Tunafunga uidhinishaji wa ActiveDirectory kwa Kubernetes kwa kutumia Keycloak

Nakala hii imeandikwa ili kupanua tayari zilizopo, lakini inazungumza juu ya sifa za kifungu na Microsoft ActiveDirectory, na pia inaikamilisha.

Katika makala hii nitakuambia jinsi ya kufunga na kusanidi:

  • Nguo ya funguo ni mradi wa chanzo huria. Ambayo hutoa sehemu moja ya kuingia kwa programu. Inafanya kazi na itifaki nyingi, ikijumuisha LDAP na OpenID ambazo tunavutiwa nazo.
  • mlinda lango wa funguo - Badilisha programu ya wakala ambayo hukuruhusu kujumuisha idhini kupitia Keycloak.
  • genge - programu ambayo hutoa usanidi wa kubectl ambayo unaweza kuingia na kuunganisha kwa Kubernetes API kupitia OpenID.

Jinsi ruhusa zinavyofanya kazi katika Kubernetes.

Tunaweza kusimamia haki za mtumiaji / kikundi kwa kutumia RBAC, rundo la vifungu tayari vimeundwa kuhusu hili, sitakaa juu ya hili kwa undani. Shida ni kwamba unaweza kutumia RBAC kuzuia haki za watumiaji, lakini Kubernetes hajui chochote kuhusu watumiaji. Inabadilika kuwa tunahitaji utaratibu wa uwasilishaji wa watumiaji huko Kubernetes. Ili kufanya hivyo, tutaongeza mtoa huduma kwa Kuberntes OpenID, ambayo itasema kwamba mtumiaji kama huyo yupo, na Kubernetes yenyewe itampa haki.

Mafunzo ya

  • Utahitaji nguzo ya Kubernetes au minikube
  • Active Directory
  • Vikoa:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Cheti cha vikoa au cheti cha kujiandikisha

Sitazingatia jinsi ya kuunda cheti cha kujiandikisha, unahitaji kuunda vyeti 2, hii ni mzizi (Mamlaka ya Cheti) na mteja wa wildcard kwa kikoa cha *.example.org

Baada ya kupokea / kutoa vyeti, mteja lazima aongezwe kwa Kubernetes, kwa hili tunaunda siri yake:

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

Ifuatayo, tutaitumia kwa kidhibiti chetu cha Ingress.

Ufungaji wa Keycloak

Niliamua kuwa njia rahisi ni kutumia suluhisho zilizotengenezwa tayari kwa hili, ambazo ni chati za helm.

Sakinisha hazina na usasishe:

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

Unda faili ya keycloak.yml na maudhui yafuatayo:

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

Mpangilio wa Shirikisho

Ifuatayo, nenda kwenye kiolesura cha wavuti keycloak.example.org

Bofya kwenye kona ya kushoto Ongeza eneo

Muhimu
Thamani

jina
Kubernetes

Jina Display
Mabernet

Zima uthibitishaji wa barua pepe ya mtumiaji:
Mawanda ya mteja —> Barua pepe —> Ramani —> Barua pepe imethibitishwa (Futa)

Tulianzisha shirikisho kuagiza watumiaji kutoka ActiveDirectory, nitaacha picha za skrini hapa chini, nadhani itakuwa wazi zaidi.

Shirikisho la watumiaji —> Ongeza mtoaji… —> ldap

Mpangilio wa ShirikishoTunafunga uidhinishaji wa ActiveDirectory kwa Kubernetes kwa kutumia Keycloak
Tunafunga uidhinishaji wa ActiveDirectory kwa Kubernetes kwa kutumia Keycloak

Ikiwa yote ni sawa, basi baada ya kushinikiza kifungo Sawazisha watumiaji wote utaona ujumbe kuhusu uingizaji wa watumiaji kwa ufanisi.

Ifuatayo tunahitaji kupanga ramani za vikundi vyetu

Shirikisho la watumiaji --> ldap_localhost --> Ramani -> Unda

Kutengeneza ramaniTunafunga uidhinishaji wa ActiveDirectory kwa Kubernetes kwa kutumia Keycloak

Mpangilio wa mteja

Ni muhimu kuunda mteja, kwa mujibu wa Keycloak, hii ni maombi ambayo itaidhinishwa kutoka kwake. Nitaangazia mambo muhimu kwenye picha ya skrini kwa rangi nyekundu.

Wateja -> Unda

Mpangilio wa mtejaTunafunga uidhinishaji wa ActiveDirectory kwa Kubernetes kwa kutumia Keycloak

Wacha tuunda safu ya vikundi:

Mawanda ya Mteja —> Unda

Unda upeoTunafunga uidhinishaji wa ActiveDirectory kwa Kubernetes kwa kutumia Keycloak

Na uwawekee mchora ramani:

Mawanda ya Mteja —> vikundi —> Watengenezaji ramani —> Unda

Mchora ramaniTunafunga uidhinishaji wa ActiveDirectory kwa Kubernetes kwa kutumia Keycloak

Ongeza ramani ya vikundi vyetu kwa Mawanda Chaguomsingi ya Wateja:

Wateja —> kubernetes —> Mawanda ya Wateja —> Mawanda Chaguomsingi ya Wateja
Kuchagua makundi в Mawanda Yanayopatikana ya Wateja, vyombo vya habari Ongeza iliyochaguliwa

Tunapata siri (na kuiandika kwa uzi) ambayo tutatumia kwa idhini katika Keycloak:

Wateja —> kubernetes —> Hati miliki —> Siri
Hii inakamilisha usanidi, lakini nilikuwa na hitilafu wakati, baada ya idhini iliyofanikiwa, nilipokea kosa 403. Ripoti ya hitilafu.

Rekebisha:

Upeo wa Wateja —> majukumu —> Wasanifu wa ramani —> Unda

RamaniTunafunga uidhinishaji wa ActiveDirectory kwa Kubernetes kwa kutumia Keycloak

Msimbo wa hati

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

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

Inasanidi Kubernetes

Tunahitaji kubainisha mahali cheti chetu cha mizizi kutoka kwenye tovuti kiko, na mtoa huduma wa OIDC yuko wapi.
Ili kufanya hivyo, hariri 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
...

Sasisha usanidi wa kubeadm kwenye nguzo:

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

Inaweka wakala wa kuthibitisha

Unaweza kutumia mlinda lango wa vifunguo ili kulinda programu yako ya wavuti. Mbali na ukweli kwamba seva mbadala hii itaidhinisha mtumiaji kabla ya kuonyesha ukurasa, pia itapitisha maelezo kukuhusu hadi mwisho wa programu kwenye vichwa. Kwa hivyo, ikiwa programu yako inasaidia OpenID, basi mtumiaji ameidhinishwa mara moja. Fikiria mfano wa Dashibodi ya Kubernetes

Inasakinisha Dashibodi ya Kubernetes


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

maadili_dashibodi.yaml

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

Kuweka haki za ufikiaji:

Wacha tuunde ClusterRoleBinding ambayo itatoa haki za msimamizi wa nguzo (wasimamizi wa kawaida wa ClusterRole) kwa watumiaji katika kikundi cha 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

Sakinisha mlinda lango wa vazi kuu:


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

Baada ya hayo, unapojaribu kwenda kubernetes-dashboard.example.org, tutaelekezwa upya kwa Keycloak na ikiwa uidhinishaji utafaulu tutafika kwenye Dashibodi ambayo tayari umeingia.

ufungaji wa gangway

Kwa urahisi, unaweza kuongeza gangway ambayo itatoa faili ya usanidi kwa kubectl, kwa msaada ambao tutaingia Kubernetes chini ya mtumiaji wetu.


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

Inaonekana kama hii. Inakuruhusu kupakua faili ya usanidi mara moja na kuizalisha kwa kutumia seti ya amri:

Tunafunga uidhinishaji wa ActiveDirectory kwa Kubernetes kwa kutumia Keycloak

Chanzo: mapenzi.com

Kuongeza maoni