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>
39 lines
1.6 KiB
YAML
39 lines
1.6 KiB
YAML
---
|
|
# Reconcilie les mappeurs d'attributs de la federation. Keycloak en cree un jeu par
|
|
# defaut a la creation du fournisseur, et pour un annuaire « other » il fait pointer
|
|
# le prenom sur `cn` — qui, dans `inetOrgPerson`, porte le nom COMPLET. Resultat
|
|
# affiche au 2026-08-08 : « Administrateur systeme systeme », le nom entier suivi du
|
|
# nom de famille. Le prenom a son attribut, c'est `givenName`.
|
|
|
|
- name: Lire les mappeurs de la fédération
|
|
ansible.builtin.uri:
|
|
url: >-
|
|
http://localhost:8080/admin/realms/{{ serveur_keycloak_realm }}/components?parent={{
|
|
serveur_keycloak_pol_fed.json[0].id }}&type=org.keycloak.storage.ldap.mappers.LDAPStorageMapper
|
|
headers:
|
|
Authorization: "Bearer {{ serveur_keycloak_pol_jeton.json.access_token }}"
|
|
register: serveur_keycloak_mappeurs
|
|
no_log: true
|
|
|
|
- name: Corriger l'attribut LDAP des mappeurs qui divergent
|
|
ansible.builtin.uri:
|
|
url: >-
|
|
http://localhost:8080/admin/realms/{{ serveur_keycloak_realm
|
|
}}/components/{{ item.id }}
|
|
method: PUT
|
|
status_code: [204]
|
|
headers:
|
|
Authorization: "Bearer {{ serveur_keycloak_pol_jeton.json.access_token }}"
|
|
body_format: json
|
|
body: >-
|
|
{{ item | combine({'config': item.config | combine({
|
|
'ldap.attribute': [serveur_keycloak_ldap_attributs[item.name]]
|
|
})}) }}
|
|
loop: "{{ serveur_keycloak_mappeurs.json }}"
|
|
loop_control:
|
|
label: "{{ item.name }}"
|
|
no_log: true
|
|
changed_when: true
|
|
when:
|
|
- item.name in serveur_keycloak_ldap_attributs
|
|
- (item.config['ldap.attribute'] | default(['']) | first) != serveur_keycloak_ldap_attributs[item.name]
|