Installer MariaDB (MySQL) et phpMyAdmin sur Kali Linux

BTS CIEL – Unix – TP 13 · Prérequis : Kali à jour, terminal administrateur (root), Apache2 et PHP déjà installés (TPs précédents)

Terminal administrateur

Dans ce TP, vous travaillez dans le terminal administrateur (root) de Kali Linux : toutes les commandes sont donc données sans sudo. En dehors de ce cadre, avec un utilisateur normal, il faudrait faire précéder chaque commande d’administration de sudo.

Vérification : la commande whoami doit afficher root.

Lire avant de commencer

Objectifs et architecture

Objectifs du TP

Architecture logique

Navigateur web
      ↓
Apache2
      ↓
phpMyAdmin
      ↓
MariaDB / MySQL

En résumé : Apache sert les pages, PHP (déjà installé) exécute phpMyAdmin, phpMyAdmin interroge MariaDB/MySQL, et MariaDB/MySQL stocke les bases de données.

1Mettre à jour le système

On actualise d’abord la liste des paquets disponibles, puis on installe les mises à jour. Faire les deux évite des erreurs de dépendances.

# Actualise la liste des paquets disponibles
$ apt update

# Applique les mises à jour complètes du système
$ apt full-upgrade -y
À savoir

apt update seul ne met à jour que la liste des paquets, pas le système. Il faut ajouter une commande d’upgrade. Sur Kali, distribution « rolling », on utilise généralement apt full-upgrade.

Conseil VM

Si vous travaillez dans une machine virtuelle, faites un snapshot avant de commencer. Kali étant une distribution rolling, une mise à jour importante peut parfois modifier le comportement de certains paquets.

2Installer le serveur de base de données

Sur Kali/Debian, le serveur de base de données fourni par défaut est MariaDB. MariaDB est un fork compatible avec MySQL. Dans la suite du TP, on parlera donc de MySQL/MariaDB.

# Installe le serveur MariaDB
$ apt install mariadb-server -y

# Démarre MariaDB et l'active au démarrage du système
$ systemctl enable --now mariadb

# Vérifie l'état du service
$ systemctl status mariadb --no-pager

# Vérifie que MariaDB écoute bien sur le port 3306
$ ss -ltnp | grep 3306

# Se connecte à la console SQL en tant que root MariaDB
$ mysql

Dans la console, le prompt devient généralement :

MariaDB [(none)]>

Pour vérifier la version et quitter :

MariaDB [(none)]> SELECT VERSION();
MariaDB [(none)]> QUIT;
À savoir : noms de paquets MySQL/MariaDB
  • mariadb-server : serveur MariaDB, recommandé ici.
  • default-mysql-server : méta-paquet Debian/Kali qui installe MariaDB.
  • mysql-client : client MySQL/MariaDB, souvent installé avec le serveur.
  • mysql.server : n’existe pas.
  • mysql-server : peut être introuvable dans les dépôts Kali/Debian par défaut.
Le compte root MariaDB sous Debian/Kali

La commande mysql -u root -p échoue généralement avec une erreur du type Access denied for user 'root'@'localhost'.

Ce n’est pas forcément une erreur d’installation. Sur Kali/Debian, le compte root de MariaDB s’authentifie via le compte système root, avec le plugin unix_socket. Il n’a donc pas forcément de mot de passe MariaDB.

Depuis un terminal administrateur, on se connecte simplement avec :

$ mysql

C’est la raison pour laquelle il faudra créer un utilisateur MySQL/MariaDB dédié, avec un mot de passe, pour se connecter à phpMyAdmin.

3Installer phpMyAdmin

phpMyAdmin est une application web écrite en PHP. Elle s’appuie donc sur :

# Installe phpMyAdmin
$ apt install phpmyadmin -y

# Relance l'assistant de configuration si nécessaire
$ dpkg-reconfigure phpmyadmin
Le -y ne remplit pas l’assistant Debconf

Le -y répond seulement « oui » à la confirmation APT. Il ne répond pas automatiquement aux questions de configuration de phpMyAdmin.

L’assistant peut s’afficher pendant l’installation. S’il ne s’affiche pas, ou si vous avez répondu incorrectement, relancez-le avec :

$ dpkg-reconfigure phpmyadmin

Réponses conseillées à l’assistant

Navigation : flèches pour se déplacer, Espace pour cocher, Entrée pour valider.

Question Réponse conseillée Remarque
Serveur web à reconfigurer automatiquement Cocher apache2 avec Espace Sans cette case cochée, la configuration Apache de phpMyAdmin n’est pas forcément activée. C’est l’erreur la plus fréquente, provoquant une erreur 404 sur /phpmyadmin.
Configurer la base de données avec dbconfig-common Oui Cela permet de créer automatiquement la base interne utilisée par phpMyAdmin.
Mot de passe de l’application phpMyAdmin Au choix, ou vide pour générer un mot de passe aléatoire Ce mot de passe sert à la configuration interne de phpMyAdmin via dbconfig-common. Ce n’est pas forcément le compte que vous utiliserez pour vous connecter à l’interface web.
Fichier de configuration interne

Les informations générées par l’assistant peuvent se trouver notamment dans :

$ ls -l /etc/phpmyadmin/config-db.php

Pour la connexion à l’interface web, on utilisera un utilisateur MariaDB/MySQL, par exemple celui créé à l’étape 6.

4Accéder à phpMyAdmin

Avant d’accéder à phpMyAdmin, on vérifie qu’Apache tourne et que la configuration phpMyAdmin est activée.

# Vérifie qu'Apache est actif
$ systemctl status apache2 --no-pager

# Active la configuration phpMyAdmin dans Apache
$ a2enconf phpmyadmin

# Recharge Apache sans couper les connexions en cours
$ systemctl reload apache2

# Vérifie que la configuration phpMyAdmin est bien activée
$ ls -l /etc/apache2/conf-enabled/ | grep phpmyadmin

Dans le navigateur de Kali, ouvrir :

http://localhost/phpmyadmin

On doit voir la page de connexion de phpMyAdmin. Si c’est le cas, passer directement à l’étape 6 pour créer un utilisateur utilisable.

localhost et accès depuis une autre machine

localhost désigne la machine elle-même, c’est-à-dire l’adresse 127.0.0.1.

Depuis une autre machine, on utiliserait l’adresse IP de la VM Kali, trouvable avec :

$ ip a
Sécurité : ne pas exposer phpMyAdmin directement

phpMyAdmin est une interface d’administration sensible. Ne l’exposez pas directement sur Internet.

En TP local, http://localhost/phpmyadmin est acceptable. Depuis une autre machine, préférez un tunnel SSH.

Exemple de tunnel SSH à lancer depuis la machine cliente :

ssh -L 8080:localhost:80 utilisateur@IP_DE_KALI

Puis ouvrir dans le navigateur de la machine cliente :

http://localhost:8080/phpmyadmin

Si vous devez absolument autoriser une IP dans Apache, limitez l’accès à cette IP précise, et seulement pour le TP.

5Dépannage : la page ne s’affiche pas

Cette section traite principalement des erreurs 404, 403, 500, et des problèmes de connexion à la base de données.

Erreur 404 sur /phpmyadmin

Une erreur 404 signifie souvent que la configuration Apache de phpMyAdmin n’est pas activée.

# 1) Les fichiers de phpMyAdmin existent-ils ?
$ ls /usr/share/phpmyadmin

# 2) La configuration est-elle disponible dans Apache ?
$ ls /etc/apache2/conf-available/ | grep phpmyadmin

# 3) La configuration est-elle activée ?
$ ls /etc/apache2/conf-enabled/ | grep phpmyadmin

# 4) Active proprement la configuration phpMyAdmin
$ a2enconf phpmyadmin

# 5) Recharge Apache
$ systemctl reload apache2

# 6) Teste la syntaxe de la configuration Apache
$ apache2ctl configtest

Si a2enconf phpmyadmin échoue parce que le fichier n’est pas présent dans conf-available, on peut créer manuellement le lien symbolique vers conf-available, puis activer la configuration :

# Crée le lien symbolique vers la configuration fournie par le paquet
$ ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf

# Active la configuration
$ a2enconf phpmyadmin

# Recharge Apache
$ systemctl reload apache2
Rappel sur ln -s

Dans ln -s CIBLE LIEN, le premier chemin est la cible, c’est-à-dire le fichier existant. Le second chemin est le nom du lien à créer.

Consulter les logs Apache

En cas d’erreur 404, 403 ou 500, les logs Apache sont indispensables :

# Affiche les dernières erreurs Apache
$ tail -n 50 /var/log/apache2/error.log

# Affiche les dernières accès Apache
$ tail -n 50 /var/log/apache2/access.log

# Alternative avec journalctl
$ journalctl -u apache2 --no-pager -n 50

Erreur 403 Forbidden

Une erreur 403 peut signifier qu’Apache autorise uniquement l’accès local. Sous Debian/Kali, la configuration de phpMyAdmin peut contenir une directive du type :

Require local

Dans ce cas, http://localhost/phpmyadmin fonctionne sur la VM Kali, mais l’accès depuis une autre machine peut être refusé.

Solutions :

Pour chercher une restriction d’accès :

$ grep -R "Require" /etc/phpmyadmin/apache.conf
$ grep -R "Require" /etc/apache2/conf-enabled/phpmyadmin.conf

Erreur 500 Internal Server Error

Une erreur 500 vient souvent de PHP, d’une extension manquante ou d’une mauvaise configuration.

# Vérifie que PHP est chargé par Apache
$ apache2ctl -M | grep php

# Vérifie les extensions PHP utiles
$ php -m | grep -E 'mysqli|pdo_mysql|mbstring|xml|zip'

# Consulte les logs Apache
$ tail -n 50 /var/log/apache2/error.log

Message : impossible de se connecter au serveur de base de données

Si phpMyAdmin affiche une erreur de connexion à MariaDB/MySQL, vérifier que le service tourne :

# Vérifie l'état de MariaDB
$ systemctl status mariadb --no-pager

# Démarre MariaDB si nécessaire
$ systemctl start mariadb

# Vérifie que le port 3306 est écouté
$ ss -ltnp | grep 3306

# Consulte les logs MariaDB
$ tail -n 50 /var/log/mysql/error.log
$ journalctl -u mariadb --no-pager -n 50

6Créer un utilisateur MySQL/MariaDB

Si la connexion à phpMyAdmin est refusée avec root, c’est normal sous Kali/Debian à cause de l’authentification unix_socket. On crée donc un utilisateur MariaDB/MySQL avec un mot de passe, dédié à l’administration du TP.

Adapter les valeurs

Dans les exemples suivants, remplacez :

  • etudiant par votre nom d’utilisateur MariaDB/MySQL ;
  • MotDePasseSolide1! par votre mot de passe.

Évitez les mots de passe trop simples comme password, 123456 ou admin, même en TP.

Méthode rapide depuis la console MariaDB

# Ouvre la console SQL en root MariaDB
$ mysql

Puis, dans la console MariaDB, exécuter une instruction par ligne, chacune terminée par ; :

CREATE USER IF NOT EXISTS 'etudiant'@'localhost' IDENTIFIED BY 'MotDePasseSolide1!';
ALTER USER 'etudiant'@'localhost' IDENTIFIED BY 'MotDePasseSolide1!';
GRANT ALL PRIVILEGES ON *.* TO 'etudiant'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
QUIT;
Pourquoi IF NOT EXISTS et ALTER USER ?

CREATE USER IF NOT EXISTS évite une erreur si l’utilisateur existe déjà. ALTER USER permet de réinitialiser le mot de passe si l’utilisateur existait déjà avec un autre mot de passe.

Tester la connexion

# Teste la connexion avec le nouvel utilisateur
$ mysql -u etudiant -p -e "SELECT CURRENT_USER();"

On doit saisir le mot de passe, puis obtenir une sortie du type :

+----------------+
| CURRENT_USER() |
+----------------+
| etudiant@localhost |
+----------------+

Retourner ensuite sur :

http://localhost/phpmyadmin

et se connecter avec etudiant et le mot de passe choisi.

Sécurité : moindre privilège

GRANT ALL PRIVILEGES ON *.* ... WITH GRANT OPTION donne les droits d’un administrateur complet.

C’est acceptable sur une VM de TP, mais pas sur un serveur réel. En production, on créerait un compte par application avec des droits limités à sa base, par exemple :

GRANT ALL PRIVILEGES ON ma_base.* TO 'app'@'localhost';
Erreurs de recopie très fréquentes
  • Les apostrophes doivent être droites : '.
  • Les guillemets typographiques ‘ ’, souvent copiés depuis Word ou une page web, provoquent une erreur ERROR 1064 (42000).
  • Ne pas oublier le ; à la fin de chaque instruction SQL.
  • Ne pas laisser user ou motdepasse tels quels sans personnalisation.

7Méthode sécurisée avec fichier SQL

Quand on tape directement une commande SQL contenant un mot de passe dans la console MariaDB, le client MySQL/MariaDB peut enregistrer la commande dans un fichier d’historique, souvent :

~/.mysql_history

Le mot de passe peut alors se retrouver en clair dans ce fichier. Pour un TP, il est préférable de préparer les commandes dans un fichier SQL temporaire, de protéger ce fichier, de l’exécuter, puis de le supprimer.

Créer un fichier SQL

# Ouvre un fichier de préparation dans nano
$ nano ~/creer_user.sql

Contenu à adapter, en remplaçant etudiant et le mot de passe :

CREATE USER IF NOT EXISTS 'etudiant'@'localhost' IDENTIFIED BY 'MotDePasseSolide1!';
ALTER USER 'etudiant'@'localhost' IDENTIFIED BY 'MotDePasseSolide1!';
GRANT ALL PRIVILEGES ON *.* TO 'etudiant'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Sous nano : Ctrl+O puis Entrée pour enregistrer, Ctrl+X pour quitter.

Protéger, exécuter puis supprimer le fichier

# Protège le fichier contre la lecture par les autres utilisateurs
$ chmod 600 ~/creer_user.sql

# Exécute le fichier SQL sans ouvrir la console interactive
$ mysql < ~/creer_user.sql

# Supprime le fichier contenant le mot de passe en clair
$ rm ~/creer_user.sql

Vérifications

# Vérifie que l'utilisateur peut se connecter
$ mysql -u etudiant -p -e "SELECT CURRENT_USER();"

# Vérifie la présence de l'utilisateur dans la table mysql.user
$ mysql -e "SELECT User, Host FROM mysql.user WHERE User='etudiant';"
Bonne habitude

Après un TP, supprimer les fichiers temporaires contenant des mots de passe. Ne pas laisser de script SQL avec identifiants en clair dans le home.

8Récapitulatif et pièges classiques

Symptôme Cause probable Solution
Unable to locate package mysql.server Nom de paquet inexistant apt install mariadb-server
mysql-server introuvable Kali/Debian fournit MariaDB par défaut Utiliser mariadb-server ou default-mysql-server
ERROR 1698 ou Access denied for user 'root' Authentification unix_socket Se connecter avec mysql sans mot de passe, ou créer un utilisateur dédié
404 Not Found sur /phpmyadmin Configuration Apache non activée a2enconf phpmyadmin puis systemctl reload apache2
Assistant phpMyAdmin non affiché Le -y d’APT ne remplit pas Debconf dpkg-reconfigure phpmyadmin
403 Forbidden depuis une autre machine Accès restreint à localhost Utiliser un tunnel SSH ou autoriser temporairement une IP précise
Impossible de se connecter au serveur de base de données MariaDB arrêté systemctl start mariadb ou service mariadb start
ERROR 1064 ... syntax Guillemets typographiques ou ; manquant Retaper les apostrophes droites ' et ajouter les points-virgules
Le navigateur propose de télécharger le fichier PHP PHP non activé dans Apache apt install libapache2-mod-php puis redémarrer Apache
Erreur 500 sur phpMyAdmin Extension PHP manquante ou erreur Apache/PHP Consulter /var/log/apache2/error.log, vérifier php -m
Mot de passe visible dans l’historique MySQL Commande SQL tapée directement avec mot de passe Utiliser un fichier SQL temporaire, chmod 600, puis le supprimer

Commandes de service à retenir

# Apache
$ systemctl status apache2 --no-pager
$ systemctl start apache2
$ systemctl restart apache2
$ systemctl reload apache2

# MariaDB
$ systemctl status mariadb --no-pager
$ systemctl start mariadb
$ systemctl restart mariadb
$ systemctl enable --now mariadb

# phpMyAdmin / Apache
$ a2enconf phpmyadmin
$ apache2ctl configtest
$ apache2ctl -M | grep php

L’ancienne commande service fonctionne encore, mais systemctl est la commande moderne sous les systèmes utilisant systemd.

# Ancienne méthode, encore fonctionnelle
$ service apache2 status
$ service mariadb status

Logs utiles

# Logs Apache
$ tail -n 50 /var/log/apache2/error.log
$ tail -n 50 /var/log/apache2/access.log

# Logs MariaDB
$ tail -n 50 /var/log/mysql/error.log

# Logs système via journalctl
$ journalctl -u apache2 --no-pager -n 50
$ journalctl -u mariadb --no-pager -n 50

Checklist de validation

Cocher chaque élément après vérification.