我有以下设置:
- 通过 docker 运行 FreeIPA 4.8.7(freeipa/freeipa-server:centos-8)
- Keycloack 12.0.1
- FreeIPA 用户在
cn=users,cn=accounts,dc=freeipa,dc=example,dc=com
- Keycloack DN:
krbprincipalname=ldap/[email protected],cn=services,cn=accounts,dc=freeipa,dc=example,dc=com
我通过此脚本为 keycloack 创建了一个主机帐户:https://gitlab.lindenaar.net/scripts/freeipa/tree/master#freeipa-service-passwordsh并能够成功地将用户从 FreeIPA 拉入 keycloak。
在 FreeIPA Web UI 中,我向 keycloack 主机添加了“用户管理员”角色。
现在,当我尝试在 keycloak 中添加用户时,出现以下错误:
LDAP: error code 50 - Insufficient 'add' privilege to add the entry 'uid=newuser,cn=users,cn=accounts,dc=freeipa,dc=example,dc=com'.
]; remaining name 'uid=newuser,cn=users,cn=accounts,dc=freeipa,dc=example,dc=com'
如果我这样做,docker exec -it freeipa-server-container ipa host-show --all --raw keycloak.example.com
我会得到:
dn: fqdn=keycloak.example.com,cn=computers,cn=accounts,dc=freeipa,dc=example,dc=com
fqdn: keycloak.example.com
krbcanonicalname: host/[email protected]
krbprincipalname: host/[email protected]
krbprincipalname: [email protected]
has_password: FALSE
has_keytab: FALSE
managedby: fqdn=keycloak.example.com,cn=computers,cn=accounts,dc=freeipa,dc=example,dc=com
cn: keycloak.example.com
ipaUniqueID: 6dc12944-51b6-11eb-b243-0242ac110002
krbPwdPolicyReference: cn=Default Host Password Policy,cn=computers,cn=accounts,dc=freeipa,dc=example,dc=com
krbTicketFlags: 3145856
managing: fqdn=keycloak.example.com,cn=computers,cn=accounts,dc=freeipa,dc=example,dc=com
memberof: cn=User Administrator,cn=roles,cn=accounts,dc=freeipa,dc=example,dc=com
memberofindirect: cn=Stage User Administrators,cn=privileges,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Modify Users,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Manage User SSH Public Keys,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Read UPG Definition,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Modify Groups,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Add Users,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Undelete User,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Preserve User,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Modify Stage User,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Add Groups,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Read Stage User password,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Remove Users,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Remove Stage User,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Add User to default group,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Modify User RDN,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Read Stage Users,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Manage User Certificates,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Remove Groups,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Manage User Principals,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Read Radius Servers,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Read Preserved Users,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Read User Kerberos Login Attributes,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Modify Preserved Users,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Reset Preserved User password,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=Group Administrators,cn=privileges,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Modify Group Membership,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Add Stage User,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Modify External Group Membership,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Unlock User,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Remove preserved User,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=System: Change User password,cn=permissions,cn=pbac,dc=freeipa,dc=example,dc=com
memberofindirect: cn=User Administrators,cn=privileges,cn=pbac,dc=freeipa,dc=example,dc=com
objectClass: ipaobject
objectClass: nshost
objectClass: ipahost
objectClass: pkiuser
objectClass: ipaservice
objectClass: krbprincipalaux
objectClass: krbprincipal
objectClass: ieee802device
objectClass: ipasshhost
objectClass: top
objectClass: ipaSshGroupOfPubKeys
objectClass: krbticketpolicyaux
serverHostName: keycloak
我遗漏了什么?我看到cn=pbac
列表中有一个,但我不知道它来自哪里,也不知道它是什么意思。这就是未获取权限的原因吗?
答案1
我正在使用 FreeIPA 4.11.0 和 Keycloak 23.0.4。它们通过 LDAP 链接。最初,我遇到了与您相同的问题,并且我比您更进一步,但仍然很挣扎。我想分享我所做的更改,这些更改实际上使它能够将用户添加到 LDAP。
您应该已经将 LDAP 配置为用户联合,但这是我的配置:
Connection: ldap://192.168.x.y
Bind type: simple
Bind DN: uid=keycloak,cn=users,cn=accounts,dc=x,dc=y
Edit Mode: WRITABLE
Users DN: cn=users,cn=accounts,dc=x,dc=y
Username LDAP attribute: uid
RDN LDAP attribute: uid
UUID LDAP Attribute: ipaUniqueID
User object classes: top, inetOrgPerson, organizationalPerson
Import users: On
Sync Registrations: On
Enable the LDAPv3 password modify extended operation: Off
Validate password policy: On
Trust Email: On
在 FreeIPA 中,我的 Keycloak 用户拥有一组专用于它的权限,其中包含所有用户管理权限;但直到我将 Keycloak 用户添加到admins
组中后,它才真正起作用。我不知道为什么这里需要它。
对我有帮助的一件事是“用户对象类”——这里发生的事情是 Keycloak 尝试使用您在此处标记的用户对象类将用户添加到 LDAP;然后,它使用映射器将字段作为该用户的一部分同步回 LDAP。每个用户对象类对需要发送回哪些字段都有特定的要求。这就是它变得非常烦人的地方。例如,您必须设置将数据发送回 LDAP 的映射器。您可能会发现自己逐个属性地尝试获取最小值……
您需要的是cn
,然后您必须强制使用默认值,例如“新用户”,因为您无法将“firstName + lastName”组合在一起来提供全名(我读到您可以编写脚本,但它需要插件/扩展)。最终,我有 19 个映射器,范围从用户属性 ldap 映射器到组 ldap 映射器,再到角色 ldap 映射器,再到硬编码 ldap 属性映射器。需要考虑的一些属性是用户密码、用户名、用户证书、uidMapper、角色映射器、组映射器(groupOfNames 类)......但它最终取决于您的环境。
最终,我将这些用户添加到 LDAP,但它们并未反映在 FreeIPA UI 中。这是因为当您尝试添加似乎与新 FreeIPA 创建的用户具有关联的用户对象时,它需要假设和发送更多属性。我发现用户隐藏在后端;使用kinit admin
和ldapsearch
查找 FreeIPA 实例上的任何散乱帐户。