Serveurs Dédiés & VPS6 février 2026 16 vues

Installer et sécuriser phpMyAdmin avec Nginx sur Debian 13

Installer et sécuriser phpMyAdmin avec Nginx sur Debian 13

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.