| 5.4 Sécurité générale du serveur
 5 Administration du serveur
 Manuel de Référence MySQL 4.1 : Version Française
 
 . Guide de sécurité
 ->Protéger MySQL contre les attaques
 . Options de démarrage qui concernent la sécurité
 . Problèmes de sécurité avec LOAD DATA LOCAL
 
 
 | 
  5.4.2 Protéger MySQL contre les attaques   
 
Lorsque vous vous connectez à MySQL, vous devriez avoir besoin d'un
mot de passe. Ce mot de passe n'est pas transmis en texte clair sur le
réseau. La gestion des mots de passe durant l'identification des
utilisateurs a été améliorée en MySQL 4.1.1 pour être très sécurisée. Si vous 
utilisez une vieille version de MySQL, ou si vous utilisez toujours les mots de 
passe de type pre-4.1.1, l'algorithme de chiffrement n'est pas très fort,
quelques efforts permettront à un pirate d'obtenir votre mot de passe
s'il est capable de surveiller le trafic entre le client et le serveur.
(Voyez  Chiffrement des mots de passe en MySQL 4.1  pour une discussion des différentes méthodes de
gestions des mots de passe).
Si la connexion entre le client et le serveur utilise des réseaux non
fiables, il est alors recommandé d'utiliser un tunnel SSH.
Toutes les autres informations sont transférées comme du texte clair,
et quiconque surveille la connexion pourra les lire. Si vous souhaitez
relever ce niveau de sécurité, il est recommandé d'utiliser le protocole
compressé (avec les versions de MySQL 3.22 et plus récentes),
pour compliquer considérablement le problème. Pour rendre la communication
encore plus sûre, vous pouvez aussi utiliser  
ssh
 . Vous trouverez une
version  
Open Source
  du client  
ssh
  sur le site 
 http://www.openssh.org/ , et une version commerciale du client  
ssh
  
sur le site de  http://www.ssh.com/ . Avec eux, vous pouvez mettre en place
une connexion TCP/IP chiffrée entre le serveur et le client MySQL. 
Si vous utilisez MySQL 4.0, vous pouvez aussi utiliser le support OpenSSL
interne.
 Utilisation des connexions sécurisées .
Pour rendre le système MySQL encore plus sûr, nous vous recommandons
de suivre les suggestions suivantes : 
Utilisez des mots de passe pour tous les utilisateurs MySQL. N'oubliez
pas que tout le monde peut se connecter avec un nom d'utilisateur quelconque,
simplement avec l'option  
mysql -u autre_utilisateur nom_de_base
 , si 
 
autre_utilisateur
  n'a pas de mot de passe. C'est un comportement classique
pour les applications client/serveur que le client spécifie son nom
d'utilisateur. Il sera plus difficile à un attaquant de pénétrer dans votre
serveur si tous les comptes ont un mot de passe.Vous pouvez modifier les mots de passe de tous les utilisateurs
en modifiant le script  
mysql_install_db
  avant de l'exécuter, ou 
vous pouvez modifier seulement le mot de passe du  
root
  MySQL comme
ceci : 
| 
shell> mysql -u rootmysql> UPDATE mysql.user SET Password=PASSWORD('nouveau_mot_de_passe')
 -> WHERE User='root';
 mysql> FLUSH PRIVILEGES;
 | 
N'exécutez jamais le démon MySQL avec l'utilisateur Unix  
root
 . C'est très dangereux,
car tout personne ayant le droit de  
FILE
  pour créer des fichiers au nom
du  
root
  (par exemple,  
~root/.bashrc
 ). Pour éviter cela, 
 
mysqld
  refusera de s'exécuter au nom de  
root
  à moins que
soit précisé l'option  
--user=root
 . 
mysqld
  peut être exécuté avec un utilisateur ordinaire sans droits
particuliers. Vous pouvez aussi créer un utilisateur Unix  
mysql
  pour rendre
cela encore plus sûr. Si vous exécutez  
mysqld
  sous un autre utilisateur Unix,
vous n'avez pas à changer le mot de passe  
root
  dans la table  
user
 ,
car les noms d'utilisateurs MySQL n'ont rien à voir avec les noms d'utilisateurs
Unix. Pour démarrer  
mysqld
  sous un autre nom d'utilisateur Unix, ajoutez la ligne
 
user
 , qui spécifie le nom de l'utilisateur, dans le fichier d'options 
de  
[mysqld]
 
/etc/my.cnf
  ou dans le fichier  
my.cnf
  présent dans
le dossier de données du serveur. Par exemple :  
 
Cette ligne va forcer le serveur à démarrer en tant qu'utilisateur  
mysql
 ,
même si vous démarrez le serveur manuellement ou avec les scripts  
safe_mysqld
 ,
ou  
mysql.server
 . Pour plus de détails, voyez  Comment faire tourner MySQL en tant qu'utilisateur normal .Exécuter  
mysql
  sous un autre compte Unix que  
root
  ne signifie pas
que vous devez changer le nom de  
root
  dans la table  
user
 . Les comptes
utilisateurs de MySQL n'ont rien à voir avec ceux du compte Unix.
N'autorisez pas l'utilisation de liens symboliques pour les tables. Cette fonctionnalité
peut être désactivée avec l'option  
--skip-symbolic-links
 . C'est particulièrement
important si vous utilisez  
mysqld
  comme  
root
 , car tout utilisateur a alors
le droit d'écrire des données sur le disque, n'importe où sur le système!!
 Utiliser les liens symboliques pour les tables sous Unix .
Vérifiez que l'utilisateur Unix qui exécute  
mysqld
  est le seul utilisateur
avec les droits de lecture et écriture dans le dossier de base de données.
Ne donnez pas le droit de  
PROCESS
  à tous les utilisateurs. La liste fournie
par  
mysqladmin processlist
  affiche le texte des requêtes actuellement exécutées,
ce qui permet à toute personne pouvant exécuter cette commande de lire des valeurs
qui seraient en clair, comme :  
UPDATE user SET
password=PASSWORD('not_secure')
 . 
mysqld
  réserve une connexion supplémentaire pour les utilisateurs qui ont
le droit de  
PROCESS
 , afin que le  
root
  MySQL puisse toujours se
connecter et vérifier que tout fonctionne bien, même s'il ne reste plus 
de connexions libres pour les autres utilisateurs.
 
Le droit  
SUPER
  peut être utilisé pour fermer des connexions clients,
changer les variables systèmes et contrôler la réplication.
Ne donnez pas le droit de  
FILE
  à tous les utilisateurs. Tout utilisateur
qui possède ce droit peut écrire un fichier n'importe où sur le serveur, avec
les droits hérités du démon  
mysqld
  ! Pour rendre cela plus sécuritaire,
tous les fichiers générés par  
SELECT ... INTO OUTFILE
  sont lisibles
par tous, mais personne ne peut les modifier.
 
Le droit de  
FILE
  peut aussi être utilisé pour lire n'importe quel
fichier accessible en lecture au démon qui fait tourner MySQL. Il devient
donc possible, suivant les configurations, d'utiliser la commande 
 
LOAD DATA
  sur le fichier  
/etc/passwd
  pour tout mettre en table,
et ensuite le relire avec la commande  
SELECT
 .
Si vous ne faites pas confiance à votre DNS, vos pouvez simplement
utiliser des adresses IP au lieu des noms d'hôtes. Dans ce cas, soyez
très prudents lors de la création de droits qui utilisent des caractères
joker.
Si vous voulez restreindre le nombre de connexions d'un utilisateur, vous
pouvez le faire en utilisant la variable  
max_user_connections
  de
 
mysqld
 .
La commande  
GRANT
  dispose aussi d'option de contrôle des ressources,
pour limiter l'utilisation du serveur par un compte utilisateur.
 |