Comment sécuriser son serveur MySQL part.2/2 : chrooter MySQL

Vous allez voir comment nous allons faire pour chrooter MySQL. Ok mais c'est quoi un chroot ? Le chroot il faut le voir comme une prison, ou l'on va lancer un programme qui ne pourra pas sortir du sa cellule. Le but est d'empêcher quiconque d'accéder aux fichiers présents sur le serveur via une requête SQL ou tout eautre commande lancé via MySQL.

En effet, car si vous configurez mal certain de vos utilisateurs MySQL, notamment avec le privilège FILE, ils vont pouvoir via une requête SQL lire tous les fichiers du serveur ou presque. Par exemple la liste des utilisateurs du serveur, ou encore des fichiers de configuration qui devraient rester inaccessible avec les mots de passe aux bases de données.

Dans la suite de l'article on part du principe que vous avez déjà un serveur MySQL d'installé. Attention pensez à réaliser un backup avant de vous lancer !

NB : Je n'ai pas réussi à faire fonctionner cela sur mes debian 8, si vous avez une solution je suis toujours preneur.

Recherche de MySQL sur votre serveur

Tout d'abord, vous allez devoir localiser l'exécutable de MySQL pour la suite de la manipulation. Pour cela il vous suffit d'utiliser la commande suivante : 

locate mysqld

Si jamais il ne trouve rien ou que vous avez comme retour "locate command not found" voici ce que vous devez faire la première commande est pour l'installation de locate : 

apt-get install locate 

La seconde met à jour locate pour qu'il sache où se trouve les fichiers, sans cela il risque de vous dire qu'il n'a rien trouvé : 

udpatedb

Une fois fait vous relancer la commande  "locate mysqld" et vous devez voir quelque chose comme ça : 

Conservez bien ces informations on va en avoir besoin un peu plus tard. Avant d'aller plus loin vous devez arrêter MySQL via la commande : 

service mysql stop

Préparation de l'arborescence du "chroot"

Vous allez donc devoir créer un répertoire ou vous allez déplacer MySQL ainsi que tout ce dont il a besoin. A savoir ces bases de données et les fichiers de librairie qu'il utilise. D'ailleurs petit bémol à l'utilisation du chroot là-dessus du fait que l'on copie des librairies si jamais l'une d'elle connait une faille de sécurité, il vous faudra s'en souvenir pour la patcher.

Vous allez donc créer un répertoire à la racine du serveur comme ceci par exemple : 

mkdir -p /chrootservices/mysql/var/lib/ /chrootservices/mysql/var/run/ /chrootservices/mysql/etc/ chrootservices/tmp/

L'option -p permet de créer toute l'arborescence en une commande. Vous devez ensuite modifier les droits sur le dossier temporaire tmp/ pour que tout le monde puisse y accéder.

chmod 1777 /chrootservices/mysql/tmp/

Je vous conseille de vous déplacer dans le dossier mysql que l'on vient de créer pour la suite cela sera plus simple : 

cd /chrootservices/mysql/

Vous allez créer une copie des utilisateurs mysql du fichier etc/passwd localiser dans notre chroot : 

grep "mysql:" /etc/passwd > etc/passwd

Vous allez maintenant déplacer les fichiers de MySQL et surtout les fichiers qui contiennent les base de données. Attention on déplace les fichiers on ne les copie pas. Pour cela on exécute les deux commandes suivantes : 

mv /var/lib/mysql var/lib/
mv /var/run/mysqld var/run/

Pour que MySQL fonctionne toujours vous allez créer les liens suivants, de l'ancien emplacement vers le nouveau : 

ln -s /chrootservices/mysql/var/lib/mysql/ /var/lib/mysql
ln -s /chrootservices/mysql/var/run/mysqld/ /var/run/mysqld

Souvenez-vous tout à l'heure vous avez recherché "mysqld" sur votre serveur. Pour ma configuration il se trouve que mysqld est situé ici : /usr/sbin/mysqld ça devrait être pareil pour vous. Maintenant vous allez devoir copier des fichiers de libraire dont a besoin MySQL. Attention ici on fait bien une copie, car d'autres applications ont surement besoin de ces librairies.

Pour les identifier vous allez utiliser la commande suivante qui va lister tout ce qui doit être déplacé : 

ldd /usr/sbin/mysqld

Vous allez avoir quelque chose comme ça qui apparait : 

Avant de les déplacer vous devez préparer les répertoires pour les recevoir. Attention vous devez obligatoirement créer toute l'arborescence des répertoires. Dans mon exemple je vais devoir notamment faire les répertoires "lib/i386-linux-gnu/i686/cmov", respectez bien le nom et l'ordre. Pour mon cas voici les commandes à faire pour créer l'arborescence nécessaire. Info : on ne tiend pas compte de linux-gate.so.1

mkdir -p lib/i386-linux-gnu/i686/cmov/ usr/lib/i386-linux-gnu/

Je vous épargne les commandes "cp" il faut simplement copier les librairies dans le bon répertoire.

Démarrer MySQL en chroot

Tout est prêt pour que vous puissiez exécuter mysql en chroot, il ne reste plus cas lui demander de le faire. Pour cela vous allez éditer le fichier de configuration de mysql via la commande : 

nano /etc/mysql/my.cnf

Recherchez ensuite la ligne : [client], sous cette ligne vous allez voir une ligne socket il faut donc la modifier comme suit : 

socket = /chrootservices/mysql/var/run/mysqld/mysqld.sock

Plus bas vous recherchez la ligne [mysqld_safe] et la modifiée comme précédemment. Avant d'en avoir fini allez jusqu'à la ligne [mysqld] ou là vous aurez deux choses à modifier. Premièrement, le socket comme pour les autres. Secondement, la ligne du pid-file que vous devez modifier comme suit : 

pid-file = /chrootservices/mysql/var/run/mysqld/mysqld.pid
socket = /chrootservices/mysql/var/run/mysqld/mysqld.sock

Afin de terminer notre chroot, vous devez changer une toute dernière ligne dans le fichier de configuration qui est la ligne qui commence par chroot = il faut la changer par ceci : 

chroot = /chrootservices/mysql/

Vous n'avez plus cas redémarrer MySQL et le tour est joué !

service mysql start

Conclusion

Voilà vous avez encore amélioré la sécurité de votre serveur MySQL. Attention comme toujours la sécurité à 100% n'existe pas et donc même si votre installation est chrootée il faudra rester vigilant sur les mises à jour de sécurité de MySQL.

Retrouver la première partie ici : Comment sécuriser MySQL part. 1/2