Betreiben Sie einen eigenen Webserver?
Dann haben Sie sich sicher schon gefragt:

  • Habe ich mich hinreichend abgesichert ?
  • Ist meine Internetpräsenz angreifbar ?
  • Wie sichere ich mich mit einfachen Mitteln ab ?

Als Betreiber einer Webseite oder eines Webservers sind Sie in der Pflicht, diesen auch abzusichern, stellt sich im Falle einer Übernahme des eigenen Servers doch die Frage, wer für mögliche Schäden durch von meinem Server ausgelieferte Schadsoftware haftbar gemacht werden kann.
Erste Anlaufstelle sollte die php.ini sein. In dieser können Einstellungen vorgenommen werden, die das Verhalten von PHP und damit auch das Verhalten unserer PHP Scripte auf dem Server beeinflussen.

  • allow_url_fopen
    Ist dieses auf ON gestellt, so können von PHP Scripten auch Dateien von anderen Servern eingebunden werden. Bei der Einstellung OFF können PHP Skripte nur lokale Dateien des Servers einbinden. Damit erschwert man Angreifern Schadcode aus dem Netz nachzuladen. Allerdings benötigen man diese Einstellung manchmal, um z.B. Newsfeeds von externen Servern zu laden, oder auch um Content Management Systeme über eine URL zu installieren.
    Empfohlene Einstellung: OFF
  • allow_url_include (ab PHP 5.2.0)
    Diese Einstellung betrifft das inkludieren von Dateien in PHP Code ( include(..) bzw. require(..) )
    Empfohlene Einstellung: OFF
  • disable_functions
    Hier kann man eine Liste an PHP Funktionen eintragen, deren Benutzung gesperrt werden soll. Soweit nicht benötigt kann man hier alle Funktionen sperren, die einen serverweiten Zugriff erlauben :  z.B. disable_functions = “ apache_get_modules, escapeshellarg, escapeshellcmd, exec,ini_restore,passtru,popen,proc_nice,proc_open,shell_exec, symlink, syslog, system” . Hier kann man durchaus noch erheblich mehr einfügen, Beispiele dazu findet man z.B. unter www.joomla-security.de
  • display_errors
    Fehlermeldungen sollten möglichst abgeschaltet sein. Sie geben einem potentiellen Angreifer zu viele Informationen über Struktur und Aufbau unserer Webverzeichnisse und Scripte preis.
    Empfohlene Einstellung: OFF
  • expose_php
    Diese Einstellung verhindert, dass der Webserver dem Browser mitteilt, dass es sich bei dem ausgelieferten Dokument um eine PHP Seite handelt , z.B. “X-Powered-By: PHP/5.3.x”. Für einen potentiellen Angreifer ist es durchaus interessant zu wissen, ob und welche PHP version auf dem Server läuft.
    Empfohlene Einstellung: OFF
  • error_reporting
    Hier gilt dasselbe wie für display_errors – sehr wichtig bei der Entwicklung einer Webseite, aber im laufenden Produktivsystem eine potentielle Gefahrenquelle.
    Dennoch sollten Sie es nicht ganz abschalten ( error_reporting = (0) ). Eine Übersicht über die einzelnen reporting Level findet man anderem auf https://php.net/manual/de/function.error-reporting.php .
    Empfohlene Einstellung: error_reporting = E_ERROR|E_WARNING|E_PARSE
  • log_errors 
    Wir haben das Error-Reporting nicht gänzlich abgeschaltet, damit wir bei Problemen nicht gänzlich im Dunkeln stehen. Da die Bildschirmausgabe abgeschaltet ist, müssen die oben eingestellten Fehlermeldungen nun irgendwie den Weg zu uns finden, also lassen wir PHP ein Fehlerlog anlegen.
  • error_log
    Damit wir das Log auch wiederfinden, geben wir mit error_log = “/pfad/zum/logdir/phperror.log” eine Stelle an, an der PHP seine Fehlerdatei speichern soll.
  • open_basedir
    Begrenzt die Dateien, die von PHP geöffnet werden auf einen bestimmten Ordner inklusive seiner Unterordner. Diese Direktive ist wirksam, egal, ob der Safe Mode an oder aus ist. Wenn ein Skript versucht eine Datei zu öffnen, wird geprüft ob die Datei im Verzeichnisbaum, der in open_basedir angegeben ist, liegt. Ist dies nicht der Fall kann PHP die Datei nicht öffnen. Man beachte das abschliessende “/” .  Fehlt dieses, so behandelt open_basedir das Verzeichnis “/www/domain/beispiel” genauso wie  “/www/domain/beispiele123”, da es mit dem selben Namen beginnt, obwohl dies zwei völlig verschiedene Verzeichnisse sind. Es ist hier der Pfad zum Web-Root anzugeben, wie er beispielstweise in der Variable “document-root” der Ausgabe von phpinfo() zu finden ist.
  • register_globals (ab PHP 5.3.0 veraltet)
    Deaktivieren von register_globals verhindert, dass von Benutzern übergebene Variablen andere Variablen im Code überschreiben können. Ist die Einstellung aktiv, so kann global auf Variablen aus GET und POST zugegriffen werden und diese können gegebenenfalls Variablen mit demselben Namen überschreiben. Ist die Einstellung deaktiviert, so muss auf externe Variablen explizit mit $_GET und $_POST zugegriffen werden.
    Empfohlene Einstellung: OFF
  • safe_mode ( ab PHP 5.3.0 veraltet, ab PHP 6 nicht mehr enthalten )
    Der safemode überprüft ob die Benutzerrechte eines ausgeführten Scripts mit denen der Datei, die es aufruft übereinstimmen und gibt im Falle einer Rechteverletzung einen Fehler aus.
    Empfohlene Einstellung: ON – allerdings führt dies zu vielen Problemen, besonders bei der Installation eines CMS wie Joomla!, daher ist im Zweifelsfalle OFF zu nehmen.
Ausgabe von phpsec - hier sollte man die Einstellungen der php.ini überdenken.

Ausgabe von PhpSecInfo – hier sollte man die Einstellungen der php.ini überdenken.

Das Verhalten von PHP lässt sich nicht nur über die php.ini beeinflussen, sondern auch über eine .htaccess Datei. In dieser kann man auch für verschiedene Verzeichnisse auf dem Server unterschiedliche Einstellungen vornehmen. Auch direkt in PHP Scripten können viele Einstellungen gesetzt werden.

php.ini:
magic_quotes_runtime = on|off
magic_quotes_gpc     = on|off
allow_url_fopen      = on|off
.htaccess, httpd.conf:
php_flag magic_quotes_runtime on|off
php_flag magic_quotes_gpc     on|off
allow_url_fopen               on|off
.php
ini_set("magic_quotes_runtime", 0|1);
// magic_quotes_gpc geht hier nicht
ini_set("allow_url_fopen", 0|1);

Informationen über die Einstellungen von PHP erhält man, indem man phpinfo() aufruft, eine grafische Aufbereitung mit Erklärung der einzelnen Einträge liefert z.B. das hier zu findende Script, welches Sie auf Ihren Webspace kopieren und dort ausführen können.
Beispiel einer PHP Info Datei:

 <?php
// Zeige alle infos, default INFO_ALL
phpinfo();
?>

Neben den hier vorgestellten Konfigurations-Einstellungen von PHP gibt es noch viele weitere Bereiche zu beachten, um einen Webserver zu sichern. So muss auch bei der Einrichtung eines Apache, Mailservers, einer  MySQL-Datenbank, oder bei grösseren Projekten auch bei DNS- oder FTP-Servern immer die Sicherheit derselben im Auge behalten werden.