Set-OPS-Public/roles/resoudre_politique_mdp/tasks/main.yml

49 lines
2.4 KiB
YAML
Raw Normal View History

identite : une declaration de politique de mot de passe, deux executants Quatre defauts mesures dans l'integration Keycloak/LDAP, meme famille : une valeur declaree d'un cote, consommee de l'autre, rien qui verifie la jonction. 1. Aucune regle ne s'appliquait sur le chemin d'un vrai utilisateur. Sonde : « abcd » refuse par l'operation etendue LDAP, accepte par Keycloak (204), puis actif pour l'authentification. Keycloak ecrivait userPassword en direct (ppolicy aveugle) et le realm n'avait aucune passwordPolicy. 2. ldap_entry ne fait que CREER : la politique etait figee a sa creation. Le depot disait pwdMustChange TRUE, le serveur FALSE — une reconstruction from-zero aurait ressuscite la boucle du 2026-08-07. ldap_attrs state=exact reconcilie la politique et l'overlay (DN lu, pas devine). 3. syncRegistrations absent : un compte cree dans Keycloak n'atteignait jamais ou=people — acces web, aucune boite, invisible du modele de groupes. 4. Le prenom pointait sur cn (nom complet) : « Administrateur systeme systeme ». Ajoute roles/resoudre_politique_mdp : LA declaration, traduite en pwdPolicy, passwordPolicy et anti-force-brute. Les deux roles la consomment sans la redeclarer. usePasswordModifyExtendedOp ET validatePasswordPolicy : la seconde est porteuse, Keycloak se liant en rootDN et slapd n'appliquant pas ses controles de qualite au rootDN. La premiere seule aurait paru juste sans tenir. Verification : abcd -> 400 « minimum length 12 » et absent de LDAP ; mot de passe conforme -> 204 puis ldapwhoami accepte ; POST users -> 201 ET present dans ou=people. Second passage des deux playbooks : changed=0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 06:28:10 -04:00
---
# Role utilitaire (pas un groupe deployable) : traduit LA declaration unique dans les
# deux dialectes. Voir defaults/main.yml.
#
# Sorties (facts) :
# resoudre_politique_mdp_ldap — attributs pwd* de l'entree pwdPolicy
# resoudre_politique_mdp_keycloak — chaine `passwordPolicy` du realm
# resoudre_politique_mdp_brute — protection anti-force-brute du realm
- name: Exiger une politique coherente
ansible.builtin.assert:
that:
- resoudre_politique_mdp_longueur_min | int >= 8
- resoudre_politique_mdp_historique | int >= 0
fail_msg: >-
Politique de mot de passe incoherente : une longueur minimale sous 8 caracteres
ne protege rien, et un historique negatif n'a pas de sens.
- name: Dériver la politique dans les deux dialectes
ansible.builtin.set_fact:
resoudre_politique_mdp_ldap: >-
{{ {
'pwdAttribute': 'userPassword',
'pwdCheckQuality': '1',
'pwdMinLength': resoudre_politique_mdp_longueur_min | string,
'pwdInHistory': resoudre_politique_mdp_historique | string,
'pwdMustChange': 'TRUE' if resoudre_politique_mdp_changement_impose | bool else 'FALSE',
'pwdAllowUserChange': 'TRUE',
'pwdLockout': 'TRUE' if resoudre_politique_mdp_verrouillage_actif | bool else 'FALSE',
'pwdMaxFailure': resoudre_politique_mdp_verrouillage_echecs | string,
'pwdLockoutDuration': resoudre_politique_mdp_verrouillage_duree | string,
'pwdFailureCountInterval': resoudre_politique_mdp_verrouillage_fenetre | string,
} }}
resoudre_politique_mdp_keycloak: >-
{{ (
['length(' ~ resoudre_politique_mdp_longueur_min | int ~ ')']
+ (['passwordHistory(' ~ resoudre_politique_mdp_historique | int ~ ')']
if resoudre_politique_mdp_historique | int > 0 else [])
+ (['notUsername', 'notEmail'] if resoudre_politique_mdp_interdire_identifiant | bool else [])
) | join(' and ') }}
resoudre_politique_mdp_brute: >-
{{ {
'bruteForceProtected': resoudre_politique_mdp_verrouillage_actif | bool,
'failureFactor': resoudre_politique_mdp_verrouillage_echecs | int,
'waitIncrementSeconds': resoudre_politique_mdp_verrouillage_duree | int,
'maxFailureWaitSeconds': resoudre_politique_mdp_verrouillage_duree | int,
'maxDeltaTimeSeconds': resoudre_politique_mdp_verrouillage_fenetre | int,
} }}