18.4. LDAP グループを自動的に同期する

cron ジョブを設定することにより、LDAP グループを定期的に自動的に同期できます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • LDAP ID プロバイダー (IDP) を設定しました。

    この手順は、ldap-secretという名前の LDAP シークレットと ca-config-map という名前の設定マップを作成したことを前提としています。

手順

  1. cron ジョブを実行するプロジェクトを作成します。

    $ oc new-project ldap-sync 1
    1
    この手順では、ldap-syncというプロジェクトを使用します。
  2. LDAP ID プロバイダーの設定時に作成したシークレットマップと設定マップを見つけて、この新しいプロジェクトにコピーします。

    シークレットマップと設定マップは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
    groupsQuerybaseDN を指定します。
    6
    usersQuerybaseDN を指定します。
  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 同期コマンド。設定マップで定義された同期設定ファイルを渡します。
    5
    このシークレットは、LDAP IDP が設定されたときに作成されました。
    6
    この設定マップは、LDAP IDP が設定されたときに作成されました。
  12. cron ジョブを作成します。

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