Lisame ActiveDirectory autentimise Kubernetesesse Keycloak'i kaudu

Käesolev artikkel on kirjutatud selleks, et laiendada juba olemasolevat, kuid räägib eriliselt Microsoft ActiveDirectory sidumise omadustest ning täiendab seda.

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

  • Keycloak — see on avatud lähtekoodiga projekt, mis pakub rakendustele ühte sisenemispunkte. See töötab paljude protokollidega, sealhulgas LDAP ja OpenID, mis meid huvitavad.
  • Keycloak gatekeeper — pöördpoksi rakendus, mis võimaldab integreerida autoriseerimist läbi Keycloak.
  • Gangway — rakendus, mis genereerib konfiguratsiooni kubectl için, mille abil saab OpenID kaudu autoriseerida ja ühenduda Kubernetes API-ga.

Kuidas õigused Kuberneteses töötavad.

Kasutaja-/gruppide õiguste haldamiseks saame kasutada RBAC-i, selle kohta on juba palju artikleid kirjutatud, seega ei jää ma sellele pikemalt pidama. Probleem on selles, et saate RBAC-i kasutada, et piirata kasutaja õigusi, kuid Kubernetes ei tea kasutajatest midagi. Seetõttu on vajalik mehhanism, mis toob kasutaja Kubernetesesse. Selleks lisame Kuberntesesse OpenID pakkuja, mis kinnitab, et selline kasutaja tõepoolest eksisteerib, ja õigused annab juba Kubernetes ise.

Ettevalmistus

  • Teil on vaja Kubernetes klastrit või minikube'i
  • Active Directory
  • Domeenid:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Domeenide sertifikaat või isehallatav sertifikaat

Ma ei jää detailsemalt peatuma isehallatavate sertifikaatide loomisel, on vaja luua 2 sertifikaati: juures sertifikaat (sertifitseerimiskeskus) ja wildcard-sertifikaat domeeni *.example.org jaoks.

Pärast seda, kui olete sertifikaadid saanud/väljastanud, peate klientsertifikaadi lisama Kubernetesesse, selleks loome selle jaoks salajase võtme:

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

Järgnevalt kasutame seda meie Ingress kontrolleris.

Keycloak'i paigaldamine

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

Lisame repository ja uuendame selle:

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

Loome faili keycloak.yml järgmise sisuga:

keycloak.yml

keycloak:
  # Administraatori nimi
  username: "test_admin"
  # Administraatori parool  
  password: "admin"
  # Need lipud on vajalikud, et lubada skriptide laadimist Keycloaki kaudu veebiliidese.
  See on vajalik ühe vea parandamiseks, millest allpool.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled" 
  # Lubame ingress'i, määrame hosti nime ja tunnistuse, mille oleme eelnevalt salvestanud secrets'i
  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 vajab oma tööks andmebaasi. Testimise eesmärgil seadistan PostgreSQL'i otse Kuberntes's, aga tootmises on see parem mitte teha!
  persistence:
    deployPostgres: true
    dbVendor: postgres

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

Föderatsiooni seadistamine

Seejärel siseneme veebiliidesesse keycloak.example.org

Vasakus nurgas klõpsame Lisa realm

Avaõigus
Väärtus

Nimi
kubernetes

Kuva nimi
Kubernetes

Keenuse kasutaja e-posti kinnitamise kontrollimine:
Kliendi ulatused —> E-post —> Mappijad —> E-post kinnitatud (Kustuta)

Seame üles föderatsiooni kasutajate importimiseks ActiveDirectory'ist, jätan allapoole ekraanipildid, mõtlen, et nii on arusaadavam.

Kasutaja föderatsioon —> Lisa pakkuja… —> ldap

Föderatsiooni seadistamineLisame ActiveDirectory autentimise Kubernetesesse Keycloak'i kaudu
Lisame ActiveDirectory autentimise Kubernetesesse Keycloak'i kaudu

Kui kõik on korras, siis pärast nupu vajutamist Sünkroniseeri kõik kasutajad näete kasutajate eduka importimise teadet.

Järgmiseks tuleb meie rühmad mingite seostega sobitada

Kasutaja föderatsioon —> ldap_localhost —> Mappijad —> Loo

Mappi loomineLisame ActiveDirectory autentimise Kubernetesesse Keycloak'i kaudu

Kliendi seadistus

Peame looma kliendi, Keycloak'i mõistes on see rakendus, mis kinnitust saab. Olulised punktid toon välja ekraanipildil punasega.

Kliendid —> Loo

Kliendi seadistusLisame ActiveDirectory autentimise Kubernetesesse Keycloak'i kaudu

Loo rühmade ulatus:

Kliendi ulatused —> Loo

Ulatused loomineLisame ActiveDirectory autentimise Kubernetesesse Keycloak'i kaudu

Ja seadistame kaardisti nende jaoks:

Kliendi ulatused —> groups —> Mappijad —> Loo

MappiLisame ActiveDirectory autentimise Kubernetesesse Keycloak'i kaudu

Lisame meie rühmade sidumise Default Client Scopes-i:

Kliendid —> kubernetes —> Kliendi ulatused —> Default Client Scopes
Valime groups ühes Saadaval kliendi ulatused, klikkige Lisa valitud

Saame salajase (ja salvestame selle kuhugile), mida kasutame autoriseerimiseks Keycloak'is:

Kliendid —> kubernetes —> Krediteerimised —> Salajane
Sellega on seadistamine lõppenud, kuid mul tekkis viga, kui pärast eduka autoriseerimist sain 403 vea. Viga raport.

Parandus:

Kliendi ulatused —> roles —> Mappijad —> Loo

MapperLisame ActiveDirectory autentimise Kubernetesesse Keycloak'i kaudu

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();

Kubernetesi seadistamine

Peame näitama, kus asub meie saidi juursertifikaat 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 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
...

auth-proxy seadistamine

Teie veebirakenduse kaitsmiseks saab kasutada keycloak gatekeeperit. Lisaks sellele, et see pöördtöötleja autoriseerib kasutaja enne lehe kuvamist, edastab ta ka lõpprakendusele teavet teie kohta päistes. Kui teie rakendus toetab OpenID-d, autoriseeritakse kasutaja kohe. Vaatame näidet Kubernetes Dashboardist.

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'

Ligipääsuõiguste seadistamine:

Loome ClusterRoleBinding, mis annab administraatori õigused klastrile (standardne ClusterRole cluster-admin) DataOPS rühma kuuluvatele kasutajatele.


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 proovime siseneda kubernetes-dashboard.example.org, toimuvad suunamised Keycloaki ja eduka autentimise korral pääseme juba sisselogitud Dashboardi.

Gangway installimine

Mugavuse huvides võime lisada gangway, mis genereerib kubectl jaoks konfiguraafili, mille abil pääseme juba oma kasutajana Kubernetesesse.


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

values_gangway.yaml


gangway:
  # Klasteri eraldi 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"
  # Teoreetiliselt saab siia lisada rühmad, mida oleme kaardistanud
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Klientnimi
  clientID: "kubernetes"
  # Salasõna
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Kui jätta vaikimisi väärtus, siis võetakse kasutajanimi <b>Eesnimi</b> <b>Perekonnanimi</b>, ja "sub" oma sisselogimise
  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 enesetestitud sertifikaati, tuleb selle (avatud juursertifikaadi) 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 selline välja. Lubab nii koheselt alla laadida konfiguraafili kui ka genereerida selle käskude komplekti abil:

Lisame ActiveDirectory autentimise Kubernetesesse Keycloak'i kaudu

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster