Empfehlungen für den Einsatz von PHP

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.

Was Sie beim Einsatz von PHP unter UNIX/Linux beachten müssen

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.

Diverse PHP-Einstellungen

Ü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:

NameWertHinweise

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)

Beispiel: php.ini Einstellungen über den php.ini Editor bei Domainfactory

Domainfactory ManagedServer: php.ini Editor - Häufig genutzte Optionen
Domainfactory ManagedServer: php.ini Editor - Häufig genutzte Optionen

Sonstige Einstellungen:

[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.