Première chose essentielle à comprendre : quelle que soit la plate-
forme utilisée, les comptes d'utilisateurs MySQL n'ont rien à voir avec ceux
du système (comptes Unix ou comptes Windows). Ils sont maintenus dans un base
particulière du serveur(la base mysql), dans la table user.
Par ailleurs bien noter que dans les versions au moins jusqu'à 3.23 la longueur
des noms est limitée à 16 caractères (8 dans Unix et beaucoup beaucoup plus dans
Windows).
Rien n'empêche (en dehors des limites de tailles différentes) de
créer des comptes MySQL ayant le même nom que des comptes du système.
De plus, faire très attention (voir plus bas et aussi ici) à l'installation initiale de MySQL qui doit absolument être sécurisée.
De la même façon que pour les noms, les mots de passe MySQL n'ont rien à
voir avec ceux du système. Ca peut changer un jour avec la généralisation
des annuaires ldap mais là ce n'est pas le cas. De même que pour les noms,
rien n'empêche de créer des comptes identiques à ceux du système avec le même
mot de passe.
Bien noter, que la façon dont MySQL crypte les mots de passe est également
différente de la façon de faire d'Unix ou de Windows.
Si vous utilisez le client mysql sans aucune option, sous Unix comme Windows, l'hôte utilisé par défaut sera localhost. Sur une machine Unix, il utilisera le login Unix courant sans mot de passe (sauf si vous spécifiez "-p" sans mot de passe derrière). Sur une machine Windows le login sera "ODBC@localhost". Si celui n'existe pas... ça ne peut qu'échouer.
D:\Perso\MonSiteWeb\mysqlinf>d:\mysql\bin\mysql ERROR 1045: Access denied for user: 'ODBC@localhost' (Using password: NO)
user | host | db | tables_priv | columns_priv | A quoi ça sert ? | |||||
---|---|---|---|---|---|---|---|---|---|---|
Champs | Champs | Champs | Champs | Champs | ||||||
Host | Host | Host | Host | Host | ||||||
Db | Db | Db | Db | |||||||
User | User | User | User | |||||||
Password | ||||||||||
Table_name | Table_name | |||||||||
Column_name | ||||||||||
Grantor | ||||||||||
Timestamp | Timestamp | |||||||||
Table_priv | ||||||||||
Column_priv | Column_priv | |||||||||
Select_priv | Select_priv | Select_priv | TC | C | Sélectionner des données | |||||
Insert_priv | Insert_priv | Insert_priv | TC | C | Insérer des données | |||||
Update_priv | Update_priv | Update_priv | TC | C | Modifier des données | |||||
Delete_priv | Delete_priv | Delete_priv | T | Supprimer des enregistrements | ||||||
Create_priv | Create_priv | Create_priv | T | Créer des tables, des bases | ||||||
Drop_priv | Drop_priv | Drop_priv | T | Détruire des tables, des bases | ||||||
Reload_priv | ||||||||||
Shutdown_priv | ||||||||||
Process_priv | ||||||||||
File_priv | Permet de lire ou écrire des fichiers sur le serveur par les commandes LOAD DATA from_file, SELECT ... INTO out_file | |||||||||
Grant_priv | Grant_priv | Grant_priv | T | Donner des droits qu'on a soi-même à un autre utilisateur | ||||||
References_priv | References_priv | References_priv | TC | C | ||||||
Index_priv | Index_priv | Index_priv | T | Créer, détruire des index | ||||||
Alter_priv | Alter_priv | Alter_priv | T | Modifier les structures de table | ||||||
Remarques |
||||||||||
"" dans User revient à tout user donc anonymous en quelque sorte % ou "" dans Host revient à tout host |
Les droits Reload_priv, Shutdown_priv, Process_priv ont trait aux actes administratifs réalisables par le biais de la commande mysqladmin. Tout utilisateur peut lister les process dont il est propriétaire mais pas ceux des autres, sans le droit Process_priv.
Les commandes reload ou flush-privileges forcent MySQL à relire les tables de droits. C'est indispensable si vous modifiez directement les droits en manipulant vous-même les tables de la base mysql. Par contre, si vous utilisez la commande grant, cela est inutile. MySQL prend en compte immédiatement les modifications faites par la commande grant.
L'utilisateur et l'hôte qui vont être utilisés pour valider les droits sont déterminés une seule fois à la connexion de l'utilisateur. Ceci signifie que toute erreur à ce niveau se répercute sur le reste du travail.
Prenons l'exemple, d'un utilisateur "toto" créé pour attribuer des droits au niveau d'une base "machin". Admettons ensuite que toto ne soit pas créé dans la table user et seulement dans la table db. Deux situations peuvent se produire :
a) Il n'y a pas de droits pour anonyme sur la base "machin", il ne pourra donc rien faire
b) Il y a des droits pour anonyme sur la base "machin" et c'est ceux-là qui vont s'appliquer et non ceux qui avaient été définis pour toto
Host | User | Password | Select | Insert | Update | Delete | Create | Drop | Grant | References | Index | Alter | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
% | root | ******** | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y |
% | N | N | N | N | N | N | N | N | N | N | N | N | N | N |
Les champs de droits en gris sont des droits globaux sur le
serveur MySQl. Ils ne nous intéressent pas ici.
Lors de sa tentative de connexion toto va être autorisé comme
anonyme grâce à la deuxième ligne. Ce user n'a aucun droit sur
les bases du serveur MySQl, comme défini dans les champs de
droits (tous à "N")
Host | Db | User | Select | Insert | Update | Delete | Create | Drop | Grant | References | Index | Alter |
---|---|---|---|---|---|---|---|---|---|---|---|---|
% | machin | toto | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y |
% | machin | Y | N | N | N | N | N | N | N | N | N |
Lors d'un accès à la base machin le user anonyme n'a droit qu'à select. Toto a tous les droits, lui, mais notre utilisateur a été identifié comme anonyme à sa connection.
Conclusion : Alors que toto aurait dû avoir tous les droits sur la base "machin" il ne va pouvoir faire que des select.
Sur un serveur de test,
Host | User | Password | Select | Insert | Update | Delete | Create | Drop | Grant | References | Index | Alter | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
% | root | ******** | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y |
% | toto | N | N | N | N | N | N | Y | Y | Y | Y | N | N | N | N | |
mysrv | N | N | N | N | N | N | N | N | N | N | N | N | N | N |
Host | Db | User | Select | Insert | Update | Delete | Create | Drop | Grant | References | Index | Alter |
---|---|---|---|---|---|---|---|---|---|---|---|---|
% | machin | toto | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y |
mysrv | lycees | toto | Y | Y | Y | Y | N | N | N | N | N | N |
% | lycees | Y | N | N | N | N | N | N | N | N | N |
Questions
L'utilisateur toto tente de se connecter successivement depuis la machine mysrv puis depuis la machine station3 pour accéder à la base de données machin.