4. Fejezet. Biztonság

Tartalom
CGI futtatható állomány
Apache modul

A PHP egy igen hatékony nyelv és feldolgozó program, akár a szerverben egy modulként van jelen, akár egy különálló CGI futtatható állományként működik, képes elérni file-okat, futtatni parancsokat és hálózati kapcsolatokat nyitni a szerveren. Ezek a tulajdonságok alapesetben veszélyessé is tehetik más, a webszerveren futó alkalmazások számára. A PHP-t úgy fejlesztették, hogy biztonságosabb legyen CGI programok írására, mint a Perl vagy C nyelvek. A PHP a fordítási és futásidejű beállítások helyes választásával megadja neked a szabadság és biztonság megfelelő kombinációját.

Mivel sok különböző formája van a PHP használatának, számos konfigurációs lehetőség van a működésének beállítására. A lehetőségek nagy száma garantálja, hogy a PHP-t sokféle célra felhasználd, de egyben azt is jelenti, hogy ezek és a szerver beállításainak kombinációi kritikus helyzeteket teremthetnek. Ez a fejezet kitér a különböző konfigurációs beállítás-kombinációkra, és azokra az esetekre, amikor ezek biztonsággal használhatóak.

CGI futtatható állomány

Lehetséges támadások

A PHP CGI futtatható állomáynként való használata egy telepítési lehetőség azok számára, akik valami oknál fogva nem szeretnék a PHP-t modulként a szerverbe integrálni (pl. Apache), vagy a PHP-t más CGI wrapper-ekkel szeretnék használni biztonságos chroot és setuid környezet kialakítása érdekében. Ez a forma magával vonja azt, hogy a PHP-t a szerver cgi-bin könyvtárába telepíted fel. A CERT advisory CA-96.11 azt tanácsolja, hogy ne tegyél feldolgozó programot a cgi-bin könyvtárba. Bár a PHP használható mint egy egyedülálló feldolgozó program, a PHP-t úgy tervezték, hogy az ilyen telepítésekből adódó támadásokat kivédje:

  • Rendszerfile-ok elérése: http://domain.nev/cgi-bin/php?/etc/passwd

    Az URL lekérési információja (query information), ami a kérdőjel (?) után található, parancssori paraméterként kerül átadásra a feldolgozónak. Általában a feldolgozók megnyitják, és lefuttatják az első paraméterként adott file-t.

    Ha a PHP CGI futattható állományként hívódik meg, nem veszi figyelembe a parancssori paramétereket.

  • Bármilyen web dokumentum elérése a szerveren: http://domain.nev/cgi-bin/php/titkos/doc.html

    Az elérési út információ (path information) az URL része, a futtatható file neve után lévő /titkos/doc.html a CGI program által megnyitásra és futtatásra kerülő file elérésének meghatározására használatos. Tipikusan néhány web server beállítási lehetőség (Apache-ban: Action) használatos a kérések átirányítására a dokumentumhoz, mint a http://domain.nev/titkos/script.php3 a PHP interpreter számára. Ezzel a beállítással a szerver először ellenőrzi az elérési engedélyeket a /titkos könyvtárra, és ezután állítja elő az átirányító kérést a http://domain.nev/cgi-bin/php/titkos/script.php3 oldalra, amit így már a PHP feldolgoz. Azonban ha eredetileg is ebben a formában volt megadva a kérés, nem történik elérési ellenőrzés a /titkos/script.php3 file-ra, csak a /cgi-bin/php file-ra. Ilyen módon bárki, aki elérheti a /cgi-bin/php címet, egyben tetszőleges védett dokumentumot is elérhet.

    A PHP esetében az --enable-force-cgi-redirect fordítási opció, a doc_root és user_dir konfigurációs lehetőségek használhatóak ennek kivédésére, ha a szerver dokumentumainak könyvtárfájában van olyan könyvtár, ami elérési korlátozásokkal bír. Nézd meg az alábbi lehetőségeket a különböző kombinációkhoz!

1. eset : csak publikus file-ok

Ha a szerveren nincs olyan tartalom, ami jelszó vagy IP alapú védelemmel van ellátva, nincs szükség ezekre a konfigurációs beállításokra. Ha a szerver nem engedélyezi az átirányításokat, illetve ha a szervernek nincs módja biztonságos átirányítással küldeni a kérést a PHP számára, megadhatod az --enable-force-cgi-redirect opciót a "configure" script számára. Meg kell győződnöd arról, hogy a PHP script-jeid nem függnek egy speciális script hívási formától sem, mint a http://domain.nev/cgi-bin/php/dir/script.php3 vagy a http://domain.nev/dir/script.php3.

Az átirányítás beállítása Apache alatt az AddHandler és Action direktívákkal történik (lásd lentebb).

2. eset : az --enable-force-cgi-redirect használata

Ez a fordítási opció megakadályozza, hogy bárki meghívja a PHP-t egy http://domain.nev/cgi-bin/php/titkos/script.php3. URL-el. Ehelyett a PHP csak akkor fog elfogadni egy ilyen kérést ha egy szerver átirányításban kapta.

Apache esetében tipikusan a következő direktívákkal történik a beállítás:

  1 
  2 
  3 Action php3-script /cgi-bin/php
  4 AddHandler php3-script .php3
  5 
  6     

Ez a lehetőség csak az Apache web szerverrel tesztelt és azon múlik, hogy az Apache beállítja a nem standard REDIRECT_STATUS CGI környezeti változót ha átirányított kérésrők van szó. Ha a webszervered semmilyen módon nem közli, hogy ez egy direkt vagy átirányított kérés volt-e, nem használhatod ezt az opciót, így valamelyik másik módot kell használnod.

3. eset : a doc_root vagy user_dir beállítása

Aktív tartalom elhelyezése a normál dokumentumok között, (pl. scriptek és futtatható állományok) veszélyes gyakorlat lehet. Ha például valamilyen beállítási hiba miatt a scriptek ahelyett, hogy lefutnának hagyományos HTML dokumentumokként jelennek meg, mindenki számára tisztán látható válnak kódolási technikáid és pl. adatbázis jelszavaid. Ezért néhány rendszeradminisztrátor inkább egy külön könyvtárat jelöl ki, ami csak a PHP CGI által elérhető, és így mindig feldolgozásra kerül és nem jelenik meg a script kódja.

Ha a fent leírt átirányítás azonosítási mód nem működik, fontos, hogy egy különálló script doc_root-ot határozz meg, ami nem azonos a web doc_root-al.

A PHP script dokumentumok gyökérkönyvtárát a doc_root konfigurációs beállítással határohatod meg a konfigurációs file-ban, vagy a PHP_DOCUMENT_ROOT környezeti változóban adhatod meg ezt az értéket. Ha ez be van állítva a PHP CGI verziója a file elérési útját a doc_root és a kérés elérési út információja (path information) alapján állítja elő, ami azt jelenti, hogy ezen a könyvtáron kívül nem futtatható file. (kivéve a user_dir esetét).

Egy másik itt használható opció a user_dir. Ha ez nincs megadva, csak a doc_root szabályozza a megnyitható file-ok körét. Ekkor egy http://domain.nev/~user/doc.php3 URL nem a "user" nevű felhasználó home könyvtárában lévő file-t keresi, hanem a ~user/doc.php3 file-t keresi a doc_root alatt (igen, egy tilde karakterrel kezdődő könyvtárban [~]).

Ha a user_dir meg van adva, például public_php, akkor a fenti http://domain.nev/~user/doc.php3 kérés a doc.php3 nevű file-t fogja megnyitni a "user" nevű felhasználó home könyvtárában lévő public_php könyvtárban. Ha a "user" home könyvtára /home/user, a lefuttatandó file a /home/user/public_php/doc.php3 lesz.

A user_dir kifejtés a doc_root beállítástól függetlenül működik, úgyhogy a dokumentum gyökér és felhasználói könyvtár beállításokat külön is használhatod.

4. eset : PHP feldolgozó a web könyvtárfán kívül

Egy rendkívül biztonságos lehetőség, ha a PHP feldolozót valahol a web-en látható könyvtárakon kívülre teszed. Például a /usr/local/bin könyvtárba. Az egyetlen igazi hátránya ennek az opciónak az, hogy minden PHP script első sorának egy ehhez hasonló sort kell megadnod:

  1 
  2 
  3 #!/usr/local/bin/php
  4 
  5       

ami megadja, hogy hol található a PHP feldolgozó, ami lefuttatja majd ezt a scriptet. Ráadásul minden PHP scriptednek futási jogot kell adni. Azaz úgy kell eljárni, mint bármilyen más CGI programmal, amit Perl, sh vagy bármilyen más nyelven írsz és a #! shell-escape mechanizmust használja sajátmaga futtatására.

Ahhoz, hogy ebben az esetben a PHP helyesen kezelje a PATH_INFO és a PATH_TRANSLATED információkat, a PHP feldolgozót az --enable-discard-path "configure" opcióval kell fordítani.