6.11 Ajout d'un nouvel utilisateur MySQL

Vous pouvez ajouter des utilisateurs de deux manières différentes : en utilisant la commande GRANT ou en manipulant directement les tables de droits MySQL. La meilleure méthode est l'utilisation de la commande GRANT, car elle est plus concise et est la source de moins d'erreur. Les exemples ci dessous montrent comment utiliser le client mysql client pour ajouter un nouvel utilisateur. Ces exemples supposent que les droits ont été créé comme décrit dans la section précédente. Cela signifie notamment que pour faire des modifications, il vous faut être sur la machine qui fait tourner le serveur, vous devez vous connecter en tant que root, et le root doit avoir les droits d'insertion et de rechargement (insert et reload ). De plus, si vous avez changé le mot de passe du root, vous devrez le spécifier pour pouvoir exécuter les commandes suivantes

Ajout d'un nouvel utilisateur

shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
           IDENTIFIED BY 'quelquechose' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
           IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;

Ces commandes ajoutent 3 nouveaux utilisateurs

  • monty Un super-utilisateur avec les pleins pouvoirs, qui peut se connecter depuis n'importe quelle machine (même distante) mais qui doit utiliser le mot de passe 'quelquechose' pour ce faire. Notez l'utilisation de la commande GRANT pour les deux formes monty@localhost et monty@"%". Si la ligne avec localhost n'est pas ajoutée l'utilisateur anonyme qui a été créé par le script mysql_install_db aura priorité lors de la connexion, car il sera plus spécifique. Il faut donc l'ajouter nommément pour pouvoir donner les bons droits à monty.
  • admin Un utilisateur qui peut se connecter depuis localhost sans mot de passe, et qui a les droits administratifs de reload et process. Cela va lui permettre d'exécuter les utilitaires mysqladmin reload, mysqladmin refresh et mysqladmin flush-*, ainsi que mysqladmin processlist . Aucun droit lié aux bases de données ne sont donnés. Ils pourront être donnés plus tard, avec des commandes GRANT.
  • dummy Un utilisateur qui peut se connecter sans mot de passe, mais uniquement depuis localhost . Les privilèges globaux sont tous à 'N' - le type spécial USAGE vous permet de créer rapidement un utilisateur sans droits, et lui occtroyer plus tard.

    Vous pouvez aussi ajouter ces informations avec des commandes INSERT et en forcant le serveur à recharger ces tables.

    shell> mysql --user=root mysql
    mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'),
                    'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
    mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'),
                    '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;
    

    Suivant la version de MySQL, vous pouvez avoir un nombre différent de 'Y' dans les lignes ci-dessus (Les versions antérieures à 3.22.11 avaient moins de colonnes de droits.). Pour l'utilisateur admin, la version plus pratique de la commande INSERT est disponible à partir de la version 3.22.11.

    Notez que pour créer un super utilisateur, il vous suffit de créer une ligne dans la table user avec tous les privilèges mis à 'Y' : aucune ligne n'est requise dans les tables db ou host.

    La colonne de droit dans la table user n'ont pas été explicitement fixée dans la dernière commande INSERT (pour l'utilisateur dummy), ce qui fait que ces colonnes ont une valeur par défaut de 'N'. C'est le même comportement que pour la commande GRANT USAGE.

    L'exemple suivant ajoute un utilisateur custom qui peut se connecter depuis les hôtes localhost, server.domain et whitehouse.gov. Il veut pouvoir accéder à la base de données bankaccount, mais uniquement depuis localhost, à la base expenses mais uniquement depuis whitehouse.gov et à la base customer depuis tous les hôtes Il veut avoir le même mot de passe pour toutes les connexions.

    Pour donner ces droits à cet utilisateur, utilisez les commandes GRANT suivantes :

    shell> mysql --user=root mysql
    mysql> 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 donner ces droits à cet utilisateur en accédant directement aux tables de droits, utilisez les commandes suivantes :

    shell> mysql --user=root mysql
    mysql> 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;
    

    Les trois premières insertions ajoutent des lignes dans la table user pour autoriser la connexion de custom depuis les divers sites qu'il désire, mais ne lui donne aucune permission. (tous ses droits sont à 'N'). Les trois insertions suivantes ajoutent des lignes dans la table db pour donner des droits sur les bases bankaccount, expenses et customer, mais uniquement pour des connexions avec des hôtes autorisés. Et, comme toujours lorsqu'on touche aux tables de droits, le serveur doit les recharger (avec FLUSH PRIVILEGES) pour les prendre en compte.

    Si vous désirez donner un droit spécifique à un utilisateur donnée, mais depuis n'importe quel hôte, utilisez la commande GRANT suivante :

    mysql> GRANT ...
               ON *.*
               TO myusername@"%.mydomainname.com"
               IDENTIFIED BY 'mypassword';
    

    Pour faire la même chose avec une attaque directe des tables, faites ceci :

    mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
               PASSWORD('mypassword'),...);
    mysql> FLUSH PRIVILEGES;
    

    Vous pouvez aussi utiliser xmysqladmin, mysql_webadmin et even xmysql pour insérer, modifier des valeurs dans les tables de droits. Vous pouvez trouvez ces utilitaires à http://www.mysql.com/Contrib/.