💡 Hinweis: Dieses Tutorial setzt voraus, dass du einen normalen Benutzer mit sudo-Rechten verwendest — wie im Tutorial Debian 13 Server absichern beschrieben.

Was ist phpMyAdmin?

phpMyAdmin ist ein kostenloses, webbasiertes Tool zur Verwaltung von MySQL- und MariaDB-Datenbanken. Statt SQL-Befehle direkt in der Kommandozeile einzutippen, bekommst du eine übersichtliche Browser-Oberfläche, in der du Datenbanken, Tabellen, Benutzer und Abfragen komfortabel verwalten kannst.

Gerade auf einem Server, auf dem du WordPress, Nextcloud oder andere Webanwendungen betreibst, ist phpMyAdmin extrem praktisch: Du kannst schnell in die Datenbank schauen, Einträge bearbeiten, Backups (Dumps) erstellen oder Benutzerrechte anpassen — alles über den Browser.

Allerdings ist phpMyAdmin auch ein beliebtes Angriffsziel. Wer es öffentlich und ungeschützt ins Netz stellt, lädt Bots und Angreifer quasi ein. Deshalb zeige ich dir in diesem Guide nicht nur die Installation, sondern vor allem, wie du phpMyAdmin richtig absicherst.

Voraussetzungen

Bevor du loslegst, sollten folgende Komponenten auf deinem Debian 13 Server bereits laufen:

Außerdem brauchst du einige PHP-Erweiterungen, die phpMyAdmin benötigt. Die installieren wir im nächsten Schritt gleich mit.

phpMyAdmin installieren

Es gibt zwei Wege, phpMyAdmin auf Debian 13 zu installieren: über das Paketmanagement (apt) oder manuell. Beide haben Vor- und Nachteile.

Methode 1: Installation über apt

Der einfachste Weg — Debian liefert phpMyAdmin in den offiziellen Repositories mit:

sudo apt update
sudo apt install phpmyadmin

Während der Installation wirst du gefragt, welchen Webserver du nutzt. Da Nginx nicht in der Liste steht, wähle keine Option aus und bestätige einfach mit Tab → OK. Die Konfiguration für Nginx machen wir manuell.

Bei der Frage nach dbconfig-common wähle Ja — das richtet die phpMyAdmin-eigene Datenbank automatisch ein.

Die apt-Version hat den Vorteil, dass sie über Sicherheitsupdates automatisch aktualisiert wird. Der Nachteil: Sie ist manchmal etwas älter als die aktuellste Version.

Methode 2: Manuelle Installation (aktuellste Version)

Wenn du die neueste Version haben willst, lädst du phpMyAdmin direkt von der offiziellen Website herunter:

# Benötigte PHP-Erweiterungen installieren
sudo apt update
sudo apt install php-mbstring php-zip php-gd php-json php-curl php-mysql php-xml php-bz2 php-intl

# Neueste Version herunterladen
cd /tmp
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz

# Signatur prüfen (optional aber empfohlen)
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz.asc
gpg --keyserver keyserver.ubuntu.com --recv-keys 3D06A59ECE730EB71B511C17CE752F178259BD92
gpg --verify phpMyAdmin-latest-all-languages.tar.gz.asc

# Entpacken und verschieben
tar xzf phpMyAdmin-latest-all-languages.tar.gz
sudo mv phpMyAdmin-*-all-languages /usr/share/phpmyadmin

# tmp-Verzeichnis für phpMyAdmin erstellen
sudo mkdir -p /var/lib/phpmyadmin/tmp
sudo chown -R www-data:www-data /var/lib/phpmyadmin

Nach der Installation starte PHP-FPM neu, damit die neuen Erweiterungen geladen werden:

sudo systemctl restart php8.4-fpm

Nginx Server-Block konfigurieren

Nginx weiß noch nichts von phpMyAdmin. Du hast zwei Optionen: phpMyAdmin als Location-Block in eine bestehende Server-Konfiguration einbinden oder eine eigene Subdomain (z.B. db.deinedomain.de) dafür anlegen.

Option A: Als Location-Block (einfach)

Füge den folgenden Block in deine bestehende Nginx-Server-Konfiguration ein. Wichtig: Wir verwenden bewusst nicht /phpmyadmin als Pfad — warum, erfährst du im Abschnitt zur Absicherung.

sudo nano /etc/nginx/sites-available/deinedomain.de

Innerhalb des server { }-Blocks fügst du hinzu:

location /geheim-db/ {
    alias /usr/share/phpmyadmin/;
    index index.php;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
}

Option B: Eigene Subdomain

Für noch bessere Trennung kannst du eine eigene Subdomain anlegen. Erstelle zuerst einen DNS-A-Record für db.deinedomain.de, der auf deinen Server zeigt. Dann:

sudo nano /etc/nginx/sites-available/db.deinedomain.de
server {
    listen 80;
    server_name db.deinedomain.de;
    root /usr/share/phpmyadmin;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }

    # Sensible Verzeichnisse blockieren
    location ~ /\. {
        deny all;
    }
}

Aktiviere den Server-Block und teste die Konfiguration:

sudo ln -s /etc/nginx/sites-available/db.deinedomain.de /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

SSL mit Let’s Encrypt

phpMyAdmin überträgt Datenbank-Zugangsdaten — ohne SSL wären diese im Klartext lesbar. HTTPS ist also Pflicht.

Wenn du Certbot bereits installiert hast (was du hoffentlich hast!), reicht ein Befehl:

sudo certbot --nginx -d db.deinedomain.de

Certbot passt deine Nginx-Konfiguration automatisch an und richtet die Zertifikatserneuerung ein. Eine ausführliche Anleitung findest du im Tutorial Let’s Encrypt SSL auf Debian 13 mit Nginx einrichten.

phpMyAdmin absichern

Jetzt kommt der wichtigste Teil. Eine nackte phpMyAdmin-Installation im Internet ist wie eine offene Haustür mit einem Schild „Einbrecher willkommen“. Hier sind die Maßnahmen, die du umsetzen solltest:

Zugriff per IP beschränken

Die effektivste Maßnahme: Erlaube den Zugriff auf phpMyAdmin nur von bestimmten IP-Adressen. In deinem Nginx-Location- oder Server-Block:

location /geheim-db/ {
    alias /usr/share/phpmyadmin/;
    index index.php;

    # Nur von deiner IP erlauben
    allow 203.0.113.50;    # Deine feste IP
    allow 10.0.0.0/24;     # Lokales Netz / VPN
    deny all;              # Alles andere blockieren

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    }
}

Tipp: Wenn du keine feste IP hast, nutze einen VPN-Tunnel (z.B. WireGuard) und erlaube nur die VPN-IP.

Eigenen Datenbank-User anlegen

Melde dich niemals mit dem root-User über phpMyAdmin an! Erstelle stattdessen einen eigenen Benutzer mit eingeschränkten Rechten:

sudo mariadb
CREATE USER 'pma_admin'@'localhost' IDENTIFIED BY 'SICHERES_PASSWORT_HIER';

-- Rechte nur auf bestimmte Datenbanken vergeben:
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'pma_admin'@'localhost';
GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'pma_admin'@'localhost';

-- Oder für alle Datenbanken (weniger sicher):
-- GRANT ALL PRIVILEGES ON *.* TO 'pma_admin'@'localhost';

FLUSH PRIVILEGES;
EXIT;

So begrenzt du den Schaden, falls der Account kompromittiert wird: Der Angreifer sieht nur die Datenbanken, für die der Benutzer Rechte hat.

HTTP Basic Auth als zweite Schicht

Eine zusätzliche Passwort-Abfrage direkt auf Nginx-Ebene — bevor phpMyAdmin überhaupt geladen wird. Das stoppt die meisten automatisierten Angriffe sofort:

# htpasswd-Datei erstellen (apache2-utils muss installiert sein)
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd pma_user

Dann in deinem Nginx-Location-Block:

location /geheim-db/ {
    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;

    alias /usr/share/phpmyadmin/;
    index index.php;
    # ... rest der Konfiguration
}

Damit muss ein Angreifer erst das HTTP-Basic-Auth-Passwort knacken, dann noch das phpMyAdmin-Login. Zwei Hürden statt einer.

URL ändern — nicht /phpmyadmin!

Bots scannen das Internet automatisch nach /phpmyadmin, /pma, /myadmin und ähnlichen Standard-Pfaden. Wenn du einen ungewöhnlichen Pfad wählst (wie /geheim-db/ in unseren Beispielen), fallen 99% der automatisierten Angriffe direkt weg.

Das ist keine echte Sicherheitsmaßnahme im klassischen Sinne („Security through Obscurity“), aber es reduziert das Grundrauschen erheblich und macht dich zu einem weniger attraktiven Ziel.

Wähle einen Pfad, den du dir merken kannst, aber den kein Bot erraten wird. Zum Beispiel:

  • /db-verwaltung-7x9/
  • /mein-pma-zugang/
  • /admin-db-42/

fail2ban für phpMyAdmin einrichten

fail2ban sperrt IP-Adressen automatisch nach zu vielen fehlgeschlagenen Login-Versuchen. Erstelle zuerst einen Filter:

sudo nano /etc/fail2ban/filter.d/phpmyadmin-auth.conf
[Definition]
failregex = user denied.*client: <HOST>
            no user/password.*client: <HOST>
ignoreregex =

Wenn du HTTP Basic Auth vor phpMyAdmin geschaltet hast, greift der Nginx-Auth-Filter. Erstelle zusätzlich ein Jail dafür:

sudo nano /etc/fail2ban/jail.local

Füge folgenden Abschnitt hinzu:

[nginx-http-auth]
enabled = true
port    = http,https
filter  = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime  = 3600
findtime = 600

Starte fail2ban neu:

sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-http-auth

Nach 3 fehlgeschlagenen Versuchen innerhalb von 10 Minuten wird die IP für eine Stunde gesperrt.

Konfiguration: config.inc.php

Die zentrale Konfigurationsdatei von phpMyAdmin ist config.inc.php. Bei der manuellen Installation musst du sie aus der Vorlage erstellen:

sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php
sudo nano /usr/share/phpmyadmin/config.inc.php

Hier die wichtigsten Einstellungen:

Blowfish Secret (Pflicht!)

Dieses Secret wird für die Cookie-basierte Authentifizierung benötigt. Es muss genau 32 Zeichen lang sein:

$cfg['blowfish_secret'] = 'HIER_32_ZEICHEN_ZUFALLS_STRING!!';

Generiere einen zufälligen String:

openssl rand -base64 32 | head -c 32; echo

Temporäres Verzeichnis

$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';

Root-Login verbieten

$cfg['Servers'][$i]['AllowRoot'] = false;

Weitere nützliche Einstellungen

// Nur bestimmte Benutzer erlauben
$cfg['Servers'][$i]['AllowDeny']['order'] = 'deny,allow';
$cfg['Servers'][$i]['AllowDeny']['rules'] = [
    'deny % from all',
    'allow pma_admin from all',
];

// Session-Timeout (in Sekunden, Standard: 1440 = 24 Min)
$cfg['LoginCookieValidity'] = 1800;

// HTTPS erzwingen
$cfg['ForceSSL'] = true;

// Upload-Limit für Imports erhöhen
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';

Troubleshooting

Hier die häufigsten Probleme und ihre Lösungen:

403 Forbidden

Meistens ein Berechtigungsproblem. Prüfe:

# Berechtigungen prüfen
ls -la /usr/share/phpmyadmin/

# Falls nötig, Berechtigungen korrigieren
sudo chown -R root:root /usr/share/phpmyadmin
sudo find /usr/share/phpmyadmin -type d -exec chmod 755 {} \;
sudo find /usr/share/phpmyadmin -type f -exec chmod 644 {} \;

Leere Seite oder 502 Bad Gateway

PHP-FPM läuft nicht oder die Socket-Verbindung stimmt nicht:

# PHP-FPM Status prüfen
sudo systemctl status php8.4-fpm

# Socket vorhanden?
ls -la /run/php/php8.4-fpm.sock

# Nginx Error-Log prüfen
sudo tail -20 /var/log/nginx/error.log

Fehlende PHP-Erweiterungen

phpMyAdmin zeigt Warnungen auf der Startseite, wenn Erweiterungen fehlen. Installiere alle empfohlenen:

sudo apt install php-mbstring php-zip php-gd php-json php-curl php-mysql php-xml php-bz2 php-intl
sudo systemctl restart php8.4-fpm

Blowfish Secret Fehler

Wenn du „The configuration file now needs a secret passphrase“ siehst, hast du den blowfish_secret in der config.inc.php nicht gesetzt. Siehe den Abschnitt zur Konfiguration oben.

Login funktioniert nicht (Access denied)

Prüfe, ob der Benutzer sich über die Kommandozeile anmelden kann:

sudo mariadb -u pma_admin -p

Falls nicht, prüfe das Authentifizierungs-Plugin:

sudo mariadb -e "SELECT user, host, plugin FROM mysql.user WHERE user='pma_admin';"

Der Benutzer sollte mysql_native_password als Plugin verwenden, nicht unix_socket.

Zusammenfassung & Checkliste

Du hast phpMyAdmin auf deinem Debian 13 Server installiert und abgesichert. Hier nochmal die Checkliste zum Abhaken:

  • ✅ phpMyAdmin installiert (apt oder manuell)
  • ✅ Nginx Server-Block konfiguriert
  • ✅ SSL/HTTPS mit Let’s Encrypt aktiv
  • ✅ URL geändert (kein /phpmyadmin!)
  • ✅ IP-basierter Zugriff eingeschränkt
  • ✅ Eigener DB-User (kein root!)
  • ✅ HTTP Basic Auth als zweite Schicht
  • ✅ fail2ban Jail aktiv
  • ✅ config.inc.php: blowfish_secret gesetzt
  • ✅ config.inc.php: Root-Login deaktiviert
  • ✅ config.inc.php: ForceSSL aktiviert

phpMyAdmin ist ein mächtiges Werkzeug, aber eben auch ein beliebtes Angriffsziel. Mit den hier gezeigten Maßnahmen machst du es Angreifern so schwer wie möglich. Im Idealfall kombinierst du mehrere Schichten: IP-Beschränkung + HTTP Basic Auth + eigener DB-User + fail2ban.

Noch besser: Wenn du phpMyAdmin nur gelegentlich brauchst, deaktiviere den Nginx-Server-Block einfach, wenn du ihn nicht nutzt:

# Deaktivieren
sudo rm /etc/nginx/sites-enabled/db.deinedomain.de
sudo systemctl reload nginx

# Bei Bedarf wieder aktivieren
sudo ln -s /etc/nginx/sites-available/db.deinedomain.de /etc/nginx/sites-enabled/
sudo systemctl reload nginx

So ist phpMyAdmin nur online, wenn du es wirklich brauchst — die sicherste Konfiguration überhaupt. 🔒