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
.
|