Sicherheit_Server

Guite edited this page Nov 15, 2014 · 1 revision
Clone this wiki locally

Der sichere Server

Natürlich kann man Bugs in einer Software nie gänzlich ausschließen - Eine Menge Probleme werden erst durch unsichere Server-Konfigurationen ermöglicht. Aus diesem Grund hat das Core-Entwicklungsteam den sogenannten Baseline-Analyser in Zikula 0.7.6 eingeführt. Wie schon angesprochen analysiert er ein paar grundlegende Einstellungen in der Serverumgebung auf die gängigen Probleme: register_globals, magic_quotes und beschreibbare Dateien/Verzeichnisse.

Eventuelle Sicherheitsrisiken werden dabei innerhalb der Administration als Warnmeldung angezeigt.

register_globals

Zikula läuft selbstverständlich mit register_globals=off (und es wird auch innerhalb des Core keine Emulation dieser Funktionalität ‘versteckt’, vielmehr erfolgt seit der Version .763 sogar ein ‘forced-register_globals=off falls dies serverseitig aktiv sein sollte). Module bzw. Erweiterungen die register_globals benötigen, sollten definitiv nicht verwendet werden. Sollte eine entsprechende Warnmeldung innerhalb der Administration angezeigt werden, bedeutet dies, dass der Provider systemweit register_globals=on gesetzt hat.

Eine Abhilfe bringt dann oftmals folgender Eintrag in einer .htaccess im root der Installation:

# set register_globals=off
php_flag register_globals off

alternativ kann (je nach Konfiguration beim Provider) auch eine php.ini im root der Installation helfen:

php_admin_flag register_globals Off

Ein Sonderfall scheint der Provider 1&1/Puretec zu sein - hier kann man (aus welchem Grund auch immer) unter PHP4 die register_globals nicht deaktivieren. Eine Umstellung auf PHP5 via .htaccess sollte dies Problem allerdings lösen:

AddType x-mapp-php5 .php

Abhängig vom Servertyp könnte auch folgendes helfen: Man entfernt die betroffenen Zeilen in der .htaccess und legt eine php.ini mit folgendem Inhalt an:

#ini
register_globals = off
magic_quotes_gpc = off

Auch beim Provider Strato ist es den Kunden nicht ohne weiteres vergönnt, eine sichere Konfiguration zu nutzen - hier hilft dem Vernehmen nach nur eine individuelle php.ini bzw. eine Umstellung auf PHP4.4(!) via .htaccess:

AddType application/x-httpd-php43 .php

Sollte das alles nicht zum Erfolg führen (Kontrolle jeweils über eine phpinfo.php): Provider kontaktieren!

magic_quotes

Die API von Zikula stellt eigene Funktionen zum ‘sanitizing’ von Eingaben in Datenbankqueries bereit, benötigt von daher also eigentlich keine magic_quotes-Maskierung. Einige weit verbreitete und leider nicht API-konforme Module nutzen allerdings eigene DB-Queries und können dadurch unter Umständen Risiken zur SQL-Injektion beinhalten - von daher empfiehlt Zikula zumindestens innerhalb der 0.7.x-Serie (trotz der Performance-Einbusse und eventuellen Problemen bei Dateiuploads) magic_quotes_gpc=on. Sollte eine entsprechende Warnmeldung innerhalb der Administration angezeigt werden, bedeutet dies, dass der Provider systemweit magic_quotes_gpc=off gesetzt hat. Eine Abhilfe bringt dann oftmals folgender Eintrag in einer .htaccess im root der Installation:

# set magic quotes settings on
php_flag magic_quotes_gpc on

Sollte dies nicht zum Erfolg führen: Provider kontaktieren!

chmod

Zikula benötigt nur ein beschreibbares Verzeichnis - pnTemp. Dieses Verzeichnis ist von Haus aus mit einer .htaccess vor externem Zugriff geschützt, optimalerweise platziert man es darüberhinaus ausserhalb der Webroot. Sollte eine Meldung in Bezug auf falsche Rechte für config.php bzw. config-old.php innerhalb der Administration angezeigt werden, einfach mit dem FTP-Client (z.B. Filezilla) die Dateirechte dieser beiden Dateien auf ‘644’ (in Ausnahmefällen auch ‘444’) korrigieren.

allgemeine Server-Einstellungen

Für Leute mit Zugriff auf die php.ini hier eine kleine Zusammenstellung an empfehlenswerten Server-Einstellungen für Produktiv-Umgebungen (zugegebenermassen nur ein sehr kurzer und sicherlich nicht vollständiger Überblick):

    • PHP-Version sollte die jeweils aktuellste ‘stable’ sein - gerade Versionen vor 4.3.10 haben bekannte und ernsthafte Sicherheitslücken, zusätzlich ggfs. den Einsatz von suhosin in Betracht ziehen.
    • display_errors sollte auf ‘off’ gesetzt sein (kann ggfs. auch via .htaccess-Direktive ‘php_flag display_errors off’ gesetzt werden). Fehler besser im PHP-Logfile aufzeichnen.
    • display_startup_errors sollte auf ‘off’ gesetzt sein
    • expose_php sollte auf ‘off’ gesetzt sein (kann zusätzlich noch durch eine eigene Serversignatur via modsecurity ergänzt werden)
    • register_globals sollte auf ‘off’ gesetzt sein (siehe Abschnitt oben)
    • magic_quotes_gpc sollte in Produktiv-Umgebungen auf ‘on’ gesetzt sein (siehe Abschnitt oben)
    • allow_url_fopen (ab PHP 5.2: allow_url_include) sollte nach Möglichkeiten auf ‘off’ gesetzt sein, kann unter Umständen allerdings Auswirkungen auf die Funktionalität von Modulen haben! Hinweis: zikula.de läuft aktuell mit allen Unterseiten unter allow_url_fopen=off
    • disable_functions nach Möglichkeit show_source, system, shell_exec, passthru, exec, popen, proc_open, symlink deaktivieren.

Einen recht guten Überblick über nicht optimale Servereinstellungen kann man sich übrigens via phpsecinfo anzeigen lassen.

modsecurity

Falls man Zikula auf einem eigenen Server betreibt, kann man darüber hinaus durch Einsatz von z.B. modsecurity die Sicherheit auf Serverebene noch deutlich erhöhen. Ein für Zikula angepasstes Ruleset:

# Turn modsecurity on
SecFilterEngine On

# log attack vectors
SecAuditEngine On
SecAuditEngine RelevantOnly
SecAuditLog /www/htdocs/irgendwo/audit_log

# Some sane defaults
SecFilterScanPOST On
SecFilterCheckURLEncoding On
SecFilterCheckCookieFormat On
SecFilterCheckUnicodeEncoding Off

# Accept almost all byte values
SecFilterForceByteRange 1 255

## -- Common attacks --------------------
SecFilterDefaultAction "deny,log,msg:'Common attacks',status:403"

#Web Proxy GET Request
SecFilter "^GET (http|https|ftp)\:/"
#Web Proxy HEAD Request
SecFilter "^HEAD (http|https|ftp)\:/"
#Proxy POST Request
SecFilter "^POST (http|https|ftp)\:/"
#Proxy CONNECT Request
SecFilterSelective THE_REQUEST "^CONNECT "

# Only accept request encodings we know how to handle.
# NOTE: application/x-www-form-urlencoded; charset=UTF-8 is used within dokuwiki ajax search
SecFilterSelective REQUEST_METHOD "!^(GET|HEAD)$" chain
SecFilterSelective HTTP_Content-Type "!(<sup>$|</sup>application/x-www-form-urlencoded$|<sup>application/x-www-form-urlencoded; charset=UTF-8$|</sup>multipart/form-data)"

# Do not accept GET or HEAD requests with bodies
# NOTE: for some reasons we receive this kind of requests in GET|HEAD!
# SecFilterSelective REQUEST_METHOD "^(GET|HEAD)$" chain
# SecFilterSelective HTTP_Content-Length "!^$"

# Require Content-Length to be provided with every POST request.
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"

# Restrict which request methods can be used
SecFilterSelective REQUEST_METHOD "!^(GET|HEAD|POST)$"

# Restrict protocol versions.
SecFilterSelective SERVER_PROTOCOL "!^HTTP/(0\.9|1\.0|1\.1)$"

# Don't accept transfer encodings we know we don't know how to handle
SecFilterSelective HTTP_Transfer-Encoding "!^$"

#XSS insertion into Content-Type
SecFilterSelective THE_REQUEST "Content-Type\:.*(<[[/:space:|:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[/:space:|:space:]]*>|onmouseover=|javascript\:)" id:300002

#Prevent SQL injection in UA
SecFilterSelective HTTP_USER_AGENT "((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[/:space:|:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[/:space:|:space:]]+(from|into|table|database|index|view)[[/:space:|:space:]]+[A-Z|a-z|0-9|\*| |\,]|UNION SELECT.*\'.*\'.*,[0-9].*INTO.*FROM)"

#XSS in referrer and UA headers
SecFilterSelective HTTP_REFERER|HTTP_USER_AGENT "<[[/:space:|:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[/:space:|:space:]]*>"

#generic attack sig
SecFilterSelective THE_REQUEST "cd\x20*\;(cd|\;|echo|perl |python |rpm |yum |apt-get |emerge |lynx |links |mkdir |elinks |cmd|pwd|wget |id|uname |cvs |svn |(s|r)(cp|sh) |net(stat|cat) |rexec |smbclient |t?ftp |ncftp |curl |telnet |gcc |cc |g\+\+ |\./)"

## -- PHP attacks --------------------
SecFilterSignatureAction "log,deny,msg:'PHP attack'"
# Possible code execution attack (targets valid PHP streams constructs)
SecFilterSelective ARGS_NAMES "^php:/"

## -- phpBB---------------------------
SecFilterSignatureAction "log,deny,msg:'phpBB Attack'"
SecFilterSelective ARG_highlight "(\x27|%27|\x2527|%2527)"

## -- Prevent PERL UA-----------------
SecFilterSignatureAction "log,deny,msg:'PERL UA Attack'"
SecFilterSelective HTTP_USER_AGENT "(libwww|lwp)"

## -- PostNuke------------------------
SecFilterSignatureAction "log,deny,msg:'PostNuke Attack'"
# Protecting from XSS attacks through the PHP session
# IF USING THE SUHOSIN PATCH the cookie is encrypted!
#SecFilterSelective ARG_POSTNUKESID "!^[0-9a-z]*$"
#SecFilterSelective COOKIE_POSTNUKESID "!^[0-9a-z]*$"
#PostNuke "func" Local File Inclusion Vulnerability
SecFilterSelective REQUEST_URI "/index\.php.*func=*(\.\./|(http|https|ftp)\:/)"
#PostNuke version : x=> 0.750 SQL injection
SecFilterSelective REQUEST_URI "/modules\.php\?op=modload&name=Messages&file=readpmsg&start=*(delete|insert|drop|do|alter|replace|truncate|update|create|rename|describe|select|union)[[/:space:|:space:]]+[A-Z|a-z|0-9|\*| ]+[[/:space:|:space:]](from|into|table|database|index|view|select)"
#PostNuke "show" Parameter SQL Injection Vulnerability
SecFilterSelective REQUEST_URI "modules/Downloads/dl-viewdownload\.php" chain
SecFilterSelective ARG_show "(select|grant|delete|insert|drop|do|alter|replace|truncate|update|create|rename|describe)[[/:space:|:space:]]+[A-Z|a-z|0-9|\*| |,]+[[/:space:|:space:]](from|into|table|database|index|view)"
#PostNuke Local file inclusion via GeSHi library
SecFilterSelective REQUEST_URI "/modules/pn_bbcode/pnincludes/contrib/example\.php"
#adodb sql injection attempt
SecFilterSelective REQUEST_URI "/includes/classes/adodb/server\.php"

## -- Binary execution --------------------
SecFilterSignatureAction "log,deny,msg:'Binary execution attack'"
SecFilterSelective "QUERY_STRING" "bin/(kill|ls|passwd|perl|chmod|wget|lynx|links|net(stat|cat)|who|whoami|id|cd|ld)"
SecFilterSelective "QUERY_STRING" "bin/(ba|a|z|c|k)?sh"

## -- /etc/password access --------------------
SecFilterSignatureAction "log,deny,msg:'/etc/password attack'"
SecFilter "/etc/(passwd|shadow)"

## End of modsecurity configuration ##

Da die meisten PN-User auch noch phpMyAdmin laufen haben, empfehlen sich noch die folgenden Regeln:

#phpMyAdmin Export.PHP File Disclosure Vulnerability
SecFilterSelective SCRIPT_FILENAME "export\.php$" chain
SecFilterSelective ARG_what "\.\."

#phpMyAdmin path vln
SecFilterSelective REQUEST_URI "/phpMyAdmin/css/phpmyadmin\.css\.php\?GLOBALS\[cfg\]\[ThemePath\]=(/|.*\.\./)"
SecFilterSelective REQUEST_URI "/css/phpmyadmin\.css\.php\?GLOBALS\[cfg\]\[ThemePath\]=/etc"

#phpMyAdmin convcharset Parameter Cross Site Scripting
SecFilterSelective REQUEST_URI "/phpmyadmin/index\.php\?pma_username=*&pma_password=*&server=.*&lang=.*&convcharset=.*((javascript|script|about|applet|activex|chrome)*\>|(http|https|ftp)\:/)"

#phpMyAdmin Cross-Site Scripting Vulnerabilities
SecFilterSelective ARG_HTTP_HOST "(<[[/:space:|:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[/:space:|:space:]]*>|onmouseover=|javascript\:)"
SecFilterSelective REQUEST_URI "libraries/auth/cookie\.auth\.lib\.php" chain
SecFilter "<[[/:space:|:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[/:space:|:space:]]*>"
SecFilterSelective REQUEST_URI "/error\.php" chain
SecFilterSelective ARG_error "<[[/:space:|:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[/:space:|:space:]]*>"

#phpMyAdmin "subform" Local File Inclusion Vulnerability
SecFilterSelective REQUEST_URI "/libraries/grab_globals\.lib\.php" chain
SecFilterSelective ARG_subform "(/|\.\.|(http|https|ftp)\:/)"
SecFilterSelective REQUEST_URI "/libraries/grab_globals\.lib\.php" chain
SecFilter "usesubform.*=.*&usesubform.*=.*&subform.*(/|\.\.|(http|https|ftp)\:/)"

#phpMyAdmin register_globals Emulation "import_blacklist" Manipulation
SecFilterSelective REQUEST_URI "/grab_globals\.php" chain
SecFilterSelective ARG_import_blacklist "(<[[/:space:|:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[/:space:|:space:]]*>|(http|https|ftp)\:/)"

suhosin

Nach eigenen Angaben ist Suhosin ein “fortschrittliches Schutzsystem für PHP Installationen und wurde erstellt um Server und Benutzer vor bekannten und unbekannten Problemen in PHP Applikationen und dem PHP Core selbst zu schützen”. Im Gegensatz zum früheren “Hardening-Patch” ist Suhosin nun “binary compatible” zur normalen PHP Installation und damit kompatibel zu Drittanbieter Erweiterungen wie dem ZendOptimizer. zikula.de setzt aktuell sowohl den Suhosin Patch als auch die Suhosin Extension im Livebetrieb ein. Wichtig: aufgrund des internen Session-Managements bei PostNuke müssen für suhosin in der php.ini zwei Konfigurationseinstellungen angepasst werden: suhosin.session.encrypt = 0 und suhosin.cookie.encrypt = 0