4.3 Gestion des comptes utilisateurs de MySQL
4 Administration du serveur
Manuel de Référence MySQL 4.1 : Version Française
->Syntaxe de GRANT et REVOKE . Nom d'utilisateurs MySQL et mots de passe . Quand les modifications de privilèges prennent-ils effets ? . Création des premiers droits MySQL . Ajouter de nouveaux utilisateurs à MySQL . Limiter les ressources utilisateurs . Configurer les mots de passe . Garder vos mots de passe en lieu sûr . Utilisation des connexions sécurisées
|
4.3.1 Syntaxe de GRANT et REVOKE
GRANT priv_type [(liste_colonnes)] [, priv_type [(liste_colonnes)] ...] ON {nom_de_table | * | *.* | nom_base.*} TO nom_utilisateur [IDENTIFIED BY [PASSWORD] 'password'] [, nom_utilisateur [IDENTIFIED BY 'password'] ...] [REQUIRE NONE | [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]] REVOKE priv_type [(liste_colonnes)] [, priv_type [(liste_colonnes)] ...] ON {nom_de_table | * | *.* | nom_base.*} FROM nom_utilisateur [, nom_utilisateur ...]
|
GRANT
est disponible depuis MySQL version 3.22.11. Pour les
versions plus anciennes de MySQL, la commande
GRANT
ne fait rien.
Les commandes
GRANT
et
REVOKE
permettent aux administrateurs
système de créer des utilisateurs, de leur donner ou de leur retirer des
droits, sur 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.
Si vous donnez des droits à un utilisateur qui n'existe pas, vous créerez cet
utilisateur. Pour voir des illustrations du fonctionnement de la commande
GRANT
, voyez Ajouter de nouveaux utilisateurs à MySQL .
Pour les commandes
GRANT
et
REVOKE
, la clause
priv_type
peut
être spécifiée par les constantes suivantes :
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 atteind, 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
.
Dans les anciennes versions de MySQL, le droit de
PROCESS
donnait les mêmes
droits que le nouveau droit
SUPER
.
Pour retirer le droit de
GRANT
à un utilisateur, utilisez les mêmes valeurs
de
priv_type
avec
GRANT OPTION
:
mysql> REVOKE GRANT OPTION ON ... FROM ...;
|
Les valeurs de
priv_type
que vous pouvez spécifier pour une table
sont
SELECT
,
INSERT
,
UPDATE
,
DELETE
,
CREATE
,
DROP
,
GRANT OPTION
,
INDEX
et
ALTER
.Les seules valeurs de
priv_type
que vous pouvez spécifier pour une colonne,
lorsque vous utilisez la clause
liste_colonnes
), sont
SELECT
,
INSERT
et
UPDATE
.
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 !
Notez bien
: les caractères joker
'_'
and
'%'
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
.
Note
: 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 !
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='';
|
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 Sécurité générale et accès à 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.
Si vous ne voulez pas faire passer 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)
.
Attention
: si vous créez un nouvel utilisateur, mais que vous ne
spécifiez pas la clause
IDENTIFIED BY
, l'utilisateur n'aura pas
de mot de passe. Ce n'est pas sûr.
Les mots de passe peuvent aussi être modifiés par la commande
SET PASSWORD
.
Syntaxe de
SET
.
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 droits sur une table, elle ne sera pas affichée lorsqu'il
requiert la liste des tables avec la commande
SHOW TABLES
.
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.
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. Limiter les ressources utilisateur .
Note: pour spécifier l'une de ces options pour un utilisateur existant sans ajouter d'autres
privilèges additionels, utilisez
GRANT USAGE ... WITH MAX_...
.
Vous ne pouvez pas donner à un autre utilisateur un droit que vous ne possédez pas
vous-même. Le droit de
GRANT
vous donne le droit de diffuser les droits dont vous
disposez déjà.
Soyez bien conscient que lorsque vous donnerez le droit de
GRANT
à un
niveau particulier, tous les droits qu'un utilisateur possède déjà (où qui
lui seront donnés dans le futur) seront alors diffusables à d'autres
individus. Supposons que vous donnez les droits de
INSERT
à un utilisateur, pour une table. Si vous ajoutez le droit de
WITH GRANT OPTION
, cet utilisateur peut donner le droit de
SELECT
mais aussi celui d'
INSERT
. Si vous donnez aussi le droit de
UPDATE
,
il pourra alors diffuser les droits de
INSERT
,
SELECT
et
UPDATE
.
Il est recommandé de ne pas donner les droits de
ALTER
à un utilisateur
normal. Si vous le faites, les utilisateurs pourront alors contourner le système
de droits en renommant des tables !
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.
Quand les changements de privilèges prennent-ils effet ? .
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
.
-
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.
Pour une description de l'utilisation de
REQUIRE
, voyez Utilisation des connexions sécurisées .
|