Mēs piestiprinām ActiveDirectory autorizāciju Kubernetes, izmantojot Keycloak

Šis raksts ir uzrakstīts, lai paplašinātu jau esošo esošo, bet runā par komplekta iespējām ar Microsoft ActiveDirectory, kā arī to papildina.

Šajā rakstā es jums pastāstīšu, kā instalēt un konfigurēt:

  • atslēgas apmetnis ir atvērtā koda projekts. Kas nodrošina vienotu ieejas punktu lietojumprogrammām. Darbojas ar daudziem protokoliem, tostarp LDAP un OpenID, kas mūs interesē.
  • atslēgu apmetnis vārtsargs - apgrieztā starpniekservera lietojumprogramma, kas ļauj integrēt autorizāciju, izmantojot Keycloak.
  • ejā - lietojumprogramma, kas ģenerē kubectl konfigurāciju, ar kuru varat pieteikties un izveidot savienojumu ar Kubernetes API, izmantojot OpenID.

Kā atļaujas darbojas Kubernetes.

Mēs varam pārvaldīt lietotāju / grupu tiesības, izmantojot RBAC, par to jau ir izveidots virkne rakstu, es par to sīkāk nekavēšos. Problēma ir tā, ka jūs varat izmantot RBAC, lai ierobežotu lietotāju tiesības, bet Kubernetes neko nezina par lietotājiem. Izrādās, ka mums ir nepieciešams lietotāja piegādes mehānisms Kubernetes. Lai to izdarītu, Kuberntes OpenID pievienosim pakalpojumu sniedzēju, kas pateiks, ka šāds lietotājs patiešām pastāv, un pati Kubernetes viņam piešķirs tiesības.

Treniņš

  • Jums būs nepieciešams Kubernetes klasteris vai minikube
  • Active Directory
  • Domēni:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Sertifikāts domēniem vai pašparakstīts sertifikāts

Es nekavēšos pie tā, kā izveidot pašparakstītu sertifikātu, jums ir jāizveido 2 sertifikāti, tas ir saknes (sertifikācijas iestāde) un aizstājējzīmju klients domēnam *.example.org

Pēc sertifikātu saņemšanas / izsniegšanas klients ir jāpievieno Kubernetes, šim nolūkam mēs tam izveidojam noslēpumu:

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

Tālāk mēs to izmantosim mūsu Ingress kontrolierim.

Atslēgvārpa uzstādīšana

Nolēmu, ka vienkāršākais veids tam ir izmantot gatavus risinājumus, proti, stūres diagrammas.

Instalējiet repozitoriju un atjauniniet to:

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

Izveidojiet failu keycloak.yml ar šādu saturu:

keycoak.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

Federācijas iestatīšana

Pēc tam dodieties uz tīmekļa saskarni keycloak.example.org

Noklikšķiniet kreisajā stūrī Pievienojiet sfēru

Taustiņš
Vērtība

Vārds
Kubernetes

Rādīt Vārds
Kubernetes

Atspējot lietotāja e-pasta verifikāciju:
Klientu darbības jomas —> E-pasts —> Kartētāji —> E-pasts pārbaudīts (dzēst)

Mēs izveidojām federāciju, lai importētu lietotājus no ActiveDirectory, zemāk atstāšu ekrānuzņēmumus, es domāju, ka tas būs skaidrāks.

Lietotāju federācija —> Pievienot pakalpojumu sniedzēju... —> ldap

Federācijas iestatīšanaMēs piestiprinām ActiveDirectory autorizāciju Kubernetes, izmantojot Keycloak
Mēs piestiprinām ActiveDirectory autorizāciju Kubernetes, izmantojot Keycloak

Ja viss ir kārtībā, tad pēc pogas nospiešanas Sinhronizēt visus lietotājus jūs redzēsit ziņojumu par veiksmīgu lietotāju importēšanu.

Tālāk mums ir jākartē mūsu grupas

Lietotāju federācija --> ldap_localhost --> Kartētāji --> Izveidot

Kartētāja izveideMēs piestiprinām ActiveDirectory autorizāciju Kubernetes, izmantojot Keycloak

Klienta iestatīšana

Ir nepieciešams izveidot klientu, Keycloak ziņā šī ir lietojumprogramma, kas tiks autorizēta no viņa. Svarīgos punktus ekrānuzņēmumā iezīmēšu sarkanā krāsā.

Klienti —> Izveidot

Klienta iestatīšanaMēs piestiprinām ActiveDirectory autorizāciju Kubernetes, izmantojot Keycloak

Izveidosim skopu grupām:

Klientu darbības jomas —> Izveidot

Izveidojiet darbības jomuMēs piestiprinām ActiveDirectory autorizāciju Kubernetes, izmantojot Keycloak

Un izveidojiet viņiem kartētāju:

Klientu darbības jomas —> grupas —> Kartētāji —> Izveidot

KartētājsMēs piestiprinām ActiveDirectory autorizāciju Kubernetes, izmantojot Keycloak

Pievienojiet mūsu grupu kartēšanu noklusējuma klientu tvērumam:

Klienti —> kubernetes —> Klientu darbības jomas —> Noklusējuma klientu darbības jomas
atlasīt grupas в Pieejamie klientu loki, nospiediet Pievienot atlasīto

Mēs iegūstam noslēpumu (un ierakstām to pavedienā), ko izmantosim autorizācijai Keycloak:

Klienti —> kubernetes —> akreditācijas dati —> slepenie dati
Tādējādi iestatīšana tiek pabeigta, taču man radās kļūda, kad pēc veiksmīgas autorizācijas saņēmu kļūdu 403. Kļūdu ziņojums.

Labot:

Klientu darbības jomas —> lomas —> Kartētāji —> Izveidot

KartētājsMēs piestiprinām ActiveDirectory autorizāciju Kubernetes, izmantojot Keycloak

Skripta kods

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

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

Kubernetes konfigurēšana

Mums ir jānorāda, kur atrodas mūsu saknes sertifikāts no vietnes un kur atrodas OIDC nodrošinātājs.
Lai to izdarītu, rediģējiet failu /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
...

Atjauniniet kubeadm konfigurāciju klasterī:

kubeadmconfig

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
...

Auth-starpniekservera iestatīšana

Varat izmantot Keycloak Gatekeeper, lai aizsargātu savu tīmekļa lietojumprogrammu. Papildus tam, ka šis apgrieztais starpniekserveris autorizēs lietotāju pirms lapas parādīšanas, tas arī nosūtīs informāciju par jums gala lietojumprogrammai galvenēs. Tādējādi, ja jūsu lietojumprogramma atbalsta OpenID, lietotājs tiek nekavējoties autorizēts. Apsveriet Kubernetes informācijas paneļa piemēru

Kubernetes informācijas paneļa instalēšana


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

vērtības_dashboard.yaml

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

Piekļuves tiesību iestatīšana:

Izveidosim ClusterRoleBinding, kas piešķirs klastera administratora tiesības (standarta ClusterRole cluster-admin) DataOPS grupas lietotājiem.


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

Instalējiet keycloak gatekeeper:


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

vērtības_proxy.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"

Pēc tam, kad jūs mēģināt doties uz kubernetes-dashboard.example.org, mēs tiksim novirzīti uz Keycloak un veiksmīgas autorizācijas gadījumā nokļūsim informācijas panelī, kas jau ir pieteicies.

eju uzstādīšana

Ērtības labad varat pievienot eju, kas ģenerēs kubectl konfigurācijas failu, ar kura palīdzību mēs nokļūsim Kubernetes zem mūsu lietotāja.


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

vērtības_gangway.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-----

Izskatās šādi. Ļauj nekavējoties lejupielādēt konfigurācijas failu un ģenerēt to, izmantojot komandu kopu:

Mēs piestiprinām ActiveDirectory autorizāciju Kubernetes, izmantojot Keycloak

Avots: www.habr.com

Pievieno komentāru