Ние го прицврстуваме овластувањето ActiveDirectory на Kubernetes користејќи Keycloak

Оваа статија е напишана со цел да се прошири веќе постоечки, но зборува за карактеристиките на врската конкретно со Microsoft ActiveDirectory, а исто така ја надополнува.

Во оваа статија ќе ви кажам како да инсталирате и конфигурирате:

  • клуч наметка е проект со отворен код. Што обезбедува единствена влезна точка за апликации. Работи со многу протоколи, вклучително и LDAP и OpenID, кои се од нас.
  • Чувар на врата — обратна прокси апликација која ви овозможува да интегрирате овластување преку Keycloak.
  • Гангвеј — апликација која генерира конфигурација за kubectl со која можете да се најавите преку OpenID и да се поврзете на Kubernetes API.

Како функционираат дозволите во Kubernetes.

Можеме да управуваме со правата на корисници/групи користејќи RBAC, за ова веќе се создадени еден куп статии, нема да се задржам на ова во детали. Проблемот е што можете да користите RBAC за да ги ограничите корисничките права, но Kubernetes не знае ништо за корисниците. Излегува дека ни треба механизам за испорака на корисници во Кубернетес. За да го направите ова, ќе додадеме провајдер на Kuberntes OpenID, што ќе укаже дека таков корисник навистина постои, а самиот Kubernetes ќе му даде права.

Обука

  • Ќе ви треба кластер Kubernetes или minikube
  • Active Directory
  • Домени:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Сертификат за домени или самопотпишан сертификат

Нема да навлегувам во детали за тоа како да креирате самопотпишан сертификат; треба да креирате 2 сертификати, ова е коренот (Автор за сертификација) и џокерот на клиентот за доменот *.example.org

Откако ќе ги примите/запишете сертификатите, треба да го додадете сертификатот на клиентот во Kubernetes; за да го направите ова, креирајте тајна за него:

kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem

Следно ќе го користиме за нашиот Ingress контролер

Инсталација на тастатурата

Решив дека најлесниот начин е да користам готови решенија за ова, имено табелите на кормилото.

Инсталирајте го складиштето и ажурирајте го:

helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update

Направете датотека keycloak.yml со следнава содржина:

клуч.yml

keycloak:
  # Имя администратора
  username: "test_admin"
  # Пароль администратор  
  password: "admin"
  # Эти флаги нужны что бы позволить загружать в Keycloak скрипты прямо через web морду. Это нам 
  понадобиться что бы починить один баг, о котором ниже.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled" 
  # Включаем ingress, указываем имя хоста и сертификат который мы предварительно сохранили в secrets
  ingress:
    enabled: true 
    path: /
    annotations:
      kubernetes.io/ingress.class: nginx
      ingress.kubernetes.io/affinity: cookie
    hosts:
      - keycloak.example.org
    tls:
    - hosts:
        - keycloak.example.org
      secretName: tls-keycloak
  # Keycloak для своей работы требует базу данных, в тестовых целях я разворачиваю Postgresql прямо в Kuberntes, в продакшене так лучше не делать!
  persistence:
    deployPostgres: true
    dbVendor: postgres

postgresql:
  postgresUser: keycloak
  postgresPassword: ""
  postgresDatabase: keycloak
  persistence:
    enabled: true

Поставување на федерацијата

Следно, одете на веб-интерфејсот keycloak.example.org

Во левиот агол кликнете Додадете царство

Клучни
Вредност

Име
кубернети

Име на екранот
Кубернети

Оневозможи проверка на потврда за е-пошта на корисникот:
Опсегот на клиентот —> Е-пошта —> Мапери —> Потврдена е-пошта (Избриши)

Правиме федерација за увоз на корисници од ActiveDirectory, ќе оставам слики од екранот подолу, мислам дека ќе биде појасно.

Корисничка федерација —> Додај провајдер… —> ldap

Поставување на федерацијатаНие го прицврстуваме овластувањето ActiveDirectory на Kubernetes користејќи Keycloak
Ние го прицврстуваме овластувањето ActiveDirectory на Kubernetes користејќи Keycloak

Ако сè е во ред, тогаш откако ќе го притиснете копчето Синхронизирајте ги сите корисници Ќе видите порака што укажува на успешен увоз на корисници.

Следно, треба да ги мапираме нашите групи

Корисничка федерација -> ldap_localhost -> Мапери -> Креирај

Креирање маперНие го прицврстуваме овластувањето ActiveDirectory на Kubernetes користејќи Keycloak

Поставување на клиентот

Треба да креирате клиент, во смисла на Keycloak ова е апликација која ќе биде овластена од него. Ќе ги истакнам важните точки со црвено на сликата од екранот.

Клиенти -> Креирај

Поставување на клиентотНие го прицврстуваме овластувањето ActiveDirectory на Kubernetes користејќи Keycloak

Ајде да создадеме простор за групи:

Опсегот на клиентот -> Креирај

Создавање опсегНие го прицврстуваме овластувањето ActiveDirectory на Kubernetes користејќи Keycloak

И поставете мапер за нив:

Опсегот на клиенти -> групи -> Мапери -> Креирај

МаперНие го прицврстуваме овластувањето ActiveDirectory на Kubernetes користејќи Keycloak

Додаваме мапирање на нашите групи во стандардните опсези на клиенти:

Клиенти -> kubernetes -> Обеми на клиенти -> Стандардни опсези на клиенти
изберете групи в Достапни опсези на клиентикликнете Додадете избрани

Ја добиваме тајната (и ја запишуваме некаде) што ќе ја користиме за авторизација во Keycloak:

Клиенти -> kubernetes -> Ингеренции -> Тајна
Ова го комплетира поставувањето, но имав грешка кога, по успешното овластување, добив грешка 403. Извештај за грешка.

Поправи:

Опсегот на клиентот -> улоги -> Мапери -> Креирај

МаперНие го прицврстуваме овластувањето ActiveDirectory на Kubernetes користејќи Keycloak

Скрипта код

// add current client-id to token audience
token.addAudience(token.getIssuedFor());

// return token issuer as dummy result assigned to iss again
token.getIssuer();

Конфигурирање на Kubernetes

Треба да наведеме каде се наоѓа нашиот root сертификат од страницата и каде се наоѓа давателот на OIDC.
За да го направите ова, уредете ја датотеката /etc/kubernetes/manifests/kube-apiserver.yaml

kube-apiserver.yaml


...
spec:
  containers:
  - command:
    - kube-apiserver
...
    - --oidc-ca-file=/var/lib/minikube/certs/My_Root.crt
    - --oidc-client-id=kubernetes
    - --oidc-groups-claim=groups
    - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
    - --oidc-username-claim=email
...

Ажурирајте ја конфигурацијата kubeadm во кластерот:

конфигурација на kubeadm

kubectl edit -n kube-system configmaps kubeadm-config


...
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        oidc-ca-file: /var/lib/minikube/certs/My_Root.crt
        oidc-client-id: kubernetes
        oidc-groups-claim: groups
        oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
        oidc-username-claim: email
...

Поставување автентик-прокси

За да ја заштитите вашата веб-апликација, можете да го користите keycloak gatekeeper. Покрај фактот што овој обратен прокси ќе го овласти корисникот пред да ја прикаже страницата, исто така ќе пренесува информации за вас во заглавјата до крајната апликација. Така, ако вашата апликација поддржува OpenID, корисникот е веднаш овластен. Да го погледнеме примерот на Kubernetes Dashboard

Инсталирање на Kubernetes Dashboard


helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

вредности_табла.yaml

enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'

Поставување права за пристап:

Ајде да создадеме ClusterRoleBinding што ќе им даде администраторски права на кластерот (стандарден ClusterRole кластер-администратор) за корисниците во групата DataOPS.


kubectl apply -f rbac.yaml

rbac.yaml


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dataops_group
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: DataOPS

Инсталирање на чувар на клучеви:


helm repo add gabibbo97 https://gabibbo97.github.io/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml

вредности_прокси.yaml



# Включаем ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
  path: /
  hosts:
    - kubernetes-dashboard.example.org
  tls:
   - secretName: tls-keycloak
     hosts:
       - kubernetes-dashboard.example.org

# Говорим где мы будем авторизовываться у OIDC провайдера
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
# Имя клиента которого мы создали в Keycloak
ClientID: "kubernetes"
# Secret который я просил записать
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Куда перенаправить в случае успешной авторизации. Формат <SCHEMA>://<SERVICE_NAME>.><NAMESAPCE>.<CLUSTER_NAME>
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
# Пропускаем проверку сертификата, если у нас самоподписанный
skipOpenidProviderTlsVerify: true
# Настройка прав доступа, пускаем на все path если мы в группе DataOPS
rules:
  - "uri=/*|groups=DataOPS"

После тоа, кога ќе се обидете да се најавите на kubernetes-dashboard.example.org, ќе се случи пренасочување до Keycloak и ако овластувањето е успешно, ќе бидеме однесени на Контролната табла што е веќе најавени.

Инсталација на гангвеј

За погодност, можете да додадете gangway што ќе генерира конфигурациска датотека за kubectl, со чија помош ќе влеземе во Kubernetes под нашиот корисник.


helm install --name gangway stable/gangway -f values_gangway.yaml

вредности_гангвеј.yaml


gangway:
  # Произвольное имя кластера
  clusterName: "my-k8s"
  # Где у нас OIDC провайдер
  authorizeURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/auth"
  tokenURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/token"
  audience: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/userinfo"
  # Теоритически сюда можно добавить groups которые мы замапили
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Имя клиента
  clientID: "kubernetes"
  # Секрет
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Если оставить дефолтное значние, то за имя пользователя будет братья <b>Frist name</b> <b>Second name</b>, а при "sub" его логин
  usernameClaim: "sub"
  # Доменное имя или IP адресс API сервера
  apiServerURL: "https://192.168.99.111:8443"

# Включаем Ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
  path: /
  hosts:
  - gangway.example.org
  tls:
  - secretName: tls-keycloak
    hosts:
      - gangway.example.org

# Если используем самоподписанный сертификат, то его(открытый корневой сертификат) надо указать.
trustedCACert: |-
 -----BEGIN CERTIFICATE-----
 MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzAwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
 -----END CERTIFICATE-----

Изгледа нешто вака. Ви овозможува веднаш да преземете конфигурациска датотека и да ја генерирате користејќи збир на команди:

Ние го прицврстуваме овластувањето ActiveDirectory на Kubernetes користејќи Keycloak

Извор: www.habr.com

Додадете коментар