Tworzymy strony WWW bo lubimy :)

26 sty 2010

Bezpieczeństwo tworzenia stron internetowych a hosting i ustawienia serwera

Opublikowany w Pozostałe aktualności, Bezpieczeństwo

Wybór odpowiedniego dostawcy usług internetowych

Wybieramy serwer

Prawdopodobnie żadna inna decyzja nie jest większym zagrożeniem dla bezpieczeństwa strony internetowej niż wybór dostawcy i serwera. Ze względu na szeroki zakres opcji serwerów i ich konfiguracji, nie jest możliwe opracowanie listy wyczerpującej wszystkie sytuacje. Wśród największych dostawców usług hostingowych w Polsce można wymienić firmę home.pl z siedzibą w Szczecinie, NetArt z siedzibą w Krakowie oraz Superhost z siedzibą w Gdyni. Jak widać Warszawa nie figuruje na tej liście. Na szczęście w przypadku hostingu nie lokalizacja jest ważna ale jakość usług i obsługi klienta.

Jeżeli nie możesz przeznaczyć na budowę i utrzymanie witryny większego budżetu, a jej zawartość nie zawiera danych poufnych, zapewne wykupisz konto na serwerze współdzielonym. Powinieneś jednak zdawać sobie sprawę z ryzyka takiego rozwiązania. Większość podanych niżej zaleceń dotyczy serwerów współdzielonych.

Unikaj niewłaściwych konfiguracji serwera

Dla uświadomienia sobie sytuacji przeczytaj ten raport o tysiącach witryn, które zezwalają Google indeksować zawartość php.info(). Nie popełnij tego błędu na swojej stronie! Raport zawiera alarmujące statystyki ilości stron używających zaniechanych już dziś ustawień jak register_globals ON, lub pracy bez skonfigurowania open_basedir. Przy okazji, jeżeli pojęcia php.ini czy register_globals są Ci obce, prawdopodobnie nie jesteś jeszcze gotowy zarządzać bezpieczeństwem swojej strony www.

Konfiguracja serwera Apache

Stosuj .htaccess

Zablokuj typowe próby włamań za pomocą lokalnego pliku serwera - .htaccess. Opcja ta nie jest włączona na wszystkich serwerach. Sprawdź u swojego dostawcy jeżeli napotkasz problemy. Stosując .htaceess możesz zabezpieczyć hasłem ważne katalogi, takie jak np. /administrator, ograniczyć do nich dostęp przez określenie adresu IP, a w zależności od ustawień Twojego serwera będziesz w stanie przełączyć się z PHP4 na PHP5.


Rozważ zastosowanie zasady najmniejszego przywileju dla użytkowników, używając takich narzędzi jak PHPsuExec, php_suexec czy suPHP. (Uwaga: Są to zaawansowane metody które, wymagają zgody i współpracy z administratorem serwera. Opcje te są włączane lub wyłączane w ustawieniach całego serwera i nie są dostępne dla użytkowników serwerów współdzielonych.)

Stosuj mod_security - zaporę aplikacji sieciowych serwera Apache

Skonfiguruj filtry mod_security i mod_rewrite aby zablokować ataki PHP. (Uwaga: Są to zaawansowane metody, które wymagają zgody i koordynacji z administratorem serwera. Opcje te są włączane lub wyłączane w ustawieniach całego serwera i nie są dostępne w serwerze współdzielonym.)

Konfiguracja bazy MySQL

Upewnij się, że konta MySQL są utworzone z ograniczonym dostępem. Domyślna instalacja MySQL zezwala na dostęp do bazy anonimowym użytkownikom z tego samego lokalnego serwera. Konto z ograniczonym dostępem przyznaje ograniczone przywileje określonym użytkownikom. (Uwaga: To zalecenie dotyczy administratorów własnych serwerów jak np. serwery dedykowane. Użytkownicy serwerów współdzielonych są zależni od dostawców hostingu, którzy ustawiają właściwy poziom bezpieczeństwa bazy danych.)

Konfiguracja PHP

Stosuj lokalne pliki php.ini

Na serwerach współdzielonych nie możesz edytować głównego pliku php.ini, ale być może będziesz mógł dodać plik lokalny tego typu do określonych katalogów. W tym celu musisz po prostu skopiować plik php.ini do każdego podkatalogu, który wymaga specyficznego ustawienia PHP. Na szczęście ten zestaw skryptów może za Ciebie wykonać tę trudną pracę.

Zapamiętaj kilka ważnych rzeczy.

  • Lokalne pliki php.ini dadzą efekt tylko, jeżeli Twój serwer jest odpowiednio skonfigurowany. Ta uwaga dotyczy także pliku php.ini umieszczonego w Twoim głównym katalogu. Będziesz mógł przetestować, czy ten plik wpływa na Twoją stronę przez zmiany ustawień dyrektyw w lokalnym pliku php.ini.
  • Lokalne pliki php.ini wpływają tylko na pliki o rozszerzeniu .php, które są umiejscowione w tym samym katalogu (albo wstawiane tam dyrektywami included() lub required()). Oznacza to, że zasadniczo istnieją tylko dwa katalogi, w których chciałbyś umieścić "php.ini". Inne katalogi, które nie zawierają plików wywoływanych z sieci, nie potrzebują lokalnych plików php.ini.
  • Jeżeli plik php.ini jest w każdym katalogu, prawdopodobnie umieściły je tam jakieś skrypty. Jeśli nie zamierzasz tych plików wykorzystywać, prawdopodobnie powinieneś się ich pozbyć, ale pamiętaj o pkt 2, martwić musisz się tylko o pliki php.ini w katalogu głównym i katalogu administratora.


Stosuj disable_functions

Stosuj dyrektywę disable_functions, aby zablokować użytkownikom możliwość uruchamiania niebezpiecznych funkcji PHP, które nie są potrzebne dla Twojej witryny.

disable_functions = show_source, system, shell_exec, passthru, exec, phpinfo, popen, proc_open


Używaj open_basedir

Dyrektywa open_basedir powinna być włączona i prawidłowo skonfigurowana. Dyrektywa ta ogranicza dostęp do określonego katalogu, co skutkuje filtrowaniem plików, które mogą być otwarte przez PHP. Jeżeli na serwerze mamy włączoną obsługę open_basedir i safe_mode, priorytet mają zabezpieczenia przekazywane przez open_basedir.

Filtrem open_basedir jest prefix, a nie nazwa katalogu. Oznacza to, że open_basedir = /dir/incl zezwala na dostęp do /dir/include i /dir/incls jeżeli takie istnieją. Ograniczenie dostępu tylko do jednego wyspecyfikowanego katalogu należy zakończyć slashem.

open_basedir = /home/users/you/public_html


Ustaw magic_quotes_gpc

Ustaw dyrektywę magic_quotes_gpc zgodnie z wymaganiami dla Twojej strony.

magic_quotes_gpc = 1


Nie używaj safe_mode

Unikaj stosowania dyrektywy safe_mode. To ważne, ale niekompletne rozwiązanie, przeznaczone dla poważniejszych problemów, które tworzy fałszywe poczucie bezpieczeństwa. Zobacz oficjalną stronę PHP dla bliższego zaznajomienia się z tematem.

safe_mode = 0


Nie używaj register_globals

Automatyczne rejestrowanie zmiennych globalnych było prawdopodobnie najgłupszą decyzją projektantów PHP. Dyrektywa ta decyduje, czy rejestrować jako globalne zmienne EGPCS (Environment, GET, POST, Cookie, Server), w wyniku czego stają się one dostępne dla wszystkich skryptów PHP. W tej sytuacji łatwo można je nadpisać swoją własną zmienną - jeżeli nie zachowasz ostrożności. Na szczęście deweloperzy PHP zdali sobie sprawę z błędu i wycofali tę 'cechę'.

Jeżeli strona została zbudowana na serwerze współdzielonym, którego administrator nalega, by register_globals była włączona, powinieneś być bardzo zmartwiony. Chociaż zwykle będziesz mógł wyłączyć register_globals dla Twojej strony za pomocą lokalnego pliku php.ini, niewiele to zmieni, ponieważ inne strony na tym samym serwerze pozostaną narażone na ataki, które mogą dosięgnąć i Twojej strony.


Wyłącz allow_url_fopen

Ta funkcja włącza możliwość obsługi plików ze zdalnych serwerów przez podanie adresu URL (tzw. wraper, albo protokół obsługi lub interfejs). Domyślne interfejsy umożliwiają dostęp do zdalnych plików z wykorzystaniem protokołów FTP lub HTTP. Dyrektywa ta rozszerza standardowe możliwości. Niektóre rozszerzenia takie jak np. zlib mogą dodawać swoje własne interfejsy. UWAGA: ze względów bezpieczeństwa wyłączenie tej funkcji jest możliwe tylko w php.ini.

allow_url_fopen = 0

Odzyskiwanie strony internetowej

Powinieneś być w stanie, w każdym momencie, przywrócić stronę do stanu prawidłowego działania przez regularne przeprowadzanie kopiowania i odtwarzania systemu poza serwerem, na którym zainstalowana jest strona. Upewnij się że prawidłowo przeprowadziłeś te testy zanim zrobisz je na serwerze strony. To jest najlepszy sposób (i często jedyny) aby odtworzyć stronę z takich katastrof jak:

1. Włamanie na stronę lub jej zniszczenie.
2. Uszkodzenie strony z powodu błędu w aktualizacji.
3. Awarii sprzętu, takich jak awarie dysków, utrata zasilania, kradzież w serwerowni itp.
4. Działania administracyjne lub karne władz (zdarzają się częściej niż myślisz).
5. Konieczność szybkiego przeniesienia się na inny serwer lub do innego dostawcy.

Zadbanie o bezpieczeństwo serwera może uchronić Cię przed późniejszymi kłopotami już przy samym tworzeniu strony internetowej.