Effacer des utilisateurs MySQL
<<<
Syntaxe de GRANT et REVOKE Syntaxe de SET PASSWORD
>>>

14.5.1 Commande de gestions des comptes utilisateurs
14.5 Référence de langage d'administration de la base de données
14 Syntaxe des commandes SQL
 Manuel de Référence MySQL 4.1 : Version Française

Effacer des utilisateurs MySQL
->Syntaxe de GRANT et REVOKE
Syntaxe de SET PASSWORD

14.5.1.2 Syntaxe de GRANT et REVOKE


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 Administration de la base .

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 . 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 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.

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 . 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. Limiter la consommation de ressources . 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 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. Quand est-ce que les droits prennent 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.

<< Syntaxe de GRANT et REVOKE >>
Effacer des utilisateurs MySQL Commande de gestions des comptes utilisateurs Syntaxe de SET PASSWORD