Présentation
Nous allons installer PhpMyAdmin sur un serveur Debian 11 (Linux) avec Apache. Cette procédure étape par étape part du principe que vous disposez déjà d’un socle LAMP opérationnel, c’est-à-dire qu’Apache, MySQL/MariaDB et PHP sont déjà en place sur la machine.
- Article – Installation d’un serveur LAMP
Installation de PhpMyAdmin
L’installation de PhpMyAdmin ne s’effectue pas comme un paquet classique, mais plutôt sur le même principe qu’une application web. Il faut que l’on télécharge les sources à partir du site officiel, directement dans le dossier « /tmp » (ou ailleurs) :
cd /tmp
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.zip
Avant de faire la commande « wget » je vous invite à accéder à la page de téléchargement de PhpMyAdmin afin de récupérer le lien vers la dernière version. Ici, c’est bien la dernière version stable : 5.2.0.
Ensuite, nous devons extraire le contenu de cette archive ZIP avec la commande « unzip ». Elle n’est pas installée par défaut sur Debian 11. Vous pouvez l’installer avec cette commande :
sudo apt-get update
sudo apt-get install unzip
Ensuite, on décompresse l’archive ZIP dans le répertoire courant :
unzip phpMyAdmin-5.2.0-all-languages.zip

On va déplacer le dossier complet vers « /usr/share » dans un nouveau dossier nommé « phpmyadmin ». Ce qui donne :
sudo mv phpMyAdmin-5.2.0-all-languages /usr/share/phpmyadmin
Ensuite, on crée un dossier distinct pour les fichiers temporaires :
sudo mkdir -p /var/lib/phpmyadmin/tmp
Puis, on attribue les droits sur le dossier racine « phpmyadmin » à l’utilisateur associé à Apache (www-data) afin qu’il soit propriétaire. Nous préciserons le chemin vers le dossier « tmp » dans la configuration de PhpMyAdmin.
sudo chown -R www-data:www-data /var/lib/phpmyadmin/
PhpMyAdmin est fourni avec un template pour le fichier de configuration, alors on va créer une copie de ce template pour ne pas partir de zéro :
cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php
Afin d’utiliser le mode d’authentification basé sur les cookies, nous devons générer une chaîne aléatoire qui est une sorte de passphrase au sein du fichier de configuration. Il doit s’agir d’une chaîne de 32 caractères. Un cookie permanent stockera l’identifiant sur votre machine tandis que le mot de passe est géré par un cookie temporaire.
On peut générer cette chaîne aléatoire avec la commande suivante :
openssl rand -base64 32
Copiez la valeur retournée en sortie. Nous allons l’insérer dans le fichier de configuration de PhpMyAdmin. Ouvrez le fichier avec nano (ou un autre éditeur de texte) :
nano /usr/share/phpmyadmin/config.inc.php
Collez la valeur au niveau de l’option « blowfish_secret« , comme ceci :
$cfg['blowfish_secret'] = 'deJ8reLGV1cXPyd32454/um/EGWRef/14Jo7tg112WM=';

Ensuite, il faut définir un user et un mot de passe que PhpMyAdmin va utiliser pour se connecter à sa base de données et stocker ses données. Pour cela, il y a deux options à décommenter et modifier pour éviter d’avoir les valeurs par défaut :
$cfg['Servers'][$i]['controluser'] = 'pma2022';
$cfg['Servers'][$i]['controlpass'] = 'MotDePasseComplexe';
Décommenter les autres options, comme sur l’image ci-dessous.

Enfin, ajoutez cette directive pour déclarer le répertoire temporaire (créé précédemment) :
$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';

Sauvegardez et fermez le fichier.
Avant de créer notre propre compte « admin » distinct pour administrer PhpMyAdmin, on va créer la base de données de l’outil. Pour cela, on va utiliser le script fournit :
mysql -u root -p < /usr/share/phpmyadmin/sql/create_tables.sql
Ensuite, on va se connecter à l’instance MySQL/MariaDB pour donner les droits sur cette base de données à l’utilisateur « pma2022 » :
mysql -u root -p
Une fois connecté avec le prompt « mysql> » à l’écran, exécutez les requêtes SQL suivantes :
CREATE USER 'pma2022'@'localhost' IDENTIFIED BY 'MotdePasseComplexe';
GRANT ALL PRIVILEGES ON phpmyadmin.* TO 'pma2022'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Les informations (utilisateur et mot de passe) doivent correspondre aux valeurs définies dans le fichier de configuration.
III. Création d’un admin pour PhpMyAdmin
Nous allons profiter d’être connecté à la console MySQL pour créer un nouveau compte administrateur qui aura la main sur l’ensemble des bases de données. Nous utiliserons ce compte pour se connecter à PhpMyAdmin.
Voici les requêtes SQL à exécuter pour créer un utilisateur nommé « pma-admin » avec le mot de passe « MotdePasseComplexe2« .
CREATE USER 'pma-admin'@'localhost' IDENTIFIED BY 'MotdePasseComplexe2';
GRANT ALL PRIVILEGES ON *.* TO 'pma-admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
Contrairement à l’utilisateur précédent, celui-ci a les droits sur toutes les BDD de l’instant MySQL, d’où le « *.* » dans la requête GRANT.
IV. Intégration de PhpMyAdmin à Apache
PhpMyAdmin est installé et configuré mais il nous manque une étape cruciale : la publication de l’application via Apache afin de pouvoir y accéder avec un navigateur.
Nous allons créer un fichier de configuration propre à PhpMyAdmin :
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
Voici le contenu à intégrer au fichier de configuration (peut-être adapté) :
Alias /pma /usr/share/phpmyadmin
<Directory /usr/share/phpmyadmin>
Options SymLinksIfOwnerMatch
DirectoryIndex index.php
# Autoriser accès depuis certaines adresses IP / sous-réseau
Order deny,allow
Deny from all
Allow from 192.168.1.0/24
<IfModule mod_php.c>
<IfModule mod_mime.c>
AddType application/x-httpd-php .php
</IfModule>
<FilesMatch ".+\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
php_value include_path .
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
php_admin_value mbstring.func_overload 0
</IfModule>
</Directory>
# Désactiver accès web sur certains dossiers
<Directory /usr/share/phpmyadmin/templates>
Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
Require all denied
</Directory>
Quelques explications :
- Le fait d’indiquer « Alias /pma /usr/share/phpmyadmin » cela signifie qu’il faudra préciser « /pma » à la fin de l’URL pour accéder à PhpMyAdmin. Vous pouvez mettre autre chose, mais seulement je vous recommande de ne pas mettre « phpmyadmin » afin que ce ne soit pas trop évident. Cela est d’autant plus important si votre PhpMyAdmin est accessible en mode public car les robots scans le web à la recherche d’interface PhpMyAdmin.
- On bloque l’accès aux dossiers « templates », « libraries » et « setup/lib ».
- On autorise seulement l’accès à PhpMyAdmin à partir des hôtes connectés au LAN « 192.168.1.0/24 » car dans cet exemple, PhpMyAdmin n’est pas exposé publiquement. Je pense qu’il faut restreindre l’accès au maximum. Pour retirer cette restriction, supprimez les trois lignes sous « Autoriser accès depuis certaines adresses IP / sous-réseau ».
Enregistrez le fichier et activez ce fichier de config (qui s’appuie sur le VirtualHost par défaut, mais on pourrait créer un vhost distinct) :
sudo a2enconf phpmyadmin.conf
Validez la configuration, et si c’est OK rechargez Apache :
sudo apachectl configtest
sudo systemctl reload apache2
Le moment est venu de tester l’accès à PhpMyAdmin !
V. Accéder à PhpMyAdmin
Ouvrez un navigateur et accédez à l’adresse suivante :
http://<ip-de-votre-serveur>/pma
Je vous rappelle que la valeur « pma » dépend de l’option « alias » définie précédemment. Vous arrivez sur une page de connexion, vous devez vous connecter avec le compte « pma-admin » que l’on a déjà créé.

Ensuite, l’interface de PhpMyAdmin apparaît avec un accès sur toutes les bases de données existantes et la possibilité de créer une nouvelle BDD, etc…. Il ne reste plus qu’à profiter de l’outil.

Pour finir, je vous invite à supprimer le dossier « setup » car il n’a pas d’intérêt. Au cas où on laissera la directive dans la config d’Apache pour refuser l’accès à ce dossier.
rm /usr/share/phpmyadmin/setup/ -Rf
PhpMyAdmin est en place sur votre serveur Debian !
Pour aller plus loin dans la sécurisation de PhpMyAdmin, vous pouvez regarder la documentation officielle : Sécurisation PhpMyAdmin.
Si votre PhpMyAdmin est accessible publiquement, je vous recommande de le basculer en HTTPS et d’ajouter l’authentification Apache « htpasswd » en complément pour avoir une authentification supplémentaire avant de pouvoir accéder à la page de connexion PhpMyAdmin.
Mettre en place une connexion chiffrée
Pour créer une connexion sécurisée on va créer le répertoire /etc/mysql et /etc/mysql/ssl. On va sous /etc/mysql/ssl et on génère une clé RSA privée pour l’autorité de certification maison (CA pour Certificate Autority). Il est bien évident que les certificats et clé de votre CA ne seront valables que sur votre seul réseau interne, à moins que vous soyiez une CA reconnue et enregistrée sur internet ! Si votre site est accessible par internet je vous conseille de créer un certificat qui sera valable sur internet avec let’s encrypt.
root@vmi820488:~# cd /etc/mysql/
root@vmi820488:/etc/mysql# mkdir ssl
root@vmi820488:/etc/mysql# cd ssl
openssl genrsa 2048 > ca-key.pem
Generating RSA private key, 2048 bit long modulus (2 primes)
..........................+++++
....................................................+++++
e is 65537 (0x010001)
root@vmi820488:/etc/mysql/ssl#
root@vmi820488:/etc/mysql/ssl# ls
ca-key.pem
on crée maintenant le certificat du CA basé sur la clé précédemment créée en tapant :
openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:ca-localhost
Email Address []:angelfree.web@gmail.com
root@vmi820488:/etc/mysql/ssl# ls
ca-cert.pem ca-key.pem
Les fichiers ca-cert.pem (certificat) et ca-key.pem (la clé associée au certificat) ont été créés.
Maintenant je crée un certificat pour le serveur en tapant :
openssl req -newkey rsa:2048 -days 365000 -nodes -keyout server-key.pem -out server-req.pem
Ignoring -days; not generating a certificate
Generating a RSA private key
.................+++++
...............................................................................................................................................................................................................................+++++
writing new private key to 'server-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:None
Locality Name (eg, city) []:None
Organization Name (eg, company) [Internet Widgits Pty Ltd]:None
Organizational Unit Name (eg, section) []:None
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:angelfree.web@gmail.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
root@vmi820488:/etc/mysql/ssl# ls
ca-cert.pem ca-key.pem server-key.pem server-req.pem
Attention pour le nom du serveur il faut mettre le nom de notre serveur tel qu’on le retrouve dans le fichier /etc/hosts.
Maintenant on crée la clé RSA du serveur :
openssl rsa -in server-key.pem -out server-key.pem
writing RSA key
On signe le certificat du serveur :
openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Signature ok
subject=C = FR, ST = None, L = None, O = None, OU = None, CN = vmi820488, emailAddress = angelfree.web@gmail.com
Getting CA Private Key
root@vmi820488:/etc/mysql/ssl# ls
ca-cert.pem ca-key.pem server-cert.pem server-key.pem server-req.pem
Les fichiers supplémentaires suivants server-cert.pem, server-key.pem et server-req.pem on été générés.
On crée maintenant le certificat du client
openssl req -newkey rsa:2048 -days 365000 -nodes -keyout client-key.pem -out client-req.pem
Ignoring -days; not generating a certificate
Generating a RSA private key
.......................+++++
..................+++++
writing new private key to 'client-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:None
Locality Name (eg, city) []:None
Organization Name (eg, company) [Internet Widgits Pty Ltd]:None
Organizational Unit Name (eg, section) []:None
Common Name (e.g. server FQDN or YOUR name) []:client-localhost
Email Address []:angelfree.web@gmail.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:None
root@vmi820488:/etc/mysql/ssl# ls
ca-cert.pem ca-key.pem client-key.pem client-req.pem server-cert.pem server-key.pem server-req.pem
On crée la clé RSA du client :
openssl rsa -in client-key.pem -out client-key.pem
writing RSA key
Et on signe le certificat du client :
openssl x509 -req -in client-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Signature ok
subject=C = FR, ST = None, L = None, O = None, OU = None, CN = vmi820488, emailAddress = angelfree.web@gmail.com
Getting CA Private Key
root@vmi820488:/etc/mysql/ssl# ls
ca-cert.pem ca-key.pem client-cert.pem client-key.pem client-req.pem server-cert.pem server-key.pem server-req.pem
On vérifie que tout est OK en tapant :
openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK
Maintenant on va rendre mysql propriétaire du répertoire ssl pour qu’il puisse lire les fichiers :
chown -R mysql:mysql /etc/mysql/ssl/
On édite le fichier /etc/my.cnf et rajoute les lignes suivantes au niveau du serveur et du client :
[client]
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/client-cert.pem
ssl-key=/etc/mysql/ssl/client-key.pem
[mysqld]
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem
On relance le serveur et on tape :
systemctl restart mariadb
mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.8.3-MariaDB Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>status
--------------
mysql Ver 15.1 Distrib 10.8.3-MariaDB, for Linux (x86_64) using readline 5.1
Connection id: 4
Current database:
Current user: root@localhost
SSL: Cipher in use is Cipher in use is TLS_AES_256_GCM_SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.8.3-MariaDB Source distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8mb3
Conn. characterset: utf8mb3
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 3 min 31 sec
Threads: 4 Questions: 53 Slow queries: 0 Opens: 44 Open tables: 38 Queries per second avg: 0.251
--------------
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
+---------------------+--------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/mysql/ssl/ca-cert.pem |
| ssl_capath | |
| ssl_cert | /etc/mysql/ssl/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /etc/mysql/ssl/server-key.pem |
| version_ssl_library | OpenSSL 1.1.1q 5 Jul 2022 |
+---------------------+--------------------------------+
10 rows in set (0.001 sec)
La connexion est sécurisée. Pour aller plus loin vous pouvez consulter cette page qui va vous indiquer (par exemple) comment forcer les connexions chiffrées par utilisateur, machine, ou autre.

Ensuite, l’interface de PhpMyAdmin apparaît avec un accès sur toutes les bases de données existantes et la possibilité de créer une nouvelle BDD, etc…. Il ne reste plus qu’à profiter de l’outil.

Pour finir, je vous invite à supprimer le dossier « setup » car il n’a pas d’intérêt. Au cas où on laissera la directive dans la config d’Apache pour refuser l’accès à ce dossier.
rm /usr/share/phpmyadmin/setup/ -Rf
PhpMyAdmin est en place sur votre serveur Debian !
Pour aller plus loin dans la sécurisation de PhpMyAdmin, vous pouvez regarder la documentation officielle : Sécurisation PhpMyAdmin.
Si votre PhpMyAdmin est accessible publiquement, je vous recommande de le basculer en HTTPS et d’ajouter l’authentification Apache « htpasswd » en complément pour avoir une authentification supplémentaire avant de pouvoir accéder à la page de connexion PhpMyAdmin.