Veröffentlichung 10. Juli 2018 @ 18:03
Letzte Änderung 19. April 2021 @ 20:09
Übersicht
- Konfigurationen für mod_php und FPM
- Absicherung mit Scanner for PHP.ini Iniscan und PHP Secure Configuration Checker
- Anlage einer Default-Pool-Konfigurationsdatei statt Anpassung der php.ini für FPM für mehr Flexibilität
Voraussetzungen
Software
- Apache 2.4.18 #apache2 -v
- Composer 1.0.0-beta2 #composer –version
- Git 2.7.4 #git –version
- PHP 7.0.30 #php –version
- Ubuntu Server 16.04.04 LTS #lsb_release -a
Ordner und Dateien
- Installation /usr/share/iniscan, /usr/share/pcc
- Konfiguration /etc/php/7.0/apache2/php.ini, /etc/php/7.0/cli/php.ini, /etc/php/7.0/fpm/php.ini, /etc/php/7.0/fpm/pool.d/default.conf (/etc/php/7.0/fpm/pool.d/default.conf.disabled)
- Log /var/log/php7.0-fpm.log
- Systemd /lib/systemd/system/php7.0-fpm.service
PHP und Module FPM und MySQL installieren
apt install php7.0 php7.0-fpm php7.0-mysql #systemctl status php7.0-fpm.service
Zeitzone festlegen
Apache
... date.timezone = "Europe/Berlin"
Kommandozeile
... date.timezone = "Europe/Berlin"
FPM
... date.timezone = "Europe/Berlin"
Default-FPM-Pool-Konfigurationsdatei in Anlehnung an www.conf anlegen
[default] group = www-data listen = /run/php/php7.0-fpm-default.sock listen.group = www-data listen.owner = www-data pm = dynamic pm.max_children = 5 pm.max_spare_servers = 3 pm.min_spare_servers = 1 pm.start_servers = 2 user = www-data
PHP mit Scanner for PHP.ini Iniscan absichern
Composer installieren
apt install composer
Scanner for PHP.ini Iniscan in Verzeichnis /usr/share/iniscan herunterladen / aktualisieren
mkdir /usr/share/iniscan cd /usr/share/iniscan && composer require psecio/iniscan #cd /usr/share/iniscan && composer update psecio/iniscan #Update
php.ini-Datei für mod_php prüfen und anpassen
/usr/share/iniscan/vendor/bin/iniscan scan --path=/etc/php/7.0/apache2/php.ini ...
... ;;;Scanner for PHP.ini Iniscan ;Zugriff auf Remote-Dateien unterbinden, bei Bedarf in Apache-Website-Konfiguration freischalten allow_url_fopen = 0 ;sicherheitskritische PHP-Funktionen durch Erweiterung der ursprünglichen Liste ${disable_functions} deaktivieren, bei mod_php nur in php.ini möglich disable_functions = ${disable_functions}curl_exec,curl_multi_exec,exec,passthru,popen,proc_open,shell_exec,system, ;PHP-Zugriff auf bestimmte(s) Verzeichniss(e) beschränken, durch "nonexistent" Fehlermeldung provozieren, in Apache-Website-Konfiguration definieren open_basedir = nonexistent ;wie in Voreinstellung Server-Hostname als Cookie-Domain verwenden, bei Bedarf in PHP oder Apache-Website-Konfiguration ändern ;session.cookie_domain = ;Session-Cookies ausschließlich über HTTP-Protokoll zugänglich machen session.cookie_httponly = 1 ;Session-Cookies ausschließlich über sichere Verbindungen senden session.cookie_secure = 1 ;wie in Voreinstellung keinen Prüfsummen-Algorithmus zur Erzeugung der Session-ID festlegen, da ab PHP 7.1.0 nicht mehr verfügbar ;session.hash_function = ;wie in Voreinstellung "PHPSESSID" für Session-Cookie-Name "session.name" verwenden, bei Bedarf in PHP oder Apache-Website-Konfiguration ändern ;session.name = PHPSESSID ;ausschließlich Session-IDs akzeptieren, die initialisiert sind session.use_strict_mode = 1
php.ini-Datei für FPM prüfen und Default-FPM-Pool-Konfigurationdatei anpassen
/usr/share/iniscan/vendor/bin/iniscan scan --path=/etc/php/7.0/fpm/php.ini ...
... ;;;Scanner for PHP.ini Iniscan ;Zugriff auf Remote-Dateien unterbinden, bei Bedarf in separater FPM-Pool-Konfiguration freischalten php_admin_value[allow_url_fopen] = 0 ;sicherheitskritische PHP-Funktionen durch Erweiterung der ursprünglichen Liste disable_functions deaktivieren php_admin_value[disable_functions] = curl_exec,curl_multi_exec,exec,passthru,popen,proc_open,shell_exec,system, ;PHP-Zugriff auf bestimmte(s) Verzeichniss(e) beschränken, durch "nonexistent" Fehlermeldung provozieren, in separater FPM-Pool-Konfiguration definieren php_admin_value[open_basedir] = nonexistent ;wie in Voreinstellung Server-Hostname als Cookie-Domain verwenden, bei Bedarf in PHP oder separater FPM-Pool-Konfiguration ändern ;php_value[session.cookie_domain] = ;Session-Cookies ausschließlich über HTTP-Protokoll zugänglich machen php_admin_value[session.cookie_httponly] = 1 ;Session-Cookies ausschließlich über sichere Verbindungen senden php_admin_value[session.cookie_secure] = 1 ;wie in Voreinstellung keinen Prüfsummen-Algorithmus zur Erzeugung der Session-ID festlegen, da ab PHP 7.1.0 nicht mehr verfügbar ;php_admin_value[session.hash_function] = ;wie in Voreinstellung "PHPSESSID" für Session-Cookie-Name verwenden, bei Bedarf in PHP oder separater FPM-Pool-Konfiguration ändern ;php_value[session.name] = PHPSESSID ;ausschließlich Session-IDs akzeptieren, die initialisiert sind php_admin_value[session.use_strict_mode] = 1
PHP zusätzlich mit PHP Secure Configuration Checker absichern
Git installieren
apt install git
PHP Secure Configuration Checker in Verzeichnis /usr/share/pcc herunterladen / aktualisieren
git clone https://github.com/sektioneins/pcc.git /usr/share/pcc #git -C /usr/share/pcc pull origin master #Update
php.ini-Datei für mod_php prüfen und anpassen
php -c /etc/php/7.0/apache2/php.ini /usr/share/pcc/phpconfigcheck.php ...
... ;;;PHP Secure Configuration Checker ;assert()-Auswertung deaktivieren assert.active = 0 ;sicherheitskritische PHP-Klassen durch Erweiterung der ursprünglichen Liste ${disable_classes} deaktivieren, todo disable_classes = ${disable_classes} ;Datei-Uploads unterbinden, bei Bedarf in Apache-Website-Konfiguration freischalten file_uploads = 0 ;E-Mail-Header 'X-PHP-Originating-Script' unterdrücken mail.add_x_header = 0 ;wie in Voreinstellung maximale Laufzeit für PHP-Skript auf 30 s festlegen, Fehlalarm wegen "This directive is hardcoded to 0 for the CLI SAPI" in php.ini max_execution_time = 30 ;Upload-Verzeichnis festlegen, durch "nonexistent" Fehlermeldung provozieren, bei Bedarf in Apache-Website-Konfiguration definieren upload_tmp_dir = nonexistent
php.ini-Datei für FPM prüfen und Default-FPM-Pool-Konfigurationdatei anpassen
php -c /etc/php/7.0/fpm/php.ini /usr/share/pcc/phpconfigcheck.php ...
... ;;;PHP Secure Configuration Checker ;assert()-Auswertung deaktivieren php_admin_value[assert.active] = 0 ;sicherheitskritische PHP-Klassen durch Erweiterung der ursprünglichen Liste disable_classes deaktivieren, todo php_admin_value[disable_classes] = ;Datei-Uploads unterbinden, bei Bedarf in separater FPM-Pool-Konfiguration freischalten php_admin_value[file_uploads] = 0 ;E-Mail-Header 'X-PHP-Originating-Script' unterdrücken php_admin_value[mail.add_x_header] = 0 ;wie in Voreinstellung maximale Laufzeit für PHP-Skript auf 30 s festlegen, Fehlalarm wegen "This directive is hardcoded to 0 for the CLI SAPI" in php.ini php_admin_value[max_execution_time] = 30 ;Upload-Verzeichnis festlegen, durch "nonexistent" Fehlermeldung provozieren, bei Bedarf in separater FPM-Pool-Konfiguration definieren php_admin_value[upload_tmp_dir] = nonexistent
PHP-FPM und Apache neustarten
PHP-FPM-Konfiguration testen, PHP-FPM neustarten und Status abfragen
php-fpm7.0 --test systemctl reload php7.0-fpm systemctl status php7.0-fpm.service
Apache neustarten und Status abfragen
systemctl reload apache2 systemctl status apache2.service
[Optional] Default-FPM-Pool-Konfigurationdatei deaktivieren und PHP-FPM neustarten
mv /etc/php/7.0/fpm/pool.d/default.conf /etc/php/7.0/fpm/pool.d/default.conf.disabled systemctl reload php7.0-fpm
Quellen
https://getcomposer.org/
https://git-scm.com/docs
https://github.com/psecio/iniscan
https://github.com/sektioneins/pcc
http://manpages.ubuntu.com/manpages/xenial/man8/php-fpm7.0.8.html
https://secure.php.net/manual/de/ini.php
https://secure.php.net/manual/de/install.fpm.php