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

23110.10 Externe Ansätze
müssen, zu sichern. Erhalten Sie Code in einer Variablen, um ihn etwa
über die Funktion
eval() auszuführen, können Sie ihn mit der Funk-
tion
runkit_lint() auf korrekte Syntax überprüfen.
Außer dem als Sandboxing bekannten Feature können Sie über
runkit noch einige andere praktische und sicherheitsrelevante Aktio-
nen ausführen. So ist es möglich, eigene Variablen per
php.ini als
superglobal (wie
$_GET, $_POST) zu markieren – diese sind dann in einem
PHP-Skript aus jedem Scope heraus verfügbar. Mit der Konfigurati-
onsdirektive
runkit.superglobal=_BLAH,_BLUBB
können Sie die beiden superglobalen Variablen $_BLAH und $_BLUBB
definieren, die Ihnen fortan zur Verfügung stehen. Natürlich ist es
nicht möglich, das direkt im Skript zu erledigen – schließlich müssen
die Variablen bei Skriptstart bereits zur Verfügung stehen – allerdings
können Sie diese Variablen in einer
.htaccess-Datei oder der Virtual-
Host-Definition aktivieren.
Runkit könnte sich in späteren Versionen von PHP zu einer
hervorragenden Möglichkeit entwickeln, potenziell gefährlichen Code
in einer abgeschlossenen Umgebung innerhalb des PHP-Interpreters
auszuführen, ohne die Kontrolle abgeben zu müssen. Viele Sicherheits-
probleme, die die Ausführung von Schadcode beinhalten, könnten so
zwar nicht verhindert, aber doch in ihrer Schädlichkeit stark einge-
schränkt werden. Leider verzeichnet die Projekthomepage
http://
pecl.php.net/package/runkit seit Juni 2006 keine neuen Versionen der
Software – man muss also davon ausgehen, dass die Entwicklung ein-
gestellt wurde.
10.10 Externe Ansätze
10.10.1 suPHP
Um PHP-Skripte mit den Rechten des jeweiligen Apache-Benutzers
auszuführen, existiert neben dem mit Apache gelieferten suExec noch
ein (ebenfalls unter einer freien Lizenz stehendes) Modul und Binary
namens suPHP
4
. Die Funktion, die dieses Modul erfüllt, ist im Prinzip
dieselbe wie die Features von suExec, weswegen es im Grunde keine
Veranlassung gibt, ein externes Modul einzusetzen. Jedoch ist suPHP
in der Konfiguration in gewisser Weise etwas einfacher einzusetzen,
weshalb es eine interessante Alternative zu suExec darstellt. Darüber
4. http://www.suphp.org/
10 PHP intern232
hinaus erlaubt es Ihnen, beliebig viele PHP-Versionen parallel zueinan-
der einzusetzen, was insbesondere auf Servern, die für Softwareent-
wicklung genutzt werden, ein sehr interessantes Feature ist.
Ein weiteres, auf den ersten Blick eher unscheinbares Feature
unterscheidet suPHP noch von suExec: Mit einem Konfigurationspa-
rameter für die
httpd.conf können Sie ohne jegliche Rekonfiguration
des PHP-Binarys den Pfad für die
php.ini pro virtuellem Host einzeln
setzen.
Das suPHP-Archiv enthält neben der eigentlichen Wrapper-Datei
auch Module für Apache 1 und 2, die für die Kommunikation mit dem
Webserver zuständig sind. Zunächst müssen Sie – ganz ähnlich wie bei
suExec – das Paket konfigurieren. Dazu geben Sie die üblichen not-
wendigen Parameter beim configure-Skript an:
Konfiguration für
suPHP: configure
./configure
--prefix=/usr/local
--with-apxs=/usr/local/apache/bin/apxs
--with-apache-user=httpd
--sysconfdir=/etc/httpd
--with-setid-mode=paranoid
Der folgende Hinweis gilt für suPHP 0.6.3 – in neueren Versionen ist
das Problem eventuell behoben.
Bevor Sie die Kompilierung starten, müssen Sie jedoch noch Hand
an den Quellcode von mod_suphp legen, um einen Bug in der aktuel-
len Version zu beheben. Dieser Fehler sorgt dafür, dass die Konfigura-
tion unnötig verkompliziert wird – ihn zu beheben, geht schnell und
vereinfacht die Einrichtung.
Öffnen Sie die Datei
src/apache/mod_suphp.c mit einem Texteditor
und ändern Sie in den Zeilen 252 bis 254 folgenden Text:
{"suPHP_AddHandler", suphp_handle_cmd_add_handler, NULL,
ACCESS_CONF,
ITERATE, "Tells mod_suphp to handle these MIME-types"},
{"suphp_RemoveHandler", suphp_handle_cmd_remove_handler, NULL,
ACCESS_CONF,
an zwei Stellen, sodass folgender Text entsteht:
{"suPHP_AddHandler", suphp_handle_cmd_add_handler, NULL,
RSRC_CONF|ACCESS_CONF,
ITERATE, "Tells mod_suphp to handle these MIME-types"},
{"suphp_RemoveHandler", suphp_handle_cmd_remove_handler, NULL,
RSRC_CONF|ACCESS_CONF,
Damit erreichen Sie, dass die wichtigen Direktiven suphp_AddHandler
und suphp_RemoveHandler nicht nur in <Location>- und <Directory>-
Blöcken, sondern überall in der Serverkonfiguration stehen können.
23310.10 Externe Ansätze
Nach dieser Anpassung können Sie zurück ins ursprüngliche
Quellverzeichnis von suPHP wechseln, das Programm und das Modul
mit
make kompilieren und mit make install installieren.
Als Nächstes konfigurieren Sie das grundsätzliche Verhalten von
suPHP mittels seiner eigenen Konfigurationsdatei. In unserem Beispiel
wurde der Pfad
/etc/httpd für Konfigurationsdateien vorgesehen –
hier legen Sie eine leere Datei namens
suphp.conf an. Diese Datei füllen
Sie dann mit den folgenden (oder ähnlichen) Werten:
suphp.conf
[global]
logfile=/usr/local/apache/logs/suphp_log
docroot=/home/www
loglevel=info
check_vhost_docroot=yes
errors_to_browser=no
webserver_user=httpd
env_path=/usr/bin:/usr/local/bin
min_uid=1000
min_gid=1000
[handlers]
x-httpd-php5=php:/home/www/cgi/php5
x-httpd-php4=php:/home/www/cgi/php4
Die Konfigurationsdatei ist in zwei Sektionen aufgeteilt. In der ersten,
mit
[global] überschrieben, finden Sie globale Einstellungen wie Log-
Dateien und Fehlerausgabe. Die Beispielinstanz von suPHP wurde so
konfiguriert, dass bei einem Rechteverstoß keine Fehler an den Client
ausgegeben, sondern in die Log-Datei unter »
/usr/local/apache/logs/
suphp_log« geschrieben werden. Der Client erhält lediglich einen Feh-
ler 500 (»Internal Server Error«).
Die Direktive »docroot« gibt das unterste Verzeichnis, unter dem
alle auszuführenden Skripte liegen müssen, an. Wie bei suExec ist dies
meist das Dokumenten-Wurzelverzeichnis, also
/var/www, /home/www,
/usr/local/apache/htdocs oder ähnlich. Analog zum Apache-eigenen
Wrapper erfolgt auch die Konfiguration der PATH-Umgebungsvariab-
len und der minimalen UID/GID, die für einen Request gesetzt werden
können. Der ursprüngliche Webserver-Benutzer, mit dessen ID suPHP
aufgerufen wird, muss ebenfalls zwingend in einer Direktive namens
webserver_user angegeben werden.
Eine zweite Sektion, eingeleitet durch
[handlers], definiert alle
Handler, für die suPHP sich zuständig fühlt. In jeder Zeile dieser
Konfigurationssektion stehen MIME-Types, die je einem PHP-Binary
zugeordnet werden. Zwischen dem Dateityp und dem voll qualifizierten
Pfad zum jeweiligen PHP steht das Kürzel »php:«, das den »PHP-
Modus« aktiviert. suPHP kann auch mit normalen CGI-Skripten umge-
hen, daher die Unterscheidung, die Sie nicht weiter beachten sollten.

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