18.4. LDAP 组同步示例

本节包含 RFC 2307、Active Directory 和增强 Active Directory 模式的示例。

注意

这些示例假定所有用户都是其各自组的直接成员。具体而言,没有任何组的成员是其他组。如需有关如何同步嵌套组的信息,请参见嵌套成员资格同步示例。

18.4.1. 使用 RFC 2307 模式同步组

对于 RFC 2307 模式,以下示例将同步名为 admins 的组,该组有两个成员 JaneJim。这些示例阐述了:

  • 如何将组和用户添加到 LDAP 服务器中。
  • 同步之后 OpenShift Container Platform 中会生成什么组记录。
注意

这些示例假定所有用户都是其各自组的直接成员。具体而言,没有任何组的成员是其他组。如需有关如何同步嵌套组的信息,请参见嵌套成员资格同步示例。

在 RFC 2307 模式中,用户(Jane 和 Jim)和组都作为第一类条目存在于 LDAP 服务器上,组成员资格则存储在组的属性中。以下 ldif 片段定义了这个模式的用户和组:

使用 RFC 2307 模式的 LDAP 条目:rfc2307.ldif

  dn: ou=users,dc=example,dc=com
  objectClass: organizationalUnit
  ou: users
  dn: cn=Jane,ou=users,dc=example,dc=com
  objectClass: person
  objectClass: organizationalPerson
  objectClass: inetOrgPerson
  cn: Jane
  sn: Smith
  displayName: Jane Smith
  mail: jane.smith@example.com
  dn: cn=Jim,ou=users,dc=example,dc=com
  objectClass: person
  objectClass: organizationalPerson
  objectClass: inetOrgPerson
  cn: Jim
  sn: Adams
  displayName: Jim Adams
  mail: jim.adams@example.com
  dn: ou=groups,dc=example,dc=com
  objectClass: organizationalUnit
  ou: groups
  dn: cn=admins,ou=groups,dc=example,dc=com 1
  objectClass: groupOfNames
  cn: admins
  owner: cn=admin,dc=example,dc=com
  description: System Administrators
  member: cn=Jane,ou=users,dc=example,dc=com 2
  member: cn=Jim,ou=users,dc=example,dc=com

1
组是 LDAP 服务器中的第一类条目。
2
组成员使用作为组属性的标识引用来列出。

先决条件

  • 创建配置文件。

流程

  1. 使用 rfc2307_config.yaml 文件运行同步:

    $ oc adm groups sync --sync-config=rfc2307_config.yaml --confirm

    OpenShift Container Platform 创建以下组记录作为上述同步操作的结果:

    使用 rfc2307_config.yaml 文件创建的 OpenShift Container Platform 组

    apiVersion: user.openshift.io/v1
    kind: Group
    metadata:
      annotations:
        openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400 1
        openshift.io/ldap.uid: cn=admins,ou=groups,dc=example,dc=com 2
        openshift.io/ldap.url: LDAP_SERVER_IP:389 3
      creationTimestamp:
      name: admins 4
    users: 5
    - jane.smith@example.com
    - jim.adams@example.com

    1
    此 OpenShift Container Platform 组与 LDAP 服务器最后一次同步的时间,采用 ISO 6801 格式。
    2
    LDAP 服务器上组的唯一标识符。
    3
    存储该组记录的 LDAP 服务器的 IP 地址和主机。
    4
    根据同步文件指定的组的名称。
    5
    属于组的成员的用户,名称由同步文件指定。

18.4.2. 使用 RFC2307 模式及用户定义的名称映射来同步组

使用用户定义的名称映射同步组时,配置文件会更改为包含这些映射,如下所示。

使用 RFC 2307 模式及用户定义的名称映射的 LDAP 同步配置:rfc2307_config_user_defined.yaml

kind: LDAPSyncConfig
apiVersion: v1
groupUIDNameMapping:
  "cn=admins,ou=groups,dc=example,dc=com": Administrators 1
rfc2307:
    groupsQuery:
        baseDN: "ou=groups,dc=example,dc=com"
        scope: sub
        derefAliases: never
        pageSize: 0
    groupUIDAttribute: dn 2
    groupNameAttributes: [ cn ] 3
    groupMembershipAttributes: [ member ]
    usersQuery:
        baseDN: "ou=users,dc=example,dc=com"
        scope: sub
        derefAliases: never
        pageSize: 0
    userUIDAttribute: dn 4
    userNameAttributes: [ mail ]
    tolerateMemberNotFoundErrors: false
    tolerateMemberOutOfScopeErrors: false

1
用户定义的名称映射。
2
唯一标识符属性,用于用户定义的名称映射中的键。将 DN 用于 groupUIDAttribute 时,您无法指定 groupsQuery 过滤器。若要进行精细过滤,请使用白名单/黑名单方法。
3
如果其唯一标识符不在用户定义的名称映射中,用于指定 OpenShift Container Platform 组的属性。
4
唯一标识 LDAP 服务器上用户的属性。将 DN 用于 userUIDAttribute 时,您无法指定usersQuery 过滤器。若要进行精细过滤,请使用白名单/黑名单方法。

先决条件

  • 创建配置文件。

流程

  1. 使用 rfc2307_config_user_defined.yaml 文件运行同步:

    $ oc adm groups sync --sync-config=rfc2307_config_user_defined.yaml --confirm

    OpenShift Container Platform 创建以下组记录作为上述同步操作的结果:

    使用 rfc2307_config_user_defined.yaml 文件创建的 OpenShift Container Platform 组

    apiVersion: user.openshift.io/v1
    kind: Group
    metadata:
      annotations:
        openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400
        openshift.io/ldap.uid: cn=admins,ou=groups,dc=example,dc=com
        openshift.io/ldap.url: LDAP_SERVER_IP:389
      creationTimestamp:
      name: Administrators 1
    users:
    - jane.smith@example.com
    - jim.adams@example.com

    1
    由用户定义的名称映射指定的组名称。

18.4.3. 使用 RFC 2307 及用户定义的容错来同步组

默认情况下,如果要同步的组包含其条目在成员查询中定义范围之外的成员,组同步会失败并显示以下错误:

Error determining LDAP group membership for "<group>": membership lookup for user "<user>" in group "<group>" failed because of "search for entry with dn="<user-dn>" would search outside of the base dn specified (dn="<base-dn>")".

这通常表示 usersQuery 字段中的 baseDN 配置错误。不过,如果 baseDN 有意不含有组中的部分成员,那么设置 tolerateMemberOutOfScopeErrors: true 可以让组同步继续进行。范围之外的成员将被忽略。

同样,当组同步过程未能找到某个组的某一成员时,它会彻底失败并显示错误:

Error determining LDAP group membership for "<group>": membership lookup for user "<user>" in group "<group>" failed because of "search for entry with base dn="<user-dn>" refers to a non-existent entry".
Error determining LDAP group membership for "<group>": membership lookup for user "<user>" in group "<group>" failed because of "search for entry with base dn="<user-dn>" and filter "<filter>" did not return any results".

这通常表示 usersQuery 字段配置错误。不过,如果组中包含已知缺失的成员条目,那么设置 tolerateMemberNotFoundErrors: true 可以让组同步继续进行。有问题的成员将被忽略。

警告

为 LDAP 组同步启用容错会导致同步过程忽略有问题的成员条目。如果 LDAP 组同步配置不正确,这可能会导致同步的 OpenShift Container Platform 组中缺少成员。

使用 RFC 2307 模式并且组成员资格有问题的 LDAP 条目:rfc2307_problematic_users.ldif

  dn: ou=users,dc=example,dc=com
  objectClass: organizationalUnit
  ou: users
  dn: cn=Jane,ou=users,dc=example,dc=com
  objectClass: person
  objectClass: organizationalPerson
  objectClass: inetOrgPerson
  cn: Jane
  sn: Smith
  displayName: Jane Smith
  mail: jane.smith@example.com
  dn: cn=Jim,ou=users,dc=example,dc=com
  objectClass: person
  objectClass: organizationalPerson
  objectClass: inetOrgPerson
  cn: Jim
  sn: Adams
  displayName: Jim Adams
  mail: jim.adams@example.com
  dn: ou=groups,dc=example,dc=com
  objectClass: organizationalUnit
  ou: groups
  dn: cn=admins,ou=groups,dc=example,dc=com
  objectClass: groupOfNames
  cn: admins
  owner: cn=admin,dc=example,dc=com
  description: System Administrators
  member: cn=Jane,ou=users,dc=example,dc=com
  member: cn=Jim,ou=users,dc=example,dc=com
  member: cn=INVALID,ou=users,dc=example,dc=com 1
  member: cn=Jim,ou=OUTOFSCOPE,dc=example,dc=com 2

1
LDAP 服务器上不存在的成员。
2
可能存在,但不在同步任务的用户查询的 baseDN 下的成员。

要容许以上示例中的错误,您必须在同步配置文件中添加以下内容:

使用 RFC 2307 模式且容许错误的 LDAP 同步配置:rfc2307_config_tolerating.yaml

kind: LDAPSyncConfig
apiVersion: v1
url: ldap://LDAP_SERVICE_IP:389
rfc2307:
    groupsQuery:
        baseDN: "ou=groups,dc=example,dc=com"
        scope: sub
        derefAliases: never
    groupUIDAttribute: dn
    groupNameAttributes: [ cn ]
    groupMembershipAttributes: [ member ]
    usersQuery:
        baseDN: "ou=users,dc=example,dc=com"
        scope: sub
        derefAliases: never
    userUIDAttribute: dn 1
    userNameAttributes: [ mail ]
    tolerateMemberNotFoundErrors: true 2
    tolerateMemberOutOfScopeErrors: true 3

1
唯一标识 LDAP 服务器上用户的属性。将 DN 用于 userUIDAttribute 时,您无法指定usersQuery 过滤器。若要进行精细过滤,请使用白名单/黑名单方法。
2
true 时,同步任务容许找不到部分成员的组,并且找不到 LDAP 条目的成员将被忽略。如果找不到组成员,同步任务的默认行为将失败。
3
true 时,同步任务容许其部分成员在 usersQuery 基本 DN 中给定用户范围之外的组,并且不在成员查询范围的成员将被忽略。如果组中某个成员超出范围,则同步任务的默认行为将失败。

先决条件

  • 创建配置文件。

流程

  1. 使用 rfc2307_config_tolerating.yaml 文件运行同步:

    $ oc adm groups sync --sync-config=rfc2307_config_tolerating.yaml --confirm

    OpenShift Container Platform 创建以下组记录作为上述同步操作的结果:

    使用 rfc2307_config.yaml 文件创建的 OpenShift Container Platform 组

    apiVersion: user.openshift.io/v1
    kind: Group
    metadata:
      annotations:
        openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400
        openshift.io/ldap.uid: cn=admins,ou=groups,dc=example,dc=com
        openshift.io/ldap.url: LDAP_SERVER_IP:389
      creationTimestamp:
      name: admins
    users: 1
    - jane.smith@example.com
    - jim.adams@example.com

    1
    属于组的成员的用户,根据同步文件指定。缺少查询遇到容许错误的成员。

18.4.4. 使用 Active Directory 模式同步组

在 Active Directory 模式中,两个用户(Jane 和 Jim)都作为第一类条目存在于 LDAP 服务器中,组成员资格则存储在用户的属性中。以下 ldif 片段定义了这个模式的用户和组:

使用 Active Directory 模式的 LDAP 条目:active_directory.ldif

dn: ou=users,dc=example,dc=com
objectClass: organizationalUnit
ou: users

dn: cn=Jane,ou=users,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: testPerson
cn: Jane
sn: Smith
displayName: Jane Smith
mail: jane.smith@example.com
memberOf: admins 1

dn: cn=Jim,ou=users,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: testPerson
cn: Jim
sn: Adams
displayName: Jim Adams
mail: jim.adams@example.com
memberOf: admins

1
用户的组成员资格列为用户的属性,组没有作为条目存在于服务器中。memberOf 属性不一定是用户的字面量属性;在一些 LDAP 服务器中,它在搜索过程中创建并返回给客户端,但不提交给数据库。

先决条件

  • 创建配置文件。

流程

  1. 使用 active_directory_config.yaml 文件运行同步:

    $ oc adm groups sync --sync-config=active_directory_config.yaml --confirm

    OpenShift Container Platform 创建以下组记录作为上述同步操作的结果:

    使用 active_directory_config.yaml 文件创建的 OpenShift Container Platform 组

    apiVersion: user.openshift.io/v1
    kind: Group
    metadata:
      annotations:
        openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400 1
        openshift.io/ldap.uid: admins 2
        openshift.io/ldap.url: LDAP_SERVER_IP:389 3
      creationTimestamp:
      name: admins 4
    users: 5
    - jane.smith@example.com
    - jim.adams@example.com

    1
    此 OpenShift Container Platform 组与 LDAP 服务器最后一次同步的时间,采用 ISO 6801 格式。
    2
    LDAP 服务器上组的唯一标识符。
    3
    存储该组记录的 LDAP 服务器的 IP 地址和主机。
    4
    LDAP 服务器中列出的组名称。
    5
    属于组的成员的用户,名称由同步文件指定。

18.4.5. 使用增强 Active Directory 模式同步组

在增强 Active Directory 模式中,用户(Jane 和 Jim)和组都作为第一类条目存在于 LDAP 服务器中,组成员资格则存储在用户的属性中。以下 ldif 片段定义了这个模式的用户和组:

使用增强 Active Directory 模式的 LDAP 条目:increaseded_active_directory.ldif

dn: ou=users,dc=example,dc=com
objectClass: organizationalUnit
ou: users

dn: cn=Jane,ou=users,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: testPerson
cn: Jane
sn: Smith
displayName: Jane Smith
mail: jane.smith@example.com
memberOf: cn=admins,ou=groups,dc=example,dc=com 1

dn: cn=Jim,ou=users,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: testPerson
cn: Jim
sn: Adams
displayName: Jim Adams
mail: jim.adams@example.com
memberOf: cn=admins,ou=groups,dc=example,dc=com

dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups

dn: cn=admins,ou=groups,dc=example,dc=com 2
objectClass: groupOfNames
cn: admins
owner: cn=admin,dc=example,dc=com
description: System Administrators
member: cn=Jane,ou=users,dc=example,dc=com
member: cn=Jim,ou=users,dc=example,dc=com

1
用户的组成员资格列为用户的属性。
2
组是在 LDAP 服务器上的第一类条目。

先决条件

  • 创建配置文件。

流程

  1. 使用 augmented_active_directory_config.yaml 文件运行同步:

    $ oc adm groups sync --sync-config=augmented_active_directory_config.yaml --confirm

    OpenShift Container Platform 创建以下组记录作为上述同步操作的结果:

    apiVersion: user.openshift.io/v1
    kind: Group
    metadata:
      annotations:
        openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400 1
        openshift.io/ldap.uid: cn=admins,ou=groups,dc=example,dc=com 2
        openshift.io/ldap.url: LDAP_SERVER_IP:389 3
      creationTimestamp:
      name: admins 4
    users: 5
    - jane.smith@example.com
    - jim.adams@example.com
    1
    此 OpenShift Container Platform 组与 LDAP 服务器最后一次同步的时间,采用 ISO 6801 格式。
    2
    LDAP 服务器上组的唯一标识符。
    3
    存储该组记录的 LDAP 服务器的 IP 地址和主机。
    4
    根据同步文件指定的组的名称。
    5
    属于组的成员的用户,名称由同步文件指定。

18.4.5.1. LDAP 嵌套成员资格同步示例

OpenShift Container Platform 中的组不嵌套。在消耗数据之前,LDAP 服务器必须平展组成员资格。Microsoft 的 Active Directory Server 通过 LDAP_MATCHING_RULE_IN_CHAIN 规则支持这一功能,其 OID 为 1.2.840.113556.1.4.1941。另外,使用此匹配规则时只能同步明确列在白名单中的组。

本节中的示例使用了增强 Active Directory 模式,它将同步一个名为 admins 的组,该组有一个用户 Jane 和一个组 otheradminsotheradmins 组具有一个用户成员:Jim。这个示例阐述了:

  • 如何将组和用户添加到 LDAP 服务器中。
  • LDAP 同步配置文件的概貌。
  • 同步之后 OpenShift Container Platform 中会生成什么组记录。

在增强 Active Directory 模式中,用户(JaneJim)和组都作为第一类条目存在于 LDAP 服务器中,组成员资格则存储在用户或组的属性中。以下 ldif 片段定义了这个模式的用户和组:

使用增强 Active Directory 模式和嵌套成员的 LDAP 条目:augmented_active_directory_nested.ldif

dn: ou=users,dc=example,dc=com
objectClass: organizationalUnit
ou: users

dn: cn=Jane,ou=users,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: testPerson
cn: Jane
sn: Smith
displayName: Jane Smith
mail: jane.smith@example.com
memberOf: cn=admins,ou=groups,dc=example,dc=com 1

dn: cn=Jim,ou=users,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: testPerson
cn: Jim
sn: Adams
displayName: Jim Adams
mail: jim.adams@example.com
memberOf: cn=otheradmins,ou=groups,dc=example,dc=com 2

dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups

dn: cn=admins,ou=groups,dc=example,dc=com 3
objectClass: group
cn: admins
owner: cn=admin,dc=example,dc=com
description: System Administrators
member: cn=Jane,ou=users,dc=example,dc=com
member: cn=otheradmins,ou=groups,dc=example,dc=com

dn: cn=otheradmins,ou=groups,dc=example,dc=com 4
objectClass: group
cn: otheradmins
owner: cn=admin,dc=example,dc=com
description: Other System Administrators
memberOf: cn=admins,ou=groups,dc=example,dc=com 5 6
member: cn=Jim,ou=users,dc=example,dc=com

1 2 5
用户和组的成员资格列为对象的属性。
3 4
组是在 LDAP 服务器上的第一类条目。
6
otheradmins 组是 admins 组的成员。

与 Active Directory 同步嵌套的组时,您必须提供用户条目和组条目的 LDAP 查询定义,以及在内部 OpenShift Container Platform 组记录中代表它们的属性。另外,此配置也需要进行某些修改:

  • oc adm groups sync 命令必须明确将组列在白名单中。
  • 用户的 groupMembershipAttributes 必须包含 "memberOf:1.2.840.113556.1.4.1941:",以遵守 LDAP_MATCHING_RULE_IN_CHAIN 规则。
  • groupUIDAttribute 必须设为 dn
  • groupsQuery

    • 不得设置 filter
    • 必须设置有效的 derefAliases
    • 不应设置 basedn,因为此值将被忽略。
    • 不应设置 scope,因为此值将被忽略。

为明确起见,您在 OpenShift Container Platform 中创建的组应尽可能将可分辨名称以外的属性用于面向用户或管理员的字段。例如,通过电子邮件标识 OpenShift Container Platform 组的用户,并将该组的名称用作通用名称。以下配置文件创建了这些关系:

使用增强 Active Directory 模式和嵌套成员的 LDAP 同步配置:increaseded_active_directory_config_nested.yaml

kind: LDAPSyncConfig
apiVersion: v1
url: ldap://LDAP_SERVICE_IP:389
augmentedActiveDirectory:
    groupsQuery: 1
        derefAliases: never
        pageSize: 0
    groupUIDAttribute: dn 2
    groupNameAttributes: [ cn ] 3
    usersQuery:
        baseDN: "ou=users,dc=example,dc=com"
        scope: sub
        derefAliases: never
        filter: (objectclass=inetOrgPerson)
        pageSize: 0
    userNameAttributes: [ mail ] 4
    groupMembershipAttributes: [ "memberOf:1.2.840.113556.1.4.1941:" ] 5

1
无法指定 groupsQuery 过滤器。groupsQuery 基本 DN 和范围值将被忽略。groupsQuery 必须设置有效的 derefAliases
2
唯一标识 LDAP 服务器上组的属性。必须设为 dn
3
要用作组名称的属性。
4
用作 OpenShift Container Platform 组记录中用户名称的属性。大多数安装中首选 mailsAMAccountName
5
存储成员资格信息的用户属性。注意 LDAP_MATCHING_RULE_IN_CHAIN 的使用。

先决条件

  • 创建配置文件。

流程

  1. 使用 augmented_active_directory_config_nested.yaml 文件运行同步:

    $ oc adm groups sync \
        'cn=admins,ou=groups,dc=example,dc=com' \
        --sync-config=augmented_active_directory_config_nested.yaml \
        --confirm
    注意

    必须明确将 cn=admins,ou=groups,dc=example,dc=com 组列在白名单中。

    OpenShift Container Platform 创建以下组记录作为上述同步操作的结果:

使用 augmented_active_directory_config_nested.yaml 文件创建的 OpenShift 组

apiVersion: user.openshift.io/v1
kind: Group
metadata:
  annotations:
    openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400 1
    openshift.io/ldap.uid: cn=admins,ou=groups,dc=example,dc=com 2
    openshift.io/ldap.url: LDAP_SERVER_IP:389 3
  creationTimestamp:
  name: admins 4
users: 5
- jane.smith@example.com
- jim.adams@example.com

1
此 OpenShift Container Platform 组与 LDAP 服务器最后一次同步的时间,采用 ISO 6801 格式。
2
LDAP 服务器上组的唯一标识符。
3
存储该组记录的 LDAP 服务器的 IP 地址和主机。
4
根据同步文件指定的组的名称。
5
属于组的成员的用户,名称由同步文件指定。请注意,嵌套组成员包含在内,因为 Microsoft Active Directory Server 已经平展了组成员关系。

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。