17.4. 自动同步 LDAP 组

您可以通过配置 cron 作业来定期自动同步 LDAP 组。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 您已配置了 LDAP 身份提供程序 (IDP)。

    此流程假设您创建一个名为 ldap-secret 的 LDAP secret 和名为 ca-config-map 的配置映射。

流程

  1. 创建一个在其中运行 cron 任务的项目:

    $ oc new-project ldap-sync 1
    1
    此流程使用名为 ldap-sync 的项目。
  2. 找到您在配置 LDAP 身份提供程序时创建的 secret 和配置映射,并将它们复制到此新项目。

    secret 和配置映射存在于 openshift-config 项目中,必须复制到新的 ldap-sync 项目中。

  3. 定义服务帐户:

    ldap-sync-service-account.yaml示例

    kind: ServiceAccount
    apiVersion: v1
    metadata:
      name: ldap-group-syncer
      namespace: ldap-sync

  4. 创建服务帐户:

    $ oc create -f ldap-sync-service-account.yaml
  5. 定义集群角色:

    ldap-sync-cluster-role.yaml示例

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: ldap-group-syncer
    rules:
      - apiGroups:
          - ''
          - user.openshift.io
        resources:
          - groups
        verbs:
          - get
          - list
          - create
          - update

  6. 创建集群角色:

    $ oc create -f ldap-sync-cluster-role.yaml
  7. 定义集群角色绑定将集群角色绑定绑定到服务帐户:

    ldap-sync-cluster-role-binding.yaml 示例

    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: ldap-group-syncer
    subjects:
      - kind: ServiceAccount
        name: ldap-group-syncer              1
        namespace: ldap-sync
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: ldap-group-syncer                2

    1
    对此过程前面创建的服务帐户的引用。
    2
    引用此流程前面创建的集群角色。
  8. 创建集群角色绑定:

    $ oc create -f ldap-sync-cluster-role-binding.yaml
  9. 定义指定同步配置文件的配置映射:

    ldap-sync-config-map.yaml 示例

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: ldap-group-syncer
      namespace: ldap-sync
    data:
      sync.yaml: |                                 1
        kind: LDAPSyncConfig
        apiVersion: v1
        url: ldaps://10.0.0.0:389                  2
        insecure: false
        bindDN: cn=admin,dc=example,dc=com         3
        bindPassword:
          file: "/etc/secrets/bindPassword"
        ca: /etc/ldap-ca/ca.crt
        rfc2307:                                   4
          groupsQuery:
            baseDN: "ou=groups,dc=example,dc=com"  5
            scope: sub
            filter: "(objectClass=groupOfMembers)"
            derefAliases: never
            pageSize: 0
          groupUIDAttribute: dn
          groupNameAttributes: [ cn ]
          groupMembershipAttributes: [ member ]
          usersQuery:
            baseDN: "ou=users,dc=example,dc=com"   6
            scope: sub
            derefAliases: never
            pageSize: 0
          userUIDAttribute: dn
          userNameAttributes: [ uid ]
          tolerateMemberNotFoundErrors: false
          tolerateMemberOutOfScopeErrors: false

    1
    定义同步配置文件。
    2
    指定 URL。
    3
    指定 bindDN
    4
    本例使用 RFC2307 模式;根据需要调整值。您还可以使用不同的架构。
    5
    groupsQuery 指定 baseDN
    6
    usersQuery 指定 baseDN
  10. 创建配置映射:

    $ oc create -f ldap-sync-config-map.yaml
  11. 定义 cron 作业:

    ldap-sync-cron-job.yaml 示例

    kind: CronJob
    apiVersion: batch/v1
    metadata:
      name: ldap-group-syncer
      namespace: ldap-sync
    spec:                                                                                1
      schedule: "*/30 * * * *"                                                           2
      concurrencyPolicy: Forbid
      jobTemplate:
        spec:
          backoffLimit: 0
          ttlSecondsAfterFinished: 1800                                                  3
          template:
            spec:
              containers:
                - name: ldap-group-sync
                  image: "registry.redhat.io/openshift4/ose-cli:latest"
                  command:
                    - "/bin/bash"
                    - "-c"
                    - "oc adm groups sync --sync-config=/etc/config/sync.yaml --confirm" 4
                  volumeMounts:
                    - mountPath: "/etc/config"
                      name: "ldap-sync-volume"
                    - mountPath: "/etc/secrets"
                      name: "ldap-bind-password"
                    - mountPath: "/etc/ldap-ca"
                      name: "ldap-ca"
              volumes:
                - name: "ldap-sync-volume"
                  configMap:
                    name: "ldap-group-syncer"
                - name: "ldap-bind-password"
                  secret:
                    secretName: "ldap-secret"                                            5
                - name: "ldap-ca"
                  configMap:
                    name: "ca-config-map"                                                6
              restartPolicy: "Never"
              terminationGracePeriodSeconds: 30
              activeDeadlineSeconds: 500
              dnsPolicy: "ClusterFirst"
              serviceAccountName: "ldap-group-syncer"

    1
    配置 cron 作业的设置。有关 cron 作业设置的更多信息,请参阅"创建 cron 作业"。
    2
    cron 格式指定的作业计划。这个示例 cron 作业每 30 分钟运行一次。根据需要调整频率,确保考虑到同步运行所需的时间。
    3
    维护完成的作业的时间(以秒为单位)。这应该与作业调度的期限匹配,以便清理旧的失败作业并防止不必要的警报。如需更多信息,请参阅 Kubernetes 文档中的 TTL-after-finished Controller
    4
    运行 cron 作业的 LDAP sync 命令。传递配置映射中定义的同步配置文件。
    5
    此 secret 是在配置 LDAP IDP 时创建的。
    6
    此配置映射是在配置 LDAP IDP 时创建的。
  12. 创建 cron job:

    $ oc create -f ldap-sync-cron-job.yaml