Обложка: OpenShift 4 — добавление LDAP провайдера и автоматическая синхронизация групп

OpenShift 4 — добавление LDAP провайдера и автоматическая синхронизация групп

Василий Кулаженков
Василий Кулаженков

Devops-инженер компании Росэлторг

В этом руководстве я объясню, как можно настроить LDAP в качестве провайдера для кластера Openshift 4. Это позволит пользователям входить в OpenShift со своей учётной записью LDAP. Также расскажу, почему именно LDAP. Итак, приступим.

Почему 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:
# oc new-project openshift-authentication
  • Добавим secret для нашего LDAP: 
# oc create secret generic ldap-secret --from-literal=bindPassword=<secret> -n openshift-authentication
  • После того, как мы создали secret, нужно создать ConfgiMap, который будет содержать информацию о сертификате ca.crt:  
# oc create configmap ca-config-map --from-file=ca.crt=/path/to/ca -n openshift-authentication
  • На последнем этапе создаём custom resource (CR), который будет содержать информацию о параметрах  нашего identity provider:
apiVersion: config.openshift.io/v1
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"
  • Применяем только что созданный CR:
# oc apply -f </path/to/CR>
  • Проверим корректно ли работает наш добавленный провайдер, войдем в cluster с помощью пользователя LDAP srv_acc_okd:
# oc login -u <username>

Управление доступами

Отлично, мы добавили провайдера LDAP. Теперь нам необходимо управлять привилегиями в нашем Openshift cluster. В инструкции к Openshift нам предлагают создать sync LDAP, но он запускается руками — это нам не подходит. Поэтому отойдём от родной инструкции и добавим решение на базе автоматизации — создадим cronjob, ещё одну сущность в нашем Openshift cluster. По сути это обычный cron:

  • Создаём project для нашего cronjob:
# oc new-project openshift-authentication
  • Создаём новый cronjob — ldap-group-sync.yaml :
kind: ServiceAccount
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.