Lors des audits de sécurité des bases de données, la politique de gestion des mots de passe est un critère fondamental. MySQL intègre nativement des mécanismes pour imposer des règles de robustesse et définir des cycles de vie pour les identifiants. Voici comment configurer ces paramètres pour renforcer la posture de sécurité de votre instance.
- Renforcement de la complexité via le plugin validate_password
MySQL fournit le plugin validate_password pour évaluer la force des mots de passe. Par défaut, il peut être désactivé, autorisant la création d'identifiants triviaux. L'activation de ce composant permet d'appliquer des règles strictes dès la création ou la modification d'un compte.
Vérification et activation du plugin
Avant toute configuration, il est nécessaire de vérifier si le module est déjà chargé dans l'instance.
-- Vérifier l'état actuel des paramètres de validation
mysql> SHOW VARIABLES LIKE 'validate_password%';
Empty set (0.00 sec)
-- Activer le plugin (l'extension dépend du système d'exploitation : .so pour Linux, .dll pour Windows)
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
Query OK, 0 rows affected (0.15 sec)
-- Confirmer le chargement et visualiser les paramètres par défaut
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | ON |
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
Paramètres de configuration
Une fois le plugin actif, plusieurs variables système permettent d'ajuster finement les exigences :
- validate_password_policy : Définit le niveau d'exigence.
LOW(0) vérifie uniquement la longueur.MEDIUM(1) ajoute des contraintes sur les types de caractères (majuscules, minuscules, chiffres, spéciaux).STRONG(2) inclut également une vérification par rapport à un fichier de dictionnaire. - validate_password_dictionary_file : Chemin vers le fichier de dictionnaire utilisé lorsque la politique est définie sur
STRONG. - validate_password_length : Nombre minimum de caractères requis (par défaut : 8).
- validate_password_mixed_case_count : Nombre minimum de lettres majuscules et minuscules requises.
- validate_password_number_count : Nombre minimum de caractères numériques requis.
- validate_password_special_char_count : Nombre minimum de caractères spéciaux requis.
Application des règles de sécurité
Supposons que nous souhaissions imposer une politique MEDIUM avec une longueur minimale de 12 caractères et des exigences accrues en matière de diversité.
-- Ajuster les paramètres au niveau global
mysql> SET GLOBAL validate_password_policy = MEDIUM;
mysql> SET GLOBAL validate_password_length = 12;
mysql> SET GLOBAL validate_password_mixed_case_count = 2;
mysql> SET GLOBAL validate_password_number_count = 2;
mysql> SET GLOBAL validate_password_special_char_count = 1;
Pour garantir la persistance de ces règles après un redémarrage du service, les directives suivantes doivent être ajoutées au fichier de configuration my.cnf ou my.ini :
[mysqld]
plugin-load-add = validate_password.so
validate-password = FORCE_PLUS_PERMANENT
validate_password_policy = MEDIUM
validate_password_length = 12
Validation des contraintes
Les nouvelles règles s'appliquent uniquement aux opérations de création ou de modification de mots de passe. Les sessions existantes ne sont pas immédiatement impactées.
-- Tentative de création avec un mot de passe non conforme (trop court, manque de complexité)
mysql> CREATE USER 'app_service'@'%' IDENTIFIED BY 'Pass1!';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
-- Tentative avec un mot de passe respectant la longueur mais pas la diversité
mysql> CREATE USER 'app_service'@'%' IDENTIFIED BY 'SimplePassword1';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
-- Création réussie avec un mot de passe robuste
mysql> CREATE USER 'app_service'@'%' IDENTIFIED BY 'S3cur3!P@ssw0rd';
Query OK, 0 rows affected (0.02 sec)
-- Tentative de modification vers un mot de passe faible
mysql> ALTER USER 'app_service'@'%' IDENTIFIED BY 'N0uv3au!';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- Gestion du cycle de vie et expiration des mots de passe
Au-delà de la complexité, il est crucial de forcer le renouvellement périodique des accès pour limiter les risques liés à la compromission à long terme d'un identifiant.
Configuration au niveau utilisateur
L'instruction ALTER USER permet de gérer l'expiration de manière granulaire pour chaque compte.
-- Inspecter les propriétés d'expiration via la table système
mysql> SELECT User, Host, password_expired, password_lifetime, password_last_changed
FROM mysql.user WHERE User = 'app_service';
-- Forcer une expiration immédiate (l'utilisateur devra réinitialiser son mot de passe à la prochaine connexion)
mysql> ALTER USER 'app_service'@'%' PASSWORD EXPIRE;
-- Définir une expiration personnalisée à 120 jours
mysql> ALTER USER 'app_service'@'%' PASSWORD EXPIRE INTERVAL 120 DAY;
-- Désactiver l'expiration pour ce compte spécifique (dérogation)
mysql> ALTER USER 'app_service'@'%' PASSWORD EXPIRE NEVER;
-- Revenir à la politique globale par défaut
mysql> ALTER USER 'app_service'@'%' PASSWORD EXPIRE DEFAULT;
Lorsque le champ password_expired passe à Y, l'utilisateur peut toujours s'authentifier, mais toute tnetative d'exécution de requête SQL renverra l'erreur ERROR 1820 (HY000), l'obligeant à utiliser la commande ALTER USER pour définir un nouveau secret.
Configuration de la politique globale
Pour uniformiser la rotation des mots de passe sur l'ensemble de l'instance, la variable système default_password_lifetime est utilisée. Dans les versions récentes, sa valeur par défaut est 0 (désactivé).
-- Appliquer une rotation globale tous les 120 jours
mysql> SET GLOBAL default_password_lifetime = 120;
-- Vérification de l'application
mysql> SHOW VARIABLES LIKE 'default_password_lifetime';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| default_password_lifetime | 120 |
+---------------------------+-------+
Comme pour la complexité, cette configuration doit être pérennisée dans le fichier de configuration du serveur :
[mysqld]
default_password_lifetime = 120