GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON {tbl_name | * | *.* | db_name.*} TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user [IDENTIFIED BY [PASSWORD] 'password']] ... [REQUIRE NONE | [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count | MAX_CONNECTIONS_PER_HOUR count]]
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON {tbl_name | * | *.* | db_name.*} FROM user [, user] ... REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
Les commandes GRANT
et
REVOKE
permettent à l'administrateur
système de créer et supprimer des comptes utilisateur et de
leur donner ou retirer des droits. GRANT
et
REVOKE
sont implémentées en MySQL 3.22.11
ou plus récent. Pour les anciennes versions de MySQL, ces
commandes ne font rien.
Les informations sur les comptes MySQL sont stockés dans la
base mysql
. Cette base et son accès sont
présentés en détails dans la section
Chapitre 5, Administration du serveur.
Les droits sont donnés à 4 niveaux :
Niveau global
Les droits globaux s'appliquent à toutes les bases de
données d'un serveur. Ces droits sont stockés dans la
table mysql.user
. REVOKE ALL
ON *.*
retirera seulement les privilèges
globaux.
Niveau base de données
Les droits de niveau de base de données s'appliquent à
toutes les tables d'une base de données. Ces droits sont
stockés dans les tables mysql.db
et
mysql.host
. REVOKE ALL ON
db.*
retirera seulement les privilèges de base
de données.
Niveau table
Les droits de table s'appliquent à toutes les colonnes
d'une table. Ces droits sont stockés dans la table
mysql.tables_priv
. REVOKE ALL
ON db.table
retirera seulement les privilèges
de table.
Niveau colonne
Les droits de niveau de colonnes s'appliquent à des
colonnes dans une table. Ces droits sont stockés dans la
table mysql.columns_priv
. Quand vous
utilisez REVOKE
vous devez spécifier
les mêmes colonnes qui s'étaient vues accorder des
privilèges.
Pour faciliter la suppression de tous les droits d'un utilisateur, MySQL 4.1.2 a ajouté la syntaxe suivante, qui efface tous les droits de base, table et colonne pour un utilisateur donné :
REVOKE ALL PRIVILEGES,GRANT FROM user_name [, user_name ...]
Avant MySQL 4.1.2, tous les droits ne peuvent pas être effacés d'un coup. Il faut deux commandes pour cela :
REVOKE ALL PRIVILEGES FROM user [, user] ... REVOKE GRANT OPTION FROM user [, user] ...
Pour les commandes GRANT
et
REVOKE
, la clause
priv_type
peut être spécifiée par les
constantes suivantes :
Droit | Signification |
ALL [PRIVILEGES] |
Tous les droits sauf WITH GRANT OPTION . |
ALTER |
Autorise l'utilisation de ALTER TABLE . |
CREATE |
Autorise l'utilisation de CREATE TABLE . |
CREATE TEMPORARY TABLES |
Autorise l'utilisation de CREATE TEMPORARY TABLE . |
DELETE |
Autorise l'utilisation de DELETE . |
DROP |
Autorise l'utilisation de DROP TABLE . |
EXECUTE |
Autorise l'utilisateur à exécuter des procédures stockées (pour MySQL 5.0). |
FILE |
Autorise l'utilisation de SELECT ... INTO OUTFILE et
LOAD DATA INFILE . |
INDEX |
Autorise l'utilisation de CREATE INDEX et
DROP INDEX . |
INSERT |
Autorise l'utilisation de INSERT . |
LOCK TABLES |
Autorise l'utilisation de LOCK TABLES sur les tables
pour lesquelles l'utilisateur a les droits de
SELECT . |
PROCESS |
Autorise l'utilisation de SHOW FULL PROCESSLIST . |
REFERENCES |
Réservé pour le futur. |
RELOAD |
Autorise l'utilisation de FLUSH . |
REPLICATION CLIENT |
Donne le droit à l'utilisateur de savoir où sont les maîtres et esclaves. |
REPLICATION SLAVE |
Nécessaire pour les esclaves de réplication (pour lire les historiques binaires du maître). |
SELECT |
Autorise l'utilisation de SELECT . |
SHOW DATABASES |
SHOW DATABASES affiche toutes les bases de données. |
SHUTDOWN |
Autorise l'utilisation de mysqladmin shutdown . |
SUPER |
Autorise une connexion unique même si
max_connections est atteint, et
l'exécution des commandes CHANGE
MASTER , KILL thread ,
mysqladmin debug , PURGE
MASTER LOGS et SET
GLOBAL . |
UPDATE |
Autorise l'utilisation de UPDATE . |
USAGE |
Synonyme de ``pas de droits''. |
GRANT OPTION |
Synonyme pour WITH GRANT OPTION
|
USAGE
peut être utilisé lorsque vous
voulez créer un utilisateur sans aucun droit.
Les droits de CREATE TEMPORARY TABLES
,
EXECUTE
, LOCK TABLES
,
REPLICATION ...
, SHOW
DATABASES
et SUPER
sont nouveaux
en version 4.0.2. Pour utiliser ces droits après mise à jour
en 4.0.2, vous devez exécuter le script
mysql_fix_privilege_tables
. See
Section 2.6.7, « Mise à jour des tables de droits ».
Dans les anciennes versions de MySQL, le droit de
PROCESS
donnait les mêmes droits que le
nouveau droit SUPER
.
Vous pouvez donner des droits globaux en utilisant la syntaxe
ON *.*
. Vous pouvez donner des droits de
base en utilisant la syntaxe ON nom_base.*
.
Si vous spécifiez ON *
et que vous avez
une base de données qui est déjà sélectionnée, vous allez
donner des droits pour la base de données courante.
Attention : si vous
spécifiez ON *
et que vous
n'avez pas de base courante, vous allez
affecter les droits au niveau du serveur !
Les droits EXECUTION
,
FILE
, PROCESS
,
RELOAD
, REPLICATION
CLIENT
, REPLICATION SLAVE
,
SHOW DATABASES
, SHUTDOWN
et SUPER
sont des droits d'administration,
qui ne peuvent être donnés que globalement (avec la syntaxe
ON *.*
).
Les autres droits peuvent être donnés globalement ou à des niveaux plus spécifiques.
Les seuls droits priv_type
que vous pouvez
donner au niveau d'une table sont SELECT
,
INSERT
, UPDATE
,
DELETE
, CREATE
,
DROP
, GRANT OPTION
,
INDEX
et ALTER
.
Les seuls droits priv_type
que vous pouvez
donner au niveau d'une colonne (avec la clause
column_list
) sont
SELECT
, INSERT
et
UPDATE
.
GRANT ALL
assigne des droits que vous
possédez au niveau où vous le possédez. Par exemple, si
vous utilisez GRANT ALL ON db_name.*
, qui
est un droit de niveau de base de données, aucun des droits
globaux, comme FILE
ne sera donné.
MySQL vous permet de donner des droits au niveau d'une base de données, même si la base de données n'existe pas, pour vous aider à préparer l'utilisation de la base de données. Actuellement, MySQL ne vous permet pas de créer des droits pour une table si la table n'existe pas.
MySQL ne supprime pas les droits lorsqu'un utilisateur efface une table ou une base.
Notez bien : les caractères
joker ‘_
’ et
‘%
’ sont autorisés lors de la
spécification de noms dans la commande
GRANT
. Cela signifie que si vous voulez
utiliser par exemple le caractère littéral
‘_
’ comme nom de base, vous
devez le spécifier sous la forme
‘\_
’ dans la commande
GRANT
, pour éviter à l'utilisateur
d'accéder à d'autres bases, dont le nom pourrait
correspondre au masque d'expression régulière ainsi créé.
Utilisez plutôt GRANT ... ON `foo\_bar`.* TO
...
.
Afin de permettre l'identification des utilisateurs depuis des
hôtes arbitraires, MySQL supporte la spécification du nom
d'utilisateur nom_utilisateur
sous la forme
user@host
. Si vous voulez spécifier un nom
d'utilisateur user
qui contient des
caractères spéciaux tels que
‘-
’, ou une chaîne d'hôte
host
qui contient des caractères joker
(comme ‘%
’), vous pouvez placer
le nom de l'utilisateur ou de l'hôte entre guillemets (par
exemple,
'test-utilisateur'@'test-nomdhote'
).
Vous pouvez spécifier des caractères jokers dans le nom
d'hôte. Par exemple, user@'%.loc.gov'
fait
correspondre l'utilisateur user
de
n'importe quel hôte du domaine loc.gov
, et
user@'144.155.166.%'
fait correspondre
l'utilisateur user
à n'importe quelle
adresse de la classe C 144.155.166
.
La forme simple de user
est synonyme de
user@"%"
.
MySQL ne supporte pas de caractères joker dans les noms
d'utilisateur. Les utilisateurs anonymes sont définis par
l'insertion de ligne avec User=''
dans la
table mysql.user
, ou en créant un
utilisateur avec un nom vide, grâce à la commande
GRANT
.
mysql> GRANT ALL ON test.* TO ''@'localhost' ...
Attention : si vous
autorisez des utilisateurs anonymes à se connecter à votre
serveur, vous devriez aussi donner ces droits à tous les
utilisateurs locaux user@localhost
car
sinon, la ligne dans la table mysql.user
sera utilisée lorsque l'utilisateur se connectera au serveur
MySQL depuis la machine locale ! (Ce compte est créé durant
l'installation de MySQL.)
Vous pouvez vérifier si cela s'applique à vous en exécutant la requête suivante :
mysql> SELECT Host,User FROM mysql.user WHERE User='';
Si vous voulez effacer les utilisateurs anonymes d'un serveur, utilisez ces commandes :
mysql>DELETE FROM mysql.user WHERE Host='localhost' AND User='';
mysql>FLUSH PRIVILEGES;
Actuellement, la commande GRANT
supporte
uniquement les noms d'hôte, colonne, table et bases de
données d'au plus 60 caractères. Un nom d'utilisateur peut
être d'au plus 16 caractères.
Les droits pour les tables et colonnes sont combinés par OU
logique, avec les quatre niveaux de droits. Par exemple, si la
table mysql.user
spécifie qu'un
utilisateur a un droit global de SELECT
, ce
droit ne pourra pas être annulé au niveau base, table ou
colonne.
Les droits d'une colonne sont calculés comme ceci :
droit global OR (droit de base de données ET droit d'hôte) OR droit de table OR droit de colonne
Dans la plupart des cas, vous donnez des droits à un utilisateur en utilisant un seul des niveaux de droits ci-dessus, ce qui fait que la vie n'est pas aussi compliquée. Le détails de la procédure de vérification des droits et disponible dans Section 5.5, « Règles de sécurité et droits d'accès au serveur MySQL ».
Si vous donnez des droits à une paire utilisateur/hôte qui
n'existe pas dans la table mysql.user
, une
ligne sera créée et restera disponible jusqu'à son
effacement avec la commande DELETE
. En
d'autre termes, GRANT
crée une ligne dans
la table user
, mais
REVOKE
ne la supprime pas. Vous devez le
faire explicitement avec la commande
DELETE
.
Avec MySQL version 3.22.12 ou plus récent, si un nouvel
utilisateur est créé, ou si vous avez les droits de
GRANT
globaux, le mot de passe sera
configuré avec le mot de passe spécifié avec la clause
IDENTIFIED BY
, si elle est fournie. Si
l'utilisateur a déjà un mot de passe, il sera remplacé par
ce nouveau.
Attention : si vous créez
un nouvel utilisateur, mais ne spécifiez pas de clause
IDENTIFIED BY
, l'utilisateur n'aura pas de
mot de passe. Ce n'est pas sécuritaire.
Les mots de passe peuvent aussi être modifiés avec la
commande SET PASSWORD
. See
Section 13.5.1.5, « Syntaxe de SET PASSWORD
».
Si vous ne voulez pas transmettre le mot de passe en texte
clair, vous pouvez immédiatement utiliser l'option
PASSWORD
suivi du mot de passe déjà
chiffré avec la fonction PASSWORD()
ou
l'API C make_scrambled_password(char *to, const char
*password)
.
Si vous donnez les droits de base, une ligne sera ajoutée
dans la table mysql.db
. Lorsque les droits
sur cette base seront supprimés avec la commande
REVOKE
, cette ligne disparaîtra.
Si un utilisateur n'a pas de droit sur une table, elle ne sera
pas affichée lorsqu'il demandera la liste des tables avec la
commande SHOW TABLES
. Si un utilisateur n'a
pas de droit dans une base, le nom de la base ne sera pas
affiché par SHOW DATABASES
à moins que
l'utilisateur n'ai un droit de SHOW
DATABASES
.
La clause WITH GRANT OPTION
donne à
l'utilisateur le droit de donner les droits qu'il possède à
d'autres utilisateurs. La plus grande prudence est
recommandée pour cette commande, car il permettra à terme à
deux utilisateurs de combiner les droits dont ils disposent.
Vous ne pouvez pas donner un droit que vous ne possédez pas.
le droit de GRANT OPTION
ne vous donne le
droit que de donner les droits que vous possédez.
Sachez que si vous donnez à quelqu'un le droit de
GRANT OPTION
, tous les droits que possède
cet utilisateur seront distribuables. Supposez que vous donnez
à un utilisateur le droit d'INSERT
dans
une base de données. Si vous donnez le droit de
SELECT
sur une base, et spécifiez l'option
WITH GRANT OPTION
, l'utilisateur peut
distribuer non seulement son droit de
SELECT
, mais aussi son droit de
INSERT
. Si vous donnez ensuite le droit de
UPDATE
, il pourra alors distribuer
INSERT
, SELECT
et
UPDATE
.
Il est recommandé de ne pas donner de droits de
ALTER
à un utilisateur normal. Si vous le
faîtes, l'utilisateur pourra essayer de contourner le
système de droits en renommant des tables.
MAX_QUERIES_PER_HOUR #
,
MAX_UPDATES_PER_HOUR #
et
MAX_CONNECTIONS_PER_HOUR #
sont nouveaux en
MySQL 4.0.2. Ces deux options limitent le nombre de requêtes
et de modifications qu'un utilisateur peut réclamer dans une
heure. Si #
vaut 0 (valeur par défaut),
alors cela signifie qu'il n'y a pas de limitations pour cet
utilisateur. See Section 5.6.4, « Limiter les ressources utilisateurs ». Note: pour
spécifier l'une de ces options pour un utilisateur existant
sans ajouter d'autres privilèges additionnels, utilisez
GRANT USAGE ... WITH MAX_...
.
MySQL peut vérifier les attributs X509 en plus des éléments
d'identifications habituels, comme le nom d'utilisateur et le
mot de passe. Pour spécifier des options SSL pour un compte
MySQL, utilisez la clause REQUIRE
de la
commande GRANT
. Pour des informations
générales sur SSL et MySQL, voyez
Section 5.6.7, « Utilisation des connexions sécurisées ».
Il y a différentes possibilités pour limiter le type de connexions d'un compte :
Si un compte ne doit pas utiliser SSL ou X509, les connexions sont autorisées si le mot de passe et le nom d'utilisateur sont valides. Cependant, les connexions non-chiffrées peuvent aussi être utilisées par le client, si le client dispose des bons certificats et clés.
L'option REQUIRE SSL
limite le serveur
aux connexions chiffrées avec SSL. Notez que cette option
peut être omise s'il y a des lignes d'identifications qui
autorisent les connexions non chiffrées.
mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
->IDENTIFIED BY 'goodsecret' REQUIRE SSL;
REQUIRE X509
signifie que le client
doit avoir un certificat valide, mais que le certificat
exact, l'émetteur et le sujet n'ont pas d'importance. La
seule obligation est qu'il faut pouvoir vérifier la
signature auprès d'une des autorités de certification.
mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
->IDENTIFIED BY 'goodsecret' REQUIRE X509;
REQUIRE ISSUER 'issuer'
impose aux
connexions l'utilisation d'un certificat X509 émis par
l'autorité de certification 'issuer'
.
Si le client présente un certificat d'une autre
autorité, le serveur rejette la connexion. L'utilisation
des certificats X509 implique toujours un chiffrement, ce
qui fait que l'option SSL
est inutile.
mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
->IDENTIFIED BY 'goodsecret'
->REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/
O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com';
Notez que la valeur de ISSUER
doit
être saisie comme une seule chaîne.
REQUIRE SUBJECT 'subject'
impose à la
connexion à la présentation d'un certificat X509 avec le
sujet 'subject'
. Si le client présente
un certificat qui est valide, mais avec un autre sujet, le
serveur rejette la connexion.
mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
->IDENTIFIED BY 'goodsecret'
->REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
O=MySQL demo client certificate/ CN=Tonu Samuel/Email=tonu@example.com';
Notez que la valeur de SUBJECT
doit
être saisie comme une seule chaîne.
REQUIRE CIPHER 'cipher'
est nécessaire
pour s'assurer que des tailles de clé et chiffrements
suffisantes sont utilisées. SSL peut être faible si de
vieux algorithmes avec des clés courtes sont utilisées.
En utilisant cette option, vous pouvez spécifier un
chiffrement spécifique.
mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
->IDENTIFIED BY 'goodsecret'
->REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
Les clauses SUBJECT
,
ISSUER
et CIPHER
peuvent
être combinées avec la clause REQUIRE
comme ceci :
mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
->IDENTIFIED BY 'goodsecret'
->REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
O=MySQL demo client certificate/ CN=Tonu Samuel/Email=tonu@example.com' ->AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/
O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com' ->AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
Notez que les valeurs de SUBJECT
et
ISSUER
doivent être saisies comme une
seule chaîne.
Depuis MySQL 4.0.4, le mot clé AND
est
optionnel entre les clauses de REQUIRE
.
L'ordre des options est libre, mais les options doivent être spécifiées une seule fois.
Notez que si vous utilisez des droits de niveau table ou colonne même pour un utilisateur, le serveur vérifiera alors ces droits pour tous les utilisateurs, et cela ralentira MySQL un peu.
Lorsque mysqld
démarre, tous les droits
sont stockés en mémoire. Les droits de bases, tables et
colonnes prennent aussitôt effet, et les droits des
utilisateurs prendront effet dès leur prochaine
configuration. Les modifications sur les tables de droits que
vous effectuez avec les commandes GRANT
et
REVOKE
sont prises en compte immédiatement
par le serveur. Si vous modifiez manuellement les tables (avec
INSERT
, UPDATE
, etc...),
vous devez exécuter la commande FLUSH
PRIVILEGES
, ou la commande en ligne
mysqladmin flush-privileges
pour indiquer
au serveur qu'il doit recharger les droits. See
Section 5.5.7, « Quand les modifications de privilèges prennent-ils effets ? ».
Les différences notables entre l'ANSI SQL et MySQL pour la
commande GRANT
sont :
Les droits MySQL sont donnés pour une combinaison nom d'utilisateur + nom d'hôte, et non pas pour un nom d'hôte seulement.
L'ANSI SQL n'a pas de droits globaux ou de niveau base de
données, et l'ANSI SQL ne supporte pas tous les types de
droits que MySQL supporte. MySQL ne supporte pas le droit
ANSI SQL de TRIGGER
ou
UNDER
.
MySQL ne supporte pas les droits standard SQL
TRIGGER
et UNDER
.
Les droits ANSI SQL sont structurés de manière hiérarchique. Si vous supprimez un utilisateur, tous les droits donnés à cet utilisateur seront supprimés. Avec MySQL, les droits ne sont pas automatiquement supprimés, et vous devez les supprimer manuellement, si besoin.
Avec MySQL, si vous avez le droit de
INSERT
sur uniquement quelques colonnes
de la table, vous pourrez exécuter des insertions. Les
colonnes pour lesquelles vous n'avez pas de droit
prendront alors leur valeur par défaut. L'ANSI SQL vous
impose d'avoir les droits d'INSERT
sur
toutes les colonnes.
Lorsque vous détruisez une table avec ANSI SQL, tous les
droits liés à la table sont supprimés. Si vous
supprimez un droit en ANSI SQL, tous les droits qui
étaient basés sur ce droit sont supprimés. Avec MySQL,
les droits peuvent être abandonnés explicitement avec la
commande REVOKE
, ou en manipulant les
tables de droits de MySQL.
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.