В этом руководстве я объясню, как можно настроить LDAP в качестве провайдера для кластера Openshift 4. Это позволит пользователям входить в OpenShift со своей учётной записью LDAP. Также расскажу, почему именно LDAP. Итак, приступим.
Далее будем отталкиваться от того, что в инфраструктуре уже есть LDAP.
Добавим отдельную группу openshift и пользователя srv_acct_ocp. С помощью ldapsearch проверим есть ли связь между LDAP и master нодой OpenShift cluster — например, с помощью команды ниже. Она создаёт связь с сервером LDAP с использованием предоставленного bindDN (флаг -D) и пароля (флаг -W):
# ldapsearch -D "cn = srv_acc_okd, ou = openshift, dc = example, dc = com" -W
Если все параметры верны, будет возвращен вывод LDIF, содержащий информацию на сервере.
kind: OAuth
metadata:
name: cluster
spec:
identityProviders:
- name: ldapidp
mappingMethod: claim
type: LDAP
ldap:
attributes:
id:
- dn
email:
- mail
name:
- cn
preferredUsername:
- uid
bindDN: "cn=srv_acc_okd,ou=openshift,dc=example,dc=com"
bindPassword:
name: ldap-secret
ca:
name: ca-config-map
insecure: false
url: "ldap://ldap.example.com/ou=openshift,dc=acme,dc=com?uid"
apiVersion: v1
metadata:
name: ldap-group-syncer
namespace: openshift-authentication
labels:
app: cronjob-ldap-group-sync
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: ldap-group-syncer
labels:
app: cronjob-ldap-group-sync
rules:
- apiGroups:
- ''
- user.openshift.io
resources:
- groups
verbs:
- get
- list
- create
- update
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ldap-group-syncer
labels:
app: cronjob-ldap-group-sync
subjects:
- kind: ServiceAccount
name: ldap-group-syncer
namespace: openshift-authentication
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ldap-group-syncer
---
kind: ConfigMap
apiVersion: v1
metadata:
name: ldap-group-syncer
namespace: openshift-authentication
labels:
app: cronjob-ldap-group-sync
data:
ldap-group-sync.yaml: |
kind: LDAPSyncConfig
apiVersion: v1
url: ldaps://<YOUR_LDAP_SERVER>/
insecure: false
bindDN: cn=<EDIT_THIS_DN>,dc=example,dc=com
bindPassword:
file: "/etc/secrets/bindPassword"
ca: /etc/ldap-ca/ca.crt
rfc2307:
groupsQuery:
baseDN: "ou=<EDIT_THIS_DN>,dc=example,dc=com"
scope: sub
filter: "(objectClass=groupOfMembers)"
derefAliases: never
pageSize: 0
groupUIDAttribute: dn
groupNameAttributes: [ cn ]
groupMembershipAttributes: [ member ]
usersQuery:
baseDN: "ou=<EDIT_THIS_DN>,dc=example,dc=com"
scope: sub
derefAliases: never
pageSize: 0
userUIDAttribute: dn
userNameAttributes: [ uid ]
tolerateMemberNotFoundErrors: false
tolerateMemberOutOfScopeErrors: false
---
kind: CronJob
apiVersion: batch/v1beta1
metadata:
name: ldap-group-syncer
namespace: openshift-authentication
labels:
app: cronjob-ldap-group-sync
spec:
schedule: "*/10 * * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 5
jobTemplate:
metadata:
labels:
app: cronjob-ldap-group-sync
spec:
backoffLimit: 0
template:
metadata:
labels:
app: cronjob-ldap-group-sync
spec:
containers:
- name: ldap-group-sync
image: "openshift/origin-cli:latest"
command:
- "/bin/bash"
- "-c"
- oc adm groups sync --sync-config=/etc/config/ldap-group-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"
serviceAccount: "ldap-group-syncer"
Почему LDAP?
Зачем использовать LDAP, когда для OpenShift доступны другие варианты: HTPasswd, Basic Auth, Github, Keystone? LDAP — это протокол открытого стандарта, известный своей лёгкостью, безопасностью и зрелостью, но все ещё развивающийся. Обычно он используется для обмена информацией о пользователях, системе, сети и услугах. Представьте его как дерево каталогов, в котором вы можно искать сверху вниз и между самими каталогами. Также мы LDAP можно использовать в инфраструктуре, как единую точку для управления доступами к ресурсам.Далее будем отталкиваться от того, что в инфраструктуре уже есть LDAP.
Добавим отдельную группу openshift и пользователя srv_acct_ocp. С помощью ldapsearch проверим есть ли связь между LDAP и master нодой OpenShift cluster — например, с помощью команды ниже. Она создаёт связь с сервером LDAP с использованием предоставленного bindDN (флаг -D) и пароля (флаг -W):
# ldapsearch -D "cn = srv_acc_okd, ou = openshift, dc = example, dc = com" -W
Если все параметры верны, будет возвращен вывод LDIF, содержащий информацию на сервере.
Добавление провайдера LDAP в Openshift
В Openshift 4 есть хорошая инструкция для добавления LDAP провайдера.Но я опишу всё в рамках статьи — для наглядности. Все действия выполняются с ноды master.- Для начала создадим project:
- Добавим secret для нашего LDAP:
- После того, как мы создали secret, нужно создать ConfgiMap, который будет содержать информацию о сертификате ca.crt:
- На последнем этапе создаём custom resource (CR), который будет содержать информацию о параметрах нашего identity provider:
kind: OAuth
metadata:
name: cluster
spec:
identityProviders:
- name: ldapidp
mappingMethod: claim
type: LDAP
ldap:
attributes:
id:
- dn
email:
name:
- cn
preferredUsername:
- uid
bindDN: "cn=srv_acc_okd,ou=openshift,dc=example,dc=com"
bindPassword:
name: ldap-secret
ca:
name: ca-config-map
insecure: false
url: "ldap://ldap.example.com/ou=openshift,dc=acme,dc=com?uid"
- Применяем только что созданный CR:
- Проверим корректно ли работает наш добавленный провайдер, войдем в cluster с помощью пользователя LDAP srv_acc_okd:
Управление доступами
Отлично, мы добавили провайдера LDAP. Теперь нам необходимо управлять привилегиями в нашем Openshift cluster. В инструкции к Openshift нам предлагают создать sync LDAP, но он запускается руками — это нам не подходит. Поэтому отойдём от родной инструкции и добавим решение на базе автоматизации — создадим cronjob, ещё одну сущность в нашем Openshift cluster. По сути это обычный cron:- Создаём project для нашего cronjob:
- Создаём новый cronjob — ldap-group-sync.yaml :
apiVersion: v1
metadata:
name: ldap-group-syncer
namespace: openshift-authentication
labels:
app: cronjob-ldap-group-sync
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: ldap-group-syncer
labels:
app: cronjob-ldap-group-sync
rules:
- apiGroups:
- ''
- user.openshift.io
resources:
- groups
verbs:
- get
- list
- create
- update
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ldap-group-syncer
labels:
app: cronjob-ldap-group-sync
subjects:
- kind: ServiceAccount
name: ldap-group-syncer
namespace: openshift-authentication
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ldap-group-syncer
---
kind: ConfigMap
apiVersion: v1
metadata:
name: ldap-group-syncer
namespace: openshift-authentication
labels:
app: cronjob-ldap-group-sync
data:
ldap-group-sync.yaml: |
kind: LDAPSyncConfig
apiVersion: v1
url: ldaps://<YOUR_LDAP_SERVER>/
insecure: false
bindDN: cn=<EDIT_THIS_DN>,dc=example,dc=com
bindPassword:
file: "/etc/secrets/bindPassword"
ca: /etc/ldap-ca/ca.crt
rfc2307:
groupsQuery:
baseDN: "ou=<EDIT_THIS_DN>,dc=example,dc=com"
scope: sub
filter: "(objectClass=groupOfMembers)"
derefAliases: never
pageSize: 0
groupUIDAttribute: dn
groupNameAttributes: [ cn ]
groupMembershipAttributes: [ member ]
usersQuery:
baseDN: "ou=<EDIT_THIS_DN>,dc=example,dc=com"
scope: sub
derefAliases: never
pageSize: 0
userUIDAttribute: dn
userNameAttributes: [ uid ]
tolerateMemberNotFoundErrors: false
tolerateMemberOutOfScopeErrors: false
---
kind: CronJob
apiVersion: batch/v1beta1
metadata:
name: ldap-group-syncer
namespace: openshift-authentication
labels:
app: cronjob-ldap-group-sync
spec:
schedule: "*/10 * * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 5
jobTemplate:
metadata:
labels:
app: cronjob-ldap-group-sync
spec:
backoffLimit: 0
template:
metadata:
labels:
app: cronjob-ldap-group-sync
spec:
containers:
- name: ldap-group-sync
image: "openshift/origin-cli:latest"
command:
- "/bin/bash"
- "-c"
- oc adm groups sync --sync-config=/etc/config/ldap-group-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"
serviceAccount: "ldap-group-syncer"
Заключение
В данной статье мы удачно добавили провайдера LDAP в наш Openshift cluster и настроили автоматическую синхронизацию групп и пользователей с нашим LDAP.OpenShift 4 — добавление LDAP провайдера и синхронизация групп
В статье расскажу, как можно настроить LDAP в качестве провайдера для кластера Openshift 4. И объясню, почему выбрал этот протокол.
tproger.ru