ActiveDirectory baimena lotzen diogu Kubernetes-i Keycloak erabiliz

Artikulu hau dagoeneko zabaltzeko idatzi da dauden, baina Microsoft ActiveDirectory-rekin sortaren ezaugarriei buruz hitz egiten du, eta osagarri ere egiten du.

Artikulu honetan nola instalatu eta konfiguratu esango dizut:

  • giltza kapaia kode irekiko proiektu bat da. Eskaeretarako sarrera puntu bakarra eskaintzen duena. Protokolo askorekin funtzionatzen du, interesatzen zaizkigun LDAP eta OpenID barne.
  • giltza atezaina - Keycloak bidez baimena integratzeko aukera ematen duen alderantzizko proxy aplikazioa.
  • pasabide - kubectl-erako konfigurazio bat sortzen duen aplikazioa, eta horrekin saioa hasi eta Kubernetes APIra konekta zaitezke OpenID bidez.

Baimenek nola funtzionatzen duten Kubernetes-en.

Erabiltzaile/taldeen eskubideak RBAC erabiliz kudeatu ditzakegu, dagoeneko artikulu mordo bat sortu da honi buruz, ez naiz honetan zehatz-mehatz luzatuko. Arazoa da RBAC erabil dezakezula erabiltzailearen eskubideak murrizteko, baina Kubernetes-ek ez daki ezer erabiltzaileei buruz. Kubernetesen erabiltzaileak bidaltzeko mekanismo bat behar dugula ematen du. Horretarako, Kuberntes OpenID-i hornitzaile bat gehituko diogu, erabiltzaile hori benetan existitzen dela esango duena, eta Kubernetesek berak emango dizkio eskubideak.

Prestakuntza

  • Kubernetes kluster edo minikube bat beharko duzu
  • Active Directory
  • Domeinuak:
    keycloak.example.org
    kubernetes-dashboard.example.org
    pasarela.adibidea.org
  • Domeinuetarako ziurtagiria edo autosinatutako ziurtagiria

Ez naiz auto-sinatutako ziurtagiri bat nola sortu nola geldituko, 2 ziurtagiri sortu behar dituzu, hau da *.example.org domeinurako erroa (Autoritatea ziurtagiri-emailea) eta komodinaren bezeroa.

Ziurtagiriak jaso/jaulki ondoren, bezeroa Kubernetesera gehitu behar da, horretarako sekretu bat sortzen dugu:

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

Ondoren, gure Ingress kontrolagailurako erabiliko dugu.

Keycloak instalazioa

Modurik errazena horretarako prest dauden irtenbideak erabiltzea dela erabaki nuen, hots, lema-diagramak.

Instalatu biltegia eta eguneratu:

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

Sortu keycloak.yml fitxategi bat eduki honekin:

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

Federazioaren konfigurazioa

Ondoren, joan web interfazera keycloak.example.org

Egin klik ezkerreko izkinan Gehitu erreinua

Key
Balio

izena
kubernetes

Bistaratzeko izena
Kubernetes

Desgaitu erabiltzailearen posta elektronikoaren egiaztapena:
Bezeroaren esparruak β€”> Posta elektronikoa β€”> Mappers β€”> Posta elektronikoa egiaztatuta (Ezabatu)

ActiveDirectorytik erabiltzaileak inportatzeko federazioa ezarri dugu, azpian utziko ditut pantaila-argazkiak, argiagoa izango dela uste dut.

Erabiltzaileen federazioa β€”> Gehitu hornitzailea... β€”> ldap

Federazioaren konfigurazioaActiveDirectory baimena lotzen diogu Kubernetes-i Keycloak erabiliz
ActiveDirectory baimena lotzen diogu Kubernetes-i Keycloak erabiliz

Dena ondo badago, botoia sakatu ondoren Sinkronizatu erabiltzaile guztiak erabiltzaileen inportazio arrakastatsuari buruzko mezu bat ikusiko duzu.

Ondoren, gure taldeak mapatu behar ditugu

Erabiltzaileen federazioa --> ldap_localhost --> Mappers --> Sortu

Mapper bat sortzeaActiveDirectory baimena lotzen diogu Kubernetes-i Keycloak erabiliz

Bezeroaren konfigurazioa

Bezero bat sortzea beharrezkoa da, Keycloak-i dagokionez, bere baimena izango duen aplikazio bat da. Pantaila-argazkian puntu garrantzitsuak gorriz nabarmenduko ditut.

Bezeroak β€”> Sortu

Bezeroaren konfigurazioaActiveDirectory baimena lotzen diogu Kubernetes-i Keycloak erabiliz

Sortu dezagun taldeentzako scoupea:

Bezeroaren esparruak β€”> Sortu

Sortu esparruaActiveDirectory baimena lotzen diogu Kubernetes-i Keycloak erabiliz

Eta konfiguratu haientzat mapatzaile bat:

Bezeroen esparruak β€”> taldeak β€”> Mapatzaileak β€”> Sortu

MapatzaileaActiveDirectory baimena lotzen diogu Kubernetes-i Keycloak erabiliz

Gehitu gure taldeen mapak Bezero-esparru lehenetsietara:

Bezeroak β€”> kubernetes β€”> Bezeroen esparruak β€”> Bezeroen esparru lehenetsiak
Aukeratu taldeak Π² Eskuragarri dauden bezero-esparruak, prentsa Gehitu hautatua

Keycloak-en baimentzeko erabiliko dugun sekretua (eta harian idatzi) jasoko dugu:

Bezeroak β€”> kubernetes β€”> Kredentzialak β€”> Sekretua
Honek konfigurazioa amaitzen du, baina errore bat izan dut, arrakastaz baimendu ondoren, 403 errore bat jaso nuenean. Akatsen txostena.

Konponketa:

Bezeroen esparruak β€”> rolak β€”> Mapatzaileak β€”> Sortu

MapatzaileaActiveDirectory baimena lotzen diogu Kubernetes-i Keycloak erabiliz

Script kodea

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

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

Kubernetes konfiguratzen

Gure guneko erro-ziurtagiria non dagoen eta OIDC hornitzailea non dagoen zehaztu behar dugu.
Horretarako, editatu /etc/kubernetes/manifests/kube-apiserver.yaml fitxategia

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

Eguneratu kubeadm konfigurazioa klusterrean:

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

Autentifikazio-proxy ezartzen

Keycloak gatekeeper erabil dezakezu zure web aplikazioa babesteko. Alderantzizko proxy honek orria erakutsi aurretik erabiltzaileari baimena emango dionez gain, goiburuetako amaierako aplikazioari zuri buruzko informazioa ere pasako du. Horrela, zure aplikazioak OpenID onartzen badu, erabiltzailea berehala baimenduta dago. Demagun Kubernetes Arbelaren adibidea

Kubernetes Dashboard instalatzea


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'

Sarbide-eskubideak ezartzea:

Sortu dezagun ClusterRoleBinding bat, klusterren administratzaile-eskubideak emango dituena (ClusterRole cluster-admin estandarra) DataOPS taldeko erabiltzaileei.


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

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

Horren ostean, joaten saiatzen zarenean kubernetes-dashboard.example.org, Keycloakera birbideratuko gaituzte eta baimena arrakastatsua izanez gero dagoeneko saioa hasita dagoen Arbelera iritsiko gara.

pasabideen instalazioa

Erosotasunerako, kubectl-erako konfigurazio fitxategi bat sortuko duen pasabide bat gehi dezakezu, eta horren laguntzarekin Kubernetes-en sartuko gara gure erabiltzailearekin.


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

Honela dirudi. Konfigurazio fitxategia berehala deskargatzeko eta komando multzo bat erabiliz sortzeko aukera ematen du:

ActiveDirectory baimena lotzen diogu Kubernetes-i Keycloak erabiliz

Iturria: www.habr.com

Gehitu iruzkin berria