Durcir son serveur Mysql en 6 étapes
Dans la continuité de notre certification, nous constatons que le durcissement des composants des bases de données Open Source soulève des difficultés aux équipes de prod.
MySQL n’échappe pas à la règle. Il faut durcir ce composant tout en permettant la continuité de la production. Ce guide de durcissement pourra sans doute aider quelques administrateurs face à des QSA en attente de preuves.
Etape N°1 : Mettre Mysql à part du socle, on CHROOT.
L’installation de Mysql doit se faire dans le domaine du possible sous un environnement chrooter. Les avantages sont maitrisés pour l’ensemble des administrateurs Linux. Les avantages du CHROOT sont indéniables en cas de compromission de votre serveur.
On commence par créer la nouvelle arborescence :
mkdir -p /services/chrootmydb-mysql/var/lib/ cd /services/chrootmydb-mysql mkdir -p var/run etc tmp chmod 1777 tmp
puis on y déplace les bases de données :
grep "mysql:" /etc/passwd > etc/passwd mv /var/lib/mysql var/lib/ ln -s /services/chrootmydb-mysql/var/lib/mysql/ /var/lib/mysql mv /var/run/mysqld var/run ln -s /services/chrootmydb-mysql/var/run/mysqld/ /var/run/mysqld
On applique les changements suivants sur les librairies :
ldd /usr/libexec/mysqld libdl.so.2 => /lib/libdl.so.2 libpthread.so.0 => /lib/i686/libpthread.so.0 libz.so.1 => /usr/lib/libz.so.1 libcrypt.so.1 => /lib/libcrypt.so.1 libnsl.so.1 => /lib/libnsl.so.1 libm.so.6 => /lib/i686/libm.so.6 libc.so.6 => /lib/i686/libc.so.6 /lib/ld-linux.so.2 => /lib/ld-linux.so.2 mkdir -p lib/i686 usr/lib cp /lib/libdl.so.2 /lib/libcrypt.so.1 /lib/libnsl.so.1 /lib/ld-linux.so.2 lib cp /lib/i686/libpthread.so.0 /lib/i686/libm.so.6 lib/i686/ cp /lib/libnss_compat.so.2 /lib/libnss_files.so.2 lib/
On modifie le fichier /etc/my.cnf:
chroot=/services/chrootmydb-mysql.
Étape 2 : On sécurise l’installation du paquet Mysql-Server
On execute le script mysql_secure_installation fourni par Mysql (Présent sur l’ensemble des socles Linux). Ce script permet :
- Affecter un mot de passe root.
- Limiter l’accès au compte root en local.
- Suppression des comptes anonymes.
- Supprimer la base de test, créer à l’installation
C’est vraiment le minimum à faire lors de la livraison d’un serveur Mysql de base.
Une fois le script effectué avec les privilèges root, il vous faudra modifier le paramètre suivant dans /etc/my.cnf
symbolic-link=0
Étape N°3 : Filtrer les accès réseaux à notre serveur MySql
Pour autoriser uniquement les réseaux de confiance sur notre serveur, on modifie le fichier /etc/my.cnf
bind-address 127.0.0.1 par le réseau souhaité... Skip-networking (ca va aider si votre serveur est dédié en tant que DB comme recommandé sous PCI DSS).
Il faut aussi préciser sur quelle base de données vous autorisez ou non les clients (Frontaux).
Etape N°4 : Limitation des connexions à la base
On va limiter le nombre de connexion à notre base de données pour éviter les utilisateurs indélicats (brute force, script en boucle…). Si notre serveur ne doit accueillir que 3 frontaux pour un potentiel de 30 connexions simultanées, on modifie le fichier /etc/my.cnf
set-variable = max_user_connexions = 30
Etape N°5 : Les privilèges sur les tables MySQL
L’utilisateur de votre base de données MySQL ne doit pas disposer de droits permissifs, il doit pouvoir lire, écrire dans la table et dans certains cas précis lancer des programmes en local sur le serveur MySQL. Nous allons vérifier que la surface d’attaque soit la plus faible en attribuant la règle: Minimum de privilège et justification de chaque augmentation de privilège.
Les comptes crées seront attachés uniquement aux frontaux autorisés avec les IP associés (Access List).
Dans le cadre de PCI DSS, les comptes suivent la PSSI. Restons simple ne réinventons pas l’eau chaude mais ne soyons pas laxiste. je suis le premier à pester contre cette reco suite aux faits que je dois créer un compte en plus…c’est pénible mais indispensable surtout si votre composant est exposé.
Etape N°6 : Les mots de passe
On ne le dira jamais assez « Les mots de passes doivent être robustes et différents sur chaque compte« .
Les fichiers qui doivent stocker les utilisateurs/mot de passes (CMS, Site WEB…) doivent être suffisamment protéger et sous surveillance (FIM).
Rappel de base PCI DSS.
- Les mots de passe doivent respecter la politique de la PSSI.
- Les mots de passe doivent être complexes (majuscules, minuscule, alphanumériques).
- Avoir une longueur minimum de 8 caractères (dans mon cas, j’ai plus de 30 caractères).
Ne pas oublier que le stockage des mots de passes doivent être sous forme de HASH (SHA1 recommandé pour l’audit PCI).
La commande magique sous MySQL
mysql> update mysql.user set Password= SHA1('<mot de passe>')where User='user';