Aller au contenu

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.

Fenêtre de terminal
sudo mariadb
CREATE 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.

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.

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.

SELECT user, host, plugin FROM mysql.user;
SELECT CURRENT_USER();
SHOW GRANTS;

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).

Trois conditions :

  1. 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) puis sudo systemctl restart mariadb.
  2. 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';
  1. Le pare-feu autorise le client seulement :
Fenêtre de terminal
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';
DROP USER 'app'@'localhost';
DROP ROLE lecteur;
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.