Rydym yn cau awdurdodiad ActiveDirectory i Kubernetes gan ddefnyddio Keycloak

Ysgrifennwyd yr erthygl hon gyda'r nod o ehangu'r eisoes presennol, ond yn sôn am nodweddion y cysylltiad yn benodol â Microsoft ActiveDirectory, a hefyd yn ei ategu.

Yn yr erthygl hon byddaf yn dweud wrthych sut i osod a ffurfweddu:

  • clogyn yn brosiect ffynhonnell agored. Sy'n darparu un pwynt mynediad ar gyfer ceisiadau. Yn gweithio gyda llawer o brotocolau, gan gynnwys LDAP ac OpenID, sydd o ddiddordeb i ni.
  • porthor cloak — cymhwysiad dirprwy gwrthdro sy'n eich galluogi i integreiddio awdurdodiad trwy Keycloak.
  • gangway - cymhwysiad sy'n cynhyrchu cyfluniad ar gyfer kubectl y gallwch fewngofnodi trwy OpenID a chysylltu ag API Kubernetes.

Sut mae caniatâd yn gweithio yn Kubernetes.

Gallwn reoli hawliau defnyddwyr / grŵp gan ddefnyddio RBAC, mae criw o erthyglau eisoes wedi'u creu am hyn, ni fyddaf yn canolbwyntio ar hyn yn fanwl. Y broblem yw y gallwch chi ddefnyddio RBAC i gyfyngu ar hawliau defnyddwyr, ond nid yw Kubernetes yn gwybod dim am ddefnyddwyr. Mae'n ymddangos bod angen mecanwaith cyflwyno defnyddwyr arnom yn Kubernetes. I wneud hyn, byddwn yn ychwanegu darparwr at Kuberntes OpenID, a fydd yn nodi bod defnyddiwr o'r fath yn bodoli mewn gwirionedd, a bydd Kubernetes ei hun yn rhoi hawliau iddo.

Hyfforddiant

  • Bydd angen clwstwr Kubernetes neu minikube arnoch chi
  • Active Directory
  • Parthau:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Tystysgrif ar gyfer parthau neu dystysgrif hunan-lofnodedig

Nid af i fanylion ar sut i greu tystysgrif hunan-lofnodedig; mae angen i chi greu 2 dystysgrif, dyma'r gwraidd (Awdurdod Ardystio) a'r cerdyn gwyllt cleient ar gyfer y parth *.example.org

Ar ôl i chi dderbyn / ysgrifennu'r tystysgrifau, mae angen i chi ychwanegu tystysgrif y cleient at Kubernetes; i wneud hyn, crëwch gyfrinach ar ei gyfer:

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

Nesaf byddwn yn ei ddefnyddio ar gyfer ein rheolydd Ingress

Gosod cloak

Penderfynais mai’r ffordd hawsaf oedd defnyddio datrysiadau parod ar gyfer hyn, sef siartiau helm.

Gosodwch yr ystorfa a'i diweddaru:

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

Creu ffeil keycloak.yml gyda'r cynnwys canlynol:

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

Sefydlu Ffederasiwn

Nesaf, ewch i'r rhyngwyneb gwe keycloak.example.org

Yn y gornel chwith cliciwch Ychwanegu tir

allweddol
Gwerth

Enw
cubernetes

arddangos Enw
Kubernetes

Analluogi gwirio cadarnhad e-bost defnyddiwr:
Cwmpasau cleient -> E-bost -> Mapwyr -> E-bost wedi'i ddilysu (Dileu)

Rydym yn sefydlu ffederasiwn i fewnforio defnyddwyr o ActiveDirectory, byddaf yn gadael sgrinluniau isod, rwy'n credu y bydd yn gliriach.

Ffederasiwn defnyddwyr —> Ychwanegu darparwr… —> ldap

Sefydlu FfederasiwnRydym yn cau awdurdodiad ActiveDirectory i Kubernetes gan ddefnyddio Keycloak
Rydym yn cau awdurdodiad ActiveDirectory i Kubernetes gan ddefnyddio Keycloak

Os yw popeth yn iawn, yna ar ôl pwyso'r botwm Cydamseru pob defnyddiwr Fe welwch neges yn nodi mewnforio defnyddwyr yn llwyddiannus.

Nesaf mae angen i ni fapio ein grwpiau

Ffederasiwn defnyddwyr -> ldap_localhost -> Mappers -> Creu

Creu mapiwrRydym yn cau awdurdodiad ActiveDirectory i Kubernetes gan ddefnyddio Keycloak

Gosodiad cleient

Mae angen i chi greu cleient, o ran Keycloak mae hwn yn gais a fydd yn cael ei awdurdodi ganddo. Byddaf yn tynnu sylw at bwyntiau pwysig mewn coch yn y sgrinlun.

Cleientiaid -> Creu

Gosodiad cleientRydym yn cau awdurdodiad ActiveDirectory i Kubernetes gan ddefnyddio Keycloak

Gadewch i ni greu sgŵp ar gyfer grwpiau:

Cwmpas Cleient -> Creu

Creu cwmpasRydym yn cau awdurdodiad ActiveDirectory i Kubernetes gan ddefnyddio Keycloak

A gosod mapiwr ar eu cyfer:

Cwmpas Cleient -> grwpiau -> Mapwyr -> Creu

MapperRydym yn cau awdurdodiad ActiveDirectory i Kubernetes gan ddefnyddio Keycloak

Rydym yn ychwanegu mapiau o'n grwpiau at Sgôp Cleient Rhagosodedig:

Cleientiaid -> kubernetes -> Cwmpas Cleient -> Sgôp Cleient Rhagosodedig
dewiswch grwpiau в Cwmpas Cleient Ar Gaelcliciwch Ychwanegu a ddewiswyd

Rydyn ni'n cael y gyfrinach (a'i hysgrifennu yn rhywle) y byddwn ni'n ei defnyddio i'w hawdurdodi yn Keycloak:

Cleientiaid -> kubernetes -> Manylion -> Cyfrinachol
Mae hyn yn cwblhau'r gosodiad, ond roedd gennyf gamgymeriad pan dderbyniais wall 403 ar ôl awdurdodi'n llwyddiannus. Adroddiad byg.

Trwsio:

Cwmpasau Cleient -> rolau -> Mapwyr -> Creu

MapwyrRydym yn cau awdurdodiad ActiveDirectory i Kubernetes gan ddefnyddio Keycloak

Cod sgript

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

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

Ffurfweddu Kubernetes

Mae angen inni nodi lle mae ein tystysgrif gwraidd o'r wefan wedi'i lleoli, a lle mae'r darparwr OIDC wedi'i leoli.
I wneud hyn, golygwch y ffeil /etc/kubernetes/manifests/kube-apiserver.yaml

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

Diweddaru ffurfwedd kubeadm yn y clwstwr:

config kubeadm

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

Gosod auth-proxy

I amddiffyn eich cymhwysiad gwe, gallwch ddefnyddio porthor cloak bysell. Yn ogystal â'r ffaith y bydd y dirprwy gwrthdro hwn yn awdurdodi'r defnyddiwr cyn dangos y dudalen, bydd hefyd yn trosglwyddo gwybodaeth amdanoch chi yn y penawdau i'r cymhwysiad terfynol. Felly, os yw'ch cais yn cefnogi OpenID, caiff y defnyddiwr ei awdurdodi ar unwaith. Edrychwn ar enghraifft Dangosfwrdd Kubernetes

Gosod Dangosfwrdd Kubernetes


helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

gwerthoedd_dashfwrdd.yaml

enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'

Gosod hawliau mynediad:

Gadewch i ni greu ClusterRoleBinding a fydd yn rhoi hawliau gweinyddol clwstwr (gweinyddwr clwstwr safonol ClusterRole) i ddefnyddwyr yn y grŵp 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

Gosod porthor cloak bysell:


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

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

Ar ôl hynny, pan fyddwch yn ceisio mewngofnodi i kubernetes-dashboard.example.org, bydd ailgyfeiriad i Keycloak yn digwydd ac os bydd awdurdodiad yn llwyddiannus, byddwn yn mynd â ni i'r Dangosfwrdd sydd eisoes wedi mewngofnodi.

Gosod Gangway

Er hwylustod, gallwch ychwanegu gangway a fydd yn cynhyrchu ffeil ffurfweddu ar gyfer kubectl, gyda chymorth y byddwn yn mynd i mewn i Kubernetes o dan ein defnyddiwr.


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

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

Mae'n edrych rhywbeth fel hyn. Yn caniatáu ichi lawrlwytho ffeil ffurfweddu ar unwaith a'i chynhyrchu gan ddefnyddio set o orchmynion:

Rydym yn cau awdurdodiad ActiveDirectory i Kubernetes gan ddefnyddio Keycloak

Ffynhonnell: hab.com

Ychwanegu sylw