Nou tache otorizasyon ActiveDirectory nan Kubernetes lè l sèvi avèk Keycloak

Atik sa a te ekri pou elaji sou deja ki ekziste, men pale sou karakteristik yo nan pake a ak Microsoft ActiveDirectory, epi tou li konplete.

Nan atik sa a mwen pral di w kouman enstale ak konfigirasyon:

  • keycloak se yon pwojè sous louvri. Ki bay yon sèl pwen antre pou aplikasyon yo. Travay ak anpil pwotokòl, tankou LDAP ak OpenID ki enterese nou.
  • gadyen keycloak - aplikasyon proxy ranvèse ki pèmèt ou entegre otorizasyon atravè Keycloak.
  • pasaj - yon aplikasyon ki jenere yon konfigirasyon pou kubectl ak kote ou ka konekte ak konekte ak API Kubernetes atravè OpenID.

Ki jan otorizasyon travay nan Kubernetes.

Nou ka jere dwa itilizatè / gwoup lè l sèvi avèk RBAC, yon pakèt atik yo te deja kreye sou sa a, mwen pa pral rete sou sa a an detay. Pwoblèm lan se ke ou ka itilize RBAC pou mete restriksyon sou dwa itilizatè yo, men Kubernetes pa konnen anyen sou itilizatè yo. Li sanble ke nou bezwen yon mekanis livrezon itilizatè nan Kubernetes. Pou fè sa, nou pral ajoute yon founisè nan Kuberntes OpenID, ki pral di ke yon itilizatè sa a reyèlman egziste, ak Kubernetes tèt li pral ba li dwa yo.

Fòmasyon

  • Ou pral bezwen yon gwoup Kubernetes oswa minikube
  • Anyè aktif
  • Domèn:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Sètifika pou domèn oswa sètifika oto-siyen

Mwen pa pral rete sou kòman yo kreye yon sètifika oto-siyen, ou bezwen kreye 2 sètifika, sa a se rasin (Otorite Sètifika) ak kliyan wildcard pou domèn *.example.org.

Apre ou resevwa / bay sètifika, kliyan an dwe ajoute nan Kubernetes, pou sa nou kreye yon sekrè pou li:

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

Apre sa, nou pral sèvi ak li pou kontwolè Ingress nou an.

Enstalasyon Keycloak

Mwen deside ke fason ki pi fasil se sèvi ak solisyon pare pou sa a, sètadi tablo Helm.

Enstale repozitwa a epi mete ajou li:

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

Kreye yon dosye keycloak.yml ak kontni sa a:

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

Konfigirasyon federasyon an

Apre sa, ale nan koòdone entènèt la keycloak.example.org

Klike nan kwen gòch la Ajoute domèn

Kle
Valè

Non
gouvènè

Display Non
Kubernetes

Enfim verifikasyon imel itilizatè a:
Dimansyon kliyan —> Imèl —> Mapeur —> Imèl verifye (Efase)

Nou mete federasyon pou enpòte itilizatè soti nan ActiveDirectory, mwen pral kite ekran anba a, mwen panse ke li pral pi klè.

Federasyon itilizatè —> Ajoute founisè… —> ldap

Konfigirasyon federasyon anNou tache otorizasyon ActiveDirectory nan Kubernetes lè l sèvi avèk Keycloak
Nou tache otorizasyon ActiveDirectory nan Kubernetes lè l sèvi avèk Keycloak

Si tout bagay byen, apre w fin peze bouton an Senkronize tout itilizatè yo ou pral wè yon mesaj sou enpòte siksè itilizatè yo.

Apre sa nou bezwen map gwoup nou yo

Federasyon itilizatè --> ldap_localhost --> Mappers --> Kreye

Kreye yon mapeNou tache otorizasyon ActiveDirectory nan Kubernetes lè l sèvi avèk Keycloak

Konfigirasyon kliyan an

Li nesesè yo kreye yon kliyan, an tèm de Keycloak, sa a se yon aplikasyon ki pral otorize nan men l '. Mwen pral mete aksan sou pwen enpòtan yo nan ekran an wouj.

Kliyan —> Kreye

Konfigirasyon kliyan anNou tache otorizasyon ActiveDirectory nan Kubernetes lè l sèvi avèk Keycloak

Ann kreye scoupe pou gwoup yo:

Dimansyon Kliyan —> Kreye

Kreye dimansyonNou tache otorizasyon ActiveDirectory nan Kubernetes lè l sèvi avèk Keycloak

Epi mete yon mape pou yo:

Dimansyon Kliyan —> gwoup —> Mapè —> Kreye

MapperNou tache otorizasyon ActiveDirectory nan Kubernetes lè l sèvi avèk Keycloak

Ajoute kat gwoup nou yo nan Dimansyon Kliyan Default yo:

Kliyan —> kubernetes —> Dimansyon Kliyan —> Dimansyon Kliyan Default
Chwazi gwoup в Dimansyon Kliyan ki disponibpouse Ajoute chwazi yo

Nou jwenn sekrè a (epi ekri li nan fil la) ke nou pral itilize pou otorizasyon nan Keycloak:

Kliyan —> kubernetes —> kalifikasyon —> sekrè
Sa a konplete konfigirasyon an, men mwen te gen yon erè lè, apre otorizasyon siksè, mwen te resevwa yon erè 403. Rapò ensèk.

Ranje:

Dimansyon Kliyan —> wòl —> Mapeur —> Kreye

MapèNou tache otorizasyon ActiveDirectory nan Kubernetes lè l sèvi avèk Keycloak

Kòd script

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

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

Konfigirasyon Kubernetes

Nou bezwen presize ki kote sètifika rasin nou an soti nan sit la manti, ak ki kote founisè OIDC a sitiye.
Pou fè sa, edite fichye a /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
...

Mete ajou konfigirasyon kubeadm nan gwoup la:

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

Mete otorizasyon-proxy

Ou ka itilize keycloak gatekeeper pou pwoteje aplikasyon w lan. Anplis lefèt ke prokurasyon ranvèse sa a pral otorize itilizatè a anvan li montre paj la, li pral tou pase enfòmasyon sou ou nan aplikasyon an fen nan tèt yo. Kidonk, si aplikasyon w lan sipòte OpenID, lè sa a itilizatè a otorize imedyatman. Konsidere egzanp Kubernetes Dashboard

Enstale Kubernetes Dashboard


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'

Mete dwa aksè:

Ann kreye yon ClusterRoleBinding ki pral bay dwa administratè gwoup (estanda ClusterRole cluster-admin) pou itilizatè yo nan gwoup DataOPS la.


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

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

Apre sa, lè ou eseye ale nan kubernetes-dashboard.example.org, nou pral redireksyon sou Keycloak ak nan ka otorizasyon siksè nou pral rive nan Dashboard la ki deja konekte.

enstalasyon pasaj

Pou konvenyans, ou ka ajoute yon pasaj ki pral jenere yon dosye konfigirasyon pou kubectl, avèk èd nan ki nou pral antre nan Kubernetes anba itilizatè nou an.


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

Sanble sa a. Pèmèt ou imedyatman telechaje fichye konfigirasyon an epi jenere li lè l sèvi avèk yon seri kòmandman:

Nou tache otorizasyon ActiveDirectory nan Kubernetes lè l sèvi avèk Keycloak

Sous: www.habr.com

Add nouvo kòmantè