phpMyAdmin – Kurzanleitung

Veröffentlichung 15. Juli 2018 @ 19:30
Letzte Änderung 15. Juli 2018 @ 19:30

Überblick

  • Weboberfläche für MySQL-Datenbanken
  • Anpassung der php.ini-Datei für mod_php und der Default-Pool-Konfigurationsdatei für FPM
  • Version aus Januar 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 GVkGRtuRO78oB75zxGT5.example.com
  • htpasswd-Benutzer X26gL3z71CeFOcUkd9Zm
  • MySQL-Datenbank phpmyadmin
  • MySQL-Benutzer pma
  • HTTPS-Port 42443

Software

  • Apache 2.4.18 #apache2 -v
  • MySQL 5.7.22 #mysql –version
  • PHP 7.0.30 #php –version
  • phpMyAdmin 4.5.4.1 #https://GVkGRtuRO78oB75zxGT5.example.com:42443
  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Ordner und Dateien

  • Installation /usr/share/phpmyadmin, /var/lib/phpmyadmin
  • Konfiguration /etc/apache2/sites-available/phpmyadmin.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/phpmyadmin.conf, /etc/phpmyadmin/
  • Log /var/log/apache2/access-phpmyadmin.log, /var/log/apache2/error-phpmyadmin.log, /var/log/php7.0-fpm.log
  • Zertifikate und Schlüssel /etc/letsencrypt/live/example.com/*.pem

phpMyAdmin installieren, Setup-Dateien löschen und Zugriffsrechte setzen

apt install phpmyadmin
  Webserver, die automatisch konfiguriert werden sollen: keiner
  Konfigurieren der Datenbank für phpmyadmin mit dbconfig-common? No
rm --recursive /usr/share/phpmyadmin/setup
chown --recursive www-data:www-data /usr/share/phpmyadmin

Konfigurationsspeicher einrichten

mysql --password --user=root
source /usr/share/phpmyadmin/sql/create_tables.sql
GRANT SELECT, INSERT, UPDATE, DELETE ON phpmyadmin.* TO 'pma'@'localhost' IDENTIFIED BY '***';

Virtuellen Host mit Basis-Authentifizierung einrichten

Hostnamen mit Passwortgenerator z. B. KeePass generieren

GVkGRtuRO78oB75zxGT5

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

Benutzernamen mit Passwortgenerator z. B. KeePass generieren

X26gL3z71CeFOcUkd9Zm

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

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

Apache-Konfigurationsdatei anlegen

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

Konfiguration aktivieren

a2ensite phpmyadmin.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/phpmyadmin.conf
;[default]
[phpmyadmin]
...
;listen = /run/php/php7.0-fpm-default.sock
listen = /run/php/php7.0-fpm-phpmyadmin.sock
...
;/var/log/apache2/error-phpmyadmin.log + GVkGRtuRO78oB75zxGT5.example.com:
;php_admin_value[open_basedir] = nonexistent
php_admin_value[open_basedir] = /etc/phpmyadmin/:/usr/share/doc/phpmyadmin/:/usr/share/php/:/usr/share/phpmyadmin/:/var/lib/php/sessions/:/var/lib/phpmyadmin/
...

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/phpmyadmin>
    ...
    #php_admin_value open_basedir /etc/phpmyadmin/:/usr/share/doc/phpmyadmin/:/usr/share/php/:/usr/share/phpmyadmin/:/var/lib/php/sessions/:/var/lib/phpmyadmin
    ...
  </Directory>
  <FilesMatch "\.php$">
    <If "-f %{REQUEST_FILENAME}">
      SetHandler "proxy:unix:/run/php/php7.0-fpm-phpmyadmin.sock|fcgi://localhost/"
    </If>
  </FilesMatch>
  <Proxy "fcgi://localhost/" enablereuse=on max=10>
  </Proxy>
</VirtualHost>

PHP-Funktion php_uname freischalten

php.ini-Datei ändern

...
;phpMyAdmin nutzt php_uname
;disable_functions = ${disable_functions}openlog,php_uname,
disable_functions = ${disable_functions}openlog,
...

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

...
;phpMyAdmin nutzt php_uname
;php_admin_value[disable_functions] = openlog,php_uname,
php_admin_value[disable_functions] = openlog,
...
php-fpm7.0 --test
systemctl reload php7.0-fpm
#systemctl status php7.0-fpm.service

Konfiguration testen, Apache neustarten und Status abfragen

apache2ctl configtest
systemctl reload apache2
systemctl status apache2.service

[Optional] Zur Sicherheit Konfiguration deaktivieren und Apache neustarten

a2dissite phpmyadmin.conf
systemctl reload apache2

Quellen

https://docs.phpmyadmin.net/en/latest/setup.html
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
https://www.phpmyadmin.net

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert