O'Reilly logo

PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren by Stefan Esser, Christopher Kunz

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

21910.7 Safe Mode
für den Benutzerwechsel zuständig sein wird. Stellen Sie in jedem Fall
sicher, dass diese Datei das »Set-UID«-Bit besitzt und holen Sie dies
ggf. durch ein
chmod +s suexec nach:
-rws--x--x 1 root staff 10804 2005-08-14 17:54 suexec
Das Einzige, was Sie nun in der Webserver-Konfiguration noch tun
müssen, ist, einen Benutzer und eine Gruppe für jeden virtuellen Host
anzulegen. Dafür gibt es bei Apache 1 die Konfigurationsdirektiven
User und Group sowie bei Apache 2 SuexecUserGroup, die geringfügig
bequemer ist. Beiden Direktiven können Sie eine numerische (mit vor-
angestelltem #) ID oder einen Namen übergeben.
Um also CGI- und PHP-Skripte unter dem Benutzer »peter« in der
Gruppe »users« laufen zu lassen, tragen Sie innerhalb des VirtualHost-
Blocks Folgendes ein (unter Apache 1):
User peter
Group users
Beim Start des Webservers sollte der suExec-Wrapper seine Funktions-
fähigkeit mit folgender Zeile im Error-Log vermelden:
[Thu Aug 18 23:15:55 2005] [notice] suEXEC mechanism enabled
(wrapper: /usr/local/apache/bin/suexec)
Die Installation von suExec ist damit abgeschlossen – alle CGI-
Anwendungen und damit auch die CGI-Version von PHP wird nun
stets von dem in der Webserver-Konfiguration angegebenen Benutzer
ausgeführt. Allerdings ergibt sich aus dieser Tatsache auch die Not-
wendigkeit, dass Sie für jeden Benutzer ein eigenes PHP-Binary bereit-
stellen müssen – Dateien, die nicht dem aktuellen Benutzer gehören,
wird suExec nämlich nicht ausführen.
Bei großen Hosting-Servern kann dies ein Skalierbarkeitsproblem
bedeuten, ist doch ein PHP-5-CGI nach dem Kompilieren noch 11
MByte groß. Bei einigen Hundert Kunden kann das zu mehreren Giga-
byte Overhead führen. Sofern Sie Ihre PHP-Binaries mit dem Unix-
Kommando
strip php um Debugging-Symbole bereinigen, können Sie
jedoch einen Teil dieses Problems lösen – die Dateien werden deutlich
kleiner.
10.7 Safe Mode
Der Safe Mode (nicht zu verwechseln mit dem »abgesicherten Modus«
beim Windows-Betriebssystem) ist per
php.ini oder VirtualHost-
Konfiguration aktivierbar. Dieser Sicherheitsmodus führt für sämtliche
PHP-Skripte eine Zugehörigkeitsprüfung durch: Versucht das gerade
10 PHP intern220
ausgeführte Skript, auf Dateien zuzugreifen, die einem anderen Benut-
zer gehören, verweigert der Safe Mode den Zugriff. Diese Maßnahme
ist ideal für Betreiber von Hosting-Servern, da sie Zugriffe zwischen
virtuellen Hosts unterbindet. Diese haben nämlich mit einem Dilemma
zu kämpfen, das bei CGI-PHP so nicht existiert: Alle PHP-Skripte
müssen vom selben Benutzer bzw. mindestens derselben Gruppe lesbar
sein, nämlich denen des Webservers.
Damit wird eine PHP-Datei, die im Verzeichnis des Kunden A
liegt, gleichzeitig prinzipiell auch für alle anderen Kunden lesbar, die
sich dafür interessieren. Diese müssen nur ein kleines PHP-Skript
schreiben, das die Datei ausliest, und dieses wird vom Webserver aus-
geführt, der über die notwendigen Leserechte verfügen muss. Schließ-
lich muss der Webserver, um eine Datei an einen Client ausliefern zu
können, diese öffnen können.
Der Ansatz, den der Safe Mode verfolgt, funktioniert folgendermaßen:
Ein PHP-Skript wurde vom Prozess mit der UID (Unix User-ID)
1001, Gruppe www-data angelegt.
Dieses Programm versucht, eine Textdatei zu inkludieren oder zu
öffnen (
/etc/passwd), die dem Benutzer root (UID 0) gehört.
Wird es über den Webserver ausgeführt, überprüft PHP die UID
und Gruppe des Skripts (
1001/www-data) und jeder durch das Skript
zu öffnenden Datei (in diesem Fall 0/0). Unterscheiden sich die
UIDs, wird dem PHP-Skript die Verwendung der inkriminierten
Datei verboten.
10.7.1 Einrichtung des Safe Mode
Um den Safe Mode in Ihrer PHP-Installation zu aktivieren, müssen Sie
lediglich in der
php.ini oder in der VirtualHost-Definition in der Apa-
che-Konfigurationsdatei einen »Schalter umlegen«:
php.ini: safe_mode = On
<VirtualHost>-Blöcken: php_admin_value safe_mode On
Nach dem nächsten Webserver-Restart ist der Safe Mode dann für den
entsprechenden virtuellen Host oder die gesamte Apache-Instanz akti-
viert. Einige PHP-Programme, unter anderem ältere Versionen von
Typo3, überprüfen per
ini_get, ob der Safe Mode aktiviert ist – erwar-
ten aber statt des Rückgabewertes
On oder Off die booleschen Werte 0
oder 1. Stoßen Sie auf Probleme mit einer inkorrekten Erkennung des
Safe Mode, sollten Sie statt
safe_mode = On die Einstellung safe_mode = 1
verwenden.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required