Autorizáciu ActiveDirectory pripevňujeme na Kubernetes pomocou Keycloak

Tento článok bol napísaný s cieľom rozšíriť už existujúce, ale hovorí o funkciách balíka s Microsoft ActiveDirectory a tiež ho dopĺňa.

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

  • plášť na kľúče je projekt s otvoreným zdrojom. Čo poskytuje jediný vstupný bod pre aplikácie. Pracuje s mnohými protokolmi, vrátane LDAP a OpenID, ktoré nás zaujímajú.
  • vrátnik na kľúče - aplikácia reverzného proxy, ktorá vám umožňuje integrovať autorizáciu cez Keycloak.
  • Ulička - aplikácia, ktorá generuje konfiguráciu pre kubectl, pomocou ktorej sa môžete prihlásiť a pripojiť sa k Kubernetes API cez OpenID.

Ako fungujú povolenia v Kubernetes.

Práva používateľov / skupiny môžeme spravovať pomocou RBAC, o tom už bolo vytvorených veľa článkov, nebudem sa tým podrobne zaoberať. Problém je v tom, že pomocou RBAC môžete obmedziť práva používateľov, ale Kubernetes o používateľoch nič nevie. Ukazuje sa, že v Kubernetes potrebujeme mechanizmus doručovania používateľov. Za týmto účelom pridáme do Kuberntes OpenID poskytovateľa, ktorý povie, že takýto používateľ skutočne existuje a sám Kubernetes mu dá práva.

Tréning

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

Nebudem sa venovať tomu, ako vytvoriť certifikát s vlastným podpisom, musíte vytvoriť 2 certifikáty, toto je koreňový (Certifikačná autorita) a zástupný klient pre doménu *.example.org

Po prijatí / vydaní certifikátov musí byť klient pridaný do Kubernetes, preto pre neho vytvoríme tajomstvo:

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

Ďalej ho použijeme pre náš ovládač Ingress.

Inštalácia kľúčenky

Rozhodol som sa, že najjednoduchšie je na to použiť hotové riešenia, a to kormidelníkové tabuľky.

Nainštalujte úložisko a aktualizujte ho:

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

Vytvorte súbor keycloak.yml s nasledujúcim obsahom:

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

Nastavenie federácie

Ďalej prejdite na webové rozhranie keycloak.example.org

Kliknite do ľavého rohu Pridať sféru

Kľúč
Hodnota

Meno
Kubernetes

Zobraziť meno
Kubernetes

Zakázať overenie e-mailu používateľa:
Rozsahy klientov —> E-mail —> Mapovači —> E-mail overený (Odstrániť)

Nastavili sme federáciu na import používateľov z ActiveDirectory, screenshoty nechám nižšie, myslím, že to bude jasnejšie.

Federácia používateľov —> Pridať poskytovateľa… —> ldap

Nastavenie federácieAutorizáciu ActiveDirectory pripevňujeme na Kubernetes pomocou Keycloak
Autorizáciu ActiveDirectory pripevňujeme na Kubernetes pomocou Keycloak

Ak je všetko v poriadku, potom po stlačení tlačidla Synchronizujte všetkých používateľov zobrazí sa správa o úspešnom importe používateľov.

Ďalej musíme zmapovať naše skupiny

Federácia používateľov --> ldap_localhost --> Mappers --> Vytvoriť

Vytvorenie mapovačaAutorizáciu ActiveDirectory pripevňujeme na Kubernetes pomocou Keycloak

Nastavenie klienta

Je potrebné vytvoriť klienta, v zmysle Keycloaku ide o aplikáciu, ktorá bude od neho autorizovaná. Dôležité body na snímke obrazovky zvýrazním červenou farbou.

Klienti —> Vytvoriť

Nastavenie klientaAutorizáciu ActiveDirectory pripevňujeme na Kubernetes pomocou Keycloak

Vytvorme scoupe pre skupiny:

Rozsahy klienta —> Vytvoriť

Vytvorte rozsahAutorizáciu ActiveDirectory pripevňujeme na Kubernetes pomocou Keycloak

A nastavte pre nich mapovač:

Rozsahy klienta —> skupiny —> Mapovače —> Vytvoriť

MapperAutorizáciu ActiveDirectory pripevňujeme na Kubernetes pomocou Keycloak

Pridajte mapovanie našich skupín do predvolených rozsahov klientov:

Klienti —> kubernetes —> Rozsahy klienta —> Predvolené rozsahy klienta
vybrať skupiny в Dostupné rozsahy klientov, stlačte Pridať vybraté

Získame tajomstvo (a zapíšeme ho do vlákna), ktoré použijeme na autorizáciu v Keycloak:

Klienti —> kubernetes —> Poverenia —> Tajné
Toto dokončí nastavenie, ale vyskytla sa chyba, keď som po úspešnej autorizácii dostal chybu 403. Hlásenie chyby.

Oprava:

Rozsahy klienta —> roly —> mapovače —> Vytvoriť

MapovačAutorizáciu ActiveDirectory pripevňujeme na 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();

Konfigurácia Kubernetes

Musíme špecifikovať, kde leží náš koreňový certifikát z lokality a kde sa nachádza poskytovateľ OIDC.
Ak to chcete urobiť, upravte 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
...

Aktualizujte konfiguráciu kubeadm v klastri:

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

Nastavenie auth-proxy

Na ochranu svojej webovej aplikácie môžete použiť keycloak gatekeeper. Okrem toho, že tento reverzný proxy vykoná autorizáciu používateľa pred zobrazením stránky, v hlavičkách odovzdá aj informácie o vás koncovej aplikácii. Ak teda vaša aplikácia podporuje OpenID, používateľ je okamžite autorizovaný. Zoberme si príklad 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:

Vytvorme ClusterRoleBinding, ktorý poskytne práva správcu klastra (štandardný ClusterRole cluster-admin) pre používateľov 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

Nainštalujte 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

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

Potom, keď sa pokúsite prejsť na kubernetes-dashboard.example.org, budeme presmerovaní na Keycloak a v prípade úspešnej autorizácie sa dostaneme na Dashboard už prihlásení.

inštalácia uličky

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


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

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

Vyzerá to takto. Umožňuje vám okamžite stiahnuť konfiguračný súbor a vygenerovať ho pomocou sady príkazov:

Autorizáciu ActiveDirectory pripevňujeme na Kubernetes pomocou Keycloak

Zdroj: hab.com

Pridať komentár