Dedicated Servers & VPS6. Februar 2026 16 Aufrufe

Installer et sécuriser phpMyAdmin avec Nginx sur Debian 13

Installer et sécuriser phpMyAdmin avec Nginx sur Debian 13

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_installation gesichert
  • 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.