PHP Security: PHP Sicherheit auf Serverseite erreichen

2009-08-02 - kostaki 1 Kommentar »

An dieser Stelle möchte ich über PHP Security bzw. PHP Sicherheit sprechen. Absolute Sicherheit mit PHP zu erreichen ist schwer wenn nicht unmöglich. Deshalb muss man den Fallout von schlechten Scripten so gering wie möglich halten oder bestimmte Scripte von vornherein nicht zulassen. Dieser Post ist an Serveradministratoren gerichtet und soll als Basis dienen. Mit dem Thema Sicherheit kann man sich gar nicht oft genug beschäftigen und man sollte von Zeit zu Zeit alles in Frage stellen und neu betrachten!

PHP hat ja nicht gerade einen guten Ruf unter den Programmierern und wenn man sagt man programmiert mit PHP wird man mehr als einmal belächelt. Ein weitere Punkt ist das PHP von vielen von Grund auf als unsicher eingeschätzt wird. Dieser Meinung bin ich natürlich nicht. Es ist wie mit jeder anderen Programmiersprache oder wenn man genau sein will es ist wie mit jeder anderen Scriptsprache. Das System selbst ist nicht unsicher oder instabil, aber wenn man seinen Kindern nur Süßigkeiten gibt muss man sich nicht wundern wenn sie fett werden. Ein Großteil an Sicherheitsproblemen ist auf unzureichende Programmierkenntnisse der PHP Anwender zurück zu führen. Unwissenheit ist natürlich nichts PHP eigenes, aber durch den sehr schnellen Einstieg in die Sprache gibt es sehr viel mehr unwissende PHP Programmierer als z.B. bei C. Ich persönlich betrachte das auch nicht als Problem, man muss nur damit umzugehen wissen.

Persönlich benutze ich ein System mit Apache2 Worker, fcgid und SuExec. Damit hat man die Ausbreitung von gehackten Systemen drastisch eingeschränkt. Hier hat man außerdem den Vorteil das man für jeden vhost eine eigene php.ini anlegen kann und so versierten Nutzern mehr Rechte geben kann als anderen. Ich fange immer mit einer harten Standardkonfiguration an und gebe dann wenn nötig weitere Funktionen frei.

Als erstes setze ich die php.ini-recommended als default php.ini ein, da die mitgelieferte Standardkonfiguration nichts für den Produktiveinsatz ist

$ /usr/share/doc/php5-common/examples/php.ini-recommended /etc/php5/cgi/php.ini

Zu erwähnen ist noch, das es auch eine php.ini-paranoid gibt. Am besten man guckt sich die Unterschiede mit Diff an und entscheidet dann welche man nimmt. Die Dateien sind sehr gut dokumentiert und wenn man nicht weiter kommt kann man immer noch googlen.

Vom safe_mode halte ich persönlich nichts und da trifft es sich gut das er in PHP 6 entfernt wird.

Standardkonfiguration

register_globals = Off
disable_functions = dl, phpinfo, system, mail, shell_exec, exec, escapeshellarg, escapeshellcmd, passthru, proc_close, proc_open, proc_get_status, proc_nice, proc_open, proc_terminate, popen, pclose, chown, disk_free_space, disk_total_space, diskfreespace, fileinode, max_execution_time, set_time_limit, highlight_file, show_source
allow_url_fopen = Off
expose_php = Off
register_long_arrays = Off
display_errors = Off
log_errors = On
error_reporting = E_ALL
output_buffering = 4096
register_argc_argv = Off
magic_quotes_gpc = Off
variables_order = "GPCS"
short_open_tag = Off
session.use_only_cookies = 1

Wie man sieht schallte ich standardmäßig eine ganze Menge an Funktionen ab. Viele davon braucht der normalen User eh nur selten und wenn man doch mal eine braucht wird sie für einzelne vhosts freigegeben. Wer nähere Informationen zu den einzelnen Einstellungen haben möchte kann sich die Kommentierten php.ini's angucken oder googlen.

Pfade

open_basedir = /var/www/vh-example/htdocs/public/:/var/www/vh-example/tmp/
upload_tmp_dir = /var/www/vh-example/tmp
soap.wsdl_cache_dir = /var/www/vh-example/tmp
session.save_path = /var/www/vh-example/sessions

Resourcenverwaltung:

max_execution_time = 30
max_input_time = 30
max_input_nesting_level = 64
memory_limit = 8M

Hinweis: open_basedir wird ab PHP 5.3 entfernt, genauso wie magic_quotes in PHP 6

Viele dieser Einstellungen sind schon getroffen in der php.ini-recommended aber man sollte trotzdem überprüfen ob etwas fehlt.

  1. Trackback(s)

  2. Apr 26, 2010:Mysql Datenbanken mit MySQLDump sichern | HowtoForge

Kommentar schreiben

*

*