phpMyAdmin mit Nginx auf Debian 13 installieren und sichern
Die Verwaltung Ihrer MySQL/MariaDB-Datenbanken über die Kommandozeile ist mächtig, aber nicht immer praktisch. phpMyAdmin bietet Ihnen eine Weboberfläche, um Ihre Datenbanken zu visualisieren, zu ändern und zu verwalten, ohne SQL-Abfragen manuell eingeben zu müssen. Das Problem ist, dass phpMyAdmin bei falscher Konfiguration ein Einstiegspunkt für Angriffe wird.
Dieser Leitfaden zeigt Ihnen, wie Sie phpMyAdmin sauber hinter Nginx auf Debian 13 (Trixie) installieren, mit HTTPS, Zugriffsbeschränkungen und Schutz gegen Brute-Force-Angriffe. Eine Konfiguration, die für die Produktion gedacht ist, nicht nur für ein Testlabor.
Was Sie vor dem Start benötigen
- Ein Debian 13 (Trixie) Server mit sudo-Zugriff
- Die Ports 80 und 443 geöffnet
- Eine Domain, die auf Ihren Server zeigt (empfohlen für HTTPS)
Debian 13 bringt standardmäßig PHP 8.3 mit. Überprüfen Sie Ihre Version:
php -v
Notieren Sie sich die Versionsnummer, die Sie für die Pfade der Konfigurationsdateien benötigen.
Das System aktualisieren
Wir beginnen immer damit:
sudo apt update && sudo apt -y full-upgrade
sudo reboot
Nginx, PHP-FPM und die erforderlichen Erweiterungen installieren
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
Überprüfen Sie, ob der PHP-FPM-Socket existiert:
ls -l /run/php/ | grep fpm
# Sie sollten etwas sehen wie: php8.3-fpm.sock
MariaDB installieren und sichern
sudo apt install -y mariadb-server mariadb-client
sudo mysql_secure_installation
Während des Sicherheitsassistenten:
- Setzen Sie ein starkes SQL-Root-Passwort
- Entfernen Sie anonyme Benutzer
- Deaktivieren Sie den Remote-Root-Login
- Entfernen Sie die Testdatenbank
- Laden Sie die Berechtigungen neu
Ein dedizierter Benutzer für phpMyAdmin erstellen
Die Verwendung des SQL-Root-Kontos für phpMyAdmin ist keine gute Idee. Erstellen Sie ein dediziertes Admin-Konto:
sudo mysql
Im SQL-Shell:
CREATE USER 'pma_admin'@'localhost' IDENTIFIED BY 'IhrStarkesPasswort!';
GRANT ALL PRIVILEGES ON *.* TO 'pma_admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
Dieses Konto werden Sie verwenden, um sich bei phpMyAdmin anzumelden.
phpMyAdmin installieren
Zwei Optionen je nach Ihren Vorlieben.
Option A: über apt (einfach und schnell)
sudo apt install -y phpmyadmin
Während der Installation:
- Bei der Frage nach dem Webserver, wählen Sie nichts aus (wir konfigurieren Nginx manuell)
- Akzeptieren Sie dbconfig-common und setzen Sie ein Passwort für den internen Benutzer
pma
Die Dateien werden in /usr/share/phpmyadmin installiert.
Option B: über das offizielle Archiv (neuere Version)
cd /var/www
sudo mkdir -p pma && cd pma
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-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
Erstellen Sie die Konfigurationsdatei:
sudo -u www-data cp /var/www/pma/phpmyadmin/config.sample.inc.php /var/www/pma/phpmyadmin/config.inc.php
sudo -u www-data nano /var/www/pma/phpmyadmin/config.inc.php
Generieren Sie einen geheimen Schlüssel von mindestens 32 Zeichen und fügen Sie ihn hinzu:
$cfg['blowfish_secret'] = 'GebenSieHierEinenLangenUndEinzigartigenGeheimtextEin!!!!';
Nginx konfigurieren
Zwei mögliche Ansätze: ein Alias /phpmyadmin auf einem bestehenden vhost oder eine dedizierte Subdomain pma.ihredomain.com. Letzteres ist sauberer, um die Zugriffsbeschränkungen zu verwalten.
Option A: Alias auf einem bestehenden vhost
Fügen Sie diese Blöcke in Ihre bestehende Nginx-Konfiguration ein:
location /phpmyadmin {
alias /usr/share/phpmyadmin; # oder /var/www/pma/phpmyadmin, wenn Methode B
index index.php;
try_files $uri $uri/ /phpmyadmin/index.php?$args;
}
location ~ ^/phpmyadmin/(.+\.php)$ {
alias /usr/share/phpmyadmin;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_read_timeout 120s;
}
location ~* ^/phpmyadmin/(.+\.(?:png|jpg|jpeg|gif|css|js|ico|svg))$ {
alias /usr/share/phpmyadmin;
access_log off;
expires 7d;
}
Option B: Dedizierte Subdomain (empfohlen)
Erstellen Sie /etc/nginx/sites-available/pma.conf:
server {
listen 80;
server_name pma.ihredomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name pma.ihredomain.com;
ssl_certificate /etc/letsencrypt/live/pma.ihredomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pma.ihredomain.com/privkey.pem;
root /usr/share/phpmyadmin;
index index.php;
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.3-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 Konfiguration und testen Sie:
sudo ln -s /etc/nginx/sites-available/pma.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
HTTPS mit Let's Encrypt aktivieren
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d pma.ihredomain.com
Überprüfen Sie, ob die automatische Erneuerung aktiv ist:
systemctl status certbot.timer phpMyAdmin sichern
Zugriff auf /setup blockieren
location ^~ /phpmyadmin/setup { deny all; }
# oder für einen dedizierten vhost:
location ^~ /setup { deny all; }
AllowArbitraryServer deaktivieren
Stellen Sie in config.inc.php sicher, dass diese Option deaktiviert ist, um SSRF-Angriffe zu vermeiden:
$cfg['AllowArbitraryServer'] = false;
PHP-Limits anpassen
Um große Datenbanken importieren zu können, bearbeiten Sie /etc/php/8.3/fpm/php.ini:
upload_max_filesize = 512M
post_max_size = 512M
max_execution_time = 300
memory_limit = 512M
Starten Sie PHP-FPM neu:
sudo systemctl restart php8.3-fpm
Zugriff nach IP und HTTP-Passwort beschränken
IP-Whitelist
location /phpmyadmin {
allow 203.0.113.10; # Ihre feste IP
deny all;
alias /usr/share/phpmyadmin;
index index.php;
}
HTTP Basic Authentifizierung
Erstellen Sie die Passwortdatei:
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd-pma admin
Fügen Sie in die Nginx-Konfiguration ein:
location /phpmyadmin {
auth_basic "Eingeschränkter Zugriff";
auth_basic_user_file /etc/nginx/.htpasswd-pma;
alias /usr/share/phpmyadmin;
index index.php;
try_files $uri $uri/ /phpmyadmin/index.php?$args;
}
Hinweis: Kombinieren Sie IP-Whitelist + HTTP-Auth für eine doppelte Sicherheitsschicht.
Schutz gegen Brute-Force-Angriffe mit Fail2ban
Nginx Rate-Limit
Fügen Sie in /etc/nginx/nginx.conf im http-Block hinzu:
limit_req_zone $binary_remote_addr zone=pma_limit:10m rate=5r/s;
In Ihrem Server-Block:
location /phpmyadmin/ {
limit_req zone=pma_limit burst=20 nodelay;
}
Fail2ban konfigurieren
sudo apt install -y fail2ban
Erstellen Sie den Filter /etc/fail2ban/filter.d/nginx-phpmyadmin.conf:
[Definition]
failregex = ^<HOST> - .* "(GET|POST) /phpmyadmin.*" .* (401|403) .*$
ignoreregex =
Erstellen Sie die Jail /etc/fail2ban/jail.d/nginx-phpmyadmin.local:
[nginx-phpmyadmin]
enabled = true
port = http,https
filter = nginx-phpmyadmin
logpath = /var/log/nginx/access.log
maxretry = 8
findtime = 10m
bantime = 1h
Starten Sie Fail2ban neu:
sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-phpmyadmin
Die UFW-Firewall aktivieren
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Häufige Fehlerbehebung
Fehler 502 Bad Gateway
Der PHP-FPM-Socket ist nicht zugänglich. Überprüfen Sie:
ls -l /run/php/php8.3-fpm.sock
sudo systemctl status php8.3-fpm
Fehler 403 Forbidden
Problem mit Berechtigungen oder der Konfiguration von alias/root. Überprüfen Sie, ob der Ordner www-data gehört:
sudo chown -R www-data:www-data /usr/share/phpmyadmin
Timeout bei großen Imports
Erhöhen Sie client_max_body_size im Nginx-Serverblock und fastcgi_read_timeout.
Ungültiges CSRF-Token
Überprüfen Sie, ob der blowfish_secret gesetzt ist, ob die Cookies funktionieren und ob die Systemuhr synchronisiert ist (timedatectl).
Abschluss-Checkliste
- Aktuelles Debian 13 System
- Nginx und PHP-FPM 8.3 funktionsfähig
- MariaDB mit
mysql_secure_installationgesichert - phpMyAdmin über HTTPS zugänglich
- Eingeschränkter Zugriff (IP und/oder HTTP Auth)
- Rate-Limit und Fail2ban aktiv
- UFW-Firewall konfiguriert
- Geplante Backups
Zusammenfassung
Die Installation von phpMyAdmin auf Debian 13 mit Nginx ist recht einfach. Der wahre Mehrwert dieses Leitfadens liegt im Sicherheitsbereich: HTTPS, Zugriffsbeschränkungen, Brute-Force-Schutz. Ein ungeschütztes phpMyAdmin ist ein leichtes Ziel für Bots, die das Web ständig scannen.
Benötigen Sie einen VPS, um all dies zu hosten? OuiHeberg bietet Linux-VPS mit vorinstalliertem Debian, bereit, Ihren LEMP-Stack und phpMyAdmin in wenigen Minuten zu hosten.

