Pričvršćujemo ActiveDirectory autorizaciju za Kubernetes koristeći Keycloak

Ovaj članak je napisan s ciljem proširenja već postojeći, ali govori o karakteristikama veze posebno s Microsoft ActiveDirectory, a također ga dopunjuje.

U ovom članku ću vam reći kako instalirati i konfigurirati:

  • keycloak je projekat otvorenog koda. Što pruža jednu ulaznu tačku za aplikacije. Radi sa mnogim protokolima, uključujući LDAP i OpenID, koji nas zanimaju.
  • Keycloak gatekeeper — Reverse proxy aplikacija koja vam omogućava da integrišete autorizaciju putem Keycloak-a.
  • prolaz — aplikacija koja generiše konfiguraciju za kubectl sa kojom se možete prijaviti preko OpenID-a i povezati se na Kubernetes API.

Kako dozvole funkcionišu u Kubernetesu.

Možemo upravljati korisničkim/grupnim pravima pomoću RBAC-a, o tome je već napravljeno hrpa članaka, neću se detaljnije zadržavati na tome. Problem je što možete koristiti RBAC da ograničite korisnička prava, ali Kubernetes ne zna ništa o korisnicima. Ispostavilo se da nam je potreban mehanizam isporuke korisnika u Kubernetesu. Da bismo to učinili, dodaćemo provajdera u Kuberntes OpenID, što će ukazati da takav korisnik zaista postoji, a sam Kubernetes će mu dati prava.

Trening

  • Trebat će vam Kubernetes klaster ili minikube
  • Aktivni direktorij
  • domene:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certifikat za domene ili samopotpisani certifikat

Neću ulaziti u detalje o tome kako kreirati samopotpisani certifikat; trebate kreirati 2 certifikata, ovo je korijen (Certification Authority) i zamjenski znak klijenta za *.example.org domenu

Nakon što primite/ispišete certifikate, morate dodati certifikat klijenta u Kubernetes; da biste to učinili, kreirajte tajnu za njega:

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

Zatim ćemo ga koristiti za naš Ingress kontroler

Keycloak Installation

Odlučio sam da je za to najlakši način koristiti gotova rješenja, odnosno helm charts.

Instalirajte spremište i ažurirajte ga:

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

Kreirajte keycloak.yml datoteku sa sljedećim sadržajem:

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

Postavljanje federacije

Zatim idite na web interfejs keycloak.example.org

U lijevom kutu kliknite Dodaj carstvo

ključ
vrijednost

Ime
kubernetes

Display Name
Kubernet

Onemogućite provjeru korisničke potvrde e-pošte:
Opseg klijenta —> E-pošta —> Maperi —> E-pošta verifikovana (Izbriši)

Postavljamo federaciju za uvoz korisnika iz ActiveDirectoryja, ostaviću slike ispod, mislim da će biti jasnije.

Korisnička federacija —> Dodaj provajdera… —> ldap

Postavljanje federacijePričvršćujemo ActiveDirectory autorizaciju za Kubernetes koristeći Keycloak
Pričvršćujemo ActiveDirectory autorizaciju za Kubernetes koristeći Keycloak

Ako je sve u redu, onda nakon pritiska na dugme Sinhronizirajte sve korisnike Vidjet ćete poruku koja označava uspješan uvoz korisnika.

Zatim moramo mapirati naše grupe

Korisnička federacija -> ldap_localhost -> Maperi -> Kreiraj

Kreiranje maperaPričvršćujemo ActiveDirectory autorizaciju za Kubernetes koristeći Keycloak

Podešavanje klijenta

Morate kreirati klijenta, u smislu Keycloak-a ovo je aplikacija koja će biti ovlaštena od njega. Na snimku ekrana ću istaknuti važne tačke crvenom bojom.

Klijenti -> Kreiraj

Podešavanje klijentaPričvršćujemo ActiveDirectory autorizaciju za Kubernetes koristeći Keycloak

Kreirajmo scoupe za grupe:

Opseg klijenta -> Kreiraj

Kreiranje opsegaPričvršćujemo ActiveDirectory autorizaciju za Kubernetes koristeći Keycloak

I postavite maper za njih:

Opseg klijenta -> grupe -> Maperi -> Kreiraj

MapperPričvršćujemo ActiveDirectory autorizaciju za Kubernetes koristeći Keycloak

Dodajemo mapiranje naših grupa u zadane opsege klijenata:

Klijenti -> kubernetes -> Opsezi klijenta -> Zadani opsegi klijenta
Odaberite grupe в Dostupni opseg klijenta, pritisnite Dodaj odabrano

Dobijamo tajnu (i zapisujemo je negdje) koju ćemo koristiti za autorizaciju u Keycloaku:

Klijenti -> kubernetes -> Akreditivi -> Tajna
Ovim je podešavanje završeno, ali sam imao grešku kada sam, nakon uspješne autorizacije, dobio grešku 403. Izveštaj o grešci.

Popravi:

Opseg klijenta -> uloge -> Maperi -> Kreiraj

MaperiPričvršćujemo ActiveDirectory autorizaciju za Kubernetes koristeći Keycloak

Skriptni kod

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

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

Konfigurisanje Kubernetesa

Moramo da naznačimo gde se nalazi naš root sertifikat sa sajta i gde se nalazi OIDC provajder.
Da biste to učinili, uredite datoteku /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
...

Ažurirajte kubeadm konfiguraciju u klasteru:

kubeadm config

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

Postavljanje auth-proxy

Da biste zaštitili svoju web aplikaciju, možete koristiti keycloak gatekeeper. Osim što će ovaj obrnuti proxy autorizirati korisnika prije prikazivanja stranice, on će također prenijeti informacije o vama u zaglavljima do krajnje aplikacije. Dakle, ako vaša aplikacija podržava OpenID, korisnik je odmah autorizovan. Pogledajmo primjer Kubernetes Dashboard-a

Instaliranje Kubernetes Dashboard-a


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'

Postavljanje prava pristupa:

Kreirajmo ClusterRoleBinding koji će dati administratorska prava klastera (standardni ClusterRole cluster-admin) za korisnike u grupi 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

Instaliranje keycloak gatekeeper-a:


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"

Nakon toga, kada pokušate da se prijavite na kubernetes-dashboard.example.org, doći će do preusmjeravanja na Keycloak i ako je autorizacija uspješna, bit ćemo odvedeni na Dashboard koji smo već prijavljeni.

Instalacija prolaza

Radi praktičnosti, možete dodati prolaz koji će generirati konfiguracijski fajl za kubectl, uz pomoć kojeg ćemo ući u Kubernetes pod našim korisnikom.


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 otprilike ovako. Omogućava vam da odmah preuzmete konfiguracijsku datoteku i generirate je pomoću skupa naredbi:

Pričvršćujemo ActiveDirectory autorizaciju za Kubernetes koristeći Keycloak

izvor: www.habr.com

Dodajte komentar