11.07.2022
Obsługa serwera Apache
Linux | UnixWWW
apache

Apache to drugi pod względem popularności serwer WWW stosowany w Internecie. Otwartoźródłowy, o dużych możliwościach konfiguracyjnych. Poniższe informacje dotyczą pracy z programem na systemie Ubuntu, jednak większość poniższych informacji da się zaaplikować w innych dystrybucjach Linux`a.

sudo apt install apache2 -y

Domyślne moduły

Moduły aktywujemy poleceniem a2enmod nazwa_modułu, a dezaktywujemy a2dismod nazwa_modułu.

  1. 16.04.x LTS
    core_module (static)
    so_module (static)
    watchdog_module (static)
    http_module (static)
    log_config_module (static)
    logio_module (static)
    version_module (static)
    unixd_module (static)
    access_compat_module (shared)
    alias_module (shared)
    auth_basic_module (shared)
    authn_core_module (shared)
    authn_file_module (shared)
    authz_core_module (shared)
    authz_host_module (shared)
    authz_user_module (shared)
    autoindex_module (shared)
    deflate_module (shared)
    dir_module (shared)
    env_module (shared)
    filter_module (shared)
    mime_module (shared)
    mpm_event_module (shared)
    negotiation_module (shared)
    setenvif_module (shared)
    status_module (shared)
  2. 18.04.x LTS
    core_module (static)
    so_module (static)
    watchdog_module (static)
    http_module (static)
    log_config_module (static)
    logio_module (static)
    version_module (static)
    unixd_module (static)
    access_compat_module (shared)
    alias_module (shared)
    auth_basic_module (shared)
    authn_core_module (shared)
    authn_file_module (shared)
    authz_core_module (shared)
    authz_host_module (shared)
    authz_user_module (shared)
    autoindex_module (shared)
    deflate_module (shared)
    dir_module (shared)
    env_module (shared)
    filter_module (shared)
    mime_module (shared)
    mpm_event_module (shared)
    negotiation_module (shared)
    reqtimeout_module (shared)
    setenvif_module (shared)
    status_module (shared)

Konfiguracja

  1. Ustawienie nasłuchiwania

    /etc/apache2/ports.conf

    1. IPv4 i IPv6 na wszystkich interfejsach.
      Listen 80
    2. Tylko IPv4.

      Ustawienie to wyłącza obsługę IPv6.

      Listen 0.0.0.0:80
    3. Tylko IPv6.
      Listen [::]:80
  2. SSL
    1. Let`s Encrypt
      1. Instalacja Certbot
        1. Instalacja dodatkowego oprogramowania (16.04.x LTS)

          Zapewniają abstrakcję używanych repozytoriów apt. Umożliwiają łatwe zarządzanie dystrybucją i niezależnymi źródłami oprogramowania dostawcy oprogramowania.

          sudo apt-get install software-properties-common python-software-properties
        2. Dodanie repozytorium
          sudo add-apt-repository ppa:certbot/certbot
        3. Instalacja
          sudo apt-get install certbot python-certbot-apache -y
      2. Konfiguracja domeny w której program automatycznie ustawi przekierowania z HTTP na HTTPS.

        Może się zdarzyć, że będzie trzeba ręcznie dodać RewriteEngine On do konfiguracji HTTP.

        sudo certbot --apache -d nazwa.domeny
      3. Ustawienie CRON`a do automatycznego odnawiania certyfikatu (16.04.x LTS).
        1. Uruchomienie CRON`a.
          sudo cron -e
        2. Dodanie poniższej linii.
          0 0 1 * * /usr/bin/letsencrypt renew >> /var/log/letsencrypt-renew.log
        3. Restart CRON`a
          sudo service cron restart
      4. Sprawdzenie połączenia SSL na stronie https://ssllabs.com/ssltest.
      5. Sprawdzenie procesu odnawiania certyfikatu

        Ponieważ certyfikaty Let's Encrypt wygasają po 90 dniach, należy je okresowo sprawdzać pod kątem przedłużenia. Certbot uruchomi się automatycznie dwa razy dziennie i odnowi każdy certyfikat, który upływa w ciągu trzydziestu dni od wygaśnięcia.

        sudo certbot renew --dry-run
      6. Wymuszenie odnowienia ważności certyfikatu (16.04.x LTS).
        sudo /usr/bin/letsencrypt renew --force-renewal

Hardening

Zmiana lub dopisanie w odpowiednich miejscach poniższych wartości wymaga resa następnie sudo service apache2 restart.

  1. Ukrycie wersji Apache`a.

    /etc/apache2/conf-enabled/security.conf

    ServerSignature Off
    ServerTokens Prod
  2. Zmiana ustawień domyślnych ścieżek.

    /etc/apache2/apache2.conf

    Options -Indexes -FollowSymLinks -SymLinksIfOwnerMatch -Includes -ExecCGI
    AllowOverride None
    Require all denied

    -Indexes - wyłączenie wyświetlania sformatowanej listy zawartości katalogu.

    -FollowSymLinks - wyłączenie śledzenia przez serwer dowiązań symbolicznych w danym katalogu.

    -SymLinksIfOwnerMatch - wyłączenie podążania przez serwer tylko za dowiązaniami symbolicznymi, którymi właścicielem lub katalogiem docelowym jest ten sam identyfikator użytkownika co link.

    AllowOverrride None - blokada nadpisywania konfiguracji katalogu.

    Require all denied - blokada dostępu dla wszystkich.

    -Includes - wyłączenie Server Side Includes.

    -ExecCGI - wyłączenie CGI Execution.

  3. Nie zezwalanie na przeglądanie katalogów poza katalogiem głównym

    /etc/apache2/apache2.conf

    <Directory />
    	Options None
       	Order deny,allow
       	Deny from all
    </Directory>

    Options None - wyłączenie wszystkich opcji.

    Order deny,allow - kolejność w jakieś aplikowane są uprawnienia.

    Deny from all - odrzuca żądania od wszystkich do katalogu głównego.

  4. Uodpornienie serwera Apache na ataki

    /etc/apache2/apache2.conf

    <Directory /var/www/html/>
    	Header always append X-Frame-Options SAMEORIGIN
    	Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    	Header set X-XSS-Protection "1; mode=block"
    	Header set X-Content-Type-Options nosniff
    	Header set X-Permitted-Cross-Domain-Policies "none"
    	Header set Content-Security-Policy "default-src * data: blob: 'self'; script-src nazwa.domeny 127.0.0.1:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self'; style-src data: blob: 'unsafe-inline' *; connect-src nazwa.domeny blob: 'self';"
    	Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
    	FileETag None
    </Directory>

    Header always append X-Frame-Options SAMEORIGIN - zabezpieczenie przed atakami Clickjacking ("UI redress attack" ("Atak ze sporami w interfejsie użytkownika")). Jest to złośliwa technika używana przez osobę atakującą do zbierania kliknięć zainfekowanego użytkownika. Clickjacking składa się z dwóch słów - Click and Hijacking. Click oznacza "kliknięcie myszą", a "Hijacking" oznacza "zmuszanie użytkownika do kliknięcia". Clickjacking oznacza zmuszanie użytkownika do kliknięcia strony internetowej, na której haker chce, aby kliknął, aby wykonać pożądaną złośliwą aktywność.

    Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" - Nagłówek HSTS (HTTP Strict Transport Security) pozwala upewnić się, że cała komunikacja z przeglądarki jest wysyłana przez HTTPS (HTTP Secure). Zapobiega to klikaniu monitów przez HTTPS i przekierowuje żądania HTTP do HTTPS. Przed wdrożeniem tego nagłówka należy upewnić się, że cała strona Twojej witryny jest dostępna przez HTTPS, w przeciwnym razie zostaną one zablokowane. Nagłówek HSTS jest obsługiwany przez wszystkie główne najnowsze wersje przeglądarek (IE, Firefox, Opera, Safari i Chrome).

    Header set X-XSS-Protection "1; mode=block" - zabezpieczenie przed atakami XSS (Cross-site Scripting). Jest to najczęstsza luka w warstwie aplikacji. Umożliwia atakującemu wykonanie kodu na docelowym serwerze sieciowym z poziomu przeglądarki użytkownika. Atakujący mogą atakować na podatnym serwerze XSS za pomocą skryptów po stronie przeglądarki (JavaScript).

    Header set X-Permitted-Cross-Domain-Policies "none" - korzystając z produktów Adobe, można zaimplementować ten nagłówek, aby poinstruować przeglądarkę, jak obsługiwać żądania w wielu domenach. Wdrażając ten nagłówek ograniczamy ładowanie zasobów witryny z innej domeny, aby uniknąć nadużywania zasobów.

    Header set X-Content-Type-Options nosniff - zabezpieczeniem przeciwko zagrożeniom bezpieczeństwa typu MIME. Posiadane tego nagłówka instruuje przeglądarkę, aby uwzględniła typy plików jako zdefiniowane i nie zezwala na "wąchanie" (ang. sniffing) zawartości.

    Header set Content-Security-Policy "default-src * data: blob: 'self'; script-src b2b.viavac.pl 127.0.0.1:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self'; style-src data: blob: 'unsafe-inline' *; connect-src b2b.viavac.pl blob: 'self';" - zabezpieczenie przed atakami XSS, kliknięciami i wstrzykiwaniu kodu. Wdrażając nagłówek CSP (Content Security Policy) w odpowiedzi HTTP na stronie internetowej. CSP instruuje przeglądarkę, aby załadowała dozwolone treści do załadowania na stronie internetowej.

    Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure - Plik HTTPOnly Cookie jest również znany jako bezpieczny plik cookie używany do przesyłania http lub https przez Internet. Zaleca się używanie "HttpOnly" i "Secure flag" w ciasteczku. To ochroni serwer WWW Apache przed najczęstszymi atakami, takimi jak CSS, ataki na pliki cookie i pliki cookie.

    FileETag None - Etagi (zwane również "Entity Tags") są luką w Apache. Pozwalają użytkownikom zdalnym uzyskiwać poufne informacje, takie jak numer i-węzła, identyfikatory procesów potomnych i wieloczęściową granicę MIME za pomocą nagłówka Etag.

Tips&Tricks

  1. Sprawdzenie nasłuchiwania jednocześnie na IPv4 i IPv6.

    sudo netstat -plunt | grep ":80"
  2. Sprawdzenie nasłuchiwania na portach

    sudo netstat -ntlp | grep LISTEN
  3. Przekierowanie URL`a na inny serwer Apache`a.

    sudo a2enmod proxy_http, modyfikacja vhost dla domeny.

    <VirtualHost *:80>
    	ProxyRequests Off
    	ProxyPass /ścieżka/linku http://adres:80/ścieżka/linku
    	ProxyPassReverse /ścieżka/linku http://adres:80/ścieżka/linku
    </VirtualHost>

    ProxyRequests - dyrektywa oznacza, że Apache przekazuje oryginalny nagłówek Hosta do serwera backendowego. Przydatne ponieważ informuje serwer backendowy o adresie używanym do uzyskania dostępu do plikacji.

    ProxyPass - główna dyrektywa konfiguracyjna serwera proxy. W w/w przypadku określa, że wszystko pod adresem URL (/ścieżka/linku) powinno zostać zmapowane z serwerem backend pod podanym adresem (http://adres:80/ścieżka/linku).

    ProxyPassReverse - dyrektywa powinna mieć taką samą konfigurację jak ProxyPass. Nakazuje Apache`wi zmodyfikowanie nagłówków odpowiedzi z serwera backendowego. Ustawienie zapewnia, że jeżeli serwer backend zwróci nagłówek przekierowania lokalizacji, przeglądarka klienta zostanie przekierowania na adres serwera proxy, a nie na adres serwera backend (który nie działałby zgodnie z przeznaczeniem).

Rozwiązywanie problemów

  1. AH00547

    Błędny VirtualHost

    <VirtualHost *:80>
    <VirtualHost *:443>
  2. AH00558

    Brak ServerName localhost

    sudo nano /etc/apache2/apache2.conf

Dodatkowe informacje

0 komentarzy

Szybki kontakt

Masz pytania? Napisz