6.14 Comment protéger MySQL contre les hackers

Lorsque vous vous connectez à un serveur MySQL, vous utiliserez en règle générale un mot de passe. Le mot de passe sera transmis crypté lors de la connexion, et non pas en clair.

Toutes les informations suivantes seront transmises en clair, ce qui fait que quiconque observe la connexion peut lire les informations. Si vous êtes concerné par les problèmes de sécurité, vous pouvez utiliser le protocole compressé (à partir de MySQL 3.22) pour rendre les choses plus difficile. Pour complexifier encore la lecture, vous pouvez installer ssh (http://www.cs.hut.fi/ssh). Ce protocol fourni un cryptage de la connexion TCP/IP entre le client MySQL et me serveur MySQL.

Pour sécuriser un système MySQL, il est fortement recommandé de suivre les recommandations suivantes :

  • Utilisez des mots de passe pour TOUT les utilisateurs MySQL. N'oubliez pas qu'il est très facile de se connecter à la place d'un autre avec la commande mysql -u other_user nom_base_de_donnees si other_user n'a pas de mot de passe. C'est une stratégie standard dans les applications clients/serveur. Vous pouvez changer les mots de passe de tous les utilisateurs en éditant le script mysql_install_db puis en l'exécutant, ou bien avec la commande root suivante :
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
           WHERE user='root';
mysql> FLUSH PRIVILEGES;
  • N'utilisez pas MySQL comme un démon du root Unix. mysqld peut être exécuté par n'importe quel utilisateur. Vous pouvez aussi créer un nouvel utilisateur mysql augmenter la sécurité. Si vous utilisez mysqld à partir d'un compte Unix autre que le root, vous n'avez pas à changer l'utilisateur the root dans la table user, car les noms d'utilisateur MySQL n'ont rien à voir avec ceux d'Unix. Vous pouvez éditer le script mysql.server pour lancer mysqld avec un autre utilisateur. Généralement, on le fait avec la commande su. Pour plus de détails, @pref{Changing MySQL user}.
  • Si vous avez mis le mot de passe du root Unix dans le script mysql.server, assurez vous que ce fichier n'est lisible que par le root.
  • Vérifiez que l'utilisateur Unix qui exécute mysqld est le seul à avoir les droits d'écriture / lecture dans le dossier des bases de données.
  • Ne donnez le droit de process que très parcimonieusement. L'affichage de la fonction mysqladmin processlist dévoile le texte de toutes les commandes en cours d'exécution, ce qui fait que tout ceux qui ont ce droit, ont vue sur les commandes du type UPDATE user SET password=PASSWORD('not_secure'). mysqld garde toujours une connexion de libre pour les utilisateurs qui ont le droit de process, afin que le root MySQL puisse toujours se connecter et s'assurer du bon fonctionnement des connexions en cours.
  • Ne donnez le droit de file que très parcimonieusement donnez. Quiconque a un tel droit peut écrire un fichier n'importe ou dans le système de fichier, et notamment dans les tables de droits de mysqld! Pour sécuriser un peu ceci, tous les fichiers généré par SELECT ... INTO OUTFILE ne sont lisibles par tous, mais non modifiables. Le droit de file peut aussi être utilisé pour lire un fichier quelconque sur le serveur. Cela permet notamment de lire le fichier ``/etc/passwd'' dans une table, et de le lire avec SELECT.
  • Si vous n'avez pas confiance dans votre serveur DNS, il vaut mieux utiliser les adresse IP numériques, à la place des noms d'hôtes. En principe, l'option --secure de mysqld devrait être suffisante pour sécuriser les noms d'hôtes. Dans toues les cas, méfiez vous des jokers dans les noms d'hôtes.

Les options suivantes affectent la sécurité :

  • --secure Les adresse IP retournées par l'appel système gethostbyname() sont vérifiées pour s'assurer qu'elle correspondent bien à l'hôte original. Cela rend plus difficile de simuler un hôte. Cette option effectue aussi un nettoyage hygiénique des hôtes. Cette option a été enlevée par défaut dans la version MySQL 3.21 car elle peut ralentir le serveur, à cause du temps de résolution. MySQL 3.22 conserve les noms d'hôtes qu'il a déjà résolu dans un cache.
  • --skip-grant-tables Cette option indique au serveur qu'il ne doit pas utiliser les droits enregistrés. Cela donne à tous un accès complet à toutes les bases. (Vous pouvez aussi charger les tables d'un serveur en fonctionnement avec la commande mysqladmin reload.)
  • --skip-name-resolve Les noms d'hôtes ne sont pas résolus. Toutes les lignes de la table Host doivent contenir des valeurs nuémriques, ou bien localhost.
  • --skip-networking N'accepte pas les connexions TCP/. Toutes les connexions à mysqld doivent être faites avec les sockets Unix. Cette option n'est pas disponibles pour les systèmes qui utilisent les MIT-pthreads, car MIT-pthreads ne supporte pas les sockets Unix.