Les droits dans MySQL


  1. Utilisateurs et mots de passe  Haut de page
  2. Première chose essentielle à comprendre : quelle que soit la plate- forme utilisée, les comptes d'utilisateurs MySQL n'ont rien à voir avec ceux du système (comptes Unix ou comptes Windows). Ils sont maintenus dans un base particulière du serveur(la base mysql), dans la table user.
    Par ailleurs bien noter que dans les versions au moins jusqu'à 3.23 la longueur des noms est limitée à 16 caractères (8 dans Unix et beaucoup beaucoup plus dans Windows).
    Rien n'empêche (en dehors des limites de tailles différentes) de créer des comptes MySQL ayant le même nom que des comptes du système.

    De plus, faire très attention (voir plus bas et aussi ici) à l'installation initiale de MySQL qui doit absolument être sécurisée.

    De la même façon que pour les noms, les mots de passe MySQL n'ont rien à voir avec ceux du système. Ca peut changer un jour avec la généralisation des annuaires ldap mais là ce n'est pas le cas. De même que pour les noms, rien n'empêche de créer des comptes identiques à ceux du système avec le même mot de passe.
    Bien noter, que la façon dont MySQL crypte les mots de passe est également différente de la façon de faire d'Unix ou de Windows.

    Les comptes et mots de passe MySQL sont dans la table user de la base mysql. Ils n'ont rien à voir avec ceux du système.
    A propos de mot de passe, si vous utilisez un client mysql en ligne de commande, ne tapez jamais le mot de passe sur la ligne de commande ; ça laisse des traces... A la place, utilisez l'option "-p" du client sans mot de passe derrière et laissez mysql vous demander le mot de passe.

    Si vous utilisez le client mysql sans aucune option, sous Unix comme Windows, l'hôte utilisé par défaut sera localhost. Sur une machine Unix, il utilisera le login Unix courant sans mot de passe (sauf si vous spécifiez "-p" sans mot de passe derrière). Sur une machine Windows le login sera "ODBC@localhost". Si celui n'existe pas... ça ne peut qu'échouer.

    D:\Perso\MonSiteWeb\mysqlinf>d:\mysql\bin\mysql
    ERROR 1045: Access denied for user: 'ODBC@localhost' (Using password: NO)
    
    N'utilisez jamais la possibilité qui vous est offerte d'enregistrer votre mot de passe de connexion dans le fichier my.cnf. C'est une mauvaise habitude ; d'abord vous finirez par oublier votre mot de passe et ensuite qui vous dit que personne n'arrivera à accéder à ce fichier ? Et ne parlons même pas de le définir par la variable d'environnement prévue à cet effet. Je ne vous en donnerai même pas le nom, NA !

  3. Liste des tables de droits  Haut de page
  4. La table ci-dessous a été constituée avant l'apparition de la colonne func dans les droits MySQL.
    userhost dbtables_priv columns_privA quoi ça sert ?
    Champs   Champs   Champs   Champs   Champs    
    Host   Host   Host   Host   Host    
        Db   Db   Db   Db    
    User       User   User   User    
    Password                    
                Table_name   Table_name    
                    Column_name    
                Grantor        
                Timestamp   Timestamp    
                Table_priv        
                Column_priv   Column_priv    
    Select_priv   Select_priv   Select_priv   TC   C   Sélectionner des données
    Insert_priv   Insert_priv   Insert_priv   TC   C   Insérer des données
    Update_priv   Update_priv   Update_priv   TC   C   Modifier des données
    Delete_priv   Delete_priv   Delete_priv   T       Supprimer des enregistrements
    Create_priv   Create_priv   Create_priv   T       Créer des tables, des bases
    Drop_priv   Drop_priv   Drop_priv   T       Détruire des tables, des bases
    Reload_priv                    
    Shutdown_priv                    
    Process_priv                    
    File_priv                   Permet de lire ou écrire des fichiers sur le serveur par les commandes LOAD DATA from_file, SELECT ... INTO out_file
    Grant_priv   Grant_priv   Grant_priv   T       Donner des droits qu'on a soi-même à un autre utilisateur
    References_priv   References_priv   References_priv   TC   C    
    Index_priv   Index_priv   Index_priv   T       Créer, détruire des index
    Alter_priv   Alter_priv   Alter_priv   T       Modifier les structures de table

    Remarques

    "" dans User revient à
    tout user donc
    anonymous en
    quelque sorte
    % ou "" dans Host
    revient à tout host
             
    Les symboles T et C spécifient si le droit en question est traité aux niveaux table et/ou colonne pour les champs Table_priv et Column_priv. Ces droits sont indiqués dans les champs en question sous forme de valeur choisie dans un "set" parmi celles indiqués par T et C dans le tableau ci-dessus, à ceci près que le droit est libellé comme le nom du champ dans les tables user, host et db moins le"_priv" de la fin.

    Les droits Reload_priv, Shutdown_priv, Process_priv ont trait aux actes administratifs réalisables par le biais de la commande mysqladmin. Tout utilisateur peut lister les process dont il est propriétaire mais pas ceux des autres, sans le droit Process_priv.

    Les commandes reload ou flush-privileges forcent MySQL à relire les tables de droits. C'est indispensable si vous modifiez directement les droits en manipulant vous-même les tables de la base mysql. Par contre, si vous utilisez la commande grant, cela est inutile. MySQL prend en compte immédiatement les modifications faites par la commande grant.

  5. Détermination du couple User@Host  Haut de page
    1. Principes  Haut de page
    2. L'utilisateur et l'hôte qui vont être utilisés pour valider les droits sont déterminés une seule fois à la connexion de l'utilisateur. Ceci signifie que toute erreur à ce niveau se répercute sur le reste du travail.

      Prenons l'exemple, d'un utilisateur "toto" créé pour attribuer des droits au niveau d'une base "machin". Admettons ensuite que toto ne soit pas créé dans la table user et seulement dans la table db. Deux situations peuvent se produire :

      1. Il ne peut pas se connecter en tant qu'anonyme et la séance se termine tout de suite
      2. Il peut se connecter en tant qu'anonyme et c'est cette identification qui va servir par la suite

      a) Il n'y a pas de droits pour anonyme sur la base "machin", il ne pourra donc rien faire

      b) Il y a des droits pour anonyme sur la base "machin" et c'est ceux-là qui vont s'appliquer et non ceux qui avaient été définis pour toto

      A chaque demande de connexion, MySQL trie d'abord les enregistrements de la table user en mettant en tête de liste les enregistrements avec les libellés d'hôtes les plus spécifiques, puis, à libellé égal, les noms d'utilisateurs les plus spécifiques. Ceci est un gros piège.
      En effet, une connexion anonyme autorisée sur un hôte spécifique sera toujours prioritaire sur les connexions non anonymes autorisées sur tout hôte ou sur un groupement d'hôtes. Or, une fois le couple "User@Host" déterminé, c'est lui qui est utilisé pour tout la durée de la connexion.
      Donc si vous créez un poste de travail depuis lequel les connexions anonymes sont autorisées les utilisateurs authentifiés ne pourront y faire valoir leurs privilèges spécifiques (voir exercices à la fin).

    3. Exemple pour 2.a  Haut de page
    4. Table user
      Host User Password Select Insert Update Delete Create Drop         Grant References Index Alter
      % root ******** Y Y Y Y Y Y Y Y Y Y Y Y Y Y
      %     N N N N N N N N N N N N N N

      Les champs de droits en gris sont des droits globaux sur le serveur MySQl. Ils ne nous intéressent pas ici.
      Lors de sa tentative de connexion toto va être autorisé comme anonyme grâce à la deuxième ligne. Ce user n'a aucun droit sur les bases du serveur MySQl, comme défini dans les champs de droits (tous à "N")

      Table db
      HostDbUserSelectInsert UpdateDeleteCreateDropGrant ReferencesIndexAlter
      %machintotoYYY YYYYYYY
      %machin YNN NNNNNNN

      Lors d'un accès à la base machin le user anonyme n'a droit qu'à select. Toto a tous les droits, lui, mais notre utilisateur a été identifié comme anonyme à sa connection.

      Conclusion : Alors que toto aurait dû avoir tous les droits sur la base "machin" il ne va pouvoir faire que des select.

    5. Manipulations  Haut de page
    6. Sur un serveur de test,

      1. Créez deux bases machin et lycees
      2. Puis ajustez les deux tables de droits user et db comme indiqué ci-après, dans la base mysql
      3. Répondez aux questions qui suivent en faisant les essais nécessaires, puis en donnant une explication au comportement observé
      Table user
      HostUserPasswordSelect InsertUpdateDeleteCreate Drop     GrantReferencesIndex Alter
      %root******** YYYYYY YY YY YYYY
      %toto  NNNNNN YY YY NNNN
      mysrv  NN NNNN N N N N NNNN
      Table db
      HostDbUserSelectInsert UpdateDeleteCreateDropGrant ReferencesIndexAlter
      % machin totoYYYYY YYYYY
      mysrvlyceestoto YYYYNN NNNN
      %lycees YN NNNNNN NN

      Questions

      L'utilisateur toto tente de se connecter successivement depuis la machine mysrv puis depuis la machine station3 pour accéder à la base de données machin.

      1. Lors d'une connexion au serveur MySQL, les lignes de la table user seront-elles parcourues dans l'ordre dans lequel elles apparaissent dans le tableau ci-dessus ?   
      2. Toto peut-il se connecter au serveur MySQL dans les deux cas ?   
      3. Aura-t-il accès à la base machin depuis mysrv ?   
      4. Aura-t-il accès à la base machin depuis station3 ?   
      5. Quels sont les droits de titi connecté depuis station3 sur la base lycees ?   
Ecrire à Etienne Durup
E. Durup - Dernière mise à jour : 22.02.2004
Valid CSS!