Avtorizacijo ActiveDirectory pritrdimo na Kubernetes s pomočjo Keycloaka

Ta članek je bil napisan, da bi razširil že obstoječih, vendar govori o funkcijah svežnja z Microsoft ActiveDirectory in ga tudi dopolnjuje.

V tem članku vam bom povedal, kako namestiti in konfigurirati:

  • keycloak je odprtokodni projekt. Kar zagotavlja enotno vstopno točko za aplikacije. Deluje s številnimi protokoli, vključno z LDAP in OpenID, ki nas zanimata.
  • keycloak gatekeeper - povratna proxy aplikacija, ki vam omogoča integracijo avtorizacije prek Keycloak.
  • Prelaz - aplikacija, ki ustvari konfiguracijo za kubectl, s katero se lahko prijavite in povežete z API-jem Kubernetes prek OpenID.

Kako delujejo dovoljenja v Kubernetesu.

Z RBAC lahko upravljamo pravice uporabnikov / skupin, o tem je bilo ustvarjenih že kup člankov, o tem se ne bom podrobneje ukvarjal. Težava je v tem, da lahko uporabite RBAC za omejitev uporabniških pravic, Kubernetes pa o uporabnikih ne ve ničesar. Izkazalo se je, da v Kubernetesu potrebujemo mehanizem za dostavo uporabnikom. Za to bomo v Kuberntes OpenID dodali ponudnika, ki bo povedal, da tak uporabnik res obstaja, in Kubernetes sam mu bo podelil pravice.

Izobraževanje

  • Potrebovali boste gručo Kubernetes ali minikube
  • Active Directory
  • Domene:
    keycloak.example.org
    kubernetes-nadzorna plošča.example.org
    prehod.example.org
  • Certifikat za domene ali samopodpisan certifikat

Ne bom se ukvarjal s tem, kako ustvariti samopodpisano potrdilo, ustvariti morate 2 potrdila, to je koren (Certificate Authority) in odjemalec z nadomestnimi znaki za domeno *.example.org

Ko prejmete/izdate potrdila, je treba stranko dodati v Kubernetes, za to ustvarimo skrivnost zanjo:

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

Nato ga bomo uporabili za naš krmilnik Ingress.

Namestitev Keycloak

Odločil sem se, da je najlažje uporabiti že pripravljene rešitve za to, in sicer krmilne karte.

Namestite repozitorij in ga posodobite:

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

Ustvarite datoteko keycloak.yml z naslednjo vsebino:

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

Nastavitev federacije

Nato pojdite na spletni vmesnik keycloak.example.org

Kliknite v levem kotu Dodaj kraljestvo

Ključne
vrednost

Ime
Kubernetes

Display Name
Kubernetes

Onemogoči preverjanje e-pošte uporabnika:
Obseg odjemalca —> E-pošta —> Preslikavci —> E-pošta preverjena (Izbriši)

Postavili smo zvezo za uvoz uporabnikov iz ActiveDirectoryja, spodaj bom pustil posnetke zaslona, ​​mislim, da bo bolj jasno.

Zveza uporabnikov —> Dodaj ponudnika… —> ldap

Nastavitev federacijeAvtorizacijo ActiveDirectory pritrdimo na Kubernetes s pomočjo Keycloaka
Avtorizacijo ActiveDirectory pritrdimo na Kubernetes s pomočjo Keycloaka

Če je vse v redu, potem po pritisku na gumb Sinhroniziraj vse uporabnike videli boste sporočilo o uspešnem uvozu uporabnikov.

Nato moramo preslikati svoje skupine

Zveza uporabnikov --> ldap_localhost --> Mappers --> Create

Ustvarjanje preslikaveAvtorizacijo ActiveDirectory pritrdimo na Kubernetes s pomočjo Keycloaka

Nastavitev odjemalca

Treba je ustvariti odjemalca, v smislu Keycloaka je to aplikacija, ki jo bo avtoriziral. Pomembne točke na posnetku zaslona bom poudaril z rdečo.

Stranke —> Ustvari

Nastavitev odjemalcaAvtorizacijo ActiveDirectory pritrdimo na Kubernetes s pomočjo Keycloaka

Ustvarimo obseg za skupine:

Obseg odjemalca —> Ustvari

Ustvari obsegAvtorizacijo ActiveDirectory pritrdimo na Kubernetes s pomočjo Keycloaka

In jim nastavite preslikavo:

Obseg odjemalca —> skupine —> Preslikavci —> Ustvari

MapperAvtorizacijo ActiveDirectory pritrdimo na Kubernetes s pomočjo Keycloaka

Dodajte preslikavo naših skupin v obsege privzetih strank:

Odjemalci —> kubernetes —> Obseg odjemalca —> Privzeti obseg odjemalca
Izberite skupine в Razpoložljivi obsegi strank, pritisnite Dodaj izbrano

Dobimo skrivnost (in jo zapišemo v nit), ki jo bomo uporabili za avtorizacijo v Keycloaku:

Odjemalci —> kubernetes —> Poverilnice —> Skrivnost
S tem je nastavitev končana, vendar sem imel napako, ko sem po uspešni avtorizaciji prejel napako 403. Poročilo o napaki.

Popravek:

Obseg odjemalca —> vloge —> Preslikavci —> Ustvari

KartaAvtorizacijo ActiveDirectory pritrdimo na Kubernetes s pomočjo Keycloaka

Koda skripta

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

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

Konfiguriranje Kubernetesa

Določiti moramo, kje leži naše korensko potrdilo s spletnega mesta in kje se nahaja ponudnik OIDC.
Če želite to narediti, uredite datoteko /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
...

Posodobite konfiguracijo kubeadm v gruči:

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

Nastavitev auth-proxyja

Za zaščito vaše spletne aplikacije lahko uporabite keycloak gatekeeper. Poleg tega, da bo ta povratni proxy pooblastil uporabnika pred prikazom strani, bo posredoval tudi podatke o vas končni aplikaciji v glavah. Torej, če vaša aplikacija podpira OpenID, je uporabnik takoj avtoriziran. Razmislite o primeru nadzorne plošče Kubernetes

Namestitev nadzorne plošče Kubernetes


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'

Nastavitev pravic dostopa:

Ustvarimo ClusterRoleBinding, ki bo dal skrbniške pravice gruče (standardni ClusterRole cluster-admin) za uporabnike v skupini 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

Namestite 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

values_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"

Po tem, ko poskušate iti na kubernetes-nadzorna plošča.example.org, bomo preusmerjeni na Keycloak in v primeru uspešne avtorizacije bomo že prijavljeni prišli na nadzorno ploščo.

namestitev prehoda

Za udobje lahko dodate prehod, ki bo ustvaril konfiguracijsko datoteko za kubectl, s pomočjo katere bomo vstopili v Kubernetes pod našim uporabnikom.


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

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

Izgleda takole. Omogoča vam, da takoj prenesete konfiguracijsko datoteko in jo ustvarite z nizom ukazov:

Avtorizacijo ActiveDirectory pritrdimo na Kubernetes s pomočjo Keycloaka

Vir: www.habr.com

Dodaj komentar