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