Une instance Adminer laissée ouverte sur une adresse publique est l'une des façons les plus discrètes de perdre une base de données. Quelqu'un déploie le fichier PHP unique pour vérifier une table, l'URL fonctionne, et le fichier reste là pendant des mois jusqu'à ce qu'une copie obsolète devienne une surface d'attaque. C'est pourquoi ce guide sur l'installation d'Adminer sur un VPS Linux accorde autant d'espace à la sécurisation de l'outil qu'à son déploiement.
Adminer est un fichier PHP unique (environ 503 Ko dans la version complète) qui prend en charge MySQL, MariaDB, PostgreSQL, SQLite et plusieurs autres bases de données. Il est très simple à déployer, ce qui explique précisément pourquoi il est souvent déployé sans précaution.
Vous l'installerez sur un VPS Ubuntu ou Debian moderne avec Nginx et PHP-FPM, ajouterez une authentification HTTP, une liste d'autorisation d'adresses IP et HTTPS avec Let's Encrypt, et terminerez par une règle claire indiquant quand ignorer entièrement la configuration publique et accéder à Adminer via un tunnel SSH.
En bref
- Adminer est un fichier PHP unique que vous téléchargez dans un répertoire web avec
wgetdans un répertoire web ; Nginx et PHP-FPM le servent. - Une instance Adminer publique nécessite les trois : une couche d'authentification HTTP, une liste d'autorisation d'adresses IP et HTTPS. Chacun seul ne suffit pas.
- Pour les bases de données les plus sensibles, n'exposez pas du tout Adminer : liez-le à
localhostet y accéder via un tunnel SSH. - La mise à jour est une seule commande : réexécutez la
wgettéléchargement. Les récentes mises à jour de sécurité font de la mise à jour régulière une véritable tâche opérationnelle, et non une option.
Prérequis : Ce dont vous aurez besoin avant l'installation
Ce guide cible Ubuntu 26.04 et 24.04 ainsi que Debian 13, avec des notes de compatibilité pour Ubuntu 22.04 et Debian 12. Les versions PHP-FPM par défaut sont 8.5 sur Ubuntu 26.04, 8.3 sur Ubuntu 24.04, 8.4 sur Debian 13, 8.2 sur Debian 12 et 8.1 sur Ubuntu 22.04.
- Un VPS Linux sous Ubuntu 22.04, Ubuntu 24.04, Ubuntu 26.04, Debian 12 ou Debian 13, avec un utilisateur disposant d'un accès
sudode manière sécurisée. - Un serveur de base de données (MySQL, MariaDB ou PostgreSQL) déjà en cours d'exécution, soit sur ce VPS, soit sur un serveur qu'Adminer peut atteindre via le réseau. Ce guide n'installe pas de base de données ; il installe l'outil que vous utilisez pour en administrer une.
- PHP-FPM provenant des dépôts officiellement pris en charge par le système d'exploitation. Bien que le fichier compilé d'Adminer prenne en charge PHP 5.3+, utilisez la version fournie par la distribution listée ci-dessus plutôt que d'installer une version PHP obsolète.
- Pour la configuration HTTPS publique, vous avez besoin d'un nom d'hôte pointant vers le VPS et des ports TCP entrants 80 et 443 disponibles. Le processus Certbot Nginx utilise la validation HTTP-01 sur le port 80. Let's Encrypt prend désormais en charge certificats d'adresse IP à courte durée de vie, mais Certbot ne les installe pas automatiquement via son processus Nginx, donc ce guide utilise un nom d'hôte.
Remarque : Ce guide utilise Nginx par conception. Si vous utilisez Apache, la logique de téléchargement et de sécurisation s'applique toujours, mais la configuration du bloc serveur ci-dessous ne s'applique pas.
Installer Nginx et PHP-FPM
Commencez par actualiser l'index des paquets et installez Nginx et PHP-FPM avec l'extension PHP de base de données dont votre serveur a besoin :
sudo apt update
sudo apt install -y nginx php-fpm php-mysql
Pour un backend PostgreSQL, installez php-pgsql à la place de, ou en plus de, php-mysql:
sudo apt install -y php-pgsql
Vérifiez que le socket PHP-FPM existe :
ls /run/php/
Faites correspondre le nom de fichier du socket à la version indiquée ci-dessus, par exemple, php8.5-fpm.sock sur Ubuntu 26.04, php8.3-fpm.sock sur Ubuntu 24.04, ou php8.4-fpm.sock sur Debian 13. Si le socket attendu est manquant, vérifiez le service correspondant avec systemctl status php8.5-fpm, en remplaçant 8.5 par la version installée sur votre système d'exploitation.
Conseil : Une incompatibilité de socket est une cause possible d'une
502 Bad Gateway. Faites correspondrefastcgi_passau nom de fichier sous/run/php/, confirmez que le service PHP-FPM correspondant est en cours d'exécution, et vérifiez/var/log/nginx/error.logsi l'erreur persiste.
Télécharger Adminer
Créez un répertoire pour héberger Adminer, puis téléchargez le fichier unique. L' latest.php URL pointe toujours vers la version stable actuelle :
sudo mkdir -p /var/www/adminer
sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php
Si vous travaillez uniquement avec MySQL ou MariaDB, la version MySQL uniquement est plus petite (environ 406 Ko) et se télécharge de la même façon :
sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest-mysql.php
Laissez le répertoire Adminer appartenant à root tout en accordant à PHP-FPM l'accès en lecture :
sudo chown -R root:root /var/www/adminer
sudo chmod 755 /var/www/adminer
sudo chmod 644 /var/www/adminer/adminer.php
You do not need to track the version number: the latest.php URL signifie que relancer le téléchargement est aussi votre chemin de mise à jour, ce que la section de maintenance détaille.
Configurer le bloc serveur Nginx
Créez un bloc serveur qui sert le répertoire Adminer et transmet les requêtes .php les requêtes au socket PHP-FPM que vous avez identifié précédemment. Ouvrez un nouveau fichier de site :
sudo nano /etc/nginx/sites-available/adminer
Collez ce qui suit, en remplaçant db.example.com par le nom d'hôte déjà pointé vers votre VPS et en confirmant que le fastcgi_pass socket correspond à votre version PHP :
# /etc/nginx/sites-available/adminer
server {
listen 80;
server_name db.example.com;
root /var/www/adminer;
location = / {
return 302 /adminer.php;
}
location = /adminer.php {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location / {
return 404;
}
}
Activez le site en créant un lien symbolique dans sites-enabled, puis testez la configuration sans encore recharger Nginx :
sudo ln -s /etc/nginx/sites-available/adminer /etc/nginx/sites-enabled/
sudo nginx -t
nginx -t devrait indiquer que la syntaxe est valide et le test réussi. Ne rechargez pas encore Nginx car le site ne dispose pas d'authentification ni de restriction d'IP. Poursuivez avec ces deux étapes de sécurisation ; l'étape de restriction d'IP effectue le premier rechargement une fois les deux protections en place.
Sécuriser l'accès : Authentification, Restriction IP et HTTPS
Une instance Adminer publique se trouve directement devant vos identifiants de base de données, elle nécessite donc des défenses en couches plutôt qu'un seul verrou. Les trois couches suivantes remplissent des fonctions différentes : l'authentification HTTP bloque toute personne sans mot de passe au niveau du serveur web, la liste d'autorisation d'adresses IP bloque toute connexion depuis une adresse non approuvée, et HTTPS empêche les identifiants que vous saisissez de traverser le réseau en clair. Ajoutez les trois. Aucun ne remplace les autres.
Ajouter l'authentification HTTP basique
Installez l'utilitaire htpasswd utilitaire, fourni dans le paquet apache2-utils sur Ubuntu et Debian :
sudo apt install -y apache2-utils
Créez un fichier de mots de passe et un utilisateur (vous serez invité à saisir le mot de passe) :
sudo htpasswd -B -C 10 -c /etc/nginx/.htpasswd adminuser
sudo chown root:www-data /etc/nginx/.htpasswd
sudo chmod 640 /etc/nginx/.htpasswd
Ajoutez les directives à l'emplacement PHP exact d'Adminer afin que la requête PHP elle-même soit protégée :
location = /adminer.php {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
Les deux directives sont documentées dans le référence du module Nginx HTTP auth_basic. Utilisez sudo nginx -t pour valider la configuration, mais ne rechargez pas encore Nginx ; la liste d'autorisation d'adresses IP est ajoutée ensuite. Ne soumettez pas les identifiants Basic Auth en HTTP non chiffré ; attendez que HTTPS soit activé ci-dessous.
Restreindre l'accès par adresse IP
L'authentification de base bloque les utilisateurs non authentifiés, mais Nginx reçoit toujours des requêtes de toutes les sources. Remplacez l'emplacement PHP Adminer existant par le bloc combiné suivant afin que les règles IP et les directives d'authentification de base restent au même endroit :
location = /adminer.php {
satisfy all;
allow 203.0.113.10;
allow 203.0.113.0/28;
deny all;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
Remplacez les adresses d'exemple par votre adresse IP publique réelle ou votre plage réseau de confiance. Conservez uniquement les entrées allow dont vous avez besoin et supprimez les exemples inutilisés. La première entrée illustre une adresse unique, tandis que la seconde illustre une plage CIDR. Nginx retourne 403 Forbidden aux adresses qui ne correspondent pas à une allow règle allow. Le référence du module d'accès Nginx documente la syntaxe des directives. Testez et rechargez Nginx :
sudo nginx -t && sudo systemctl reload nginx
Activer HTTPS avec Let's Encrypt
Avec un domaine pointant vers le VPS, installez Certbot et son plugin Nginx, puis demandez un certificat :
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d db.example.com
Certbot modifie votre bloc serveur pour servir HTTPS sur le port 443 et propose de rediriger HTTP vers HTTPS ; acceptez la redirection. Il installe également un minuteur de renouvellement, de sorte que le certificat se renouvelle automatiquement avant son expiration. Vous pouvez confirmer le chemin de renouvellement avec sudo certbot renew --dry-run, qui devrait se terminer sans erreurs.
Rendez-vous maintenant sur https://db.example.com/adminer.php depuis une adresse autorisée et confirmez que Nginx demande les identifiants d'authentification de base avant le chargement d'Adminer.
Choisir votre modèle d'accès : HTTPS public ou tunnel SSH
La configuration ci-dessus convient lorsque vous avez besoin d'un accès par navigateur à une base de données depuis plusieurs machines ou lorsqu'ouvrir une session SSH est peu pratique. Ce n'est pas le seul modèle, et pour une base de données sensible, ce n'est pas le plus défensif.
Pour les configurations sensibles, n'exposez pas Adminer publiquement. Les recommandations de sécurité officielles d'Adminer recommande de le rendre inaccessible depuis Internet public dans la mesure du possible. Si vous optez pour un accès uniquement par tunnel, remplacez le bloc serveur Nginx public par cette configuration réservée au loopback et ignorez la configuration HTTPS publique :
# /etc/nginx/sites-available/adminer
server {
listen 127.0.0.1:8080 default_server;
server_name _;
root /var/www/adminer;
location = / {
return 302 /adminer.php;
}
location = /adminer.php {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location / {
return 404;
}
}
Testez et rechargez la configuration de remplacement :
sudo nginx -t && sudo systemctl reload nginx
Ensuite, ouvrez le tunnel depuis votre propre machine :
ssh -N -L 127.0.0.1:8080:127.0.0.1:8080 user@your-server-ip
Avec le tunnel actif, ouvrez http://127.0.0.1:8080/adminer.php. Nginx n'accepte les connexions Adminer que via l'interface de loopback du VPS, tandis que SSH achemine le trafic via sa connexion chiffrée. Cela utilise le comportement décrit dans la documentation de transfert local OpenSSH.
Utilisez la configuration HTTPS publique, Basic Auth et liste d'autorisation d'adresses IP lorsque vous avez besoin d'un accès direct par navigateur depuis plusieurs machines. Préférez la configuration SSH uniquement en loopback lorsque l'accès public est inutile.
Point clé : L'Adminer le plus sécurisé est celui qui n'est jamais accessible depuis Internet public.
Maintenir Adminer à jour
L'instance oubliée est le vrai risque ici, et il vaut la peine de la traiter comme une tâche planifiée plutôt qu'une réflexion après coup. La mise à jour d'Adminer est une seule commande, la même wget commande que vous avez utilisée pour l'installer, car latest.php récupère toujours la version actuelle :
sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php
Ce n'est pas une préoccupation théorique. Adminer 5.4.3, sorti le 9 juillet 2026, a résolu sept avis de sécurité GitHub dans une seule version. L'avis antérieur pour CVE-2026-25892 a montré que même l'endpoint de vérification de version d'Adminer pouvait être transformé en vecteur de déni de service non authentifié ; le problème a été corrigé dans la version 5.4.2. Une copie obsolète accumule des vulnérabilités documentées publiquement, donc sa mise à jour devrait être une maintenance de routine.
Remarque : Restez sur la version officielle actuelle d'Adminer. Le dépôt AdminerEvo a été archivé en janvier 2025 et n'est pas une alternative activement maintenue.
Déploiement sur un VPS
Si vous préférez éviter les étapes manuelles, Adminer est disponible en déploiement en un clic dans le la marketplace Cloudzy sur un Cloudzy VPS Linux. L'image du marketplace utilise Apache, Basic Auth et un certificat auto-signé, donc elle diffère de la pile Nginx, liste d'autorisation d'adresses IP et Let's Encrypt ci-dessus. Vérifiez ces différences de sécurité avant de saisir les identifiants de la base de données de production.
L'empreinte propre d'Adminer est négligeable ; c'est la base de données qui détermine votre dimensionnement. Choisissez le CPU, la mémoire et le stockage en fonction de la taille des données et des index de la base de données, de la charge des requêtes, du nombre de connexions, des sauvegardes et de la croissance attendue plutôt qu'en fonction d'Adminer lui-même.
Foire aux questions
Est-il sûr d'exposer Adminer publiquement sur un VPS ?
Pas seul. Si vous devez exposer Adminer publiquement, placez-le derrière une authentification HTTP basique, une liste d'autorisation d'adresses IP et HTTPS ensemble. Ces contrôles réduisent le risque mais ne rendent pas l'exposition publique sans risque. Pour les bases de données sensibles, associez Adminer à localhost et y accédez via un tunnel SSH à la place.
Comment accéder à Adminer sans l'exposer à Internet ?
Configurez le bloc serveur Nginx réservé au loopback montré ci-dessus pour qu'Adminer écoute sur 127.0.0.1:8080, puis lancez ssh -N -L 127.0.0.1:8080:127.0.0.1:8080 user@your-server-ip sur votre propre machine. Ouvrez http://127.0.0.1:8080/adminer.php pendant que le tunnel est en cours d'exécution.
Adminer peut-il se connecter à PostgreSQL ainsi qu'à MySQL ?
Oui. Adminer prend en charge MySQL, MariaDB, PostgreSQL, SQLite, MS SQL et Oracle sans configuration supplémentaire, avec d'autres bases de données disponibles via des plugins. Installez l'extension PHP correspondant à votre base de données, par exemple php-pgsql pour PostgreSQL, afin que PHP puisse communiquer avec lui.
Comment maintenir Adminer à jour ?
Réexécutez la commande de téléchargement : sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php. La latest.php URL retourne toujours la version stable actuelle, ce qui écrase votre copie avec la version la plus récente. Les récentes versions de sécurité font que cela vaut la peine de le faire selon un calendrier plutôt que seulement lorsque vous vous en souviendrez.
Dois-je installer Adminer via le apt Paquet ou le télécharger directement ?
Téléchargez directement le fichier unique. Cela vous donne la version actuelle immédiatement et rend les mises à jour une commande en une seule ligne, tandis qu'un package de distribution peut prendre du retard sur la version officielle. Le fichier direct est le même outil avec un chemin plus court vers les dernières correctifs de sécurité.