Les gestion des droits (ajout/suppression d'utilisateur, modification de droits) sous MySQL se fait entièrement en SQL. MySQL stocke les utilisateurs et leurs droits dans la base mysql, et les tables user, db et host. La détermination des droits en fonction de ces tables est un peu complexe à détailler mais si l'on utilise les commandes GRANT et REVOKE, cela reste très simple.
La commande GRANT permet d'ajouter des droits. Lorsque j'ajoute des droits à un utilisateur inexistant, GRANT crééra cet utilisateur
Sa syntaxe générale est :
GRANT quoi ON sur_quoi TO qui@depuis_ou IDENTIFIED BY mot_de_passe
Par exemple, pour donner l'autorisation à alice de lire (c'est à dire faire des SELECT) sur la table Genies de la base mabase, on devra saisir :
GRANT SELECT ON mabase.Genies TO alice@localhost IDENTIFIED BY 'lepass'
Si l'on souhaite donner un accès lecture/création/mise à jour d'enregistrement, on utilisera :
GRANT SELECT,INSERT,UPDATE ON mabase.Genies TO alice@localhost IDENTIFIED BY 'lepass'
On pourra être moins spécifique si nécessaire. Dans les exemples précédent, les droits alloués concernaient la table Genies de la base mabase. Si l'on souhaite appliquer ces droits à toutes les tables de mabase, on utilisera :
GRANT SELECT,INSERT,UPDATE ON mabase.* TO alice@localhost IDENTIFIED BY 'lepass'
De même, si l'on souhaite appliquer ces droits pour Alice sur toutes les bases du système, on utilisera :
GRANT SELECT,INSERT,UPDATE ON *.* TO alice@localhost IDENTIFIED BY 'lepass'
Attention cependant à la table mysql....
Ces commandes ne permettront à Alice de se connecter que localement
(localhost). Si Alice doit se connecter depuis une machine
distante, il faudra remplacer localhost par
nom_machine ou ip_machine. Bien sûr,
le filtrage (Section 6.4.5, « Filtrage ») et le
binding (Section 6.4.3, « my.cnf
») devront être
adaptés.
root@ubuntu:~#mysql -u alice -p
❶ Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 Server version: 5.0.38-Ubuntu_0ubuntu1-log Ubuntu 7.04 distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>USE mabase
Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql>SELECT * from Genies WHERE Nom='Turing';
+--------+--------+----------------+ | Nom | Prenom | AnneeNaissance | +--------+--------+----------------+ | Turing | Alan | 2912 | +--------+--------+----------------+ 1 row in set (0.00 sec) mysql>UPDATE Genies SET AnneeNaissance=1912 WHERE Nom='Turing';
❷ Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql>DELETE FROM Genies WHERE Nom='Gates';
❸ ERROR 1142 (42000): DELETE command denied to user 'alice'@'localhost' for table 'Genies' mysql>
La commande REVOKE permet de supprimer des droits. Lorsque je supprime le dernier droit à un utilisateur, il n'est pas supprimé. Im faudra le suppriler explicitement de la table user (base mysql) si nécessaire. GRANT crééra cet utilisateur
Sa syntaxe générale, presque symétrique à celle de GRANT[19]est :
REVOKE quoi ON sur_quoi FROM qui@depuis_ou
Par exemple, pour supprimer à Alice la possibilité de mettre à jour des enregistremenets, on utilisera la commande suivante :
REVOKE UPDATE ON mabase.Genies FROM alice@localhost
Si l'on reprend la connexion ci-dessus, une tentative d'UPDATE par Alice se traduirait par un refus :
mysql> UPDATE Genies SET AnneeNaissance=1912 WHERE Nom='Turing';
ERROR 1142 (42000): UPDATE command denied to user 'alice'@'localhost' for table 'Genies'
mysql>
La commande SHOW GRANTS permet de visualiser les droits dont disposent les utilisateurs de la base. Sans arguments, cette commande renvoie les droits de l'utilisateur qui l'invoque. Si on l'accompagne de FOR, on pourra spécifier pour quel utilisateur on souhaite visualiser les droits.
mysql>SHOW GRANTS;
+-------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for dbadmin@localhost | +-------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'localhost' IDENTIFIED BY PASSWORD '*196BDEDE2AE4F84CA44C47D54D78478C7E2BD7B7' WITH GRANT OPTION | +-------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>SHOW GRANTS FOR alice@localhost;
+-------------------------------------------------------------------------------------------------------------------------------+ | Grants for alice@localhost | +-------------------------------------------------------------------------------------------------------------------------------+ | GRANT SELECT, INSERT, UPDATE ON *.* TO 'alice'@'localhost' IDENTIFIED BY PASSWORD '*4F5CCA657BD61D1C1127E5C4EA3B0EE4A9841B85' | | GRANT SELECT, INSERT ON `mabase`.`Genies` TO 'alice'@'localhost' | +-------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) mysql>
La liste des droits utilisables avec GRANT et REVOKE (le quoi) est assez importante. Chaque droit porte généralement le nom de la commande SQL autorisée (ou révoquée). On se reportera à la documentation MySQL (voir sur [MySQL] le chapitre concernant GRANT) pour un tableau exhaustif, mais les plus importantes sont :
SELECT : « lire » des enregistrements
INSERT : insérer des enregistrements
UPDATE : mettre à jour des enregistrements existants
DELETE : supprimer des enregisrtements
CREATE : créér des tables
DROP : détruire des tables
GRANT : donner ou supprimer des droits
Il faudra ici aussi appliquer le principe du privilège minimum : inutile de donner accès à toutes les bases si l'utilisateur n'a besoin d'accéder qu'a la sienne. De même, inutile de donner le droit DELETE si l'utilisateur n'a besoin que de lire la base, et inutile de donner des droits sur des tables d'une base quand ce n'est pas nécessaire.