MariaDB : utilisateurs et droits
Un compte MariaDB est identifié par un nom et un hôte : 'app'@'localhost' et 'app'@'%' sont deux comptes différents.
Créer un compte applicatif
Section intitulée « Créer un compte applicatif »sudo mariadbCREATE USER 'app'@'localhost' IDENTIFIED BY 'MotDePasseFortEtUnique';GRANT SELECT, INSERT, UPDATE, DELETE ON boutique.* TO 'app'@'localhost';SHOW GRANTS FOR 'app'@'localhost';Principe du moindre privilège : un compte par application, avec seulement les droits nécessaires sur sa base. Ne jamais utiliser root dans une application.
Droits courants
Section intitulée « Droits courants »| Droit | Permet |
|---|---|
SELECT, INSERT, UPDATE, DELETE |
Lire et modifier les données |
CREATE, ALTER, DROP, INDEX |
Modifier la structure (migrations) |
ALL PRIVILEGES ON boutique.* |
Tout sur une base |
EXECUTE |
Exécuter des routines |
FILE, SUPER, GRANT OPTION |
Droits d’administration : à ne pas donner à une application |
GRANT ALL PRIVILEGES ON boutique.* TO 'migrations'@'localhost';REVOKE DELETE ON boutique.* FROM 'app'@'localhost';FLUSH PRIVILEGES;FLUSH PRIVILEGES n’est nécessaire que si les tables de droits sont modifiées directement ; GRANT et REVOKE suffisent.
Mots de passe
Section intitulée « Mots de passe »ALTER USER 'app'@'localhost' IDENTIFIED BY 'NouveauMotDePasse';SET PASSWORD FOR 'app'@'localhost' = PASSWORD('NouveauMotDePasse');Générer un mot de passe aléatoire : openssl rand -base64 24. Ne pas écrire le mot de passe dans l’historique du shell (-p sans valeur) ni dans un dépôt de code. Le fichier ~/.mysql_history mémorise les requêtes : le vider après avoir saisi des mots de passe.
Lister les comptes
Section intitulée « Lister les comptes »SELECT user, host, plugin FROM mysql.user;SELECT CURRENT_USER();SHOW GRANTS;Authentification unix_socket
Section intitulée « Authentification unix_socket »Sur Ubuntu, root utilise le plugin unix_socket : la connexion réussit si le compte système correspond (sudo mariadb). Pour un compte de service local sans mot de passe :
CREATE USER 'sauvegarde'@'localhost' IDENTIFIED VIA unix_socket;GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER, EVENT ON *.* TO 'sauvegarde'@'localhost';Le compte système doit porter le même nom (sauvegarde).
Accès distant
Section intitulée « Accès distant »Trois conditions :
- Le serveur écoute sur une interface accessible : dans
/etc/mysql/mariadb.conf.d/50-server.cnf,bind-address = 10.0.0.5(adresse privée) puissudo systemctl restart mariadb. - Un compte autorisé depuis l’adresse du client :
CREATE USER 'app'@'10.0.0.12' IDENTIFIED BY 'MotDePasseFortEtUnique';GRANT SELECT, INSERT, UPDATE, DELETE ON boutique.* TO 'app'@'10.0.0.12';- Le pare-feu autorise le client seulement :
sudo ufw allow from 10.0.0.12 to any port 3306 proto tcp comment 'MariaDB : serveur applicatif'CREATE ROLE lecteur;GRANT SELECT ON boutique.* TO lecteur;GRANT lecteur TO 'alice'@'localhost';SET DEFAULT ROLE lecteur FOR 'alice'@'localhost';Supprimer
Section intitulée « Supprimer »DROP USER 'app'@'localhost';DROP ROLE lecteur;Dépannage
Section intitulée « Dépannage »| Symptôme | Piste |
|---|---|
ERROR 1045 Access denied for user |
Mot de passe, nom ou hôte incorrect : SELECT user, host FROM mysql.user; |
ERROR 1698 Access denied for user 'root' |
Utiliser sudo mariadb |
ERROR 1044 Access denied … to database |
Droit manquant sur la base : SHOW GRANTS FOR … |
ERROR 1396 Operation CREATE USER failed |
Le compte existe déjà : DROP USER ou ALTER USER |
Host … is not allowed to connect |
Aucun compte pour cette adresse cliente |
| Connexion distante refusée | bind-address, pare-feu, port 3306 : sudo ss -tlnp | grep 3306 |
Ubuntu 24.04 et 26.04 : différences à connaître
Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »La gestion des comptes est la même sur MariaDB 10.11 et 11.8. Sur 26.04, certains algorithmes d’authentification par défaut évoluent : lors d’une migration, vérifier que les clients se connectent toujours.