Kinnitame ActiveDirectory autoriseerimise Kubernetes'iga Keycloaki abil

See artikkel on kirjutatud juba selle laiendamiseks olemasolevad, kuid räägib Microsoft ActiveDirectory komplekti funktsioonidest ja täiendab seda ka.

Selles artiklis räägin teile, kuidas installida ja konfigureerida:

  • võtmesärk on avatud lähtekoodiga projekt. Mis pakub rakenduste jaoks ühtset sisenemispunkti. Töötab paljude protokollidega, sealhulgas LDAP ja OpenID, millest oleme huvitatud.
  • võtmekepp väravavaht - pöördpuhverserveri rakendus, mis võimaldab teil Keycloaki kaudu autoriseerimist integreerida.
  • Vahekäik - rakendus, mis genereerib kubectli konfiguratsiooni, millega saate sisse logida ja OpenID kaudu Kubernetes API-ga ühenduse luua.

Kuidas load Kubernetesis töötavad.

Kasutajate / rühmade õigusi saame hallata RBAC-i abil, selle kohta on juba hunnik artikleid loodud, ma ei hakka sellel üksikasjalikult peatuma. Probleem on selles, et kasutajaõiguste piiramiseks saab kasutada RBAC-i, kuid Kubernetes ei tea kasutajatest midagi. Selgub, et vajame Kubernetesis kasutajate edastamise mehhanismi. Selleks lisame Kuberntes OpenID-le pakkuja, kes ütleb, et selline kasutaja on tõesti olemas ja Kubernetes ise annab talle õigused.

Koolitus

  • Teil on vaja Kubernetese klastrit või minikube
  • Active Directory
  • Domeenid:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Domeenide sertifikaat või iseallkirjastatud sertifikaat

Ma ei peatu iseallkirjastatud sertifikaadi loomisel, peate looma 2 sertifikaati, see on domeeni *.example.org juur (sertifitseerimisasutus) ja metamärgi klient

Pärast sertifikaatide saamist / väljastamist tuleb klient Kubernetesesse lisada, selleks loome selle jaoks saladuse:

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

Järgmisena kasutame seda meie Ingressi kontrolleri jaoks.

Võtmekatte paigaldamine

Otsustasin, et kõige lihtsam on selleks kasutada valmislahendusi, nimelt tüürikaarte.

Installige hoidla ja värskendage seda:

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

Looge järgmise sisuga fail keycloak.yml:

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

Föderatsiooni seadistamine

Järgmisena minge veebiliidesele keycloak.example.org

Klõpsake vasakus nurgas Lisa valdkond

Võti
Väärtus

Nimi
kubernetes

Näita Nimi
Kubernetes

Keela kasutaja e-posti kinnitamine:
Kliendi ulatused —> E-post —> Kaardistajad —> E-post kinnitatud (Kustuta)

Seadistasime föderatsiooni, et importida kasutajaid ActiveDirectoryst, jätan alla ekraanipildid, arvan, et see on selgem.

Kasutajate liit —> Lisa pakkuja… —> ldap

Föderatsiooni seadistamineKinnitame ActiveDirectory autoriseerimise Kubernetes'iga Keycloaki abil
Kinnitame ActiveDirectory autoriseerimise Kubernetes'iga Keycloaki abil

Kui kõik on korras, siis pärast nupule vajutamist Sünkroonige kõik kasutajad näete teadet kasutajate eduka impordi kohta.

Järgmiseks peame oma rühmad kaardistama

Kasutajate liitmine --> ldap_localhost --> Kaardistajad --> Loo

Kaardistaja loomineKinnitame ActiveDirectory autoriseerimise Kubernetes'iga Keycloaki abil

Kliendi seadistamine

Peate looma kliendi, Keycloaki osas on see rakendus, mis volitatakse temalt. Toon ekraanipildil punasega esile olulised punktid.

Kliendid —> Loo

Kliendi seadistamineKinnitame ActiveDirectory autoriseerimise Kubernetes'iga Keycloaki abil

Loome rühmade jaoks skaala:

Kliendi ulatused —> Loo

Loo ulatusKinnitame ActiveDirectory autoriseerimise Kubernetes'iga Keycloaki abil

Ja koostage neile kaardistaja:

Kliendi ulatused —> grupid —> Kaardistajad —> Loo

KaardistajaKinnitame ActiveDirectory autoriseerimise Kubernetes'iga Keycloaki abil

Lisage meie rühmade vastendamine kliendi vaikeulatustele:

Kliendid —> kubernetes —> Kliendi ulatused —> Kliendi vaikeulatused
valima rühmade в Saadaolevad kliendi ulatusedklõps Lisa valitud

Saame saladuse (ja kirjutame selle lõime), mida kasutame Keycloakis autoriseerimiseks:

Kliendid —> kubernetes —> Mandaat —> Saladus
See lõpetab seadistamise, kuid mul tekkis viga, kui pärast edukat autoriseerimist sain veateate 403. Veateade.

Paranda:

Kliendi ulatused —> rollid —> Kaardistajad —> Loo

KaardistajaKinnitame ActiveDirectory autoriseerimise Kubernetes'iga Keycloaki abil

Skripti kood

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

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

Kubernetese konfigureerimine

Peame täpsustama, kus asub meie saidi juursertifikaat ja kus asub OIDC pakkuja.
Selleks muutke faili /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
...

Värskendage kubeadmi konfiguratsiooni klastris:

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-puhverserveri seadistamine

Saate oma veebirakenduse kaitsmiseks kasutada võtmeklapi väravahoidjat. Lisaks sellele, et see pöördpuhverserver volitab kasutajat enne lehe näitamist, edastab see teie kohta teavet ka päistes olevale lõpprakendusele. Seega, kui teie rakendus toetab OpenID-d, antakse kasutajale kohe luba. Mõelge Kubernetese armatuurlaua näitele

Kubernetese armatuurlaua installimine


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

Values_dashboard.yaml

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

Juurdepääsuõiguste määramine:

Loome ClusterRoleBindingi, mis annab DataOPS-rühma kasutajatele klastri administraatori õigused (standardne ClusterRole cluster-admin).


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

Installige võtmekatte 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äärtused_puhverserver.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ärast seda, kui proovite minna kubernetes-dashboard.example.org, suunatakse meid Keycloaki ja eduka autoriseerimise korral jõuame juba sisse logitud armatuurlauale.

käigutee paigaldamine

Mugavuse huvides saate lisada käigutee, mis genereerib kubectli jaoks konfiguratsioonifaili, mille abil jõuame oma kasutaja alla Kubernetesesse.


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

väärtused_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-----

Näeb välja selline. Võimaldab kohe alla laadida konfiguratsioonifaili ja genereerida selle käsukomplekti abil:

Kinnitame ActiveDirectory autoriseerimise Kubernetes'iga Keycloaki abil

Allikas: www.habr.com

Lisa kommentaar