phpMyAdmin ist eine praktische Weboberfläche für MariaDB und MySQL und zugleich eine der am häufigsten gescannten URLs im Internet. Diese Anleitung zeigt zwei Installationen auf Ihrem VPS Linux Infrawire, das apt-Paket mit Apache und eine manuelle Installation hinter Nginx, und anschließend die Maßnahmen, die Bots fernhalten.
📋 Voraussetzungen
- Ein VPS mit Ubuntu 24.04 oder Debian 12 und root- oder
sudo-Zugang (IP und Root-Passwort finden Sie in Ihrem Kundenbereich) - Ein funktionierender LAMP-Stack (Option A) oder LEMP-Stack (Option B) mit MariaDB
- Ihre eigene öffentliche IP, im Folgenden
ADMIN_IPgenannt
1. Option A: apt-Paket mit Apache installieren
Bashapt update apt install -y phpmyadmin php-mbstring php-zip php-gd php-curl
Wählen Sie im Installer apache2 mit der Leertaste aus (ein Sternchen muss erscheinen), antworten Sie dann mit „Ja“, um die Datenbank mit dbconfig-common zu konfigurieren, und vergeben Sie ein Passwort für das interne phpMyAdmin-Konto. Laden Sie danach Apache neu:
Bashphpenmod mbstring systemctl reload apache2
phpMyAdmin ist jetzt unter http://VPS_IP/phpmyadmin erreichbar.
2. Eigenen Datenbankbenutzer anlegen
Melden Sie sich nie als root an. Unter Ubuntu und Debian nutzt root bei MariaDB die unix_socket-Authentifizierung, und phpMyAdmin lehnt ihn ohnehin ab: Lassen Sie das so und legen Sie ein normales Konto an.
Bashmariadb
SQLCREATE USER 'pmauser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; GRANT ALL PRIVILEGES ON appdb.* TO 'pmauser'@'localhost'; FLUSH PRIVILEGES; EXIT;
Vergeben Sie Rechte nur für die Datenbanken, die der Benutzer wirklich verwaltet. Aktivieren Sie AllowNoPassword nicht in der Konfiguration.
3. URL verstecken und Authentifizierung hinzufügen (Apache)
Ersetzen Sie den Standard-Alias durch einen zufälligen und erstellen Sie eine Passwortdatei:
BashSUFFIX=$(openssl rand -hex 6); echo "pma-$SUFFIX" sed -i "s#Alias /phpmyadmin#Alias /pma-$SUFFIX#" /etc/phpmyadmin/apache.conf htpasswd -c /etc/phpmyadmin/.htpasswd USER
Fügen Sie dann diese Zeilen in den vorhandenen Block <Directory /usr/share/phpmyadmin> in /etc/phpmyadmin/apache.conf ein:
Apache1AuthType Basic 2AuthName 'Restricted area' 3AuthUserFile /etc/phpmyadmin/.htpasswd 4<RequireAll> 5 Require valid-user 6 Require ip ADMIN_IP 7</RequireAll>
Ohne <RequireAll> würde Apache eine der beiden Bedingungen genügen lassen; mit dem Block sind Passwort und IP beide erforderlich.
Bashapache2ctl configtest && systemctl reload apache2
4. Option B: manuelle Installation hinter Nginx
Installieren Sie die Abhängigkeiten und laden Sie dann die aktuelle Version von der offiziellen phpMyAdmin-Website herunter (ersetzen Sie VERSION durch die aktuelle Nummer):
Bashapt install -y nginx php-fpm php-mysql php-mbstring php-xml php-zip php-gd php-curl apache2-utils cd /tmp wget https://files.phpmyadmin.net/phpMyAdmin/VERSION/phpMyAdmin-VERSION-all-languages.tar.gz tar xzf phpMyAdmin-VERSION-all-languages.tar.gz mkdir -p /var/www/pma mv phpMyAdmin-VERSION-all-languages /var/www/pma/pma-SECRET cd /var/www/pma/pma-SECRET cp config.sample.inc.php config.inc.php openssl rand -hex 16
Ersetzen Sie pma-SECRET durch einen zufälligen Namen. Bearbeiten Sie config.inc.php und tragen Sie den erzeugten Wert (32 Zeichen) als Secret ein:
PHP$cfg['blowfish_secret'] = 'RANDOM_32_CHARS'; $cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';
Bashmkdir -p /var/lib/phpmyadmin/tmp chown www-data:www-data /var/lib/phpmyadmin/tmp chmod 700 /var/lib/phpmyadmin/tmp chown -R root:www-data /var/www/pma chmod 640 /var/www/pma/pma-SECRET/config.inc.php htpasswd -c /etc/nginx/.htpasswd USER
Fügen Sie diesen Block in den server { ... } Ihrer Site ein. Unter Debian 12 heißt der Socket php8.2-fpm.sock statt php8.3-fpm.sock:
Nginx1location ^~ /pma-SECRET/ { 2 allow ADMIN_IP; 3 deny all; 4 auth_basic 'Restricted area'; 5 auth_basic_user_file /etc/nginx/.htpasswd; 6 root /var/www/pma; 7 index index.php; 8 9 location ~ \.php$ { 10 include snippets/fastcgi-php.conf; 11 fastcgi_pass unix:/run/php/php8.3-fpm.sock; 12 } 13}
Bashnginx -t && systemctl reload nginx
5. Die sicherste Variante: ein SSH-Tunnel
Wenn Sie keinerlei öffentliche Erreichbarkeit wollen, lassen Sie die Oberfläche nur vom VPS selbst erreichbar und öffnen Sie von Ihrem Rechner aus einen Tunnel:
Bashssh -L 8080:127.0.0.1:80 USER@VPS_IP
Solange die Sitzung offen ist, rufen Sie http://127.0.0.1:8080/pma-SECRET/ auf. Beschränken Sie bei Apache den Block auf Require local statt Require ip ADMIN_IP; bei Nginx verwenden Sie allow 127.0.0.1;. Das löst auch das Problem einer wechselnden privaten IP.
6. Schutz überprüfen
Bashcurl -sI http://VPS_IP/phpmyadmin | head -n 1 curl -sI http://VPS_IP/pma-SECRET/ | head -n 1
Die erste Anfrage muss 404 liefern. Die zweite liefert 403 von jeder anderen IP als ADMIN_IP und 401 von Ihrer, bis Sie das Basic-Auth-Passwort angeben. Betreiben Sie phpMyAdmin außerdem nur über HTTPS, sonst reisen die Passwörter im Klartext.
🛠️ Fehlerbehebung
404 Not Found. Alias oder location-Name stimmen nicht mit der eingegebenen URL überein, oder der Webserver wurde nicht neu geladen.
403 Forbidden für Sie selbst. Ihre öffentliche IP hat sich geändert. Aktualisieren Sie ADMIN_IP oder wechseln Sie zum SSH-Tunnel.
„The mbstring extension is missing“ oder leere Seite. Installieren Sie php-mbstring und führen Sie phpenmod mbstring (Apache) aus oder starten Sie php8.3-fpm (Nginx) neu.
Access denied für root. Das ist erwartet und gewollt. Melden Sie sich mit dem in Schritt 2 angelegten Benutzer an.
🎉 phpMyAdmin ist installiert, versteckt und eingeschränkt: Nur Sie erreichen Ihre Datenbanken.