Wy befestigje ActiveDirectory-autorisaasje oan Kubernetes mei Keycloak

Dit artikel is skreaun mei it doel om it al út te wreidzjen besteande, mar praat oer de funksjes fan 'e ferbining spesifyk mei Microsoft ActiveDirectory, en komplementearret it ek.

Yn dit artikel sil ik jo fertelle hoe't jo ynstallearje en konfigurearje:

  • keycloak is in iepen boarne projekt. Wat jout ien yngong punt foar applikaasjes. Wurket mei in protte protokollen, ynklusyf LDAP en OpenID, dy't fan belang binne foar ús.
  • Keycloak poartewachter - in omkearde proxy-applikaasje wêrmei jo autorisaasje kinne yntegrearje fia Keycloak.
  • Gangway - in applikaasje dy't in konfiguraasje genereart foar kubectl wêrmei jo kinne oanmelde fia OpenID en ferbine mei de Kubernetes API.

Hoe tagongsrjochten wurkje yn Kubernetes.

Wy kinne brûker / groep rjochten beheare mei help fan RBAC, in boskje artikels binne al makke oer dit, ik sil net dwaen op dit yn detail. It probleem is dat jo RBAC brûke kinne om brûkersrjochten te beheinen, mar Kubernetes wit neat oer brûkers. It docht bliken dat wy in meganisme foar levering fan brûkers nedich hawwe yn Kubernetes. Om dit te dwaan, sille wy in provider tafoegje oan Kuberntes OpenID, wat sil oanjaan dat sa'n brûker echt bestiet, en Kubernetes sels sil him rjochten jaan.

Tarieding fan

  • Jo sille in Kubernetes-kluster of minikube nedich wêze
  • Active Directory
  • Domeinen:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Sertifikaat foar domeinen of sels ûndertekene sertifikaat

Ik sil net yn detail yngean oer hoe't jo in sels-ûndertekene sertifikaat kinne oanmeitsje; jo moatte 2 sertifikaten oanmeitsje, dit is de root (sertifikaasjeautoriteit) en de client-wildcard foar it *.example.org-domein

Neidat jo de sertifikaten ûntfange/skriuwe, moatte jo it kliïntsertifikaat tafoegje oan Kubernetes; om dit te dwaan, meitsje der in geheim foar:

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

Folgjende sille wy it brûke foar ús Ingress-controller

Keycloak Ynstallaasje

Ik besleat dat de maklikste manier wie om hjir kleare oplossingen foar te brûken, nammentlik helmkaarten.

Ynstallearje it repository en aktualisearje it:

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

Meitsje in keycloak.yml-bestân mei de folgjende ynhâld:

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

Federaasje opset

Gean dan nei de webynterface keycloak.example.org

Klikje yn 'e linker hoeke Foegje ryk ta

Kaai
Wearde

namme
kubernetes

NAME OF TRANSLATORS
Kubernetes

Skeakelje kontrôle fan e-postbefêstiging fan brûkers út:
Klantbereiken -> E-post -> Mappers -> E-post ferifiearre (wiskje)

Wy sette in federaasje op om brûkers te ymportearjen fan ActiveDirectory, ik sil screenshots hjirûnder litte, ik tink dat it dúdliker sil wêze.

Brûkersfederaasje -> Provider tafoegje ... -> ldap

Federaasje opsetWy befestigje ActiveDirectory-autorisaasje oan Kubernetes mei Keycloak
Wy befestigje ActiveDirectory-autorisaasje oan Kubernetes mei Keycloak

As alles goed is, dan nei it drukken op de knop Syngronisearje alle brûkers Jo sille in berjocht sjen dat de suksesfolle ymport fan brûkers oanjout.

Dêrnei moatte wy ús groepen yn kaart bringe

Brûkersfederaasje -> ldap_localhost -> Mappers -> Meitsje

It meitsjen fan in mapperWy befestigje ActiveDirectory-autorisaasje oan Kubernetes mei Keycloak

Client opset

Jo moatte in klant oanmeitsje, yn termen fan Keycloak is dit in applikaasje dy't der troch sil wurde autorisearre. Ik sil wichtige punten yn read markearje yn 'e skermprint.

Klanten -> Meitsje

Client opsetWy befestigje ActiveDirectory-autorisaasje oan Kubernetes mei Keycloak

Litte wy in scoupe meitsje foar groepen:

Client Scopes -> Create

It meitsjen fan in omfangWy befestigje ActiveDirectory-autorisaasje oan Kubernetes mei Keycloak

En set in mapper foar har op:

Client Scopes -> groepen -> Mappers -> Create

MapperWy befestigje ActiveDirectory-autorisaasje oan Kubernetes mei Keycloak

Wy foegje mapping fan ús groepen ta oan Standert Client Scopes:

Clients -> kubernetes -> Client Scopes -> Standert Client Scopes
Kies groepen в Beskikbere Client Scopes, drukke Taheakje selektearre

Wy krije it geheim (en skriuwe it earne op) dat wy sille brûke foar autorisaasje yn Keycloak:

Klanten -> kubernetes -> Credentials -> Geheim
Dit foltôget de opset, mar ik hie in flater doe't ik, nei suksesfolle autorisaasje, in 403-flater krige. Bug rapport.

Meitsje:

Client Scopes -> rollen -> Mappers -> Create

MappersWy befestigje ActiveDirectory-autorisaasje oan Kubernetes mei Keycloak

Skript koade

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

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

Kubernetes konfigurearje

Wy moatte oanjaan wêr't ús root-sertifikaat fan 'e side leit, en wêr't de OIDC-provider sit.
Om dit te dwaan, bewurkje de triem /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
...

Update kubeadm config yn it kluster:

kubeadm konfiguraasje

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-proxy ynstelle

Om jo webapplikaasje te beskermjen, kinne jo keycloak-poartewachter brûke. Neist it feit dat dizze omkearde proxy de brûker autorisearje sil foardat de side werjûn wurdt, sil it ek ynformaasje oer jo stjoere yn 'e kopteksten nei de einapplikaasje. Dus, as jo applikaasje OpenID stipet, wurdt de brûker fuortendaliks autorisearre. Litte wy nei it foarbyld fan Kubernetes Dashboard sjen

Ynstallaasje fan 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'

Tagongsrjochten ynstelle:

Litte wy in ClusterRoleBinding oanmeitsje dy't klusteradminrjochten sil jaan (standert ClusterRole cluster-admin) foar brûkers yn 'e DataOPS-groep.


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

Ynstallearje keycloak poartewachter:


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"

Dêrnei, as jo besykje oan te melden by kubernetes-dashboard.example.org, sil in trochferwizing nei Keycloak foarkomme en as autorisaasje suksesfol is, wurde wy nommen nei it Dashboard dat al oanmeld is.

Gangway ynstallaasje

Foar gemak kinne jo in gangway tafoegje dy't in konfiguraasjetriem sil generearje foar kubectl, mei help wêrfan wy yn Kubernetes komme ûnder ús brûker.


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

It sjocht der sa út. Hjirmei kinne jo fuortendaliks in konfiguraasjetriem downloade en generearje mei in set kommando's:

Wy befestigje ActiveDirectory-autorisaasje oan Kubernetes mei Keycloak

Boarne: www.habr.com

Add a comment