Milan Kryl

Kryl Blog - RSS

Zabezpečení PHP instalace

16. 10. 2006 - 08:59

Co se vyplatí zabezpečit na instalaci serveru Apache, PHP a MySQL. A pokud jste začínajícím programátorem v PHP, s čím je dobré počítat při tvorbě svých skriptů. Ne vše Vám může fungovat po přesunu z vývojového prostředí na produkční server.

Zakázat otvírání adres přes funkce manipulující se soubory

Funkce fopen, file_get_contents a include mohou umožňovat otvírání vzdáleného URL podobně jako když čtete lokální soubor. Spolu s možností ovlivnit uživatelem jméno souboru zde existuje velmi silné riziko, jak aplikaci podvrhnout nebezpečná data.

V nastavení serveru stačí přidat do souboru php.ini následující řádek:

allow_url_fopen = Off

Ke vzdáleným adresám je pak nadále možné přistupovat přes fsockopen nebo funkce CURL.

Vypnout Register Globals

Ačkoliv se již toto nastavení dočkalo změny od verze 4.2.0 je možné, že někde ještě zůstává z důvodu nekompatibilních a špatně napsaných aplikací. Pokud můžete takové projekty přepište nebo zrušte. V některých případech je manipulace s libovolnou proměnnou velmi nebezpečná a při psaní kódu to hlavně začátečníci mohou lehce přehlédnout.

V nastavení stačí ověřit přítomnost řádku:

register_globals = Off

Omezit čtení a zápis PHP samotnému

Velmi často stačí skriptům přístup pouze pro některý adresář a jeho podadresáře. Všechny funkce přistupující k souborům lze omezit například na /var/www/htdocs/files následující řádkou:

open_basedir = /var/www/htdocs/files

Safe mode

Bezpečný mód omezuje přístup k souborům, u kterých není vlastníkem Apache. Omezuje přístup k proměnným prostředí a spouštění binárních programů.

safe_mode = Off
safe_mode_gid = On

Safe_mode_gid umožní přístup i k souborům, které jsou ve vlastnictví jiných uživatelů. Nicméně musí mít nastaveny na apache aspoň skupinu.

Povolení některých binárek je možné umístěním do jednoho adresáře (např. /var/www/binaries) a povolením v konfiguraci:

safe_mode_exec_dir = /var/www/binaries

Přístup k některým proměnným prostředí je možné povolit, pokud mají stejný prefix (např. PHP_).

safe_mode_allowed_env_vars = PHP_

Nastavit limity

max_execution_time = 30 ; Max doba běhu skriptu
max_input_time = 60 ; Max doba parsování vstupu
memory_limit = 16M ; Max paměti použité jedním skriptem
upload_max_filesize = 2M ; Max velikost uploadovaného souboru
post_max_size = 8M ; Max velikost požadavku POST

Omezit přístup k určitým souborům

Mnoho souborů by nemělo být přístupných i když se v projektu budou vyskytovat. Typicky velmi populární přípona .inc (mnohem vhodnější je používat .inc.php) bude na většině nezabezpečených serverů vést k zobrazení zdrojového kódu a bude volně přístupná. Podobně na tom jsou záložní kopie editovaných souborů .php~ nebo .sql. Obrana je zase jednoduchá do souboru .htaccess nebo konfigurace apache stačí přidat:

<FilesMatch "\.(inc|.*sql|.*~)$">
Order allow,deny
Deny from all

Chybové zprávy a logy

Ve výchozím nastavení jde výstup chyb do okna prohlížeče. To je vhodné během vývoje, nicméně pro ostrý běh je lepší zprávy nezobrazovat a směrovat je do logu:

display_errors = Off
log_errors = On

Skrýt přítomnost PHP

PHP o sobě dává vědět několika různými cestami. Informace objevíte v hlavičce HTTP požadavků a navíc obsahuje i Easter Egg ve formě vráceného obrázku v případě zavolání následující adresy:

http://www.example.com/script.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000

Nicméně není důvod, proč by o PHP na serveru měl některý z návštěvníků vědět. Jednoduše to lze zařídit nastavením v php.ini:

expose_php = Off

Závěrem

Výchozí konfigurace distribuovaná s PHP je vhodná spíš pro vývoj aplikací, ale ne pro produkční servery. Pokud server sami provozujete, tak si ověřte zmiňovaná nastavení. V opačném případě se nedivte, že některá nastavení mohou být na ostrém serveru odlišná a někdy mohou způsobit i nefunkčnost Vašich aplikací.

Ayman Hourieh's Blog - Checklist for Securing PHP Configuration

 

Tip: Krátké zprávy a zajímavosti (rychlý přístup https://kryl.info/kratce)

Související