Installer et sécuriser phpMyAdmin avec Nginx sur Debian 13
Gérer vos bases de données MySQL/MariaDB en ligne de commande, c'est puissant mais pas toujours pratique. phpMyAdmin vous donne une interface web pour visualiser, modifier et administrer vos bases sans taper de requêtes SQL à la main. Le problème, c'est que mal configuré, phpMyAdmin devient une porte d'entrée pour les attaques.
Ce guide vous montre comment installer phpMyAdmin proprement derrière Nginx sur Debian 13 (Trixie), avec HTTPS, restrictions d'accès et protections contre le bruteforce. Une config pensée pour la production, pas juste pour un lab de test.
Ce qu'il vous faut avant de commencer
- Un serveur Debian 13 (Trixie) avec accès sudo
- Les ports 80 et 443 ouverts
- Un nom de domaine pointant vers votre serveur (recommandé pour le HTTPS)
Debian 13 embarque PHP 8.3 par défaut. Vérifiez votre version :
php -v
Notez le numéro de version, vous en aurez besoin pour les chemins des fichiers de config.
Mettre à jour le système
On commence toujours par ça :
sudo apt update && sudo apt -y full-upgrade
sudo reboot
Installer Nginx, PHP-FPM et les extensions nécessaires
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
Vérifiez que le socket PHP-FPM existe :
ls -l /run/php/ | grep fpm
# Vous devriez voir quelque chose comme : php8.3-fpm.sock
Installer et sécuriser MariaDB
sudo apt install -y mariadb-server mariadb-client
sudo mysql_secure_installation
Pendant l'assistant de sécurisation :
- Définissez un mot de passe root SQL solide
- Supprimez les utilisateurs anonymes
- Désactivez le login root à distance
- Supprimez la base de test
- Rechargez les privilèges
Créer un utilisateur dédié pour phpMyAdmin
Utiliser le compte root SQL pour phpMyAdmin, c'est une mauvaise idée. Créez un compte admin dédié :
sudo mysql
Dans le shell SQL :
CREATE USER 'pma_admin'@'localhost' IDENTIFIED BY 'VotreMotDePasseSolide!';
GRANT ALL PRIVILEGES ON *.* TO 'pma_admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
C'est ce compte que vous utiliserez pour vous connecter à phpMyAdmin.
Installer phpMyAdmin
Deux options selon vos préférences.
Option A : via apt (simple et rapide)
sudo apt install -y phpmyadmin
Pendant l'installation :
- À la question sur le serveur web, ne cochez rien (on configure Nginx manuellement)
- Acceptez dbconfig-common et définissez un mot de passe pour l'utilisateur interne
pma
Les fichiers s'installent dans /usr/share/phpmyadmin.
Option B : via l'archive officielle (version plus récente)
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
Créez le fichier de configuration :
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
Générez une clé secrète de 32 caractères minimum et ajoutez-la :
$cfg['blowfish_secret'] = 'MettezIciUnePhraseSecrèteLongueEtUnique!!!!';
Configurer Nginx
Deux approches possibles : un alias /phpmyadmin sur un vhost existant, ou un sous-domaine dédié pma.votredomaine.com. La seconde est plus propre pour gérer les restrictions d'accès.
Option A : Alias sur un vhost existant
Ajoutez ces blocs dans votre configuration Nginx existante :
location /phpmyadmin {
alias /usr/share/phpmyadmin; # ou /var/www/pma/phpmyadmin si méthode 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 : Sous-domaine dédié (recommandé)
Créez /etc/nginx/sites-available/pma.conf :
server {
listen 80;
server_name pma.votredomaine.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name pma.votredomaine.com;
ssl_certificate /etc/letsencrypt/live/pma.votredomaine.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pma.votredomaine.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;
}
}
Activez la config et testez :
sudo ln -s /etc/nginx/sites-available/pma.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Activer HTTPS avec Let's Encrypt
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d pma.votredomaine.com
Vérifiez que le renouvellement automatique est actif :
systemctl status certbot.timer Sécuriser phpMyAdmin
Bloquer l'accès à /setup
location ^~ /phpmyadmin/setup { deny all; }
# ou pour un vhost dédié :
location ^~ /setup { deny all; }
Désactiver AllowArbitraryServer
Dans config.inc.php, assurez-vous que cette option est désactivée pour éviter les attaques SSRF :
$cfg['AllowArbitraryServer'] = false;
Ajuster les limites PHP
Pour pouvoir importer des bases volumineuses, éditez /etc/php/8.3/fpm/php.ini :
upload_max_filesize = 512M
post_max_size = 512M
max_execution_time = 300
memory_limit = 512M
Redémarrez PHP-FPM :
sudo systemctl restart php8.3-fpm
Restreindre l'accès par IP et mot de passe HTTP
Whitelist d'IP
location /phpmyadmin {
allow 203.0.113.10; # votre IP fixe
deny all;
alias /usr/share/phpmyadmin;
index index.php;
}
Authentification HTTP Basic
Créez le fichier de mots de passe :
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd-pma admin
Ajoutez dans la config Nginx :
location /phpmyadmin {
auth_basic "Accès restreint";
auth_basic_user_file /etc/nginx/.htpasswd-pma;
alias /usr/share/phpmyadmin;
index index.php;
try_files $uri $uri/ /phpmyadmin/index.php?$args;
}
Conseil : Combinez whitelist IP + auth HTTP pour une double couche de sécurité.
Protéger contre le bruteforce avec Fail2ban
Rate-limit Nginx
Dans /etc/nginx/nginx.conf, ajoutez dans le bloc http :
limit_req_zone $binary_remote_addr zone=pma_limit:10m rate=5r/s;
Dans votre bloc server :
location /phpmyadmin/ {
limit_req zone=pma_limit burst=20 nodelay;
}
Configurer Fail2ban
sudo apt install -y fail2ban
Créez le filtre /etc/fail2ban/filter.d/nginx-phpmyadmin.conf :
[Definition]
failregex = ^<HOST> - .* "(GET|POST) /phpmyadmin.*" .* (401|403) .*$
ignoreregex =
Créez la 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
Redémarrez Fail2ban :
sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-phpmyadmin
Activer le pare-feu UFW
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Dépannage courant
Erreur 502 Bad Gateway
Le socket PHP-FPM n'est pas accessible. Vérifiez :
ls -l /run/php/php8.3-fpm.sock
sudo systemctl status php8.3-fpm
Erreur 403 Forbidden
Problème de droits ou de configuration alias/root. Vérifiez que le dossier appartient à www-data :
sudo chown -R www-data:www-data /usr/share/phpmyadmin
Timeout sur les imports volumineux
Augmentez client_max_body_size dans le bloc server Nginx et fastcgi_read_timeout.
Token CSRF invalide
Vérifiez que le blowfish_secret est défini, que les cookies fonctionnent et que l'horloge système est synchronisée (timedatectl).
Checklist finale
- Système Debian 13 à jour
- Nginx et PHP-FPM 8.3 fonctionnels
- MariaDB sécurisé avec
mysql_secure_installation - phpMyAdmin accessible en HTTPS
- Accès restreint (IP et/ou HTTP Auth)
- Rate-limit et Fail2ban actifs
- Pare-feu UFW configuré
- Sauvegardes planifiées
En résumé
Installer phpMyAdmin sur Debian 13 avec Nginx, c'est assez direct. La vraie valeur ajoutée de ce guide, c'est la partie sécurisation : HTTPS, restrictions d'accès, protection bruteforce. Un phpMyAdmin exposé sans protection, c'est une cible facile pour les bots qui scannent le web en permanence.
Besoin d'un VPS pour héberger tout ça ? OuiHeberg propose des VPS Linux avec Debian préinstallé, prêts à accueillir votre stack LEMP et phpMyAdmin en quelques minutes.

