PhpSecInfo – Kurzanleitung

Veröffentlichung 15. Juli 2018 @ 14:12
Letzte Änderung 15. Juli 2021 @ 10:38

Überblick

  • Test der Ordnerzugriffsrechte, der aktivierten PHP-Funktionen, der PHP-Kern-Konfiguration und der Session-Einstellungen
  • Anpassung der php.ini-Datei für mod_php und der Default-Pool-Konfigurationsdatei für FPM
  • „Aktuelle“ Version aus Dezember 2016
  • Security through obscurity durch komplizierten Hostnamen und abweichenden HTTPS-Port
  • Wildcard-Zertifikat, damit Hostname nicht extern bekannt wird
  • (Zusätzliche) Absicherung über Apache-Basis-Authentifizierung mit kompliziertem Benutzernamen

Voraussetzungen

Netzwerk

  • Host GoqL6YYNukBQQnLHZmb1.example.com
  • htpasswd-Benutzer eByKKQBFhboZWZD68DAh
  • HTTPS-Port 42443

Software

  • Apache 2.4.18 #apache2 -v
  • Git 2.7.4 #git –version
  • PHP 7.0.30 #php –version
  • PhpSecInfo 2.0.2 #https://GoqL6YYNukBQQnLHZmb1.example.com:42443
  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Ordner und Dateien

  • Installation /usr/share/phpsecinfo
  • Konfiguration /etc/apache2/sites-available/phpsecinfo.conf, /etc/php/7.0/apache2/php.ini, /etc/php/7.0/fpm/pool.d/default.conf.disabled, /etc/php/7.0/fpm/pool.d/phpsecinfo.conf
  • Log /var/log/apache2/access-phpsecinfo.log, /var/log/apache2/error-phpsecinfo.log, /var/log/php7.0-fpm.log
  • Zertifikate und Schlüssel /etc/letsencrypt/live/example.com/*.pem

Git installieren

apt install git

PhpSecInfo in Verzeichnis /usr/share/phpsecinfo herunterladen / aktualisieren und Zugriffsrechte setzen

git clone https://github.com/bigdeej/PhpSecInfo.git /usr/share/phpsecinfo
#git -C /usr/share/phpsecinfo pull origin master #Update
chown --recursive www-data:www-data /usr/share/phpsecinfo

Virtuellen Host mit Basis-Authentifizierung einrichten

Hostnamen mit Passwortgenerator z. B. KeePass generieren

GoqL6YYNukBQQnLHZmb1

Benutzerdatei für Basis-Authentifizierung geschützter Website-Bereiche anlegen / ergänzen

Benutzernamen mit Passwortgenerator z. B. KeePass generieren

eByKKQBFhboZWZD68DAh

Benutzerdatei mit bcrypt-Passwort-Hash neu erstellen / ergänzen

htpasswd -B -c /etc/apache2/.htpasswd eByKKQBFhboZWZD68DAh
#htpasswd -B /etc/apache2/.htpasswd eByKKQBFhboZWZD68DAh

Apache-Konfigurationsdatei anlegen

<VirtualHost *:42443>
CustomLog ${APACHE_LOG_DIR}/access-phpsecinfo.log vhost_combined
DocumentRoot /usr/share/phpsecinfo
ErrorLog ${APACHE_LOG_DIR}/error-phpsecinfo.log
#Firefox Web-Entwickler:
Header always set Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'"
ServerAdmin webmaster@example.com
ServerName GoqL6YYNukBQQnLHZmb1.example.com
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLEngine on
<Directory /usr/share/phpsecinfo>
AuthBasicProvider file
AuthName "PhpSecInfo"
AuthType Basic
AuthUserFile /etc/apache2/.htpasswd
php_admin_value open_basedir /usr/share/phpsecinfo/
Require valid-user
</Directory>
</VirtualHost>

Konfiguration aktivieren

a2ensite phpsecinfo.conf

[Optional] FPM-Pool-Konfiguration aus Default-Konfiguration erstellen und virtuellen Host anpassen

FPM-Konfigurationsdatei anlegen

cp /etc/php/7.0/fpm/pool.d/default.conf.disabled /etc/php/7.0/fpm/pool.d/phpsecinfo.conf
;[default]
[phpsecinfo]
...
;listen = /run/php/php7.0-fpm-default.sock
listen = /run/php/php7.0-fpm-phpsecinfo.sock
...
;php_admin_value[open_basedir] = nonexistent
php_admin_value[open_basedir] = /usr/share/phpsecinfo/
...

Konfiguration testen und PHP-FPM neustarten

php-fpm7.0 --test
systemctl reload php7.0-fpm
#systemctl status php7.0-fpm.service

Apache-Konfigurationsdatei modifizieren

<VirtualHost *:42443>
...
<Directory /usr/share/phpsecinfo>
...
#php_admin_value open_basedir /usr/share/phpsecinfo/
...
</Directory>
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:unix:/run/php/php7.0-fpm-phpsecinfo.sock|fcgi://localhost/"
</If>
</FilesMatch>
<Proxy "fcgi://localhost/" enablereuse=on max=10>
</Proxy>
</VirtualHost>

Konfiguration testen, Apache neustarten und Status abfragen

apache2ctl configtest
systemctl reload apache2
systemctl status apache2.service

PHP-Einstellungen (ggf. mehrfach) prüfen und anpassen

PhpSecInfo aufrufen

https://GoqL6YYNukBQQnLHZmb1.example.com:42443
...

php.ini-Datei ändern

...
;;;PhpSecInfo
disable_functions = ${disable_functions}apache_setenv,
disable_functions = ${disable_functions}escapeshellarg,escapeshellcmd,
disable_functions = ${disable_functions}ftp_connect,ftp_exec,ftp_get,ftp_login,ftp_nb_fput,ftp_put,ftp_raw,ftp_rawlist,
disable_functions = ${disable_functions}highlight_file,
disable_functions = ${disable_functions}ini_alter,ini_get_all,ini_restore,
disable_functions = ${disable_functions}openlog,php_uname,
disable_functions = ${disable_functions}posix_getpwuid,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,posix_uname,
disable_functions = ${disable_functions}proc_close,proc_get_status,proc_nice,proc_terminate,
disable_functions = ${disable_functions}syslog,

[Optional] FPM-Pool-Konfiguration ändern, Konfiguration testen und PHP-FPM neustarten

...
;;;PhpSecInfo
php_admin_value[disable_functions] = apache_setenv,
php_admin_value[disable_functions] = escapeshellarg,escapeshellcmd,
php_admin_value[disable_functions] = ftp_connect,ftp_exec,ftp_get,ftp_login,ftp_nb_fput,ftp_put,ftp_raw,ftp_rawlist,
php_admin_value[disable_functions] = highlight_file,
php_admin_value[disable_functions] = ini_alter,ini_get_all,ini_restore,
php_admin_value[disable_functions] = openlog,php_uname,
php_admin_value[disable_functions] = posix_getpwuid,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,posix_uname,
php_admin_value[disable_functions] = proc_close,proc_get_status,proc_nice,proc_terminate,
php_admin_value[disable_functions] = syslog,
php-fpm7.0 --test
systemctl reload php7.0-fpm
#systemctl status php7.0-fpm.service

[Optional] Default-FPM-Pool-Konfiguration ändern

...
;;;PhpSecInfo
php_admin_value[disable_functions] = apache_setenv,
php_admin_value[disable_functions] = escapeshellarg,escapeshellcmd,
php_admin_value[disable_functions] = ftp_connect,ftp_exec,ftp_get,ftp_login,ftp_nb_fput,ftp_put,ftp_raw,ftp_rawlist,
php_admin_value[disable_functions] = highlight_file,
php_admin_value[disable_functions] = ini_alter,ini_get_all,ini_restore,
php_admin_value[disable_functions] = openlog,php_uname,
php_admin_value[disable_functions] = posix_getpwuid,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,posix_uname,
php_admin_value[disable_functions] = proc_close,proc_get_status,proc_nice,proc_terminate,
php_admin_value[disable_functions] = syslog,

Apache neustarten

systemctl reload apache2

Zur Sicherheit Konfiguration deaktivieren und Apache neustarten

a2dissite phpsecinfo.conf
systemctl reload apache2

Quellen

https://git-scm.com/docs
https://github.com/bigdeej/PhpSecInfo
https://httpd.apache.org/
https://httpd.apache.org/docs/2.4/howto/auth.html
https://keepass.info/
http://manpages.ubuntu.com/manpages/xenial/man8/php-fpm7.0.8.html
https://secure.php.net/manual/de/install.fpm.php
https://wiki.apache.org/httpd/PHP-FPM