Deutsch

phpMyAdmin auf einem Linux-VPS installieren und absichern

3 min
VPS/VDS-Hosting

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_IP genannt

1. Option A: apt-Paket mit Apache installieren

Bash
apt 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:

Bash
phpenmod 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.

Bash
mariadb
SQL
CREATE 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:

Bash
SUFFIX=$(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:

Apache
1AuthType 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.

Bash
apache2ctl 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):

Bash
apt 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';
Bash
mkdir -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:

Nginx
1location ^~ /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}
Bash
nginx -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:

Bash
ssh -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

Bash
curl -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.

Bleiben Sie über die neuesten Angebote, Rabatte und Sonderaktionen informiert.

Aktionen ansehen

Wir verwenden Cookies

Wir verwenden Analyse-Cookies, um Ihre Erfahrung auf unserer Website zu verbessern. Es werden keine Daten an Dritte verkauft. Mehr erfahren Sie in unserer Datenschutzerklärung.