PHP – Kurzanleitung

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