27. Januar 2017
php einbinden empfehlen empfehlung CGI-Modul Apache-Modul
Dieser Artikel beschreibt allgemeine Punkte zum Thema Sicherheit bei der Konfiguration eines Webservers mit PHP. Besonders erwähnt ist hier die Konfiguration von PHP als CGI-Modul.
Wichtig beim Einsatz von PHP ist, wie der Webserver unter Unix/Linux hinsichtlich der Zugriffsrechte konfiguriert ist:
Vor allem im Shared Hosting Bereich sollte PHP als CGI eingebunden sein. Der Webserver (z. B. Apache) sollte über einen CGI-Wrapper (z. B. suEXEC) auf die Domäne zugreifen. Damit ist gewährleistet, dass der Webserver mit einem Minimum an Zugriffsrechten auskommt, sodass sich einem potentiellen Angreifer möglichst wenig Angriffsfläche bietet.
Welche Unterschiede gibt es bei der Verwendung von PHP als CGI oder als Apache-Modul?
In der PHP Online Dokumentation steht zur Verwendung von PHP als CGI folgendes (Auszug):
"PHP als CGI zu nutzen, ist eine Möglichkeit für Installationen, bei denen aus irgendwelchen Gründen kein Modul in die Serversoftware eingebunden werden soll (wie beim Apache) oder für Systeme, bei denen verschiedene CGI-Wrapper genutzt werden sollen, um sichere chroot- und setuid-Umgebungen für Skripte zu schaffen. [...]"
Nachfolgend wird die Verwendung von PHP als Apache-Modul erläutert (Auszug):
"Wenn PHP als Apache-Modul eingesetzt wird, übernimmt es die Benutzerrechte des Apache (üblicherweise user "nobody"). Das hat verschiedene Auswirkungen auf Sicherheit und Authentifizierung, [...] Wenn Sie PHP zum Zugriff auf eine Datenbank benutzen, [...], müssen Sie dem Benutzer "nobody" Zugriffsrechte auf die Datenbank erteilen. [...]"
Das trifft nicht nur für Datenbankzugriffe zu, sondern auch für den Zugriff auf beliebige Dateien oder Verzeichnisse in der Domäne. Je nach Art des Zugriffs müssen Sie die Zugriffsrechte u. U. bis auf 777 freigeben. Ein Hochsetzen der Rechte wird von uns nicht empfohlen und sollte nur vorübergehend zu Testzwecken vorgenommen werden. Wir empfehlen die hier genannte sichere Konfiguration von PHP als CGI-Modul, womit keine Rechte hochgesetzt werden müssen.
Fazit:
Die CGI Version ist im Gegensatz zum Apache-Modul sicherer, wenn Sie mit einem CGI-Wrapper (z. B. suEXEC) eingesetzt wird. In diesem Fall werden alle PHP Skripte mit der User ID der Domäne ausgeführt. Zusammen mit diversen PHP Direktiven (z. B. Safe Mode, Open Basedir, usw.), kann PHP soweit beschränkt werden, dass alle notwendigen Funktionen zur Verfügung stehen, aber eine missbräuchliche Verwendung so gut wie ausgeschlossen ist.
Über die PHP-Konfiguration (php.ini) können entsprechende Werte und Beschränkungen für die PHP-Skripten gesetzt werden. Je nach Projekt und Umgebung können diese Einstellungen variieren, weshalb es keine generelle Empfehlung für bestimmte PHP-Einstellungen gibt.
Nachfolgend ein Aiuszug von PHP-Einstellungen und entsprechende Hinweise dazu:
Name | Wert | Hinweise |
---|---|---|
register_globals | Off | Diese Einstellung ist seit PHP-Version 5.3.0 als DEPRECATED eingestuft und darf nicht mehr verwendet werden. |
display_errors | Off | siehe weiterführende Links "Sicherheit erhöhen: Empfehlungen zur Fehlerbehandlung unter PHP" |
allow_url_fopen | Off | Diese Einstellung wird von Weblication® CMS nicht benötigt und kann daher deaktiviert werden. |
allow_url_include | Off | Diese Einstellung wird von Weblication® CMS nicht benötigt und kann daher deaktiviert werden. |
magic_quotes_gpc | Off | Diese Einstellung ist seit PHP-Version 5.3.0 als DEPRECATED eingestuft und darf nicht mehr verwendet werden. |
max_execution_time | 30 | Den Wert setzen Sie abhängig von den Erfordernissen Ihres Projektes. Grundsätzlich reichen Weblication® CMS bei den meisten Aktionen z.B. 10 Sekunden. Je nach Grösse eines Projektes kann aber z.B. ein Backup oder ein Generieren von PDFs mehr Zeit in Anspruch nehmen (z.B. ein Wert von 180 oder 240 erforderlich). Ein Wert von 30 ist aber in den meisten Fällen ausreichend. |
memory_limit | 40M | Mindestvoraussetzung sind für Weblication® CMS 40 MB Arbeitsspeicher. Je nach Projekt kann auch mehr erforderlich sein, was dann individuell eingestellt werden sollte. |
post_max_size | 8M | Den Wert setzen Sie abhängig von den Erfordernissen Ihres Projektes. Wenn z.B. keine Dateien hochgeladen werden, die mehr als ca. 8 MB haben, muss die Einstellung auch nicht hochgesetzt werden. |
session.use_trans_sid | 0 | Den Wert setzen Sie hinsichtlich des Session-Handlings auf "1", damit der WSESSIONID-Zusatz in der URL unterbunden wird. (siehe auch php.net) |
session.use_only_cookies | 1 | Den Wert setzen Sie hinsichtlich des Session-Handlings auf "0", damit möglichen Angriffen durch Übermittlung von Session-IDs in URLs vorgebeugt wird. (siehe auch php.net) |
[PHP] engine = On short_open_tag = On date.timezone = "Europe/Berlin" precision = 14 y2k_compliance = Off output_buffering = Off output_handler = unserialize_callback_func = zlib.output_compression = implicit_flush = Off allow_call_time_pass_reference = On safe_mode = Off safe_mode_gid = safe_mode_include_dir = safe_mode_exec_dir = safe_mode_allowed_env_vars = "PHP_" safe_mode_protected_env_vars = "LD_LIBRARY_PATH" disable_functions = highlight.string = "#CC0000" highlight.comment = "#FF9900" highlight.keyword = "#006600" highlight.bg = "#FFFFFF" highlight.default = "#0000CC" highlight.html = "#000000" expose_php = On max_execution_time = 180 memory_limit = 100M error_reporting = 0 display_startup_errors = track_errors = Off variables_order = "EGPCS" register_argc_argv = On post_max_size = 8M gpc_order = "GPC" magic_quotes_runtime = Off magic_quotes_sybase = Off default_mimetype = "text/html" doc_root = user_dir = enable_dl = On file_uploads = 1 allow_url_include = 0 asp_tags = Off allow_url_fopen = Off display_errors = Off log_errors = Off error_log = register_globals = Off magic_quotes_gpc = Off auto_prepend_file = auto_append_file = include_path = ".:/usr/local/lib/php" upload_max_filesize = 8M extension_dir = "./" zend_optimizer.enable_loader = On zend_optimizer.optimization_level = 15 zend_extension = "/usr/local/php5/ZendOptimizer.so" [mail function] SMTP = "localhost" sendmail_from = "me@localhost.com" [SQL] sql.safe_mode = Off [ODBC] odbc.allow_persistent = 1 odbc.check_persistent = 1 odbc.max_persistent = -1 odbc.max_links = -1 odbc.defaultlrl = 4096 odbc.defaultbinmode = 1 [MySQL] mysql.allow_persistent = Off mysql.max_persistent = -1 mysql.max_links = -1 mysql.default_port = mysql.default_socket = mysql.default_host = mysql.default_user = mysql.default_password = [PostgresSQL] pgsql.allow_persistent = On pgsql.auto_reset_persistent = pgsql.max_persistent = -1 pgsql.max_links = -1 [bcmath] bcmath.scale = 0 [Session] session.serialize_handler = "php" session.gc_probability = 1 session.referer_check = session.entropy_length = 0 session.entropy_file = session.cache_limiter = "nocache" session.cache_expire = 180 session.use_trans_sid = 0 session.use_only_cookies = 1 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" session.save_handler = "files" session.save_path = "/tmp" session.use_cookies = On session.name = "PHPSESSID" session.auto_start = Off session.cookie_lifetime = 0 session.cookie_path = "/" session.cookie_domain = session.gc_maxlifetime = 1440
Prüfen Sie im Einzelfall die Einstellungen und passen diese an Ihre Vorstellungen und Notwendigkeiten an.