Apache to jeden z najbardziej narażonych na ataki serwerów (poza SSH), warto skonfigurować jego opcje tak, by był jednocześnie funkcjonalny i bezpieczny. Oto kilka praktycznych wskazówek.

Po pierwsze moduły apache2 włączamy poleceniem a2enmod

1
a2enmod rewrite

Polecenie robi link symboliczny w katalogu /etc/apache2/mods-enabled, do modułu w katalogu mods-available.

Każdorazowo po zmianie konfiguracji robimy restart Apache2:

1
service apache2 restart

Przydatne moduły:

  1. rewrite – do plików .htaccess
  2. userdir – każdy użytkownik serwera będzie miał swój katalog public_html dostępny przez http://adres/~user
  3. cgi – do uruchamiania skryptów CGI (dla programistów w C++, Perl itp., przykłady w osobnym artykule)
  4. php5 – obsługa php, włączony automatycznie przy instalacji PHP
  5. modsecurity – moduł zewnętrzny, doinstalowujemy go apt-get install libapache2-modsecurity, tworzy on katalog /etc/modsecurity z plikiem ustawień, http://www.tecmint.com/apache-security-tips/
  6. mod-evasive – obrona przed atakami DDOS

i inne.

Ważny jest katalog /etc/apache2/conf.d w którym umieszczamy własne fragmenty kodów konfiguracji. Do każdego pomysłu na opcje Apache warto stworzyć osobny plik. np. jeśli chcemy, aby każdy użytkownik mógł uruchamiać skrypty cgi przez adres: http://adres/~user/cgi-bin/skrypt

plik uruchomcgi:

1
2
3
4
<Directory /home/*/public_html/cgi-bin/>
 Options ExecCGI
 SetHandler cgi-script
 </Directory>

UWAGA! powyższy kod wymaga włączonych modułów: userdir i cgi.

W katalogu sites-enabled umieszczamy moduły dotyczące aktualnie włączonych serwerów. Do każdego wirtualnego serwera tworzymy plik konfiguracyjny w katalogu /etc/apache2/sites-available. Dobrym pomysłem jest przed dokonaniem zmian skopiowanie konfiguracji default i nie używanie jej przed dokonaniem zmian, usunięcie jej z sites-enabled i zastąpienie linkiem do własnej konfiguracji, którą tworzymy poleceniem

1
a2ensite nazwaplikukonfiguracji

W tym przykładzie opiszę przypadek, gdy mamy wiele adresów prowadzących do naszego serwera (kilka domen), chcemy uruchomić www na jednej i tak, aby nie można był się dostać przez adres ip. Nie będziemy konfigurować VirtualHostów dla różnych domen. Jest to istotne, gdyż w przypadku ataku typu brutal force na program phpmyadmin atakujący będzie musiał znać przynajmniej naszą domenę (wpisywanie ip/phpmyadmin zakończy się komunikatem „Forbidden”).

W pliku zrobionym z default w sekcji zmieniamy:

1
2
3
4
5
6
7
8
9
10
                ServerAdmin swoj@email.org
                RewriteEngine On
# dla debugowania -  logi jeśli konieczne:
#                RewriteLog "/var/log/apache2/rewrite.log"
#                RewriteLogLevel 3
                RewriteCond %{HTTP_HOST} !^(twojadres.domenowy.com) [NC]
                RewriteRule ^(.*)$ - [F,L]
# Można utworzyć też dodatkowe linki user.server.com do server.com/~user:
                RewriteCond %{HTTP_HOST} ^(.+)(\.)(twojadres.domenowy.com)$ [NC]
                RewriteRule ^(.*)$ http://twojadres.domenowy.com/~%1$1 [L]

Włączymy logi dla Rewrite i wymusimy adres: twojadres.domenowy.com na użytkownikach. Będziemy też wiedzieć, gdy ktoś próbuje się dostać na serwer przez inny adres co można wykorzystać w blokowaniu fail2ban. Loglevel 0-9 oznacza ilość danych logowanych (0=pusty log, 4=9=maksimum informacji).

Kolejnym krokiem jest wyłączenie podpisów wersji serwera, w pliku /etc/apache2/conf.d/security

1
2
3
ServerTokens Minimal
...
ServerSignature Off

Zabezpieczanie katalogów domowych public_html

W pliku /etc/apache2/sites-enabled/userdir.conf
W sekcji
zmieniamy Options na:

1
Options Indexes IncludesNoExec

Wyrzucamy SymLinksIfOwnerMatch, uniemożliwi to dodawanie sztucznego dostępu do katalogu /home w sposób: ln -s /home/user /home/user/public_html/dostephome

Tak dowiązany katalog zwróci teraz forbidden. Jeśli użytkownik coś chce udostępnić musi to wrzucić do public_html.

Instalacja dwóch dodatkowych modów bezpieczeństwa

Można pokusić się o instalację dwóch popularnych modułów bezpieczeństwa – mod_security i mod_evasive. Więcej tu:

Protect Apache Against Brute Force or DDoS Attacks Using Mod_Security and Mod_evasive Modules