Guide complet pour sécuriser votre serveur MySQL

sécuriser serveur MySQL ubuntu debian redhat centos

MySQL est l’un des systèmes de gestion de bases de données open source les plus populaires au monde. Il alimente de nombreuses applications et sites web que nous utilisons quotidiennement. Cependant, comme toute technologie puissante, MySQL peut être vulnérable s’il n’est pas correctement sécurisé. Un serveur MySQL compromis peut conduire à des fuites de données sensibles, à la corruption de bases de données et même à la mise hors ligne de sites web ou d’applications entières.

Heureusement, MySQL offre un ensemble robuste de fonctionnalités de sécurité qui, lorsqu’elles sont correctement utilisées, peuvent protéger vos bases de données contre la plupart des menaces. Dans ce guide complet, nous couvrirons toutes les étapes majeures que vous devez suivre pour verrouiller MySQL et garder vos données en sécurité.

1. Utilisez des mots de passe forts

La première étape de sécurité est très basique mais cruciale – utilisez toujours des mots de passe complexes et difficiles à deviner pour vos comptes d’administration MySQL. Évitez les mots de passe simples ou facilement devinables.

Quelques conseils pour créer de meilleurs mots de passe MySQL :

  • Minimum 12 caractères de longueur
  • Mélange de majuscules, minuscules, chiffres et symboles
  • Évitez les mots du dictionnaire et les informations personnelles
  • Ne réutilisez pas les mots de passe sur plusieurs comptes
  • Envisagez d’utiliser un gestionnaire de mots de passe pour générer et stocker les mots de passe

Il est également fortement recommandé d’éviter d’utiliser le compte root par défaut et de créer plutôt des comptes d’administration supplémentaires avec des mots de passe forts.

De plus, n’exécutez pas votre serveur MySQL en tant qu’utilisateur root du système d’exploitation – créez un compte d’utilisateur MySQL distinct à cette fin.

2. Limitez l’accès à distance

Par défaut, MySQL écoute les connexions sur le port 3306 à partir de n’importe quel hôte. Cela peut laisser votre port MySQL ouvert aux attaques.

Une meilleure approche consiste à autoriser uniquement les connexions à partir d’hôtes de confiance qui doivent accéder à MySQL. Voici quelques façons de limiter l’accès à distance :

Lier à des adresses IP spécifiques

Dans votre fichier de configuration MySQL (my.cnf), spécifiez des directives bind-address pour restreindre l’écoute à une ou plusieurs adresses IP sur votre réseau privé :

bind-address=192.168.1.101
bind-address=127.0.0.1

Cela fera en sorte que MySQL n’écoute que sur les adresses IP définies.

Autoriser l’accès uniquement via VPN

Si vos clients à distance se connectent via VPN, vous pouvez configurer MySQL pour autoriser uniquement les connexions à partir du sous-réseau IP du tunnel VPN.

Utilisez des pare-feu

Les règles de pare-feu fournissent une autre couche de contrôle sur l’accès à distance. Avec iptables sur Linux, par exemple, vous ne pouvez autoriser les connexions que depuis des adresses IP spécifiées.

L’essentiel est de limiter les connexions aux seules adresses IP client de confiance qui nécessitent réellement l’accès MySQL.

3. Utilisez des connexions sécurisées

Par défaut, MySQL transmet les données de manière non sécurisée en texte brut. Pour chiffrer les connexions, vous devez activer Transport Layer Security (TLS).

Il existe quelques façons de mettre en œuvre TLS :

Appliquer TLS pour des utilisateurs spécifiques

Dans MySQL, accordez l’autorisation à un compte d’utilisateur de se connecter via TLS :

mysql> GRANT USAGE ON *.* TO 'mysqluser'@'192.168.1.101' REQUIRE SSL;

Cela exige que l’utilisateur spécifié se connecte à l’aide du chiffrement TLS.

Activer TLS sur le serveur MySQL

Pour rendre TLS obligatoire pour l’ensemble du serveur MySQL, modifiez votre configuration MySQL :

[mysqld]
ssl-ca=/chemin/vers/ca.pem
ssl-cert=/chemin/vers/certificat-serveur.pem
ssl-key=/chemin/vers/clé-serveur.pem  
require_secure_transport=ON

Redémarrez MySQL, et toutes les connexions client utiliseront désormais TLS.

Utiliser le tunneling SSH

Une autre option consiste à tunneliser votre connexion MySQL via SSH, ce qui chiffre tout le trafic. Par exemple :

$ ssh -L 3307:127.0.0.1:3306 [email protected] -N -f

Vous pouvez ensuite vous connecter localement au tunnel sur le port 3307.

4. Améliorez la sécurité de l’authentification

L’utilisation des seuls mots de passe pour l’authentification MySQL présente quelques faiblesses. Des plugins d’authentification supplémentaires peuvent encore mieux verrouiller l’accès :

Exiger l’authentification à deux facteurs

Activez le plugin MFA pour les comptes :

mysql> CREATE USER 'jeffrey'@'192.168.1.101' IDENTIFIED WITH authentication_ldap_simple
  AS 'secretPassword';
mysql> ALTER USER 'jeffrey'@'192.168.1.101'
  REQUIRE TWO_FACTOR AUTHENTICATION
  VIA one_time_password;

La connexion nécessitera désormais à la fois un mot de passe et un code à usage unique.

Utiliser l’authentification LDAP

Avec le plugin AUTHENTICATION_LDAP_SIMPLE, MySQL peut authentifier les utilisateurs de manière externe par rapport à un annuaire LDAP.

Utiliser des certificats SSH

Le plugin AUTHENTICATION_LDAP_SIMPLE permet de vérifier les clients via des certificats SSH plutôt que par des mots de passe.

Limiter le nombre de tentatives de connexion

Utilisez le plugin FAILED_LOGIN_ATTEMPTS pour verrouiller un compte après un certain nombre de connexions infructueuses, entravant les attaques par force brute.

Exiger des mots de passe forts

Le plugin VALIDATE_PASSWORD peut appliquer des exigences telles que la longueur du mot de passe, la complexité, l’expiration et l’historique.

5. Mettre en œuvre un contrôle d’accès basé sur les rôles

MySQL comprend un système d’autorisations robuste. Plutôt que d’accorder des privilèges globaux, vous devez mettre en œuvre un contrôle d’accès basé sur les rôles (RBAC) pour un contrôle plus granulaire.

Par exemple, les tâches administratives peuvent être séparées en rôles tels que :

  • Administrateur de base de données – CREATEALTERDROPBACKUP
  • Développeur d’applications – SELECTINSERTUPDATE
  • Analyste en lecture seule – SELECT

Accordez à chaque utilisateur l’ensemble minimal de privilèges nécessaires à son rôle. Révoquez tous les privilèges inutiles.

Envisagez également un contrôle d’accès au niveau des lignes ou des colonnes pour limiter la visibilité des données.

6. Surveillez et auditez l’activité

Pour détecter les activités non autorisées, MySQL fournit des plugins d’audit qui peuvent enregistrer les exécutions de requêtes, les modifications de données et les actions d’administration.

Les principaux plugins incluent :

Journal général des requêtes

Le journal général des requêtes enregistre toutes les instructions SQL exécutées par MySQL. Pour l’activer, définissez la variable general_log sur 1 dans votre fichier de configuration MySQL (my.cnf) ou en exécutant la commande :

mysql> SET GLOBAL general_log = 'ON';

Vous pouvez spécifier l’emplacement du fichier journal à l’aide de general_log_file.

Slow Query Log

Le slow query log suit les requêtes qui dépassent un seuil de temps d’exécution défini. Pour l’activer, définissez la variable slow_query_log sur 1 et définissez le seuil via long_query_time (par exemple 10 secondes). Par exemple :

mysql> SET GLOBAL slow_query_log = 'ON';
mysql> SET GLOBAL long_query_time = 10;

L’emplacement du fichier journal est contrôlé par slow_query_log_file.

Journal binaire

Le journal binaire contient les instructions SQL qui modifient les données. Il est activé par défaut dans MySQL 5.1+ (à des fins de réplication). Pour l’activer explicitement, définissez :

mysql> SET GLOBAL log_bin = ON;

Le format de journalisation binaire est défini via binlog_format, et l’emplacement du fichier est binlog_file.

Faites pivoter et sauvegardez régulièrement ces journaux pour éviter les problèmes d’espace disque. Les journaux fournissent une piste d’audit de l’activité de la base de données.

7. Appliquez les derniers correctifs de sécurité

Comme tout logiciel, MySQL publie périodiquement des correctifs de sécurité et des mises à jour de version. Pour réduire les vulnérabilités, appliquez toujours la dernière version stable de MySQL ou les correctifs dès que possible.

Vérifiez le blog MySQL ou les notes de version pour les annonces de sécurité. Les versions majeures comme MySQL 8 peuvent recevoir des backports de correctifs pour les anciennes versions comme MySQL 5.7.

Pour les systèmes Debian/Ubuntu, exécutez :

$ sudo apt update
$ sudo apt upgrade mysql-server

Sur RHEL/CentOS, utilisez :

$ sudo yum update mysql-server

8. Évitez d’exposer MySQL aux fronts Web

N’exposez jamais directement votre serveur MySQL à Internet public. Si les applications Web doivent se connecter à MySQL, envisagez d’utiliser une couche proxy intermédiaire comme Envoy ou HAProxy pour ajouter un pare-feu et contrôler l’accès.

Ce serveur proxy peut fournir :

  • Pare-feu pour restreindre les connexions
  • Mise en pool de connexions pour optimiser les performances
  • Analyse de requêtes pour la surveillance de la sécurité
  • Mise en cache pour réduire la charge sur la base de données
  • Limitation du débit pour empêcher un trafic excessif

Le proxy ajoute une surcharge, mais vous donne plus de contrôle qu’en exposant directement MySQL.

9. Tirez parti des autorisations d’utilisateur

Comme mentionné précédemment, alignez les autorisations des utilisateurs MySQL sur le principe du moindre privilège. Donnez à chaque utilisateur uniquement les capacités nécessaires à son travail.

Mais les autorisations des utilisateurs peuvent fournir une autre couche de sécurité au-delà du simple accès aux données :

Restreindre les privilèges de processus

Les privilèges PROCESS et SUPER permettent de modifier les paramètres et les processus du serveur MySQL. Limitez les utilisateurs qui en ont absolument besoin.

Limiter les ressources utilisateur

La limite de ressources MAX_USER_CONNECTIONS empêche un utilisateur d’ouvrir trop de connexions qui pourraient surcharger MySQL.

Restreindre le verrouillage des comptes utilisateur

Activez le privilège CREATE USER ou ALTER USER pour restreindre les utilisateurs pouvant verrouiller/déverrouiller d’autres comptes, empêchant les modifications non autorisées.

Limiter les utilisateurs pouvant créer de nouveaux utilisateurs

Soyez prudent quant à l’octroi du privilège CREATE USER car la création de nouveaux utilisateurs pourrait ouvrir des failles de sécurité.

10. Tirez parti des privilèges de base de données

Comme pour les comptes utilisateur, vous pouvez appliquer le principe du moindre privilège au niveau de la base de données :

Limiter les privilèges CREATE/ALTER de la base de données

Soyez prudent quant à l’autorisation des utilisateurs à créer ou modifier la structure des bases de données.

Restreindre les privilèges DROP de la base de données

Le privilège DROP au niveau de la base de données peut être dangereux – limitez les utilisateurs qui ont cette capacité.

Affecter des rôles de base de données

Des rôles tels que db_datareader ou db_datawriter peuvent définir des ensembles de privilèges préconfigurés sur une base de données, mettant en œuvre le RBAC au niveau de la base de données.

11. Sécurisez vos fichiers et répertoires MySQL

Le système de fichiers contenant vos répertoires de données MySQL, vos tablespaces et vos fichiers journaux doit être verrouillé :

Restreindre les autorisations de fichier

N’autorisez jamais l’accès global en lecture/écriture aux fichiers MySQL. Révoquez les autorisations inutiles pour limiter l’accès.

Activer le transfert de fichiers sécurisé

Envisagez d’utiliser SFTP ou SSH pour le transfert de fichiers sécurisé plutôt que FTP non sécurisé.

Séparer les fichiers de base de données et les fichiers journaux

Placez les répertoires de bases de données MySQL et les fichiers journaux sur des volumes disques différents. Cela ajoute de la résilience si un volume disque tombe en panne ou se remplit.

Chiffrer les fichiers de base de données

Des outils comme le chiffrement transparent des données de MySQL Enterprise Edition peuvent chiffrer les fichiers de base de données, protégeant contre les accès non autorisés.

12. Soyez prudent lors de l’utilisation de la réplication

La réplication MySQL vous permet de maintenir des bases de données esclaves identiques. Cette puissante capacité introduit également des considérations de sécurité :

Utiliser TLS pour le trafic de réplication

Tout comme vous chiffrez les connexions client, utilisez également TLS pour chiffrer le transfert de données de réplication entre le maître et l’esclave.

Restreindre les privilèges de réplication

Accordez le privilège REPLICATION SLAVE avec prudence, uniquement aux comptes qui en ont besoin. Envisagez également d’utiliser un contrôle d’accès basé sur les rôles.

Surveiller le journal binaire

Vérifiez régulièrement le journal binaire pour détecter tout SQL potentiellement malveillant pendant la réplication.

13. Effectuez des sauvegardes régulières

Les sauvegardes fournissent une défense importante contre la perte catastrophique de données due à une défaillance matérielle, une corruption de données, des suppressions accidentelles et même des attaques de rançongiciel.

Envisagez de combiner :

  • Sauvegardes complètes quotidiennes ou hebdomadaires
  • Sauvegardes incrémentielles plus fréquentes
  • Sauvegardes de journaux de transactions

Testez régulièrement les restaurations pour vérifier que vos sauvegardes fonctionnent correctement. Chiffrez vos sauvegardes et stockez-les dans plusieurs endroits sécurisés.

14. Tirez parti des fonctionnalités de sécurité de MySQL 8

Si possible, mettez à niveau vers la dernière version majeure 8.x de MySQL pour tirer parti des améliorations de sécurité :

Meilleure protection par mot de passe

MySQL 8 a une meilleure hachage de mot de passe via caching_sha2_password et une validation plus forte avec la vérification de l’expiration du mot de passe.

Contrôle d’accès basé sur les rôles

Capacités RBAC plus avancées pour les privilèges administratifs et l’accès aux données.

Plugin d’authentification par défaut

Les nouvelles installations auront le plugin caching_sha2_password fort activé par défaut.

Chiffrement amélioré

MySQL 8 ajoute la prise en charge du chiffrement des journaux d’annulation, des journaux redo et des pages de fichiers de données.

Conclusion

La sécurisation d’un serveur de base de données MySQL nécessite de la diligence, mais la tranquillité d’esprit en vaut la peine. Utilisez les conseils complets fournis dans ce guide comme une feuille de route pour verrouiller vos environnements MySQL. Gardez toujours la sécurité à l’esprit lors de la mise en place de nouvelles instances.

En tirant parti du contrôle d’accès robuste, du chiffrement, de l’audit et plus encore de MySQL, vous pouvez déployer une infrastructure de base de données en toute confiance, vos données étant protégées contre la plupart des attaques. Combinez ces mesures au niveau de la base de données avec des protections au niveau du système telles que des pare-feu, des groupes de sécurité et des VPN pour mettre en œuvre une défense en profondeur.

Bien qu’aucun régime de sécurité n’élimine tout risque, la mise en place de plusieurs couches de sécurité augmente considérablement la barrière à la compromission. Avec une mise en œuvre adéquate de la sécurité MySQL ainsi qu’une surveillance et une maintenance vigilantes, vous pouvez éviter la grande majorité des menaces pour les bases de données.

Laisser un commentaire