| 5.6 Gestion des comptes utilisateurs de MySQL
 5 Administration du serveur
 Manuel de Référence MySQL 4.1 : Version Française
 
 . Nom d'utilisateurs MySQL et mots de passe
 ->Ajouter de nouveaux utilisateurs à MySQL
 . Supprimer un compte utilisateur de 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
 
 
 | 
  5.6.2 Ajouter de nouveaux utilisateurs à MySQL   
     Vous pouvez ajouter des utilisateurs de deux façons différentes : 
La méthode préférée consiste à utiliser la commande  
GRANT
 , car elle est plus
concise et qu'il y a moins de risques d'erreur. Sa syntaxe est présentée
dans la section  Syntaxe de 
GRANT
 et 
REVOKE
 .
en utilisant la commande  
GRANT
manipulant la table des droits de MySQL directement
 
Il y a aussi beaucoup de programmes utilitaires comme  
phpmyadmin
  qui peuvent
être utilisés pour créer et administrer les utilisateurs.
Les exemples suivants montrent comment utiliser le client  
mysql
  
pour créer de nouveaux utilisateurs. Ces exemples supposent que 
les privilèges sont attribués en accord avec les valeurs 
par défaut discutées dans la section  Sécurisation des comptes MySQL initiaux . 
Cela signifie que pour effectuer des changements, vous devez être sur 
la même machine où  
mysqld
  tourne, vous devez vous 
connecter en tant qu'utilisateur MySQL  
root
 , et l'utilisateur 
 
root
  doit avoir le droit  
INSERT
  sur la base  
mysql
  
et le droit d'administration  
RELOAD
 . Si vous avez changé 
le mot de passe de l'utilisateur  
root
 , vous devez le spécifier dans
les commandes  
mysql
  ci-dessous. 
D'abord, utilisez le programme client  
mysql
  pour vous connecter au
serveur MySQL en tant qu'utilisateur  
root
  :
 Vous pouvez ajouter de nouveaux utilisateurs en utilisant des commandes  
GRANT
  :| 
shell> mysql --user=root mysql
 | 
 Ces commandes  
GRANT
  ajoutent trois nouveaux utilisateurs :| 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'->     IDENTIFIED BY 'un_mot_de_passe' WITH GRANT OPTION;
 mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
 ->     IDENTIFIED BY 'un_mot_de_passe' WITH GRANT OPTION;
 mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
 mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';
 | 
 
Deux comptes de super-utilisateur qui utilisent le mot de passe  
'un_mot_de_passe'
 . 
Les deux comptes ont tous les droits sur le serveur. Un des comptes,  
'monty'@'localhost'
 ,
peut être utilisé depuis la machine locale. L'autre depuis n'importe quel autre serveur : 
 
'monty'@'%'
 . Notez que nous devons
exécuter une commande  
GRANT
  pour  
'monty'@'localhost'
  et  
'monty'@'%'
 .
Si nous n'ajoutons pas l'entrée avec  
localhost
 , l'entrée concernant l'utilisateur
anonyme pour  
localhost
  qui est créée par  
mysql_install_db
  prendra 
précédence lors de la connexion à partir de l'hôte local, car elle a une entrée plus spécifique
pour la valeur du champ  
Host
  et de plus, elle vient en premier dans l'ordre de tri de la
table  
user
 . Les tris de la table  
user
  sont présentés dans la section
 Contrôle d'accès, étape 1 : vérification de la connexion . 
Un utilisateur  
admin
  qui peut se connecter depuis  
localhost
  
sans mot de passe et qui a les droits administratifs  
RELOAD
  et  
PROCESS
 .
Cela permet à cet utilisateur d'exécuter les commandes  
mysqladmin reload
 ,
 
mysqladmin refresh
 , et  
mysqladmin flush-*
 , ainsi que 
 
mysqladmin processlist
 . Aucun droit lié aux bases de données n'est donné.
Ils peuvent l'être plus tard en utilisant d'autres instructions  
GRANT
 .
Un utilisateur   
dummy
  qui peut se connecter sans mot de passe, 
mais seulement à partir de l'hôte local. Les droits globaux 
sont tous à  
'N'
  : le type de droit  
USAGE
  vous permet 
de créer un utilisateur démuni de privilège. Il est 
supposé que vous lui assignerez les droits spécifiques aux 
bases de données plus tard.
   
Vous pouvez ajouter les mêmes droits d'accès aux utilisateurs en utilisant
directement des requêtes  
INSERT
  puis en demandant au serveur de recharger
les tables de droits :
 Selon votre version de MySQL, vous pouvez avoir un nombre différent de valeurs
 
'Y'
  plus haut (les versions antérieures à la 3.22.11 possèdent moins de
colonnes de privilèges). Pour l'utilisateur  
admin
 , la syntaxe d' 
INSERT
 
étendue la plus lisible disponible depuis la version 3.22.11 est utilisée.| 
shell> mysql --user=root mysqlmysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('un_mot_de_passe'),
 ->          'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
 mysql> INSERT INTO user VALUES('%','monty',PASSWORD('un_mot_de_passe'),
 ->          'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
 mysql> INSERT INTO user SET Host='localhost',User='admin',
 ->           Reload_priv='Y', Process_priv='Y';
 mysql> INSERT INTO user (Host,User,Password)
 ->                  VALUES('localhost','dummy','');
 mysql> FLUSH PRIVILEGES;
 | 
 
Notez que pour ajouter un super-utilisateur, vous avez juste besoin de créer une entrée 
dans la table  
user
  avec tous les champs de droits à  
'Y'
 . Aucune entrée n'est
requise dans les tables  
db
  et  
host
 .
Les colonnes de privilèges de la table  
user
  n'étaient pas renseignées 
explicitement dans la dernière requête  
INSERT
  (pour l'utilisateur 
 
dummy
 ), ses colonnes prennent donc la valeur par défaut,  
'N'
 .
C'est la même chose que ce que fait  
GRANT USAGE
 . 
L'exemple suivant ajoute un utilisateur  
custom
  qui peut se connecter à
partir des hôtes  
localhost
 ,  
server.domain
 , et  
whitehouse.gov
 .
Il ne pourra accéder à la base de données  
bankaccount
  qu'à partir de  
localhost
 ,
à la base  
expenses
  qu'à partir de  
whitehouse.gov
 , et à la base  
customer
 
à partir des trois hôtes. Il utilisera le mot de passe  
stupid
  pour les trois hôtes.
Pour configurer les privilèges de cet utilisateur en utilisant des commandes  
GRANT
 ,
exécutez ce qui suit : Les trois comptes peuvent être utilisés comme suit :| 
shell> mysql --user=root mysqlmysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
 ->     ON bankaccount.*
 ->     TO custom@localhost
 ->     IDENTIFIED BY 'stupid';
 mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
 ->     ON expenses.*
 ->     TO custom@whitehouse.gov
 ->     IDENTIFIED BY 'stupid';
 mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
 ->     ON customer.*
 ->     TO custom@'%'
 ->     IDENTIFIED BY 'stupid';
 | 
 
Pour régler les permissions d'accès en modifiant directement les tables
de droits, exécutez ces commandes (notez l'appel à  
FLUSH PRIVILEGES
 
à la fin) :
Le premier compte a accès à la base  
bankaccount
 , mais uniquement
depuis l'hôte local.
Le second compte peut accéder à la base  
expenses
 , mais uniquement
depuis l'hôte  
whitehouse.gov
 .
Le troisième compte peut accéder à la base  
customer
 , mais uniquement
depuis l'hôte  
server.domain
 . Les trois premières requêtes  
INSERT
  ajoute les entrées dans la table
 
user
  qui permettent l'utilisateur  
custom
  à se connecter à partir
de plusieurs hôtes avec le mot de passe donné, mais ne lui donnent aucun droit
(tous les droits sont mis à la valeur par défaut qui est  
'N'
 ).  
Les trois requêtes  
INSERT
  suivantes ajoutent des entrées dans la table
 
db
  qui autorisent  
custom
  à utiliser les bases de données 
 
bankaccount
 ,  
expenses
 , et  
customer
 , mais seulement s'il
y accède à partir de l'hôte spécifié. Comme d'habitude, lorsque
les tables de droits sont modifiées directement, on doit demander au serveur des les recharger (avec
 
FLUSH PRIVILEGES
 ) pour que les changements soient pris en compte.Si vous voulez donner un accès spécifique à un utilisateur à partir de n'importe
quelle machine d'un domaine donné, vous pouvez utiliser la commande  
GRANT
 ,
en utilisant  
'%'
  comme joker dans le nom de l'hôte :| 
shell> mysql --user=root mysqlmysql> INSERT INTO user (Host,User,Password)
 -> VALUES('localhost','custom',PASSWORD('stupid'));
 mysql> INSERT INTO user (Host,User,Password)
 -> VALUES('server.domain','custom',PASSWORD('stupid'));
 mysql> INSERT INTO user (Host,User,Password)
 -> VALUES('whitehouse.gov','custom',PASSWORD('stupid'));
 mysql> INSERT INTO db
 -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
 ->  Create_priv,Drop_priv)
 -> VALUES
 -> ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
 mysql> INSERT INTO db
 -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
 ->  Create_priv,Drop_priv)
 -> VALUES
 -> ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
 mysql> INSERT INTO db
 -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
 ->  Create_priv,Drop_priv)
 -> VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
 mysql> FLUSH PRIVILEGES;
 | 
 Pour faire la même chose en modifiant directement la table de droits, faites :| 
mysql> GRANT ...->     ON *.*
 ->     TO monutilisateur@"%.mondomaine.com"
 ->     IDENTIFIED BY 'monmotdepasse';
 | 
 | 
mysql> INSERT INTO user VALUES ('%.mondomaine.com', 'monutilisateur',->             PASSWORD('monmotdepasse'),...);
 mysql> FLUSH PRIVILEGES;
 | 
 |