Sécurisation d'un serveur MySQL


MySQL safe
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


7 Commentaires pour "Sécurisation d'un serveur MySQL"

Flux des commentaires de cet article Ajouter un commentaire
  •  

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

    RépondreRépondre
    Gameplayer , le 27 novembre 2007 à 21:05
  •  

    @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;

    RépondreRépondre
    pti-seb , le 28 novembre 2007 à 12:21
  •  

    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

    RépondreRépondre
    tuxce , le 28 novembre 2007 à 14:36
  •  

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

    RépondreRépondre
    pti-seb , le 28 novembre 2007 à 21:04
  •  

    Ah oui, jamais fait attention, au temps pour moi :)

    RépondreRépondre
    tuxce , le 28 novembre 2007 à 22:50
  •  

    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+

    RépondreRépondre
    Remi , le 29 novembre 2007 à 06:22
  •  

    Ouai pour moi déjà la première protection c'est :

    bind-address = 127.0.0.1
    bind-address = adresse ip du serveur

    RépondreRépondre
    dav , le 10 décembre 2007 à 14:29
 

Ajouter un commentaire

actualité android apache apple astuce astuces bash bilboblog blog boot chrome clavier commande commandes conky date debian Desktop développement elementary exploit faille fedora firefox flash gimp gnome google graphique Graphisme hack hacking Hardware humour intel internet iphone jailbreak Jeux Kde kernel libre Linux log logiciels Logiciels Libres lucid lynx maemo mail maquette metasploit microsoft mobile mockup monitoring mozilla multi-touch musique mysql n900 nautilus nokia noyau openoffice open source password photos php Planet publicité redhat red hat rpm réseau screenshot script serveur serveurs shell sql ssh statistiques sysadmin system Sécurité thème tux-planet tv twitter ubuntu unity vidéo vidéos vlc voyage wallpaper windows wordpress yum