Pripájame autorizáciu ActiveDirectory k Kubernetes pomocou Keycloak

Tento článok je napísaný s cieľom rozšíriť už existujúcu, ale rozpráva o špecifikách tejto väzby práve s Microsoft ActiveDirectory a taktiež ju dopĺňa.

V tomto článku vám poviem, ako nainštalovať a nastaviť:

  • Keycloak — to je projekt s otvoreným zdrojovým kódom. Poskytuje jednotný prístupový bod pre aplikácie. Funguje s množstvom protokolov, vrátane LDAP a OpenID, ktoré nás zaujímajú.
  • Keycloak gatekeeper — reverzný proxy aplikácia, ktorá umožňuje integrovať autorizáciu cez Keycloak.
  • Gangway — aplikácia, ktorá generuje konfiguráciu pre kubectl, pomocou ktorej sa cez OpenID môžete autorizovať a pripojiť sa k Kubernetes API.

Ako fungujú práva v Kubernetes.

Spravovať práva používateľov/skupín môžeme pomocou RBAC, o čom bolo už vytvorených množstvo článkov, nebudem sa tým podrobne zaoberať. Problém je v tom, že môžete použiť RBAC na obmedzenie práv používateľa, ale Kubernetes nevie nič o používateľoch. Výsledkom je, že potrebujeme mechanizmus doručenia používateľa do Kubernetes. Na tento účel pridáme do Kubernetes OpenID poskytovateľa, ktorý potvrdí existenciu používateľa, a práva mu už pridelí Kubernetes sám.

Príprava

  • Budete potrebovať Kubernetes klaster alebo minikube.
  • Active Directory
  • Domény:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certifikát pre domény alebo samopodpisaný certifikát

Nepotrebujem podrobne rozoberať, ako vytvoriť samopodpisaný certifikát, musíte vytvoriť 2 certifikáty, jeden koreňový (Certifikačná autorita) a wildcard klientsky pre doménu *.example.org.

Po obdržaní/vypísaní certifikátov treba pridať klientsky certifikát do Kubernetes, na toto vytvoríme preň tajomstvo:

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

Ďalej ho budeme používať pre náš Ingress kontrolér.

Inštalácia Keycloak

Rozhodol som sa, že najjednoduchšie je použiť hotové riešenia, a to presne helm chart-y.

Nainštalujeme repozitár a aktualizujeme ho:

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

Vytvoríme súbor keycloak.yml s nasledujúcim obsahom:

keycloak.yml

keycloak:
  # Meno administrátora
  username: "test_admin"
  # Heslo administrátora
  password: "admin"
  # Tieto flagy sú potrebné na to, aby sa dali načítavať skripty do Keycloak priamo prostredníctvom webového rozhrania. To budeme
  potrebovať na opravu jedného problému, o ktorom bude reč nižšie.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
  # Aktivujeme ingress, uvedieme meno hostiteľa a certifikát, ktorý sme predtým uložili v 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 pre svoju činnosť potrebuje databázu. Na testovacie účely spúšťam Postgresql priamo v Kubernetese, v produkcii je to lepšie nerobiť!
  persistence:
    deployPostgres: true
    dbVendor: postgres

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

Nastavenie federácie

Ďalej vstupujeme do webového rozhrania keycloak.example.org

V ľavom rohu klikneme na Pridať realm

Kľúč
Hodnota

Názov
kubernetes

Zobrazované meno
Kubernetes

Vypneme preverovanie potvrdzovania e-mailu používateľa:
Client scopes —> Email —> Mappers —> Email verified (Odstrániť)

Nastavujeme federáciu na import používateľov z ActiveDirectory, nižšie zanechám obrázky, aby to bolo jasnejšie.

User federation —> Pridať poskytovateľa… —> ldap

Nastavenie federáciePripájame autorizáciu ActiveDirectory k Kubernetes pomocou Keycloak
Pripájame autorizáciu ActiveDirectory k Kubernetes pomocou Keycloak

Ak všetko prebehne v poriadku, po stlačení tlačidla Synchronizovať všetkých používateľov uvidíte správu o úspešnom importe používateľov.

Ďalej musíme zmapovať naše skupiny

User federation —> ldap_localhost —> Mappers —> Vytvoriť

Vytvorenie mapperaPripájame autorizáciu ActiveDirectory k Kubernetes pomocou Keycloak

Nastavenie klienta

Musíme vytvoriť klienta, v pojmoch Keycloak to je aplikácia, ktorá sa bude autentifikovať. Dôležité body zvýrazním na obrázku červenou farbou.

Clients —> Vytvoriť

Nastavenie klientaPripájame autorizáciu ActiveDirectory k Kubernetes pomocou Keycloak

Vytvoríme scoupe pre skupiny:

Client Scopes —> Vytvoriť

Vytvorenie scoupePripájame autorizáciu ActiveDirectory k Kubernetes pomocou Keycloak

A nastavíme mapper pre nich:

Client Scopes —> groups —> Mappers —> Vytvoriť

MapperPripájame autorizáciu ActiveDirectory k Kubernetes pomocou Keycloak

Pridávame mapovanie našich skupín do Default Client Scopes:

Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Vyberáme groups v Dostupné Client Scopes, klikneme na Pridať vybrané

Získame secret (a zapíšeme si ho niekam), ktorý budeme používať na autentifikáciu v Keycloak:

Clients —> kubernetes —> Credentials —> Secret
Na tomto nastavení končí, ale mal som chybu, keď som po úspešnej autentifikácii dostal chybu 403. Bug report.

Oprava:

Client Scopes —> roles —> Mappers —> Vytvoriť

MapperPripájame autorizáciu ActiveDirectory k Kubernetes pomocou Keycloak

Kód skriptu

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

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

Nastavenie Kubernetes

Musíme uviesť, kde sa nachádza náš koreňový certifikát od webovej stránky a kde sa nachádza poskytovateľ OIDC.
Na to editujeme súbor /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
...

Aktualizujeme kubeadm konfiguráciu v klastri:

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

Nastavenie auth-proxy

Na ochranu vašich webových aplikácií môžete použiť keycloak gatekeeper. Okrem toho, že tento reverzný proxy server autentifikuje užívateľa predtým, než mu zobrazí stránku, tak tiež predáva konečnej aplikácii informácie o vás v hlavičkách. Týmto spôsobom, ak vaša aplikácia podporuje OpenID, sa užívateľ okamžite autentifikuje. Pozrieme sa na príklade Kubernetes Dashboard.

Inštalácia Kubernetes Dashboard


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'

Nastavenie prístupových práv:

Vytvoríme ClusterRoleBinding, ktorý poskytne administrátorské práva (štandardná ClusterRole cluster-admin) pre užívateľov, ktorí sú v skupine 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

Inštalácia 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 tomto, pri pokuse o prístup na kubernetes-dashboard.example.org, dôjde k presmerovaniu na Keycloak a v prípade úspešnej autentifikácie sa dostaneme do Dashboardu už prihlásený.

Inštalácia gangway

Pre pohodlie môžete pridať gangway, ktorý vygeneruje konfiguračný súbor pre kubectl, pomocou ktorého sa už pod naším užívateľom dostaneme do Kubernetes.


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

values_gangway.yaml


gangway:
  # Názov clusteru
  clusterName: "my-k8s"
  # Kde je náš OIDC provider
  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"
  # Teoreticky tu môžeme pridať skupiny, ktoré sme mapovali
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Názov klienta
  clientID: "kubernetes"
  # Tajný kľúč
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Ak necháte predvolené hodnoty, vezme meno používateľa z <b>Krstné meno</b> <b>Priezvisko</b>, a pri "sub" jeho prihlásenie
  usernameClaim: "sub"
  # Doménové meno alebo IP adresa API servera
  apiServerURL: "https://192.168.99.111:8443"

# Aktivujeme 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

# Ak používame samopodpisaný certifikát, musíme uviesť jeho (otvorený koreňový certifikát).
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-----

Vyzerá približne takto. Umožňuje jednak okamžite stiahnuť konfiguračný súbor, tak aj ho vytvoriť pomocou sady príkazov:

Pripájame autorizáciu ActiveDirectory k Kubernetes pomocou Keycloak

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster