Durcissement de la sécurité MySQL (audit d'état, réseau, TLS, authentification, privilèges, audit, chiffrement)
MySQLNiveau: IntermédiaireDurée: 5 min (audit) – 3 heures (durcissement complet)Ce n'est pas un guide d'installation : il détecte et corrige les failles d'un serveur MySQL 8.4 / 8.0 en service. D'abord, l'audit d'état, en lecture seule, liste les failles par ordre de gravité et indique pour chaque constat la carte à ouvrir ; vous traitez ensuite les domaines un par un, ou tous dans l'ordre : bind_address, firewall et restriction d'hôte des comptes ; TLS, require_secure_transport et VERIFY_IDENTITY côté client ; caching_sha2_password, politique de mots de passe, root distant et comptes anonymes ; rôles et compte applicatif sans DDL ; audit ; chiffrement des tablespaces InnoDB (keyring component) ; sauvegardes chiffrées ; système d'exploitation ; suivi des versions. L'audit n'existe pas en Community : il faut MySQL Enterprise (abonnement payant) ou Percona Server (gratuit) ; le TDE est aussi disponible en Community. À la fin, l'audit est relancé.
Topologie: Un serveur MySQL + un serveur d'application (vérification côté client) ; replica/InnoDB Cluster dans les notes
Scénarios
- Audit d'état : quelles sont mes failles ? (lecture seule) — Le scan à lancer en premier : comptes anonymes, sans mot de passe ou root distant, accès depuis n'importe où (%), plugin d'authentification faible, privilèges globaux, TLS, audit, chiffrement, droits sur les fichiers et firewall ; il ne modifie rien.
- Durcissement complet (tout dans l'ordre) — Serveur fraîchement installé ou jamais durci : tous les domaines sont appliqués dans un ordre sûr ; MySQL est redémarré plusieurs fois (une fenêtre de maintenance est nécessaire).
- Réseau et connexions : qui peut se connecter et d'où ? (bind_address, firewall, restriction d'hôte) — MySQL écoute sur toutes les interfaces, les comptes ont l'hôte '%', le port est ouvert à tous. Modifier bind_address nécessite un redémarrage.
- Chiffrer les connexions (TLS, require_secure_transport, VERIFY_IDENTITY) — Le certificat auto-signé généré automatiquement est utilisé, les connexions non chiffrées sont acceptées, ou les clients ne vérifient pas le certificat. Sans interruption grâce à ALTER INSTANCE RELOAD TLS.
- Authentification et mots de passe (caching_sha2, politique de mots de passe, root) — Comptes mysql_native_password, aucune politique de mots de passe, root distant, comptes anonymes et base test. Sans interruption.
- Moindre privilège : rôles et compte applicatif sans DDL — Privilèges CREATE/ALTER/DROP ou . sur le compte applicatif, comptes avec FILE/SUPER ; rôles lecture/écriture/DDL et rapport des privilèges. Sans interruption.
- Audit : qui a fait quoi ? — L'auditeur demande la journalisation des sessions et des requêtes. MySQL Community n'a pas d'audit intégré : Enterprise Audit, Audit Log Filter de Percona Server, ou des options limitées pour Community. Licence : Enterprise Audit n'est fourni qu'avec un abonnement MySQL Enterprise ; Percona Audit Log Filter est gratuit.
- Chiffrer les données au repos (InnoDB tablespace encryption, keyring) — Chiffrement des tables, du redo, de l'undo et des binlogs contre le vol d'un disque ou d'une copie de sauvegarde ; un redémarrage pour installer le keyring component, durée d'ALTER sur les grandes tables. Aucune licence requise, y compris en Community ; les keyrings chiffrés/KMS sont Enterprise.
- Sécurité des sauvegardes (sauvegarde chiffrée, login-path, droits) — Sauvegardes non chiffrées ou dans un répertoire lisible par tous, mot de passe en clair dans les scripts ; mysqldump + GPG ou XtraBackup --encrypt, compte de sauvegarde et login-path.
- Côté système d'exploitation (compte de service, droits, core dump, SELinux) — Répertoire de données ou fichiers de certificats accessibles aux autres, secure_file_priv vide, local_infile activé, SELinux désactivé. Certains paramètres ne prennent effet qu'au redémarrage.
- Correctifs et versions : suis-je sur une version supportée ? — Version, fin de support (8.0 s'est terminée en avril 2026) et mises à jour en attente ; renvoie au guide d'upgrade pour leur application. Lecture seule.
Avant de commencer
- MySQL … est en service et, en root sur le serveur, la commande mysql se connecte sans mot de passe (root@localhost avec auth_socket, ou login-path client défini avec mysql_config_editor). Si l'installation a été faite avec le guide d'installation MySQL, c'est déjà en place. Le SQL des étapes s'exécute en root via mysql -t.
- Deux sessions SSH distinctes sont ouvertes sur le serveur ; dans l'une d'elles, le client mysql reste ouvert. Après avoir modifié l'hôte des comptes, require_secure_transport et le firewall, testez une nouvelle connexion dans une autre session ; ne fermez pas les anciennes sessions avant d'avoir constaté le succès. La connexion root@localhost par socket ne change jamais dans ce guide : elle reste toujours votre voie de retour.
- Fenêtre de maintenance : dans les domaines choisis, MySQL sera redémarré (bind_address, keyring component, plugin d'audit, limite de core dump). Dans un environnement avec replicas, appliquez d'abord sur les replicas.
- La liste de toutes les applications qui se connectent à MySQL (IP des serveurs, comptes, versions des drivers). L'étape d'audit montre les connexions actuelles ; un client absent de la liste ne pourra plus se connecter après la restriction.
- Une sauvegarde récente dont la restauration a été testée existe (logique ou XtraBackup). L'étape de chiffrement (TDE) rend les données illisibles si le fichier keyring est perdu : faites la sauvegarde AVANT le keyring.
Phases du guide
- Audit d'état (lecture seule) — Lister les constats internes à la base · Auditer le côté système d'exploitation
- Avant de commencer : point de retour — Copier les paramètres, comptes et privilèges actuels · Activer le répertoire de configuration supplémentaire
- Privilèges — 1. Diagnostic — Afficher les privilèges des comptes
- Privilèges — 3. Application — Créer les rôles et leur accorder les privilèges · Créer les comptes et les rattacher aux rôles · Retirer les privilèges directs du compte applicatif · Rapport des privilèges
- Privilèges — 4. Vérification — Vérifier que les privilèges effectifs ne contiennent pas de DDL · Tentative de DDL depuis le serveur d'application
- Privilèges — 5. Après — Garder le compte de migration verrouillé hors utilisation
- Authentification — 1. Diagnostic — Afficher les plugins d'authentification, les paramètres de mots de passe et les comptes par défaut
- Authentification — 2. Filet de sécurité — Vérifier la compatibilité des drivers
- Authentification — 3. Application — Supprimer les comptes anonymes, le root distant et la base test · Mettre en place la politique de mots de passe (validate_password, historique) · Passer les comptes mysql_native_password en caching_sha2_password · Créer le compte DBA personnel
- Authentification — 4. Vérification — Vérifier l'état des comptes · Tenter une connexion root depuis le serveur d'application
- TLS — 1. Diagnostic — Afficher les paramètres TLS actuels et les clients non chiffrés
- TLS — 3. Application — Créer une CA de test et un certificat serveur · Créer la clé et la demande de signature (CSR) · Mettre en place le certificat signé · Vérifier le certificat et la clé · Appliquer le contexte SELinux · Basculer le serveur sur le nouveau certificat (sans interruption) …
- TLS — 4. Vérification — Vérifier que les connexions non chiffrées sont refusées
- TLS — 5. Après : renouvellement du certificat — Procédure de renouvellement du certificat
- Réseau — 1. Diagnostic : qui se connecte et d'où ? — Afficher l'adresse d'écoute, les hôtes des comptes et les clients actifs
- Réseau — 3. Application — Restreindre les comptes d'hôte '%' au réseau applicatif · Restreindre l'adresse d'écoute (effectif au redémarrage) · N'ouvrir le port dans le firewall qu'aux réseaux autorisés · Redémarrer MySQL pour l'adresse d'écoute
- Réseau — 4. Vérification — Tester une connexion depuis le serveur d'application (nouvelle session)
- Audit — 1. Diagnostic — Afficher les plugins d'audit et les paramètres de journalisation
- Audit — 3. Application — Community : journaliser les échecs de connexion et le texte des instructions DML · Installer le plugin Enterprise Audit · Définir les filtres Enterprise Audit · Installer le component Percona Audit Log Filter · Définir les filtres d'audit Percona · Transférer le journal d'audit vers le serveur central (rsyslog imfile) …
- Audit — 4. Vérification — Faire une modification et en voir la trace
- Sauvegarde — 1. Diagnostic — Afficher l'état de chiffrement des sauvegardes et les fichiers de mots de passe
- Sauvegarde — 3. Application — Créer le compte de sauvegarde avec le moindre privilège · Enregistrer le mot de passe dans un login-path · Importer la clé publique GPG · Script de sauvegarde chiffrée · Script de sauvegarde chiffrée avec XtraBackup · Fichier de clé, répertoire de sauvegarde et test manuel …
- Sauvegarde — 4. Vérification — Vérifier que la sauvegarde chiffrée peut être déchiffrée
- Système d'exploitation — 1. Diagnostic — Compte de service, droits, permissions sur les fichiers et SELinux
- Système d'exploitation — 3. Application — Restreindre l'import/export de fichiers · Corriger les droits du répertoire de données et des fichiers de clés · Désactiver les core dumps · Recharger systemd et redémarrer MySQL · Empêcher les mots de passe d'arriver dans l'historique des commandes · Garder SELinux en mode Enforcing
- Système d'exploitation — 4. Vérification — Vérifier les modifications
- Chiffrement — 1. Diagnostic — Afficher l'état du keyring et du chiffrement
- Chiffrement — 2. Filet de sécurité — Sauvegarde complète avant chiffrement
- Chiffrement — 3. Application — Écrire le manifest du keyring component · Préparer le répertoire et la configuration du keyring · Redémarrer pour charger le keyring · Activer le chiffrement du redo, de l'undo, du binlog et des nouvelles tables · Chiffrer les tables de la base applicative · Sauvegarder le fichier keyring
- Chiffrement — 4. Vérification — Vérifier le chiffrement et le keyring