Sécurisation d'un serveur MySQL
![]()
Cet article explique quelques règles d'administration de base, à appliquer afin de sécuriser au mieux un serveur MySQL.
Sécurisation des accès
Dans la plupart des cas, lorsque l'on vient d'installer un serveur MySQL, le mot de passe du compte root est vide. Une des premières tâches consistera donc à le changer immédiatement comme ceci :
mysqladmin -u root password 'mon_password' -p
L'accès sera ainsi protégé :
# mysql -h localhost -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
Et il faudra ensuite utiliser l'option "-p" pour se connecter avec le nouveau password :
# mysql -h localhost -u root -p
L'étape suivante consistera à repérer tous les comptes sans mot de passe :
mysql> SELECT * FROM mysql.user WHERE Password='';
Si la dernière requête renvoie des résultats, on pourra supprimer ces comptes comme ceci :
mysql> DELETE FROM mysql.user WHERE Password='';
mysql> FLUSH PRIVILEGES;
On pourra également faire de même, avec les comptes qui sont autorisés à se connecter depuis n'importe où :
mysql> SELECT * FROM mysql.user WHERE host = '%';
mysql> DELETE FROM user WHERE host = '%';
mysql> FLUSH PRIVILEGES ;
Interdire complètement l'accès distant pour root
Une autre règle, qui me semble importante, est l'interdiction de se connecter en tant que root depuis un accès distant. Toutes les tâches d'administration qui nécessiteront l'utilisation de cet utilisateur, devront être faites en local directement en ligne de commande.
Pour interdire l'accès distant, il suffira d'autoriser que les connexions locales, comme ceci :
mysql> UPDATE mysql.user SET Host = 'localhost' WHERE user='root';
mysql> FLUSH PRIVILEGES;
Supprimer les bases de tests
Par défaut, MySQL autorise l'accès pour tous les utilisateurs, aux bases de données dont le nom commence par "test_". Cela peut poser un vrai problème de sécurité et on préfèrera les supprimer :
mysql> DROP DATABASE test;
mysql> DELETE FROM db WHERE db='test' OR db='test\_%';
Désactiver les options non utilisées
MySQL active tout un tas d'options par défaut qui ne sont pas forcément utilisées. Voici un exemple de paramètres à ajouter dans le fichier /etc/my.cnf, permettant de désactiver des options dont on n'a pas l'utilité :
# Désactivation du programmateur d'événements event-scheduler=0 # Interdit l'utilisation de l'ordre sql 'LOAD DATA INFILE' qui permet # de remplir une base de données avec un fichier local-infile=0 # Désactivation du support des liens symboliques # qui permet de faciliter le stockage de tables sur plusieurs disques durs, # mais cela peut s'avérer très dangereux. skip-symbolic-links # Désactivation du moteur de stockage MERGE skip-merge
Sécuriser l'accès réseau
Enfin, on essayera de faire en sorte que le serveur ne soit pas accessible au niveau réseau. Pour cela on le placera derrière un firewall ou dans un vlan non accessible directement. Seuls les serveurs utilisant des bases de données devront y avoir accès.
On pourra vérifier que la connexion directe au serveur MySQL est bien bloquée, avec la commande telnet (3306 étant le port par défaut) :
$ telnet adresse_ip_serveur 3306


Créé en 2005, Tux-planet est un site qui a pour ambition de regrouper des articles sur Linux et le monde des logiciels libres. 





7 Commentaires pour "Sécurisation d'un serveur MySQL"
Flux des commentaires de cet article Ajouter un commentaireUn certain nombre des opérations proposées ici peuvent être gérées de façon automatiques par le script mysql_secure_installation, qui propose une série de question permettant de fixer un mot de passe pour root, de supprimer l'accès distant pour root, de supprimer la table de test...
@Gameplayer : effectivement certaines des actions citée sont incluses dans ce script.
J'en profite pour rajouter une petite précision sur la désactivation "LOAD DATA INFILE", en effet, si cette option est activée, et que certaines permissions sur des fichiers sont mal gérés, un utilisateur pourra en voir le contenu.
Exemple extreme : LOAD DATA INFILE "/etc/shadows" INTO TABLE ma_table;
Par rapport à l'accès réseau, il peut aussi etre utile de spécifier l'adresse d'écoute de mysql dans le fichier de conf my.cnf:
bind-address = 127.0.0.1
ceci dans le cas où tous les accès à la base se font depuis des applications installées en local.
PS: une petite faute de frappe sur la première commande: un espace entre -u et root
@Tuxce : ta remarque est effectivement pertinante pour les accès uniquement en local. Pour ce qui est de la syntaxe, elle est bonne car les deux solutions fonctionne, mais je vais corriger tout de même car cela peut porter à confusion.
Ah oui, jamais fait attention, au temps pour moi
Avant toute chose, il est aussi utile de supprimer la compatibilité avec les anciens clients (3.x), toujours activée dans les RPM Fedora/Redhat/CentOS
Si la directive :
old_passwords=1
Mettre :
old_passwords=0
De cette manière le cryptage des mots de passe sera plus important.
A+
Ouai pour moi déjà la première protection c'est :
bind-address = 127.0.0.1
bind-address = adresse ip du serveur