尽管 Keycloack 主机在 FreeIPA 中设置了权限,但无法通过 LDAP 从 FreeIPA 上的 Keycloack 添加用户

尽管 Keycloack 主机在 FreeIPA 中设置了权限,但无法通过 LDAP 从 FreeIPA 上的 Keycloack 添加用户

我有以下设置:

  • 通过 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 adminldapsearch查找 FreeIPA 实例上的任何散乱帐户。

相关内容