Seome ActiveDirectory autoriseerimise Kubernetesega Keycloakiga

See artikkel on kirjutatud eesmärgiga laiendada juba olemasolevat, kuid räägib täpselt Microsoft Active Directory sidumise omadustest ja täiendab seda.

Selles artiklis räägin, kuidas installida ja seadistada:

  • Keycloak on avatud lähtekoodiga projekt, mis tagab ühe sisselogimispunkti rakendustele. Töötab paljude protokollidega, sealhulgas LDAP ja OpenID, mis meid huvitavad.
  • Keycloak gatekeeper on pöördproksi rakendus, mis võimaldab integreerida autolasutuse läbi Keycloak.
  • Gangway on rakendus, mis genereerib kubectl-i konfi, mille abil saab OpenID kaudu autolasuda ja Kubernetes API-le ühenduda.

Kuidas töötavad õigused Kuberneteses.

Kasutaja/gruppide õigusi saame hallata RBAC-iga, mille kohta on kirjutatud juba palju artikleid, seega ei hakka ma sel teemal pikalt peatuma. Probleem seisneb selles, et saate RBAC-i kasutada kasutaja õiguste piiramiseks, kuid Kubernetes ei tunne kasutajaid. Seega on vajalik mehhanism, mis toob kasutaja Kubernetesesse. Selleks lisame Kubernetesesse OpenID pakkuja, mis tõendab, et antud kasutaja tõeliselt eksisteerib, ja õigused annab Kubernetes ise.

Ettevalmistus

  • Vajate Kubernetes klastrit või minikube'i
  • Active Directory
  • Domeenid:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Domeenide sertifikaat või isekohandatud sertifikaat

Ei hakka detailselt seletama, kuidas luua isekohandatud sertifikaate, tuleb luua kaks sertifikaati, nimelt juuresoleku (sertifitseerimiskeskus) ja wildcard klientserdiaat domeeni *.example.org jaoks

Pärast sertifikaatide saamist/väljastamist peate kliendisertifikaadi lisama Kubernetesesse, selleks loome talle salajase:

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

Edasi kasutame seda meie ingressi kontrolleris

Keycloaki paigaldamine

Otsustasin, et kõige lihtsam on kasutada valmis lahendusi, nimelt helm chart'e.

Paigaldame repositooriumi ja uuendame seda:

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

Loome faili keycloak.yml järgmise sisuga:

keycloak.yml

keycloak:
  # Admini nime
  username: "test_admin"
  # Admini parool  
  password: "admin"
  # Need flags to allow uploading scripts directly through the Keycloak web interface. This will be 
  necessary to fix a bug mentioned below.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled" 
  # Enable ingress, specify the hostname and the certificate that we have previously saved in 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 requires a database for operation, for testing purposes I deploy Postgresql directly in Kubernetes, which is not advisable in production!
  persistence:
    deployPostgres: true
    dbVendor: postgres

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

Föderatsiooni seadistamine

Seejärgmiseks logime veebiliidese. keycloak.example.org

Vasakus nurgas vajutame. Lisa realm

Ava
Väärtus

Nimi
kubernetes

Kuvamise nimi
Kubernetes

Kustutame kasutaja e-kirja kinnituse kontrolli:
Client scopes —> Email —> Mappers —> Email verified (Kustuta)

Seame üles föderatsiooni kasutajate importimiseks Active Directory-st, lisaks jätan alla ekraanipildid, nii on arusaadavam.

User federation —> Lisa pakkuja… —> ldap

Föderatsiooni seadistamineSeome ActiveDirectory autoriseerimise Kubernetesega Keycloakiga
Seome ActiveDirectory autoriseerimise Kubernetesega Keycloakiga

Kui kõik läheb hästi, siis pärast nuppu vajutamist Synchronize all users näete te edukat kasutajate importimise teadet.

Seejärel peame meie rühmad kaardistama.

User federation —> ldap_localhost —> Mappers —> Loo

Kaardistaja loomineSeome ActiveDirectory autoriseerimise Kubernetesega Keycloakiga

Kliendi seadistamine

Peame looma kliendi, mis Keycloakis tähendab rakendust, mis selle kaudu autoriseerib. Tõstan olulisused punasega ekraanipildil esile.

Clients —> Loo

Kliendi seadistamineSeome ActiveDirectory autoriseerimise Kubernetesega Keycloakiga

Loome rühmade jaoks scoupe:

Client Scopes —> Loo

Scoupe loomineSeome ActiveDirectory autoriseerimise Kubernetesega Keycloakiga

Ja seadistame nende jaoks mappimise:

Client Scopes —> groups —> Mappers —> Loo

KaardistajaSeome ActiveDirectory autoriseerimise Kubernetesega Keycloakiga

Lisame meie rühmade kaardistamise Default Client Scopes:

Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Valime groups ja Saadaval kliendi scoperid, klõpsake Lisa valitud

Saame salajase (ja salvestame selle kuhugi), mida me kasutame Keycloakis autoriseerimiseks:

Clients —> kubernetes —> Credentials —> Secret
Selle seadistamine on lõpetatud, kuid mul oli probleem, kuna pärast eduka autoriseerimise sain 403 vea. Veateade.

Parandus:

Client Scopes —> roles —> Mappers —> Loo

MapperSeome ActiveDirectory autoriseerimise Kubernetesega Keycloakiga

Skripti kood

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

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

Kubernetes'e seadistamine

Peame määrama, kus asub meie šifreeritud sertifikaat saidilt ja kus asub OIDC pakkuja.
Selleks redigeerime faili \/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
...

Uuendame kubeadm konfiguratsiooni klastris:

kubeadm konfig

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 seadistamine

Teie veebirakenduse kaitsmiseks saate kasutada Keycloak Gatekeeperi. Lisaks sellele, et see pöördproksi autoriseerib kasutaja enne lehe kuvamist, edastab ta ka lõpp-rakendusele teavet teie kohta päistes. Seega, kui teie rakendus toetab OpenID-d, autoriseeritakse kasutaja kohe. Vaatame näiteks Kubernetes Dashboardi.

Kubernetes Dashboardi installimine


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'

Omandiõiguste seadistamine:

Loome ClusterRoleBinding'i, mis annab klastrihalduri õigused (standardsed ClusterRole cluster-admin) kasutajatele, kes kuuluvad DataOPS rühma.


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

Keycloak Gatekeeperi installimine:


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"

Pärast seda, kui proovite siseneda kubernetes-dashboard.example.org, suunatakse teid Keycloak'i ja pärast eduka autoriseerimisega pääsete juba logitud Dashboardi.

Gangway installimine

Mugavuse huvides võite lisada Gangway'i, mis genereerib konfiguratsioonifaili kubectl jaoks, mille abil pääseme oma kasutajana Kubernetesesse.


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

values_gangway.yaml


gangway:
  # Klastri suvalnimi nimi
  clusterName: "my-k8s"
  # Meie OIDC pakkuja
  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"
  # Siia saab teoreetiliselt lisada grupid, mille oleme kaardistanud
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Kliendi nimi
  clientID: "kubernetes"
  # Saladus
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Kui jätta vaikimisi väärtus, kasutatakse kasutajanime määramiseks <b>Eesnimi</b> <b>Perenimi</b>, ja "sub" tema sisenimiseks
  usernameClaim: "sub"
  # API serveri domeeninimi või IP-aadress
  apiServerURL: "https://192.168.99.111:8443"

# Lülitame sisse 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

# Kui kasutame iseeneslikku sertifikaati, siis tuleb selle (avatud juure sertifikaadi) näidata.
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-----

Näeb umbes välja selline. Lubab nii kohe allalaadida konfiguratsioonifaili kui ka selle genereerida kasutades käske:

Seome ActiveDirectory autoriseerimise Kubernetesega Keycloakiga

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster