Comment sécuriser MySQL part. 1/2

Cette fois vous aller voir comment sécuriser votre serveur MySQL. Vous verrez que c'est tout à fait possible et reste relativement simple. Bien entendu on va revoir ensemble ce que l'on entend par sécurisation de serveur MySQL. On va placer notre contexte sur un serveur MySQL installé sur une debian 8,  sur lequel fonctionne aussi un service Nginx et PHP7-FPM.

Ce qu'il faut entendre par sécurisation

On va parler de rendre MySQL intouchable depuis l’extérieur du serveur et de le renforcer en local sur le serveur qui l'héberge. Ce qui implique pour vous d'assurer ou de faire assurer la bonne sécurité physique de votre serveur. Il est aussi indispensable que le serveur en lui-même soit sécurisé. Sinon cela ne servira pas à grand-chose. Ce que vous allez apprendre avec cet article c'est ce qui est possible pour que MySQL ne soit pas la cause de soucis important.

Les failles de sécurité

Au moment où je rédige cet article une nouvelle faille critique touche MySQL et elle ne sera pas patchée avant mi-octobre par Oracle (Plus d'information sur la CVE-2016-6662 ici : http://www.nextinpact.com/news/101344-mysql-chercheur-devoile-deux-failles-0-day-critiques.htm)... Dans tous les cas il faut savoir que très certainement durant la période d'utilisation de votre serveur MySQL, il connaîtra des failles de sécurité. Vous devrez donc être toujours vigilant sur les mises à jour de ce dernier. C'est la première règle à respecter pour maintenir la sécurité de votre serveur : N°1 faites vos mises à jour.

Vous devez bien avoir en tête que l'on peut utiliser MySQL pour prendre le contrôle complet d'un serveur, voler des informations (extractions de fichiers notamment) et installer des malwares.

Sécurisation via l'outil de MySQL

Sous linux vous avez lorsque vous installez MySQL il installe aussi le programme suivant : "mysql_secure_installation" ce programme va vous poser plusieurs questions notamment si vous souhaitez changer votre mot de passe d'utilisateur root (celui de MySQL). Si votre installation vient d'être , réalisé pas besoin de le changer dans le cas contraire faites-le c'est une bonne idée. Pour rappel un bon mot de passe dépasse les 12 caractères contient des lettres, majuscules et minuscules, des chiffres et des méta-caractères.

Une fois le programme lancé et que vous ayez ou pas choisi de modifier le mot de passe root, il va vous poser d'autres questions. Je vous conseille de toujours répondre "y" pour "Yes". Pour simplifier il va retirer les tables de test ainsi que les utilisateurs de test. Très important il va aussi interdire de se connecter en root depuis un poste distant.

Voilà vous avez fait une bonne première étape !

Sortez votre terminal vous allez en avoir besoin

Vous allez tout d'abord vérifier que la connexion distante est bien désactivée. Pour cela ouvrez votre terminal et connectez-vous sur le serveur en SSH. Une fois connecté tapez la commande suivante pour ouvrir le fichier de configuration de MySQL.

nano /etc/mysql/my.cnf

Dans le fichier il faut rechercher la ligne "bind-adress" et la configurer comme suit :

bind-address = 127.0.0.1

Si jamais vous avez besoin d'avoir un accès distant à votre serveur je vous conseille de lire l'article suivant : https://technique.arscenic.org/lamp-linux-apache-mysql-php/mysql-le-serveur-de-bases-de-donnees/article/acces-distant-a-un-serveur-mysql

Et si on parlait historique des requêtes ?

Si vous êtes un peu habitué à linux vous devez connaître les fichiers "history". Ces fichiers gardent en mémoire les commandes que vous avez tapées. Il y en a un pour les utilisateurs ".bash_history" dans le répertoire home. Mais il y a aussi un fichier similaire pour MySQL. Ce fichier c'est ".mysql_history" dans lequel on peut trouver ce genre de choses :

GRANT ALL PRIVILEGES ON BDD.* To 'USER'@'%' INDETIFED BY 'XXXX'

Il est donc conseillé de le désactiver, car si jamais un attaquant arrive à lire le fichier en question il pourrait accéder à des requêtes avec des mots de passes (comme celle ci-dessus). Pour ce faire il suffit de supprimer le fichier via la commande :

rm $HOME/.mysql_history

Puis de créer un lien symbolique vers le "vide" du système d'exploitation généralement sous linux "/dev/null" ce qui nous donne la commande suivante :

ln -s /dev/null $HOME/.mysql_history

Autres points à prendre en compte

En plus de tout cela vous devez prendre en compte que si vous installez par exemple un outil comme phpMyAdmin, une grosse partie de ces actions ne serviront à rien... De même si vous avez des applications qui contiennent des failles d'injection SQL cela ne servira aussi à rien. Car ce n'est pas dans MySQL que vous pouvez venir contrer ces attaques. La seconde et dernière règle pour maintenir la sécurité de votre serveur c'est : N°2 gérer vos utilisateurs avec rigueur.

Gestion des utilisateurs MySQL comment faire

Dans un premier temps il est conseillé de changer régulièrement vos mots de passe utilisateurs. Surtout ceux avec de forts privilèges tels que root. Pour ce dernier une fois par mois c'est bien. Pour les autres utilisateurs il vous est conseillé de ne pas leur donner tous les droits comme le mauvais exemple plus haut :

GRANT ALL PRIVILEGES ON BDD.* To 'USER'@'%' INDETIFED BY 'XXXX'

Dans l'idée vous devez assigner des droits restreint à vos utilisateurs de MySQL, par exemple pour un site Internet sous un CMS quelconque vous n'avez besoin que des droits suivants : UPDATE, INSERT, SELECT, CREATE, DELETE, ALTER, TRUNCATE et encore cela prête à discussion selon la criticité des bases de données et du CMS utilisé.

Autres points de configuration liés aux utilisateurs

Pour MySQL il y a un nombre de connexion limitée qu'il autorise. Si jamais ce nombre est atteint plus personne ne peut se connecter au serveur. Si on génère trop de requête sur un site Internet par exemple et que l'on arrive à les faire en boucles, on va provoquer un déni de service car plus personne ne pourra accéder au site Internet. Sauf si bien sûr celui-ci dispose de dispositif pour contrer cela. Dans l'idée vous devez configurer en amont MySQL pour qu'on limite les connexions par utilisateur. Disons que pour un site Internet vitrine 30/50 c'est largement suffisant. Pour le configurer il faut ouvrir votre fichier de configuration de MySQL :

nano /etc/mysql/my.cnf

Puis de rajouter la ligne suivante :

set-variable = max_user_connections = 50

Vous allez aussi limiter les droits d'accès aux autres base de données à votre internaute.  Vous devez vous dire, euh... on l'a pas déjà fait plus haut ? En fait oui et non. Il reste la possibilité à l'utilisateur de lister tous les bases disponibles sur le serveur. Sans pour autant en lister les informations précises, mais le simple fait de savoir qu'elles existent peut permettre à un attaquant de cibler un autre site. Dont il n'aurait pas eu connaissance autrement. Pour limiter cela il faut rajouter la ligne suivante dans votre fichier de configuration de MySQL, pour que ce soit un minimum rangé ajoutez la dans la section mysqld :

safe-show-database

Vous pouvez aussi limiter le nombre de connexion total à votre serveur, mais cela dépendra du nombre de site Internet. En général 500 reste correct, voir un peu élevé.

Le plus dur pour la fin le chroot de MySQL

Le chroot est en fait une technique que l'on utilise pour les utilisateurs SSH et FTP pour les restreindre à un seul répertoire. Le but et d'empêcher un utilisateur ou les utilisateurs d'un programme ici MySQL d'avoir accès à tout le disque dur. En effet avec MySQL sans le chroot vous pouvez lui demander d'afficher tous les fichiers, ou presque d'un serveur web. Comme par exemple le fichier /etc/passwd, ou pourquoi pas des fichiers de configuration d'autre site Internet sur le serveur...

Le but est donc de restreindre MySQL pour améliorer la sécurité de manière importante en l'empêchant suite à une injection SQL de lire ou d'exporter n'importe quel fichier du serveur.

La configuration en chroot étant un peu compliquée je l'évoque juste et je vous prépare un article dédié à ce sujet.

Conclusion

Vous l'aurez compris la sécurisation d'un serveur MySQL n'est pas forcément compliqué par contre son bon maintient est une gestion de tous les jours et une rigueur dans son utilisation au quotidien. Pour une installation de MySQL avec Nginx et PHP7-FPM vous pouvez vous plonger dans un de mes précédents article.

 

Crédit illustration : Designed by Freepik