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:
- rewrite – do plików .htaccess
- userdir – każdy użytkownik serwera będzie miał swój katalog public_html dostępny przez http://adres/~user
- cgi – do uruchamiania skryptów CGI (dla programistów w C++, Perl itp., przykłady w osobnym artykule)
- php5 – obsługa php, włączony automatycznie przy instalacji PHP
- 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/
- 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
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