19.4. LDAP グループを自動的に同期する
LDAP グループと OpenShift Container Platform を自動的に同期するように cron ジョブを設定し、手動同期コマンドを実行せずにグループメンバーシップを最新の状態に維持できるようにします。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 - LDAP アイデンティティープロバイダー(IDP)を設定しました。
-
ldap-secretという名前の LDAP シークレットとca-config-mapという名前の設定マップを作成している。
手順
次のコマンドを実行して、cron ジョブが実行されるプロジェクトを作成します。
$ oc new-project ldap-syncこの手順では、
ldap-syncというプロジェクトを使用します。LDAP ID プロバイダーの設定時に作成したシークレットマップと設定マップを見つけて、この新しいプロジェクトにコピーします。
シークレットマップと設定マップは
openshift-configプロジェクトに存在し、新しいldap-syncプロジェクトにコピーする必要があります。サービスアカウントを定義します。
kind: ServiceAccount apiVersion: v1 metadata: name: ldap-group-syncer namespace: ldap-sync次のコマンドを実行してサービスアカウントを作成します。
$ oc create -f ldap-sync-service-account.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次のコマンドを実行して、クラスターのロールを作成します。
$ oc create -f ldap-sync-cluster-role.yamlクラスターロールバインディングを定義して、クラスターロールをサービスアカウントにバインドします。
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ldap-group-syncer subjects: - kind: ServiceAccount name: ldap-group-syncer namespace: ldap-sync roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ldap-group-syncer各項目の説明:
subjects.name- この手順の前半で作成したサービスアカウントを指定します。
roleRef.name- この手順の前半で作成したクラスターロールを指定します。
次のコマンドを実行して、クラスターロールバインディングを作成します。
$ oc create -f ldap-sync-cluster-role-binding.yaml同期設定ファイルを指定する設定マップを定義します。
kind: ConfigMap apiVersion: v1 metadata: name: ldap-group-syncer namespace: ldap-sync data: sync.yaml: kind: LDAPSyncConfig apiVersion: v1 url: ldaps://10.0.0.0:636 insecure: false bindDN: cn=admin,dc=example,dc=com bindPassword: file: "/etc/secrets/bindPassword" ca: /etc/ldap-ca/ca.crt rfc2307: groupsQuery: baseDN: "ou=groups,dc=example,dc=com" scope: sub filter: "(objectClass=groupOfMembers)" derefAliases: never pageSize: 0 groupUIDAttribute: dn groupNameAttributes: [ cn ] groupMembershipAttributes: [ member ] usersQuery: baseDN: "ou=users,dc=example,dc=com" scope: sub derefAliases: never pageSize: 0 userUIDAttribute: dn userNameAttributes: [ uid ] tolerateMemberNotFoundErrors: false tolerateMemberOutOfScopeErrors: false各項目の説明:
data.sync.yaml- 同期設定ファイルを指定します。
data.sync.yaml.url- URL を指定します。
data.sync.yaml.bindDN-
bindDNを指定します。 data.sync.yaml.rfc2307- RFC 2307 スキーマを指定します。必要に応じて値を調整します。別のスキーマを使用することもできます。
data.sync.yaml.rfc2307.groupsQuery.baseDN-
groupsQueryのbaseDNを指定します。 data.sync.yaml.rfc2307.usersQuery.baseDN-
usersQueryのbaseDNを指定します。
以下のコマンドを実行して config map を作成します。
$ oc create -f ldap-sync-config-map.yamlcron ジョブを定義します。
kind: CronJob apiVersion: batch/v1 metadata: name: ldap-group-syncer namespace: ldap-sync spec: schedule: "*/30 * * * *" concurrencyPolicy: Forbid jobTemplate: spec: backoffLimit: 0 ttlSecondsAfterFinished: 1800 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" 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" - name: "ldap-ca" configMap: name: "ca-config-map" restartPolicy: "Never" terminationGracePeriodSeconds: 30 activeDeadlineSeconds: 500 dnsPolicy: "ClusterFirst" serviceAccountName: "ldap-group-syncer"各項目の説明:
spec- cron ジョブの設定を指定します。cron ジョブ設定の詳細は、「cron ジョブの作成」を参照してください。
spec.schedule- cron 形式 で指定されるジョブのスケジュールを指定します。この例の cron ジョブは 30 分ごとに実行されます。同期の実行にかかる時間を考慮して、必要に応じて周波数を調整します。
spec.jobTemplate.spec.ttlSecondsAfterFinished- 完了したジョブを保持する期間を秒単位で指定します。これは、失敗した以前のジョブを消去して不要なアラートを発生させないように、ジョブスケジュールの期間と同じにする必要があります。詳細は、Kubernetes ドキュメント(Finished Jobs)の自動クリーンアップ を参照してください。
spec.jobTemplate.spec.template.spec.containers.command- cron ジョブを実行する LDAP 同期コマンドを指定します。設定マップで定義された同期設定ファイルを渡します。
spec.jobTemplate.spec.template.spec.volumes.secret.secretName- LDAP IDP の設定時に作成したシークレットの名前を指定します。
spec.jobTemplate.spec.template.spec.volumes.configMap.name- LDAP IDP の設定時に作成した設定マップの名前を指定します。
次のコマンドを実行して cron ジョブを作成します。
$ oc create -f ldap-sync-cron-job.yaml