Services webmasters
Partenaires
Jeux concours gratuits
 
Contrôle d'accès, étape 2 : Vérification de la requête
<<<
Causes des erreurs Access denied Administration du serveur
>>>

4.2 Règles de sécurité et droits d'accès au serveur MySQL
4 Administration du serveur
 Manuel de Référence MySQL 4.1 : Version Française

Instructions générales de sécurité
Comment protéger MySQL contre les pirates
Options de démarrage qui concernent la sécurité
Problèmes de sécurité avec LOAD DATA LOCAL
Rôle du système de privilèges
Comment fonctionne le système de droits
Droits fournis par MySQL
Se connecter au serveur MySQL
Contrôle d'accès, étape 1 : Vérification de la connexion
Contrôle d'accès, étape 2 : Vérification de la requête
->Causes des erreurs Access denied

4.2.11 Causes des erreurs Access denied

Si vous rencontrez des erreurs Access denied quand vous essayez de vous connecter au serveur MySQL, la liste suivante indique quelques actions à entreprendre pour corriger le problème :

  • Après l'installation de MySQL, avez vous exécuté le script mysql_install_db pour initialiser le contenu de la table des droits ? Si tel n'est pas le cas, faites le. Mise en place des privilèges initiaux de MySQL . Testez les privilèges initiaux en exécutant la commande suivante :
    
    shell> mysql -u root test
    
    Le serveur devrait vous laisser vous connecter sans erreurs. Vous devez aussi vous assurer que vous avez un fichier user.MYD dans le dossier des bases de données MySQL. Ordinairement, il s'agit de CHEMIN/var/mysql/user.MYD , où CHEMIN est le chemin vers le dossier racine de l'installation MySQL.
  • Après une installation toute fraîche, vous devez vous connecter au serveur et créer les utilisateurs en réglant leurs permissions d'accès :
    
    shell> mysql -u root mysql
    
    Le serveur devrait vous laisser vous connecter car l'utilisateur root de MySQL n'a pas de mot de passe initial. Ceci est aussi une faille de sécurité, et donc, vous devez choisir un mot de passe pour l'utilisateur root en même tant que les autres utilisateurs MySQL.Si vous essayez de vous connecter en root et que vous rencontrez cette erreur :
    
    Access denied for user: '@unknown' to database mysql
    
    cela signifie que vous n'avez pas d'entrée dans la table user avec une valeur 'root' de la colonne User et que mysqld cne peut trouver de nom d'hôte à votre client. Dans ce cas, vous devez redémarrer le serveur avec l'option --skip-grant-tables et éditer le fichier /etc/hosts ou \windows\hosts pour ajouter une entrée pour votre hôte.
  • Si vous obtenez une erreur qui ressemble à celle-ci :
    
    shell> mysqladmin -u root -pxxxx ver
    Access denied for user: 'root@localhost' (Using password: YES)
    Cela signifie que vous utilisez un mot de passe erroné. Mise en place d'un mot de passe .Si vous avez oublié le mot de passe root, vous pouvez redémarrer mysqld avec --skip-grant-tables pour changer le mot de passe. Comment modifier un mot de passe Root oublié .

    Si vous obtenez l'erreur suivante même sans spécifier de mot de passe, cela signifie que vous avez un mauvais mot de passe dans un fichier my.ini . Fichier d'options my.cnf . Vous pouvez ne pas utiliser les fichiers d'options en utilisant l'option --no-defaults , comme suit :

    
    shell> mysqladmin --no-defaults -u root ver
    
  • Si vous mettez à jour une installation MySQL existante à partir d'une version plus ancienne que 3.22.11 vers la version 3.22.11 ou plus à jour, avez-vous exécuté le script mysql_fix_privilege_tables ? Si ce n'est pas le cas, faites le. La structure des tables de droits a changé avec la version 3.22.11 de MySQL lorsque la commande GRANT est devenue fonctionnelle.
  • Si vos droits semblent avoir changé au milieu d'une session, il se peut qu'un super-utilisateur les ait changé. Recharger les tables de droits affecte les nouvelles connexions, mais affecte aussi les anciennes comme indiqué dans Quand les changements de privilèges prennent-ils effet ? .
  • Si vous n'arrivez pas à faire fonctionner votre mot de passe, souvenez-vous que vous devez utiliser la fonction PASSWORD() si vous le changez avec les commandes INSERT , UPDATE , ou SET PASSWORD . L'utilisation de la fonction PASSWORD() n'est pas nécessaire si vous spécifiez le mot de passe en utilisant la commande GRANT ... INDENTIFIED BY ou la commande mysqladmin password . Mise en place d'un mot de passe .
  • localhost est un synonyme de votre nom d'hôte local, et est aussi l'hôte par défaut auquel le client essaye de se connecter si vous n'en spécifiez pas un explicitement. Toutefois, les connexions à localhost ne fonctionnent pas si vous utilisez une version antérieure à la 3.23.27 qui utilise les MIT-pthreads (les connexions à localhost sont réalisées en utilisant les sockets Unix, qui n'étaient pas supportés par les MIT-pthreads à ce moment). Pour contourner ce problème sur de tels systèmes, vous devez utiliser l'option --host pour nommer l'hôte du serveur explicitement. Cela créera une connexion TCP/IP vers le serveur mysqld . Dans ce cas, vous devez avoir votre vrai nom d'hôte dans les entrées de la table user du serveur hôte. (Cela est vrai même si vous utilisez un programme client sur la même machine que le serveur.)
  • Si vous obtenez une erreur Access denied lorsque vous essayez de vous connecter à la base de données avec mysql -u nom_utilisateur nom_base , vous pouvez avoir un problème dans la table user . Vérifiez le en vous exécutant mysql -u root mysql et entrant la commande SQL suivante :
    
    mysql> SELECT * FROM user;
    
    Le résultat devrait comprendre une entrée avec les colonnes Host et User correspondate au nom d'hôte de votre ordinateur et votre nom d'utilisateur MySQL.
  • Le message d'erreur Access denied vous dira en tant que qui vous essayez de vous identifier, l'hôte à partir duquel vous voulez le faire, et si vous utilisez ou pas un mot de passe. Normalement, vous devez avoir une entrée dans la table user qui correspondent au nom d'hôte et nom d'utilisateur donnés dans le message d'erreur. Par exemple, si vous obtenez une erreur qui contient Using password: NO , cela signifie que vous avez essayé de vous connecter sans mot de passe.
  • Si vous obtenez l'erreur suivante en essayant de vous connecter à partir d'un hôte différenet de celui sur lequel est placé le serveur, c'est qu'il n'y a pas d'enregistrement dans la table user qui correspond à cet hôte :
    
    Host ... is not allowed to connect to this MySQL server
    
    Vous pouvez contourner le problème en utilisant l'outil en ligne de commande mysql (sur l'hôte du serveur !) pour ajouter un enregistrement aux tables user , db , ou host pour la combinaison utilisateur / nom d'hôte avec laquelle vous essayez de vous connecter puis exécuter mysqladmin flush-privileges . Si vous n'avez pas la version 3.22 de MySQL et que vous ne connaissez ni l'IP ni le nom d'hôte à partir duquel vous essayez de vous connecter, vous devez créer une entrée avec '%' dans la colonne Host dans la table user et redémarrer mysqld avec l'option --log sur la machine serveur. Après avoir essayé à nouveau de vous connecter à partir de la machine cliente, les informations contenues dans le log de MySQL vous apprendront comment vous vous êtes vraiment connectés. (Remplacez alors l'entrée de la table user contenant '%' avec le nom d'hôte qui apparait dans le log. Sinon, vous aurez un système non-sécurisé.)

    Une autre raison pour cette erreur sous Linux est que vous utilisez une version binaire de MySQL qui est compilée avec une version de glibc différente de celle que vous utilisez. Dans ce cas, vous devez soit mettre à jour votre système d'exploitation/glibc, soit télécharger les sources de MySQL et les compiler vous-même. Un RPM de sources est normalement facile à compiler et installer, cela ne devrait donc pas vous poser de gros problèmes.

  • Si vous obtenez une erreur où le nom d'hôte est absent ou que celui-ci est une adresse IP alors que vous avez bien entré le nom d'hôte :
    
    shell> mysqladmin -u root -pxxxx -h some-hostname ver
    Access denied for user: 'root@' (Using password: YES)
    Cela signifie que MySQL a rencontré des erreurs lors de la résolution de l'IP du nom d'hôte. Dans ce cas, vous pouvez exécuter mysqladmin flush-hosts pour vider le cache interne des DNS. Comment MySQL utilise les DNS .Les autres solutions sont :
    • Essayez de trouver le problème avec votre serveur DNS et corrigez le.
    • Spécifiez les IP à la place des noms d'hôtes dans les tables de droits de MySQL.
    • Démarrez mysqld avec --skip-name-resolve .
    • Démarrez mysqld avec --skip-host-cache .
    • Connectez vous à localhost si vous utilisez le serveur et le client sur la même machine.
    • Placez le nom de la machine cliente dans /etc/hosts .
  • Si mysql -u root test fonctionne mais que mysql -h votre_hote -u root test provoque une erreur Access denied , il se peut que vous ayez entré de mauvaises informations pour votre nom d'hôte dans la table user . Un problème commun ici est que la valeur Host dans la table user spécifie un nom d'hôte non-qualifié, mais que vos routines système de résolution de noms retournent un nom de domaine pleinement qualifié (ou vice-versa). Par exemple, si vous avez une entrée avec l'hôte 'tcx' dans la table user , mais que vos DNS disent à MySQL que votre nom d'hôte est 'tcx.subnet.se' , l'entrée ne fonctionnera pas. Essayez d'ajouter une entrée dans la table user qui contient votre adresse IP en tant que valeur de la colonne Host . (Une alternative est d'ajouter une entrée dans la table user avec une valeur de Host qui contient un caractère spécial, par exemple, 'tcx.%' . Toutefois, l'utilisation des noms d'hôtes se terminant par '%' est non-sécurisé et n 'est pas recommendé !)
  • Si mysql -u utilisateur test fonctionne mais que mysql -u utilisateur autre_base ne fonctionne pas, vous n'avez pas d'entrée pour autre_base listée dans la table db .
  • Si mysql -u utilisateur nom_base fonctionne à partir du serveur, mais que mysql -h nom_hote -u utilisateur nom_base ne fonctionne pas à partir d'une autre machine, cette machine n'est pas listée dans la table user ou db .
  • Si vous n'arrivez pas à trouver pourquoi vous obtenez l'erreur Access denied , effacez toutes les entrées de la table user dont la valeur du champ Host contiennent des caractères spéciaux (entrées contenant '%' ou '_' ). Une erreur commune est d'insérer une nouvelle entrée avec Host = '%' et User = 'un utilisateur' , en pensant que cela vous permettra de spécifier localhost pour vous connecter à partir de la même machine. La raison pour laquelle cela ne fonctionnera pas est que les droits par défaut incluent une entrée avec Host = 'localhost' et User = '' . Puisque cette entrée possède une valeur de Host égale à 'localhost' , qui est plus spécifique que '%' , elle est utilisée de préférence à la nouvelle entrée lors de la connexion à partir de localhost ! La procédure correcte est d'insérer une seconde entrée avec Host = 'localhost' et User = 'un_utilisateur' , ou de supprimer l'entrée avec Host = 'localhost' et User = '' .
  • Si vous avez l'erreur suivante, vous avez peut-être un problème avec la table db ou host :
    
    Access to database denied
    
    Si l'entrée sélectionnée dans la table db possède un champ Host vide, assurez-vous qu'il y'a au moins une entrée correspondante dans la table host spécifiant les hôtes auxquels l'entrée dans la table db s'applique.Si vous obtenez l'erreur lors de l'utilisation des commandes SQL SELECT ... INTO OUTFILE ou LOAD DATA INFILE , votre entrée dans la table user ne possède probablement pas le privilège FILE .
  • Souvenez-vous que le programme client utilise les paramètres de connexion spécifiés dans les fichiers de configuration ou des les variables d'environnement. Variables d'environnement MySQL . Si un client semble envoyer les mauvais paramètres de connexion par défaut lorsque vous ne les spécifiez pas en ligne de commande, vérifiez votre environnement et le fichier .my.cnf dans votre répertoire personnel. Vous devrez aussi vérifier les fichiers système de configuration de MySQL, bien qu'il est fort peu probable que les paramètres de connexion du client y soient spécifiés. Fichier d'options my.cnf . Si vous obtenez une erreur Access denied quand vous démarrer un client sans aucune option, assurez-vous de ne pas avoir spécifié un vieux mot de passe dans l'un de vos fichiers d'options ! Fichier d'options my.cnf .
  • Si vous apportez des modifications au tables de droits directement (en utilisant une requête INSERT ou UPDATE ) et que vos changements semblent ignorés, souvenez vous que vous devez exécuter une requête FLUSH PRIVILEGES ou la commande mysqladmin flush-privileges pour demander au serveur de lire à nouveau les tables de droits. Sinon, vos changements ne seront pris en compte qu'au prochain démarrage du serveur. Souvenez-vous qu'après avoir choisi le mot de passe root avec une commande UPDATE , vous n'aurez pas à le spécifier avant de recharger les privilèges, car le serveur ne sait pas que vous l'avez modifié !
  • Si vous avez des problèmes d'accès avec un programme Perl, PHP, Python, ou ODBC, essayez de vous connecter au serveur avec mysql -u utilisateur nom_base ou mysql -u utilisateur -pvotre_passe nom_base . Si vous pouvez vous connecter en utilisant le client mysql , c'est que le problème vient de votre programme et non des droits MySQL. (Notez qu'il n'y a pas d'espace entre -p et le mot de passe; vous pouvez aussi utiliser la syntaxe --password=votre_passe pour spécifier le mot de passe. Si vous utilisez l'option -p toute seule, MySQL vous demandera le mot de passe.)
  • Pour les tests, démarrez le démon mysqld avec l'option --skip-grant-tables . Vous pourrez alors changer les tables de droits MySQL puis utiliser le script mysqlaccess pour vérifier si vos changements ont l'effet désiré. Lorsque vous êtes satisfait de vos modifications, exécutez mysqladmin flush-privileges pour dire au serveur mysqld de commencer à utiliser les nouvelles tables de droits. Note : Recharger les tables de droits écrase l'option --skip-grant-tables . Cela vous permet de dire au serveur de commencer à prendre en considération les droits sans avoir à le couper et le redémarrer.
  • Si rien ne fonctionne, démarrez le démon mysqld avec l'option de débogage (par exemple, --debug=d,general,query ). Cela affichera l'hôte et les informations de l'utilisateur pour chaque tentative de connexion. Les informations à propos de chaque commande exécutée seront aussi affichées. Créer des fichiers de traçage .
  • Si vous avez d'autres problèmes avec les tables de droits de MySQL et que vous sentez que vous devez envoyer le problème à la liste de diffusion, fournissez toujours le contenu de vos tables de droits. Vous pouvez obtenir les données avec la commande mysqldump mysql . Comme toujours, postez votre problème à l'aide du script mysqlbug . Comment rapporter des bogues ou problèmes . Dans certains cas, vous aurez besoin de redémarrer mysqld avec --skip-grant-tables pour pouvoir exécuter mysqldump .

<< Causes des erreurs Access denied >>
Contrôle d'accès, étape 2 : Vérification de la requête Règles de sécurité et droits d'accès au serveur MySQL Administration du serveur
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -