Définir le nombre minimal de tours SHA_CRYPT dans login.defs
Porte SHA_CRYPT_MIN_ROUNDS dans /etc/login.defs à au moins 10000 (Pavois écrit 65536), afin que les empreintes de mot de passe SHA-256/SHA-512 soient calculées avec bien plus d'itérations que le défaut glibc de 5000. Chaque tour supplémentaire multiplie le coût d'une attaque par force brute hors ligne sur un /etc/shadow volé.
Vérifié sur le contenu d’un fichier de configuration persistant, la source de vérité qui survit aux redémarrages.
Ce que vérifie Pavois
Pavois s'appuie sur la ressource InSpec login_defs et exige SHA_CRYPT_MIN_ROUNDS >= 10000. La ressource interprète les directives comme le fait la suite shadow (la dernière affectation non commentée l'emporte) : une valeur laissée en commentaire est donc considérée comme absente et échoue. La preuve effective du réglage ne se trouve pas dans le fichier mais dans l'empreinte produite : un mot de passe défini après la modification est stocké dans /etc/shadow sous la forme $6$rounds=65536$..., alors que le défaut produit une empreinte $6$ sans préfixe rounds=.
describe login_defs do
its('SHA_CRYPT_MIN_ROUNDS') { should cmp >= 10000 }
endComment vérifier qu’elle est appliquée
Contrôlez la directive, puis l'empreinte qu'elle produit réellement :
grep -i '^SHA_CRYPT_MIN_ROUNDS' /etc/login.defs
SHA_CRYPT_MIN_ROUNDS 65536
Changez le mot de passe d'un utilisateur de test, puis vérifiez que l'empreinte stockée porte bien le nombre de tours :
sudo getent shadow testuser | cut -d: -f2 | cut -c1-16
$6$rounds=65536$
Inspecter et investiguer
Le réglage lui-même n'est pas journalisé, pas plus que le nombre de tours utilisé pour une empreinte donnée. Un changement de mot de passe est enregistré par PAM dans /var/log/auth.log (Debian/Ubuntu) ou via journalctl (famille RHEL), sans aucun détail de hachage :
passwd[3210]: pam_unix(passwd:chauthtok): password changed for alice
La seule preuve fiable du facteur de coût appliqué reste le préfixe $6$rounds= dans l'entrée shadow.
Remédiation
Le plan de durcissement Pavois applique une remédiation conf_line sur /etc/login.defs avec la clé SHA_CRYPT_MIN_ROUNDS, la valeur 65536 et un séparateur espace (sep: space), car login.defs utilise la syntaxe CLÉ VALEUR et non clé = valeur. L'étape générée réécrit la ligne existante sur place avec sed et l'ajoute si elle est absente ; une garde not_if sur la ligne déjà correcte rend l'application idempotente.
Pavois applique ceci avec son propre moteur harden, le plan ci-dessous, pas un script shell :
| file | /etc/login.defs |
|---|---|
| key | SHA_CRYPT_MIN_ROUNDS |
| resource | conf_line |
| sep | space |
| value | 65536 |
pavois harden plan localoù la cible est local, un alias SSH user@hôte, ou un conteneur , Docs
Impact & précautions
Avec le défaut glibc de 5000 tours, un /etc/shadow divulgué est cassé un ordre de grandeur plus vite. Deux réserves avant d'appliquer. D'abord, SHA_CRYPT_MIN_ROUNDS ne s'applique que si ENCRYPT_METHOD vaut SHA512 ou SHA256 : sur Debian 12+ et Ubuntu 24.04, dont le défaut est YESCRYPT, la directive reste inerte tant que la méthode n'est pas repassée en SHA-512, et le contrôle relève alors de la défense en profondeur. Ensuite, elle ne concerne que les mots de passe hachés après la modification ; les empreintes existantes conservent leur coût d'origine jusqu'au prochain renouvellement de chaque utilisateur. Un nombre de tours très élevé allonge par ailleurs chaque authentification (quelques dizaines de millisecondes à 65536), ce qui est négligeable pour des connexions interactives mais mesurable sur un hôte réalisant des milliers d'authentifications PAM par seconde. Il n'y a aucun risque de verrouillage : les mots de passe existants restent valides.