• Aucun résultat trouvé

6 Systèmes de droits MySQL manual_toc.html - Privilege_system

MySQL dispose d'un système moderne mais original de droits d'accès. Cette section le décrit.

6.1 A quoi sert le système de droits

La fonction primaire du système de droits de MySQL est d'authentifier un utilisateur se connectant, et l'associer avec les droits d'utilisation des commandes select, insert, update et delete sur cette base.

Les fonctions secondaires inclus la possibilité d'accueillir un utilisateur anonyme, et de donner des droits particuliers à des fonctions spécifiques à MySQL LOAD DATA INFILE et les opérations.

6.2 Noms et mot de passe des d'utilisateurs MySQL

Il y a de grandes différences entre la gestion des noms d'utilisateur et mots de passe de MySQL, et celle de Unix ou de Windows.

 Les noms d'utilisateurs, utilisé par MySQL pour l'authentification, n'ont rien à voir avec les nom d'utilisateur de Unix (Nom de login) ou de Windows. La plus part des clients MySQL essaie de se connecter à la base avec le nom d'utilisateur Unix courant, mais cela est uniquement par commodité. Les programmes clients permettent de se connecter sous un autre nom, spécifié avec l'option -u ou --user. Cela signifie que vous ne pouvez sécuriser un serveur MySQL qu'en ayant un mot de passe pour chacun des utilisateurs. Sinon, n'importe quelle personne qui se connecte en utilisant n'importe quel nom, réussira à se connecter, si ce nom d'utilisateur n'a pas de mot de passe.

 Les noms d'utilisateurs MySQL peuvent avoir jusqu'à 16 caractères de long. Généralement, les noms d'utilisateur Unix sont limités à 8 caractères.

 Les mots de passe MySQL n'ont rien à voir non plus avec le mot de passe Unix ou Windows. Il n'y a pas de connexion entre les deux, mais ils peuvent être identiques.

 Les mots de passe MySQL sont cryptés avec un cryptage différents de celui d'Unix. Reportez vous à la description de la commande PASSWORD()et ENCRYPT() dans la section Confère section 7.3.12 Fonctions diverses.

6.3 Connection au serveur MySQL

Les clients MySQL ont besoin d'un certains nombre de paramètres pour se connecter à un serveur MySQL : l'hôte qui abrite le serveur, le nom d'utilisateur et le mot de passe. Par exemple, le client mysql peut être lancé avec la ligne suivante : (les arguments optionnels sont mis entre crochets ``['' et ``]''):

shell> mysql [-h host_name] [-u user_name] [-pyour_pass]

Il est aussi possible de remplacer respectivement les options -h, -u et -p parhost=host_name, user=user_name et --password=your_pass. Notez bien qu'il n'y as pas d'espace entre -p ou --password= et le mot de passe qui le suit.

Note: Transmettre un mot de passe dans la ligne de commande n'est pas sécurisé ! N'importe quel utilisateur du système peut découvrir le mot de passe en tapant : ps auxww. Confère section 4.15.4 Fichier d'options.

Par défaut, mysql utilise les valeurs suivantes :

 Le nom d'hôte par défaut est localhost, c'est à dire la machine locale.

 Le nom d'utilisateur par défaut est le nom de login Unix.

 Aucun mot de passe n'est envoyé si -p n'est pas précisé.

Ainsi, pour un utilisateur Unix joe, les commandes suivantes sont équivalentes : shell> mysql -h localhost -u joe

shell> mysql -h localhost shell> mysql -u joe

shell> mysql

D'autres clients MySQL se comportent de manière similaire :

Sous Unix, vous pouvez spécifier d'autres valeurs par défaut, lors de la connexion, ce qui vous évitera d'entrer les paramètres à chaque connexion. Cela peut être fait de diverses façons :

 Vous pouvez spécifier les paramètres de connexion dans la section [client] du fichier de configuration

``.my.cnf'' de votre dossier personnel. Les informations doivent être présentées comme suit : [client]

host=host_name user=user_name password=your_pass

Confère section 4.15.4 Fichier d'options

 Vous pouvez spécifier les paramètres de connexion en utilisant les variables d'environnement. L'hôte sera spécifié avec la variable MYSQL_HOST. Le nom d'utilisateur MySQL peut être spécifié avec les variables

connexion, et ce ne serait pas conseillé de les changer). Le mot de passe sera spécifié dans la variable MYSQL_PWD ( mais ce n'est pas très sur, comme vous le verrez à la prochaine section).

Si les paramètres de connexion sont spécifiables de nombreuses manières, les valeurs spécifiées sur la ligne de commande ont priorité sur les valeurs enregistrées dans le fichier de configuration, et ces dernières ont priorité sur les variables d'environnement.

6.4 Un mot de passe sûr

Il n'est pas conseillé d'exposer son mot de passe, ou de le stocker dans des endroits qui faciliterait sa connaissances par d'autres utilisateurs. Les méthodes de spécifications du mot de passe lors du lancement du programme client sont présentées ci-dessous, avec à chaque fois, les risques de la méthode :

 Utiliser la ligne de commande avec l'option -pyour_pass ou --password=your_pass. C'est très pratique, mais très dangereux, ca le mot de passe devient visible pour les commandes de statut du système (comme par exemple ps) qui peut être invoqué pas d'autres utilisateurs. Les clients MySQL remplace le mot de passe par une ligne de zéro lors de la séquence d'initialisation, mais il y a quand même un temps très bref, où la valeur est écrite en clair).

 Utiliser la ligne de commande avec l'option -p ou --password (sans valeur spécifiée). Dans ce cas, le programme client va solliciter le mot de passe depuis la console :

shell> mysql -u user_name -p Enter password: ********

Le client renvoie les caractères``*'' à la console, au fur et à mesure que vous entrez votre mot de passe, ce qui fait que quelqu'un derrière votre épaule ne pourra pas le voir. La sécurité est donc renforcée par rapport à la méthode précédente, mais cela oblige à utiliser le client en mode interactif. Vous ne pourrez pas lancer le programme depuis un script.

 Enregistrez votre mot de passe dans un fichier de configuration. Par exemple, vous pouvez mettre votre mot de passe dans la section [client] du fichier de configuration ``.my.cnf'' de votre dossier home.

[client]

password=your_pass

Si vous stockez votre mot de passe dans le fichier ``.my.cnf'', ce fichier ne doit pas être accessible en lecture ou en écriture ni au groupe, ni au monde. Assurez vous que le mode d'accès du fichier est 400 ou 600. Confère section 4.15.4 Fichier d'options.

 Vous pouvez enregistrer votre mot de passe dans la variable d'environnement MYSQL_PWD, mais cette méthode doit être considéré comme extrêmement dangereuse. Certaines options de ps permettent d'avoir accès aux variables d'environnement des processus en cours, ce qui fait que votre mot de passe peut être parfaitement lisible. Même sur des systèmes qui n'ont pas cette version de ps, il est fortement déconseillé de supposer qu'il n'y a pas d'autres méthode d'observation des processus.

L'un dans l'autre, la méthode la plus sûre est de fournir le mot de passe à la console, ou de spécifier le mot de passe dans le fichier ``.my.cnf'', correctement protégé.

6.5 Droits sous MySQL

Les droits sont conservés dans les tables user, db, host, tables_priv et columns_priv de la base de données. Le serveur MySQL lis le contenu de ces tables au démarrage, et à chaque fois que c'est nécessaire, comme décrit dans la section section 6.9 Prise en compte des modifications de droits.

Les noms utilisés dans ce manuel pour se référer aux droits de MySQL sont listés ci-dessous, avec le nom de la colonne associé à chaque droit dans la table de droits, et le contexte d'application du droit.

Les droits select, insert, update et delete permettent d'exécuter des opérations sur les lignes dans les tables existantes d'une base. Vous pouvez même exécuter certaines commandes SELECT sans avoir accès à aucune base sur le serveur.

Par exemple, vous pouvez utiliser mysql comme une simple calculatrice : mysql> SELECT 1+1;

mysql> SELECT PI()*2;

Le droit index vous permet de créer ou de détruire des index.

Le droit alter vous permet d'utiliser la commande ALTER TABLE.

Les droits create et drop vous permet de créer et détruire de nouvelles tables et bases.

Il faut bien remarquer que si vous donnez le droit de drop pour la base mysql , un utilisateur pourra effacer la table des droits MySQL!

Le droit grant vous permet de donner des droits que vous possédez à un autre utilisateur.

Le droit file vous permet de lire et écrire des fichiers sur le serveur, en utilisant les commandes LOAD DATA INFILE et SELECT ... INTO OUTFILE. Tout utilisateur qui dispose de ce droit peut écrire ou lire des fichiers que MySQL peut écrire ou lire.

Les autres droits sont utilisés pour les opérations administratives, qui sont disponibles avec mysqladmin. La table ci-dessous montre quelle droit donne accès à quelle commande mysqladmi:

La commande reload force le serveur à relire les tables de droits. La commande refresh vide toutes les tables de la mémoire, et ouvre puis ferme les fichiers d'historique. flush-privileges est un synonyme de reload. Les autres

commandes flush-* exécutent des fonctions similaires à refresh mais ne sont pas aussi limitées, et parfois même, elles sont préférables. Par exemple, si vous souhaitez uniquement enregistrer les fichiers d'historique, flush-logs est mieux que refresh.

La commande shutdown éteint le serveur.

La commande processlist affiche la liste des threads courant du serveur. La commande kill arrête les threads du serveur.

Vous pouvez toujours afficher et détruire les threads que vous possédez, mais vous devez avoir les droits de process pour afficher ou terminer les threads d'un autre utilisateur.

La meilleure stratégie est de ne donner des droits qu'à ceux qui en ont besoin, mais il faut être particulièrement prudents avec certains droits :

 Le droit de grant permet à utilisateur de donner ses propres droits à un autre. Deux utilisateurs pourront alors s'échanger les droits, et ainsi, obtenir des droits supplémentaires.

 Les droits de alter peuvent être utilisés pour renommer des tables systèmes

 Les droits de file peuvent être détourné : en lisant n'importe quel fichier (sensible de préférence) sur le serveur pour le monter dans une base de données, il est alors possible d'accéder au contenu en utilisant la commande SELECT.

 Les droits de shutdown peuvent être utilisé pour empêcher l'accès au serveur, en l'éteignant.

 Les droits de process permettent à un utilisateur de voir les commandes des autres utilisateurs, sans cryptage, notamment les commandes de changement de mot de passe.

 Les droits sur la base mysql peuvent être utilisés pour changer des mots de passe, ou tout autre droit d'accès.

(Les mots de passes sont cryptés avant d'être enregistrés, ce qui empêche leur relecture. Mais avec les droits adéquats, un utilisateur peu scrupuleux peu les remplacer par d'autre mot de passe, et empêcher l'accès).

Il y a des limitations avec les droits MySQL:

 Vous ne pouvez pas refuser des droits à un utilisateur. Vous ne pouvez pas spécifier un utilisateur, et lui refuser spécialement les droits de connexion.

 Vous ne pouvez pas séparer les droits de création et d'effacement des tables et de la bases de données qui les contient. L'utilisateur pourra créer et effacer les tables ET la base.

6.6 Fonctionnement du système de droits

MySQL s'assure que tous les utilisateurs peuvent faire ce qu'ils ont le droit de faire. Lorsque vous vous connectez à un serveur MySQL, le serveur détermine votre identité grâce à l'hôte depuis lequel vous vous connectez, et le nom d'utilisateur que vous spécifiez.. Le système vous alloue alors les droits adéquats.

MySQL considère que le nom de l'hôte et le nom d'utilisateur sont suffisants pour vous identifier sans ambiguïté, car il y a peu de chance qu'un nom d'utilisateur soit utilisé par la même personne, depuis tous les hôtes sur Internet ! Par exemple, l'utilisateur bill qui se connecte depuis whitehouse.gov ne sera probablement pas la même personne que l'utilisateur bill qui se connecte depuis microsoft.com. MySQL vous permet de distinguer les deux utilisateurs, et de donner des droits différents pour le même nom d'utilisateur, mais pour des hôtes différents.

MySQL contrôle l'accès en deux temps :

 Etape 1: le serveur vérifie que vous êtes autorisés à vous connecter.

 Etape 2: Si vous pouvez vous connecter, le serveur vérifie chaque requête que vous émettez pour voir sir vous avez des droits suffisants. Par exemple, pour sélectionner des lignes dans une table, ou effacer une table dans une base, le serveur s'assure que vous avez les droits de select ou de drop pour la base de données courante.

Le serveur utilise les tables user, db et host de la base mysql pour conserver les informations de connexion et les droits.

Les champs de ces tables sont les suivants :

Pour la deuxième étape d'accès, le serveur peut consulter éventuellement (si la requête implique des tables)les tables tables_priv et columns_priv. Les champs de ces tables sont les suivants :

Chaque table de droits contient les champs d'identification et de droits.

Les champs d'identification détermine le contexte d'application des droits. Par exemple, la table user avec une ligne dont les champs Host, User ont les valeurs de 'thomas.loc.gov' et 'bob' seront utilisés pour identifier les connexions de bob depuis thomas.loc.gov. De la même façon, la table db avec une ligne dont les champs Host, User et Db sont respectivement 'thomas.loc.gov', 'bob' et 'reports' seront utilisés lors que bob se connecte depuis host thomas.loc.gov pour accéder à la base reports. Les tables tables_priv et columns_priv contiennent les noms des tables et des tables / colonnes pour qui s'appliquent les droits.

Pour des raisons de vérifications d'accès, les comparaisons effectuées sur les colonnes Host sont insensibles à la casse..

User, Password, Db et Table_name sont sensibles à la casse.. Column_name est insensible à la casse depuis MySQL 3.22.12.

Les champs de droits indiques quels droits sont donnés, quelles commandes sont autorisées. Le serveur combine les informations des différentes tables pour construire une fiche complète de description des droits du serveur. Les règles utilisées pour cela sont décrites dans la section section 6.8 Contrôle d'accès, étape 2 : vérification des requêtes.

Les champs d'identification sont des chaînes, déclarées comme ci-dessous. La valeur par défaut de chaque champs est la chaîne vide.

Dans les tables user, db et host, tous les champs de droits sont déclarés comme des ENUM('N','Y') - chaque champs peut prendre la valeur 'N' ou 'Y', et la valeur par défaut est 'N'.

Dans les tables tables_priv et columns_priv, Les champs de droits sont déclarés comme des SET:

Présenté rapidement, le serveur utilises les tables de droits comme ceci :

 La table user détermine le droit de connexion. Pour les connexions autorisées, les droits globaux de l'utilisateurs sont précisés.

 Les tables db et host sont utilisées ensembles :

 La table db détermine quelles bases sont accessibles à quels utilisateurs. Les champs de droits déterminent quels sont les droits autorisés.

 La table host est utilisée comme une extension de db lorsque vous voulez qu'une ligne de db s'applique à plusieurs hôtes. Par exemple, si vous voulez qu'un utilisateur soit capable d'accéder à la base depuis plusieurs hôtes différents, laissez le champs Host de la table db vide, puis ajoutez un enregistrement dans la table host pour chaque hôte à autoriser. Ce mécanisme est décrit en détails dans la section section 6.8 Contrôle d'accès, étape 2 : vérification des requêtes.

 Les tables tables_priv et columns_priv sont similaires à la table db, mais s'appliquent au niveau table et colonne, plutôt qu'au niveau base.

Notez bien que les droits administratifs (tels reload, shutdown, etc.) ne sont spécifiés que dans la tables user. En effet, les opérations administratives sont des opérations sur le serveur lui-même, et ne sont pas spécifiques à une base de données : il n'y a pas de raison d'avoir ces privilèges dans d'autres tables. En fait, seule la table user est consultée pour déterminer les droits administratifs.

Le droit file est spécifié seulement dans la table user. Ce n'est pas un droit administratif, mais il n'est pas dépendant de la table, ou de la base en cours.

Le serveur mysqld lit le contenu des tables de droits au démarrage. Les modifications des tables de droits ne prennent effets qu'à des moments précis, comme précisé dans la Confère section 6.9 Prise en compte des modifications de droits.

Lorsque vous modifiez le contenu des tables de droits, il es important de s'assurer que les modifications de droits produiront bien l'effet désiré. Il existe une aide pour comprendre ces erreurs, reportez vous à la sectionConfère section 6.14 Comment protéger MySQL contre les hackers.

Un outil d'analyse pratique est le script mysqlaccess, qui est fournit gracieusement par Yves Carlier dans la distribution de MySQL. Lancez mysqlaccess avec l'option --help pour comprendre comment il fonctionne. Notez que mysqlaccess utilise les droits des tables user, db et host. Il ne prend pas en compte les droits sur les tables ou les colonnes.

6.7 Contrôle d'accès, étape 1 : vérification de la connexion

Lorsque vous tentez de vous connecte à un serveur MySQL, le serveur accepte ou rejete votre tentative en fonction de votre identité, et de votre capacité à fournir le mot de passe correct. Dans le cas contraire, le serveur refuse complètement l'accès. Sinon, le serveur accepte la connexion, et passe en niveau 2, pour attendre les requêtes.

L'identité lors de la connexion est basé sur deux éléments :

 L'hôte depuis lequel vous vous connectez

 Votre nom d'utilisateur MySQL

La vérification de l'identité est faite en utilisant les trois champs d'identité de la table user (Host, User et Password). Le serveur n'acceptera une connexion que si il existe un enregistrement qui contienne votre hôte, votre nom d'utilisateur et votre mot de passe.

Les valeurs de la table user peuvent être fournies avec les propriétés suivante :

 Host peut être un nom d'hôte, ou une adresse IP ou 'localhost' pour indiquer la machine locale.

 Vous pouvez utilisez les caractères spéciaux ``%'' et ``_'' dans le champs Host.

 Host qui vaut '%' accepte tous les hôtes. Host vide est équivalent à to '%'. Notez que ces valeurs accepte n'importe quel hôte qui peut créer une connexion avec votre serveur !

 Les caractères spéciaux ne sont pas autorisés dans le champs User, mais vous pouvez le laisser vide, ce qui équivaudra à '%'. Si un enregistrement de la table user a un champs User vide, cet utilisateur sera considéré comme anonyme (utilisateur sans nom) plutôt qu'étant l'utilisateur avec le nom spécifié par le client. Cela signifie que l'utilisateur vide sera utilisé ultérieurement pour toutes les vérifications de droits, durant toute la connexion.

 Le champs Password peut être laissé vide. Cela ne signifie pas que n'importe quel mot de passe sera accepté, mais que l'utilisateur doit se connecter SANS mot de passe.

Les valeurs de Password qui ne sont pas vides représentent des mots de passe cryptés. MySQL ne conserve pas les mots de passe en clair, qui risqueraient ainsi d'être vu par n'importe qui. Lors de la connexion, le mot de passe fourni est crypté de la même manière que le mot de passe enregistré, et les deux valeurs sont comparées. Si les deux correspondent, le mot de passe fourni est le bon.

Les exemples suivants montrent différentes combinaisons des colonnes Host et User de la table user :

Les exemples suivants montrent différentes combinaisons des colonnes Host et User de la table user :