phpMyAdmin mit Nginx auf Debian 13 installieren und absichern
phpMyAdmin bietet eine Weboberfläche, mit der Sie Ihre MariaDB- oder MySQL-Datenbanken ohne SQL-Befehle verwalten. Diese Anleitung installiert phpMyAdmin hinter Nginx auf Debian 13, mit HTTPS, eingeschränktem Zugang und Schutz vor Brute-Force-Angriffen. Ungeschützt lockt phpMyAdmin schnell die Bots an, die das Netz durchsuchen.
Sie brauchen einen VPS mit Debian 13 und sudo-Zugriff sowie für HTTPS eine Subdomain, die auf seine IP zeigt, zum Beispiel pma.example.com.
Debian 13 vorbereiten
Aktualisieren Sie das System und starten Sie neu, falls sich der Kernel geändert hat.
sudo apt update && sudo apt -y full-upgrade
sudo reboot
Installieren Sie Nginx, PHP-FPM und die Erweiterungen, die phpMyAdmin braucht. Debian 13 liefert PHP 8.4.
sudo apt install -y nginx php-fpm php-cli php-mbstring php-xml php-zip php-curl php-mysql php-gd php-intl php-bcmath
sudo apt install -y php-imagick php-apcu
Prüfen Sie die PHP-Version und den Socket von PHP-FPM. Beides brauchen Sie in der Nginx-Konfiguration.
php -v
ls -l /run/php/ | grep fpm
# Unter Debian 13 heißt der Socket php8.4-fpm.sock
Die Anleitung Nginx und PHP-FPM auf einem Linux-VPS installieren beschreibt diesen Stack und seine Einstellungen.
MariaDB installieren und absichern
sudo apt install -y mariadb-server mariadb-client
sudo mariadb-secure-installation
Unter Debian 13 heißt der Assistent mariadb-secure-installation. Der alte Name mysql_secure_installation existiert nur, wenn das Paket mariadb-client-compat installiert ist. Beantworten Sie die Fragen so.
Behalten Sie die Anmeldung von root über den Unix-Socket. Das SQL-Konto root ist dann nur mit
sudoauf dem VPS erreichbar.Entfernen Sie die anonymen Benutzer.
Verbieten Sie die Anmeldung von root aus der Ferne.
Löschen Sie die Testdatenbank und laden Sie die Rechte neu.
Einen eigenen Benutzer anlegen
Melden Sie sich nicht als root bei phpMyAdmin an. Legen Sie ein eigenes Administratorkonto an. Öffnen Sie die SQL-Shell.
sudo mariadb
Geben Sie dann diese Abfragen mit Ihrem eigenen Passwort ein.
CREATE USER 'pma_admin'@'localhost' IDENTIFIED BY 'StrongPassword_ChangeMe';
GRANT ALL PRIVILEGES ON *.* TO 'pma_admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
Mit diesem Konto melden Sie sich bei phpMyAdmin an.
phpMyAdmin installieren
Mit apt
Das Paket von Debian 13 ist am einfachsten zu pflegen, da es den Systemupdates folgt.
sudo apt install -y phpmyadmin
Kreuzen Sie bei der Frage nach dem Webserver nichts an. Nginx richten Sie weiter unten ein. Bestätigen Sie dbconfig-common und wählen Sie ein Passwort für den internen Benutzer pma. Die Dateien landen in /usr/share/phpmyadmin, die Konfiguration in /etc/phpmyadmin/config.inc.php.
Mit dem offiziellen Archiv
Das Archiv liefert die neueste auf phpmyadmin.net veröffentlichte Version. Updates spielen Sie selbst ein.
sudo mkdir -p /var/www/pma && cd /var/www/pma
sudo wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
sudo tar xzf phpMyAdmin-*-all-languages.tar.gz
sudo mv phpMyAdmin-*-all-languages phpmyadmin
sudo chown -R www-data:www-data /var/www/pma/phpmyadmin
Legen Sie die Konfigurationsdatei an und erzeugen Sie den geheimen Schlüssel für die Cookies. Er muss genau 32 Byte lang sein, also 64 Hexadezimalzeichen.
sudo -u www-data cp /var/www/pma/phpmyadmin/config.sample.inc.php /var/www/pma/phpmyadmin/config.inc.php
openssl rand -hex 32
sudo -u www-data nano /var/www/pma/phpmyadmin/config.inc.php
Setzen Sie den erzeugten Wert anstelle des Beispielwerts ein.
$cfg['blowfish_secret'] = sodium_hex2bin('f16ce59f45714194371b48fe362072dc3b019da7861558cd4ad29e4d6fb13851');
Ersetzen Sie bei dieser Methode /usr/share/phpmyadmin in der Nginx-Konfiguration durch /var/www/pma/phpmyadmin.
Nginx konfigurieren
Eine eigene Subdomain ist die sauberste Lösung. Zugriffsbeschränkungen gelten dort für ganz phpMyAdmin, PHP-Skripte eingeschlossen.
Auf einer eigenen Subdomain
Legen Sie die Datei /etc/nginx/sites-available/pma.conf an. Sie läuft zunächst über HTTP. Certbot fügt im nächsten Schritt HTTPS hinzu.
server {
listen 80;
listen [::]:80;
server_name pma.example.com;
root /usr/share/phpmyadmin;
index index.php;
access_log /var/log/nginx/pma.access.log;
add_header X-Frame-Options SAMEORIGIN always;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy no-referrer-when-downgrade always;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 120s;
}
location ~* \.(?:css|js|ico|gif|jpe?g|png|svg)$ {
access_log off;
expires 7d;
}
}
Aktivieren Sie die Website, prüfen Sie die Konfiguration und laden Sie Nginx neu.
sudo ln -s /etc/nginx/sites-available/pma.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Auf einer bestehenden Website unter /phpmyadmin
Fügen Sie diese Blöcke in den server-Block der Website ein, vor deren Block location ~ \.php$. Nginx prüft Blöcke mit regulären Ausdrücken in der Reihenfolge der Datei.
location /phpmyadmin {
alias /usr/share/phpmyadmin;
index index.php;
try_files $uri $uri/ /phpmyadmin/index.php?$args;
}
location ~ ^/phpmyadmin/(.+\.php)$ {
alias /usr/share/phpmyadmin/$1;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_read_timeout 120s;
}
location ~* ^/phpmyadmin/(.+\.(?:png|jpg|jpeg|gif|css|js|ico|svg))$ {
alias /usr/share/phpmyadmin/$1;
access_log off;
expires 7d;
}
Bei dieser Methode gilt eine Beschränkung in
location /phpmyadminnicht für die PHP-Skripte, die der nächste Block verarbeitet. Um den Zugang zu beschränken, nehmen Sie besser die Subdomain.
HTTPS mit Let's Encrypt aktivieren
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d pma.example.com
Certbot holt das Zertifikat, ergänzt den server-Block um HTTPS und leitet HTTP auf HTTPS um. Dabei schreibt es Zeilen wie diese in pma.conf.
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/pma.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/pma.example.com/privkey.pem; # managed by Certbot
Für HTTP/2 fügen Sie die Zeile http2 on; in diesen server-Block ein und laden Nginx neu. Seit Nginx 1.25 gehört die Option http2 nicht mehr in die Zeile listen. Prüfen Sie zum Schluss, ob die automatische Verlängerung aktiv ist.
systemctl status certbot.timer
Die Anleitung Let's Encrypt Zertifikat mit Certbot erstellen behandelt weitere Fälle.
Den Zugang zu phpMyAdmin beschränken
Legen Sie zuerst die Passwortdatei für die HTTP-Authentifizierung an. Sie fragt nach Zugangsdaten, noch bevor die Anmeldeseite von phpMyAdmin erscheint.
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd-pma admin
Fügen Sie in /etc/nginx/nginx.conf im Block http eine Zone zur Begrenzung der Anfragen hinzu.
limit_req_zone $binary_remote_addr zone=pma_limit:10m rate=5r/s;
Fügen Sie dann diese Zeilen in den server-Block von pma.conf ein, der auf 443 lauscht, also den von Certbot geänderten. Ersetzen Sie 198.51.100.20 durch Ihre feste IP.
# Den Einrichtungsassistenten sperren
location ^~ /setup { deny all; }
# Nur Ihre IP kommt durch
allow 198.51.100.20;
deny all;
# HTTP-Zugangsdaten zusätzlich zu denen von phpMyAdmin
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd-pma;
# Anfragerate begrenzen
limit_req zone=pma_limit burst=20 nodelay;
Auf einer bestehenden Website sperren Sie den Assistenten mit location ^~ /phpmyadmin/setup { deny all; }. Prüfen Sie Nginx nach jeder Änderung und laden Sie es neu.
sudo nginx -t && sudo systemctl reload nginx
Prüfen Sie zum Schluss in der Datei config.inc.php, dass phpMyAdmin nur den lokalen Server erreichen kann. Das ist der Standardwert, der SSRF-Angriffe verhindert.
$cfg['AllowArbitraryServer'] = false;
Brute Force mit Fail2ban und UFW abwehren
Fail2ban sperrt Adressen, die zu oft scheitern. Der folgende Filter liest das Protokoll der Subdomain und zählt die Ablehnungen von Nginx, also die Codes 401 (falsche HTTP-Zugangsdaten) und 403 (IP abgelehnt). Die Anleitung Fail2ban unter Debian und Ubuntu einrichten stellt das Werkzeug vor.
sudo apt install -y fail2ban
Legen Sie den Filter /etc/fail2ban/filter.d/nginx-phpmyadmin.conf an.
[Definition]
failregex = ^<HOST> -[^"]*"(?:GET|POST) /\S* HTTP/[^"]*" (?:401|403)\s
ignoreregex =
Legen Sie das Jail /etc/fail2ban/jail.d/nginx-phpmyadmin.local an.
[nginx-phpmyadmin]
enabled = true
port = http,https
filter = nginx-phpmyadmin
logpath = /var/log/nginx/pma.access.log
maxretry = 8
findtime = 10m
bantime = 1h
Testen Sie den Filter am Protokoll, starten Sie Fail2ban neu und prüfen Sie das Jail.
sudo fail2ban-regex /var/log/nginx/pma.access.log /etc/fail2ban/filter.d/nginx-phpmyadmin.conf
sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-phpmyadmin
Schließen Sie zum Schluss alles Übrige mit UFW. Die Anleitung UFW Firewall unter Ubuntu und Debian einrichten erklärt diese Regeln.
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Häufige Fehler beheben
502 Bad Gateway
Nginx erreicht PHP-FPM nicht. Prüfen Sie den Socket und den Dienst.
ls -l /run/php/php8.4-fpm.sock
sudo systemctl status php8.4-fpm
403 Forbidden
Ihre IP steht nicht in der Liste allow, oder die Dateirechte stimmen nicht. Beim offiziellen Archiv muss der Ordner www-data gehören.
sudo chown -R www-data:www-data /var/www/pma/phpmyadmin
Große Importe schlagen fehl
Erhöhen Sie die PHP-Grenzen in /etc/php/8.4/fpm/php.ini.
upload_max_filesize = 512M
post_max_size = 512M
max_execution_time = 300
memory_limit = 512M
Fügen Sie außerdem client_max_body_size 512M; in den server-Block von Nginx ein. Starten Sie dann PHP-FPM neu und laden Sie Nginx neu.
sudo systemctl restart php8.4-fpm
sudo systemctl reload nginx
Ungültiges CSRF-Token
Prüfen Sie, ob der Schlüssel blowfish_secret gesetzt ist, ob Ihr Browser Cookies annimmt und ob die Uhr des VPS synchron läuft. Der Befehl timedatectl zeigt ihren Status.
Brauchen Sie Hilfe?
Eröffnen Sie ein Ticket über Tickets › Ticket öffnen oder über die Kachel Support kontaktieren unten auf der VPS-Seite. Wählen Sie im Feld Betreffender Dienst den VPS aus, das spart dem Team Zeit. Sie können Ihre Frage auch auf dem Discord von OuiHeberg stellen.
Root-Zugriff, freie Wahl der Distribution und Verwaltung im OuiHeberg-Kundenbereich.
Angebote ansehen →