Le système de droits de MySQL s'assure que les utilisateurs font exactement ce qu'ils sont supposés pouvoir faire dans la base. Lorsque vous vous connectez au serveur, vous identité est déterminée par l'hôte d'où vous vous connectez et le nom d'utilisateur que vous spécifiez. Le système donne les droits en fonction de votre identité et de ce que vous voulez faire.
MySQL considère votre nom d'hôte et d'utilisateur pour vous
identifier, car il n'y pas que peu de raisons de supposer que le
même nom d'utilisateur appartient à la même personne, quelque
soit son point de connexion sur Internet. Par exemple,
l'utilisateur joe
qui se connecte depuis
office.com
n'est pas forcément la même
personne que joe
qui se connecte depuis
elsewhere.com
. MySQL gère cela en vous
aidant à distinguer les différents utilisateurs et hôtes qui
ont le même nom : vous pourriez donner des droits à
joe
lorsqu'il utilise sa connexion depuis
office.com
, et un autre jeu de droits
lorsqu'il se connecte depuis elsewhere.com
.
Le contrôle d'accès de MySQL se fait en deux étapes :
Etape 1 : Le serveur vérifie que vous êtes autorisé à vous connecter.
Etape 2 : En supposant que vous pouvez vous connecter, le
serveur vérifie chaque requête que vous soumettez, pour
vérifier si vous avez les droits suffisants pour
l'exécuter. Par exemple, si vous sélectionnez des droits
dans une table, ou effacez une table, le serveur s'assure
que vous avez les droits de SELECT
pour
cette table, ou les droits de DROP
,
respectivement.
Si vos droits ont changé (par vous-mêmes ou bien par un administrateur), durant votre connexion, ces changements ne prendront peut être effets qu'à la prochaine requête. Voyez la section Section 5.5.7, « Quand les modifications de privilèges prennent-ils effets ? » pour plus détails.
Le serveur stocker les droits dans des tables de droits,
situées dans la base mysql
. Le serveur lit
le contenu de ces tables en mémoire lorsqu'il démarre, et les
relit dans différentes circonstances, détaillées dans
Section 5.5.7, « Quand les modifications de privilèges prennent-ils effets ? ». Le contrôle d'accès se
fait par rapport aux tables en mémoire.
Normalement, vous manipulez le contenu des tables indirectement,
via les commandes GRANT
et
REVOKE
pour configurer des comptes et des
droits. See Section 13.5.1.3, « Syntaxe de GRANT
et REVOKE
». La discussion de cette
section décrit la structure des tables de droits, et comment
elle interagit avec les clients.
Le serveur utilise les tables user
,
db
et host
dans la base
mysql
durant les deux étapes. Les champs de
cette table sont les suivants :
Table name | utilisateur | base | hôte |
Scope fields | Host |
Host |
Host |
User |
Db |
Db |
|
Password |
User |
||
Privilege fields | Select_priv |
Select_priv |
Select_priv |
Insert_priv |
Insert_priv |
Insert_priv |
|
Update_priv |
Update_priv |
Update_priv |
|
Delete_priv |
Delete_priv |
Delete_priv |
|
Index_priv |
Index_priv |
Index_priv |
|
Alter_priv |
Alter_priv |
Alter_priv |
|
Create_priv |
Create_priv |
Create_priv |
|
Drop_priv |
Drop_priv |
Drop_priv |
|
Grant_priv |
Grant_priv |
Grant_priv |
|
References_priv |
References_priv |
References_priv |
|
Reload_priv |
|||
Shutdown_priv |
|||
Process_priv |
|||
File_priv |
|||
Show_db_priv |
|||
Super_priv |
|||
Create_tmp_table_priv |
Create_tmp_table_priv |
Create_tmp_table_priv |
|
Lock_tables_priv |
Lock_tables_priv |
Lock_tables_priv |
|
Execute_priv |
|||
Repl_slave_priv |
|||
Repl_client_priv |
|||
ssl_type |
|||
ssl_cypher |
|||
x509_issuer |
|||
x509_cubject |
|||
max_questions |
|||
max_updates |
|||
max_connections |
Lors de la seconde étape du contrôle d'accès (vérification
de la requête), le serveur peut, suivant la requête, consulter
aussi les tables tables_priv
et
columns_priv
. Les champs de ces tables
sont :
Nom de la table | tables_priv | columns_priv |
Champ | Host |
Host |
Db |
Db |
|
User |
User |
|
Table_name |
Table_name |
|
Column_name |
||
Droit | Table_priv |
Column_priv |
Column_priv |
||
Autre champ | Timestamp |
Timestamp |
Grantor |
Chaque table de droit contient des champs d'identification et des champs de droits.
Les champs d'identification déterminent quels utilisateurs
correspondent à cette ligne dans la table. Par exemple, une
ligne dans la table user
avec les valeurs
dans les colonnes Host
et
User
de
'thomas.loc.gov'
et
'bob'
servira à identifier les
connexions qui sont faites par l'utilisateur
bob
depuis l'hôte
thomas.loc.gov
. De même, une ligne dans
la table db
avec les valeurs des colonnes
Host
, User
et
Db
de
'thomas.loc.gov'
,
'bob'
et 'reports'
sera utilisée lorsque l'utilisateur bob
se connecte depuis l'hôte thomas.loc.gov
pour accéder à la base reports
. Les
tables tables_priv
et
columns_priv
contiennent en plus des
champs indiquant les tables et combinaisons tables et
colonnes auxquelles les lignes s'appliquent.
Les champs de droits indiquent si le droit est donné, c'est à dire si l'opération indiquée peut être exécuté. Le serveur combine les informations dans différentes tables pour former une description complète de l'utilisateur. Les règles utilisées sont décrites dans Section 5.5.6, « Contrôle d'accès, étape 2 : Vérification de la requête ».
Les champs d'identification sont des chaînes, déclarées comme suit. La valeur par défaut de chacun des champs est la chaîne vide.
Nom de la colonne | Type |
Host |
CHAR(60) |
User |
CHAR(16) |
Password |
CHAR(16) |
Db |
CHAR(64) |
Table_name |
CHAR(60) |
Column_name |
CHAR(60) |
Avant MySQL 3.23, la colonne Db
valait
CHAR(32)
dans certaines tables, et
CHAR(60)
dans d'autres.
Pour vérifier les accès, la comparaison sur les valeurs de la
colonne Host
sont sensibles à la casse.
User
, Password
,
Db
et Table_name
sont
insensibles. Les valeurs de Column_name
sont
insensibles depuis MySQL 3.22.12.
Dans les tables user
, db
et host
, tous les champs de droits sont
déclarés avec le type ENUM('N','Y')
: il
peuvent prendre tous les valeurs de 'N'
(non)
ou 'Y'
(oui, YES), et la valeur par défaut
est 'N'
.
Dans les tables tables_priv
et
columns_priv
, les champs de droits sont
déclarés comme des champs de type SET
:
Nom de la table | Nom du champs | Valeurs possibles |
tables_priv |
Table_priv |
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop',
'Grant', 'References', 'Index', 'Alter' |
tables_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
columns_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
En bref, le serveur utilise les tables de droits comme ceci :
La table user
détermine si le serveur
accepte ou rejette la connexion. Pour les connexions
acceptées, tous les privilèges donnés dans la table
user
indiquent des privilèges globaux.
Ces droits d'appliquent à
toutes les bases du
serveur.
Les champs d'identification de la table
db
déterminent quels utilisateurs
peuvent accéder à quelles bases, depuis quel hôte. Les
champs de droits indiquent alors les opérations permises.
Les droits s'appliquent alors à toutes
les bases sur le serveur.
La table host
est utilisée comme
extension de la table db
lorsque vous
voulez qu'une ligne de la table db
s'applique à plusieurs hôtes. Par exemple, si vous voulez
qu'un utilisateur soit capable d'utiliser une base depuis
plusieurs hôtes dans votre réseau, laissez la colonne
Host
vide dans la table
db
, Ce mécanisme est décrit en détails
dans Section 5.5.6, « Contrôle d'accès, étape 2 : Vérification de la requête ».
Les tables tables_priv
et
columns_priv
sont similaires à la table
db
, mais sont plus atomiques : elle
s'appliquent au niveau des tables et des colonnes, plutôt
qu'au niveau des bases.
Notez que les droits d'administration tels que
(RELOAD
, SHUTDOWN
, etc...)
ne sont spécifiés que dans la table user
.
En effet, ces opérations sont des opérations au niveau
serveur, et ne sont pas liées à une base de données, ce qui
fait qu'il n'y a pas de raison de les lier avec les autres
tables. En fait user
doit être consulté
pour déterminer les autorisations d'administration.
Le droit de FILE
est spécifié par la table
user
. Ce n'est pas un droit d'administration,
mais votre capacité à lire ou écrire des fichiers sur le
serveur hôte et dépendant de la base à laquelle vous
accédez.
Le serveur mysqld
lit le contenu des tables
de droits une fois, au démarrage. Lorsqu'il y a des
modifications dans les tables, elles prennent effet tel
qu'indiqué dans Section 5.5.7, « Quand les modifications de privilèges prennent-ils effets ? ».
Lorsque vous modifiez le contenu des tables de droits, c'est une
bonne idée que de s'assurer que vous avez bien configuré les
droits qui vous intéressent. Un moyen de vérifier les droits
pour un compte est d'utiliser la commande SHOW
GRANTS
. Par exemple, pour déterminer les droits qui
sont donnés à un compte avec les valeurs
Host
et User
de
pc84.example.com
et bob
,
utilisez cette commande :
mysql> SHOW GRANTS FOR 'bob'@'pc84.example.com';
Un outil de diagnostique pratique est le script
mysqlaccess
, que Yves Carlier a fourni à la
distribution MySQL. Appelez mysqlaccess
avec
l'option the --help
pour comprendre comment il
fonctionne. Notez que mysqlaccess
ne vérifie
les accès que pour les tables user
,
db
et host
. Il n'utilise
pas les tables de droit de niveau table ou colonne.
Pour plus d'aide au diagnostique pour les problèmes de droits,
voyez la section Section 5.5.8, « Causes des erreurs Access denied
». Pour des
conseils généraux sur la sécurité, voyez la section
Section 5.4, « Sécurité générale du serveur ».
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.