community.general.keycloak_user_federation 模块 – 允许通过 Keycloak API 管理 Keycloak 用户联合

注意

此模块是 community.general 集合(版本 10.1.0)的一部分。

如果您正在使用 ansible 包,您可能已经安装了此集合。 它不包含在 ansible-core 中。 要检查是否已安装,请运行 ansible-galaxy collection list

要安装它,请使用: ansible-galaxy collection install community.general

要在 playbook 中使用它,请指定:community.general.keycloak_user_federation

community.general 3.7.0 中的新功能

概要

  • 此模块允许您通过 Keycloak REST API 添加、删除或修改 Keycloak 用户联合。 它需要通过 OpenID Connect 访问 REST API;连接的用户和正在使用的客户端必须具有必要的访问权限。 在默认的 Keycloak 安装中,admin-cli 和管理员用户可以工作,具有针对您的需求量身定制的作用域和具有预期角色的单独客户端定义也可以工作。

  • 模块选项的名称是 Keycloak API 及其文档(位于 https://keycloak.java.net.cn/docs-api/20.0.2/rest-api/index.html)中找到的 camelCase 版本的 snake_cased 版本。

参数

参数

注释

auth_client_id

字符串

OpenID Connect client_id 用于向 API 进行身份验证。

默认: "admin-cli"

auth_client_secret

字符串

auth_client_id 结合使用的客户端密钥(如果需要)。

auth_keycloak_url

别名:url

字符串 / 必需

Keycloak 实例的 URL。

auth_password

别名:password

字符串

用于 API 访问的身份验证密码。

auth_realm

字符串

用于 API 访问的身份验证 Keycloak 领域名称。

auth_username

别名:username

字符串

用于 API 访问的身份验证用户名。

bind_credential_update_mode

字符串

在 community.general 9.5.0 中添加

config 参数 config.bindCredential 的值在 Keycloak 响应中被编辑。 将编辑后的值与期望值进行比较,始终评估为不相等。 这意味着如果设置了参数,则之前的状态和期望的状态永远不会相等。

设置为 always 以在比较之前和期望状态时包括 config.bindCredential。 由于 Keycloak 返回的编辑值,如果设置了 config.bindCredential 值,则模块将始终检测到更改并进行更新。

设置为 only_indirect 以在比较之前状态与期望状态时排除 config.bindCredentialconfig.bindCredential 的值只有在用户联合的其他更改需要更新时才会更新。

选择

  • "always" ← (默认)

  • "only_indirect"

config

字典

一个字典,指定提供程序的配置选项;其内容取决于 provider_id 的值。下面给出了 ldapkerberossssd 的示例。最简单的方法是通过在 existing 字段中使用检查模式转储现有的用户联邦配置来获取有效的配置值。

自 community.general 4.2.0 版本起支持 sssd 值。

allowKerberosAuthentication

布尔值

启用/禁用使用 SPNEGO/Kerberos 令牌对用户进行 HTTP 身份验证。经过身份验证的用户数据将从此 LDAP 服务器提供。

选择

  • false ← (默认)

  • true

allowPasswordAuthentication

布尔值

启用/禁用针对 Kerberos 数据库使用用户名/密码进行身份验证的可能性。

选择

  • false

  • true

authType

字符串

LDAP 绑定操作期间使用的身份验证方法类型。它用于发送到 LDAP 服务器的大多数请求中。

选择

  • "none" ← (默认)

  • "simple"

batchSizeForSync

整数

在单个事务中从 LDAP 导入到 Keycloak 的 LDAP 用户计数。

默认值: 1000

bindCredential

字符串

LDAP 管理员的密码。

bindDn

字符串

Keycloak 用于访问 LDAP 服务器的 LDAP 用户的 DN。

cachePolicy

字符串

此存储提供程序的缓存策略。

选择

  • "DEFAULT" ← (默认)

  • "EVICT_DAILY"

  • "EVICT_WEEKLY"

  • "MAX_LIFESPAN"

  • "NO_CACHE"

changedSyncPeriod

整数

同步已更改或新创建的 LDAP 用户的周期(以秒为单位)。

默认值: -1

connectionPooling

布尔值

确定 Keycloak 是否应使用连接池来访问 LDAP 服务器。

选择

  • false

  • true ← (默认)

connectionPoolingAuthentication

字符串

可能被池化的连接的以空格分隔的身份验证类型列表。

选择

  • "none"

  • "simple"

  • "DIGEST-MD5"

connectionPoolingDebug

字符串

一个字符串,指示要生成的调试输出级别。有效的示例值包括 fine (跟踪连接的创建和删除)和 all (所有调试信息)。

connectionPoolingInitSize

整数

在最初为身份创建连接时,每个连接身份要创建的连接数。

connectionPoolingMaxSize

整数

可以同时维护的每个连接身份的最大连接数。

connectionPoolingPrefSize

整数

应该同时维护的每个连接身份的首选连接数。

connectionPoolingProtocol

字符串

可能被池化的连接的以空格分隔的协议类型列表。有效类型为 plainssl

connectionPoolingTimeout

整数

空闲连接可以在池中保留而不会被关闭并从池中删除的毫秒数。

connectionTimeout

整数

LDAP 连接超时(以毫秒为单位)。

connectionUrl

字符串

到 LDAP 服务器的连接 URL。

customUserSearchFilter

字符串

用于过滤搜索用户的其他 LDAP 过滤器。如果不需要其他过滤器,请将其留空。

debug

布尔值

启用/禁用 Krb5LoginModule 的调试日志记录到标准输出。

选择

  • false

  • true

editMode

字符串

READ_ONLY 是一个只读的 LDAP 存储。WRITABLE 表示数据将根据需要同步回 LDAP。UNSYNCED 表示将导入用户数据,但不会同步回 LDAP。

选择

  • "READ_ONLY"

  • "WRITABLE"

  • "UNSYNCED"

enabled

布尔值

启用/禁用此用户联合。

选择

  • false

  • true ← (默认)

evictionDay

字符串

该条目失效的星期几。

evictionHour

字符串

该条目失效的当天的小时。

evictionMinute

字符串

该条目失效的当天的分钟。

fullSyncPeriod

整数

完全同步的周期(以秒为单位)。

默认值: -1

importEnabled

布尔值

如果为 true,则 LDAP 用户将被导入到 Keycloak 数据库中,并按照配置的同步策略进行同步。

选择

  • false

  • true ← (默认)

kerberosRealm

字符串

Kerberos 域的名称。

keyTab

字符串

包含服务器主体凭据的 Kerberos KeyTab 文件位置。例如 /etc/krb5.keytab

krbPrincipalAttribute

字符串

在 community.general 8.1.0 中添加

LDAP 属性的名称,它引用 Kerberos 主体。这用于在 Keycloak 中成功进行 Kerberos/SPNEGO 身份验证后查找相应的 LDAP 用户。当此为空时,将基于 LDAP 用户名(对应于其 Kerberos 主体的第一部分)查找 LDAP 用户。例如,对于主体 [email protected],它会假设 LDAP 用户名为 john

maxLifespan

整数

缓存条目的最大生命周期(以毫秒为单位)。

pagination

布尔值

LDAP 服务器是否支持分页。

选择

  • false

  • true ← (默认)

priority

整数

执行用户查找时提供程序的优先级。最低优先级优先。

默认值: 0

rdnLDAPAttribute

字符串

LDAP 属性的名称,它用作典型用户 DN 的 RDN(顶部属性)。通常,它与 Username LDAP 属性相同,但不是必需的。例如,对于 Active Directory,通常使用 cn 作为 RDN 属性,而用户名属性可能是 sAMAccountName

readTimeout

整数

LDAP 读取超时(以毫秒为单位)。此超时适用于 LDAP 读取操作。

referral

字符串

在 community.general 9.5.0 中添加

指定是否应遵循或忽略 LDAP 引用。请注意,启用引用可能会减慢身份验证速度,因为它允许 LDAP 服务器决定要使用哪些其他 LDAP 服务器。这可能包括不受信任的服务器。

选择

  • "ignore"

  • "follow"

searchScope

字符串

对于一层,搜索仅适用于“用户 DN”指定的 DN 中的用户。对于子树,搜索适用于整个子树。有关更多详细信息,请参阅 LDAP 文档。

选择

  • "1" ← (默认)

  • "2"

serverPrincipal

字符串

HTTP 服务的服务器主体的完整名称,包括服务器和域名。例如 HTTP/[email protected]。使用 * 接受 KeyTab 文件中的任何服务主体。

startTls

布尔值

使用 STARTTLS 加密与 LDAP 的连接,这将禁用连接池。

选择

  • false ← (默认)

  • true

syncRegistrations

布尔值

是否应在 LDAP 存储中创建新创建的用户?优先级会影响选择哪个提供程序来同步新用户。

选择

  • false ← (默认)

  • true

trustEmail

布尔值

如果启用,即使该域启用了验证,此提供程序提供的电子邮件也不会被验证。

选择

  • false ← (默认)

  • true

updateProfileFirstLogin

布尔值

在首次登录时更新个人资料。

选择

  • false

  • true

useKerberosForPasswordAuthentication

布尔值

使用 Kerberos 登录模块对 Kerberos 服务器进行用户名/密码身份验证,而不是使用目录服务 API 对 LDAP 服务器进行身份验证。

选择

  • false ← (默认)

  • true

usePasswordModifyExtendedOp

布尔值

使用 LDAPv3 密码修改扩展操作 (RFC-3062)。密码修改扩展操作通常需要 LDAP 用户在 LDAP 服务器中已经有密码。因此,当将其与“同步注册”一起使用时,最好添加一个具有随机生成的初始密码的“硬编码 LDAP 属性映射器”。

选择

  • false ← (默认)

  • true

usernameLDAPAttribute

字符串

LDAP 属性的名称,它映射为 Keycloak 用户名。对于许多 LDAP 服务器供应商,它可以是 uid。对于 Active Directory,它可以是 sAMAccountNamecn。应该为要从 LDAP 导入到 Keycloak 的所有 LDAP 用户记录填充该属性。

userObjectClasses

字符串

LDAP 中用户的 LDAP objectClass 属性的所有值,以逗号分隔。例如 inetOrgPerson, organizationalPerson。新创建的 Keycloak 用户将使用所有这些对象类写入 LDAP,并且仅当现有 LDAP 用户记录包含所有这些对象类时才会被找到。

usersDn

字符串

用户所在的 LDAP 树的完整 DN。此 DN 是 LDAP 用户的父级。

useTruststoreSpi

字符串

指定 LDAP 连接是否将使用 standalone.xml/domain.xml 中配置的信任存储 SPI。always 表示它将始终使用它。never 表示它不会使用它。ldapsOnly 表示如果您的连接 URL 使用 ldaps,它将使用它。请注意,即使未配置 standalone.xml/domain.xml,也将使用默认的 Java cacerts 或由 javax.net.ssl.trustStore 属性指定的证书。

选择

  • "always"

  • "ldapsOnly" ← (默认)

  • "never"

uuidLDAPAttribute

字符串

用于 LDAP 中对象的唯一对象标识符 (UUID) 的 LDAP 属性的名称。对于许多 LDAP 服务器供应商来说,它是 entryUUID;但是,有些供应商的属性不同。例如,对于 Active Directory,它应该是 objectGUID。如果您的 LDAP 服务器不支持 UUID 的概念,您可以使用任何其他在树中 LDAP 用户中应该是唯一的属性。

validatePasswordPolicy

布尔值

确定 Keycloak 是否应在更新密码之前使用 realm 密码策略验证密码。

选择

  • false ← (默认)

  • true

vendor

字符串

LDAP 供应商(提供商)。

使用简称。例如,对于“Red Hat Directory Server”,请写 rhds

connection_timeout

整数

在 community.general 4.5.0 中添加

控制与 Keycloak API 的 HTTP 连接超时时间(以秒为单位)。

默认值: 10

http_agent

字符串

在 community.general 5.4.0 中添加

配置 HTTP User-Agent 标头。

默认值: "Ansible"

id

字符串

此用户联合的唯一 ID。如果留空,将通过其 name 搜索用户联合。

mappers

列表 / 元素=字典

定义与此身份提供程序关联的映射器的字典列表。

config

字典

指定映射器配置选项的字典;内容取决于 identityProviderMapper 的值。

id

字符串

此映射器的唯一 ID。

name

字符串

映射器的名称。如果没有给出 ID,将按名称搜索映射器。

parentId

字符串

此映射器父项的唯一 ID。如果留空,将自动使用用户联合的 ID。

providerId

字符串

此映射器的映射器类型(例如 user-attribute-ldap-mapper)。

providerType

字符串

此映射器的组件类型。

默认值: "org.keycloak.storage.ldap.mappers.LDAPStorageMapper"

name

字符串

在管理控制台中链接时提供程序的显示名称。

parent_id

别名:parentId

字符串

此用户联合的父项的唯一 ID。如果留空,将自动使用 Realm ID。

provider_id

别名:providerId

字符串

此用户联合的提供程序。内置提供程序为 ldapkerberossssd。也可以使用自定义用户存储提供程序。

provider_type

别名:providerType

字符串

用户联合的组件类型(仅支持的值为 org.keycloak.storage.UserStorageProvider)。

默认值: "org.keycloak.storage.UserStorageProvider"

realm

字符串

此用户联合所在的 Keycloak Realm。

默认值: "master"

remove_unspecified_mappers

布尔值

在 community.general 9.4.0 中添加

删除此联合配置中未指定的映射器。

设置为 false 以保留未在 mappers 中列出的映射器。

选择

  • false

  • true ← (默认)

state

字符串

用户联合的状态。

设置为 present 时,如果用户联合尚不存在,将创建用户联合,或者使用您提供的参数更新用户联合。

设置为 absent 时,如果用户联合存在,则将其删除。

选择

  • "present" ←(默认)

  • "absent"

token

字符串

在 community.general 3.0.0 中添加

Keycloak API 的身份验证令牌。

validate_certs

布尔值

验证 TLS 证书(请勿在生产环境中禁用此选项)。

选择

  • false

  • true ← (默认)

属性

属性

支持

描述

check_mode

支持:完全

可以在 check_mode 中运行,并返回更改的状态预测,而无需修改目标。

diff_mode

支持:完全

当处于 diff 模式时,将返回已更改(或可能需要在 check_mode 中更改)的内容的详细信息。

示例

- name: Create LDAP user federation
  community.general.keycloak_user_federation:
    auth_keycloak_url: https://keycloak.example.com/auth
    auth_realm: master
    auth_username: admin
    auth_password: password
    realm: my-realm
    name: my-ldap
    state: present
    provider_id: ldap
    provider_type: org.keycloak.storage.UserStorageProvider
    config:
      priority: 0
      enabled: true
      cachePolicy: DEFAULT
      batchSizeForSync: 1000
      editMode: READ_ONLY
      importEnabled: true
      syncRegistrations: false
      vendor: other
      usernameLDAPAttribute: uid
      rdnLDAPAttribute: uid
      uuidLDAPAttribute: entryUUID
      userObjectClasses: inetOrgPerson, organizationalPerson
      connectionUrl: ldaps://ldap.example.com:636
      usersDn: ou=Users,dc=example,dc=com
      authType: simple
      bindDn: cn=directory reader
      bindCredential: password
      searchScope: 1
      validatePasswordPolicy: false
      trustEmail: false
      useTruststoreSpi: ldapsOnly
      connectionPooling: true
      pagination: true
      allowKerberosAuthentication: false
      debug: false
      useKerberosForPasswordAuthentication: false
    mappers:
      - name: "full name"
        providerId: "full-name-ldap-mapper"
        providerType: "org.keycloak.storage.ldap.mappers.LDAPStorageMapper"
        config:
          ldap.full.name.attribute: cn
          read.only: true
          write.only: false

- name: Create Kerberos user federation
  community.general.keycloak_user_federation:
    auth_keycloak_url: https://keycloak.example.com/auth
    auth_realm: master
    auth_username: admin
    auth_password: password
    realm: my-realm
    name: my-kerberos
    state: present
    provider_id: kerberos
    provider_type: org.keycloak.storage.UserStorageProvider
    config:
      priority: 0
      enabled: true
      cachePolicy: DEFAULT
      kerberosRealm: EXAMPLE.COM
      serverPrincipal: HTTP/[email protected]
      keyTab: keytab
      allowPasswordAuthentication: false
      updateProfileFirstLogin: false

- name: Create sssd user federation
  community.general.keycloak_user_federation:
    auth_keycloak_url: https://keycloak.example.com/auth
    auth_realm: master
    auth_username: admin
    auth_password: password
    realm: my-realm
    name: my-sssd
    state: present
    provider_id: sssd
    provider_type: org.keycloak.storage.UserStorageProvider
    config:
      priority: 0
      enabled: true
      cachePolicy: DEFAULT

- name: Delete user federation
  community.general.keycloak_user_federation:
    auth_keycloak_url: https://keycloak.example.com/auth
    auth_realm: master
    auth_username: admin
    auth_password: password
    realm: my-realm
    name: my-federation
    state: absent

返回值

常见的返回值记录在此处,以下是此模块特有的字段

描述

end_state

字典

模块执行后用户联合的表示形式。

已返回:成功时

示例: {"config": {"allowPasswordAuthentication": "false", "cachePolicy": "DEFAULT", "enabled": "true", "kerberosRealm": "EXAMPLE.COM", "keyTab": "/etc/krb5.keytab", "priority": "0", "serverPrincipal": "HTTP/[email protected]", "updateProfileFirstLogin": "false"}, "id": "cf52ae4f-4471-4435-a0cf-bb620cadc122", "mappers": [], "name": "kerberos", "parentId": "myrealm", "providerId": "kerberos", "providerType": "org.keycloak.storage.UserStorageProvider"}

existing

字典

现有用户联合的表示形式。

已返回:始终

示例: {"config": {"allowKerberosAuthentication": "false", "authType": "simple", "batchSizeForSync": "1000", "bindCredential": "**********", "bindDn": "cn=directory reader", "cachePolicy": "DEFAULT", "changedSyncPeriod": "-1", "connectionPooling": "true", "connectionUrl": "ldaps://ldap.example.com:636", "debug": "false", "editMode": "READ_ONLY", "enabled": "true", "fullSyncPeriod": "-1", "importEnabled": "true", "pagination": "true", "priority": "0", "rdnLDAPAttribute": "uid", "searchScope": "1", "syncRegistrations": "false", "trustEmail": "false", "useKerberosForPasswordAuthentication": "false", "useTruststoreSpi": "ldapsOnly", "userObjectClasses": "inetOrgPerson, organizationalPerson", "usernameLDAPAttribute": "uid", "usersDn": "ou=Users,dc=example,dc=com", "uuidLDAPAttribute": "entryUUID", "validatePasswordPolicy": "false", "vendor": "other"}, "id": "01122837-9047-4ae4-8ca0-6e2e891a765f", "mappers": [{"config": {"always.read.value.from.ldap": "false", "is.mandatory.in.ldap": "false", "ldap.attribute": "mail", "read.only": "true", "user.model.attribute": "email"}, "id": "17d60ce2-2d44-4c2c-8b1f-1fba601b9a9f", "name": "email", "parentId": "01122837-9047-4ae4-8ca0-6e2e891a765f", "providerId": "user-attribute-ldap-mapper", "providerType": "org.keycloak.storage.ldap.mappers.LDAPStorageMapper"}], "name": "myfed", "parentId": "myrealm", "providerId": "ldap", "providerType": "org.keycloak.storage.UserStorageProvider"}

msg

字符串

关于采取了什么操作的消息。

已返回:始终

示例: "对用户联合 164bb483-c613-482e-80fe-7f1431308799 不需要进行任何更改。"

proposed

字典

建议的用户联合的表示形式。

已返回:始终

示例: {"config": {"allowKerberosAuthentication": "false", "authType": "simple", "batchSizeForSync": "1000", "bindCredential": "**********", "bindDn": "cn=directory reader", "cachePolicy": "DEFAULT", "connectionPooling": "true", "connectionUrl": "ldaps://ldap.example.com:636", "debug": "false", "editMode": "READ_ONLY", "enabled": "true", "importEnabled": "true", "pagination": "true", "priority": "0", "rdnLDAPAttribute": "uid", "searchScope": "1", "syncRegistrations": "false", "trustEmail": "false", "useKerberosForPasswordAuthentication": "false", "useTruststoreSpi": "ldapsOnly", "userObjectClasses": "inetOrgPerson, organizationalPerson", "usernameLDAPAttribute": "uid", "usersDn": "ou=Users,dc=example,dc=com", "uuidLDAPAttribute": "entryUUID", "validatePasswordPolicy": "false", "vendor": "other"}, "name": "ldap", "providerId": "ldap", "providerType": "org.keycloak.storage.UserStorageProvider"}

作者

  • Laurent Paumier (@laurpaum)