Ne e lidhim autorizimin ActiveDirectory në Kubernetes duke përdorur Keycloak

Ky artikull është shkruar për të zgjeruar tashmë ekzistuese, por flet për veçoritë e paketës me Microsoft ActiveDirectory, dhe gjithashtu e plotëson atë.

Në këtë artikull do t'ju tregoj se si ta instaloni dhe konfiguroni:

  • mantel çelësi është një projekt me kod të hapur. E cila siguron një pikë të vetme hyrjeje për aplikimet. Punon me shumë protokolle, duke përfshirë LDAP dhe OpenID për të cilat ne jemi të interesuar.
  • mbulesë çelësash portier - aplikacion i kundërt proxy që ju lejon të integroni autorizimin përmes Keycloak.
  • rrugë e rrugës - një aplikacion që gjeneron një konfigurim për kubectl me të cilin mund të identifikoheni dhe të lidheni me Kubernetes API përmes OpenID.

Si funksionojnë lejet në Kubernetes.

Ne mund të menaxhojmë të drejtat e përdoruesve / grupit duke përdorur RBAC, një mori artikujsh janë krijuar tashmë për këtë, unë nuk do të ndalem në këtë në detaje. Problemi është se ju mund të përdorni RBAC për të kufizuar të drejtat e përdoruesve, por Kubernetes nuk di asgjë për përdoruesit. Rezulton se ne kemi nevojë për një mekanizëm shpërndarjeje të përdoruesit në Kubernetes. Për ta bërë këtë, ne do të shtojmë një ofrues në Kuberntes OpenID, i cili do të thotë se një përdorues i tillë ekziston me të vërtetë, dhe vetë Kubernetes do t'i japë atij të drejtat.

Trajnimi

  • Do t'ju duhet një grup Kubernetes ose minikube
  • Active Directory
  • Domenet:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certifikatë për domenet ose certifikatë e vetë-nënshkruar

Nuk do të ndalem në mënyrën se si të krijoni një certifikatë të vetë-nënshkruar, ju duhet të krijoni 2 certifikata, kjo është klienti rrënjë (Autoriteti i Certifikatës) dhe klienti i shkrepjes për domenin *.example.org

Pasi të merrni / lëshoni certifikata, klienti duhet të shtohet në Kubernetes, për këtë ne krijojmë një sekret për të:

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

Më pas, ne do ta përdorim atë për kontrolluesin tonë Ingress.

Instalimi i tastierës

Vendosa që mënyra më e lehtë është të përdor zgjidhje të gatshme për këtë, përkatësisht tabelat e drejtimit.

Instaloni depon dhe përditësoni atë:

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

Krijoni një skedar keycloak.yml me përmbajtjen e mëposhtme:

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

Organizimi i Federatës

Tjetra, shkoni te ndërfaqja e internetit keycloak.example.org

Klikoni në këndin e majtë Shto sferën

Kyç
vlerë

Emër
Kubernetes

Display Emri
Kubernetes

Çaktivizo verifikimin e emailit të përdoruesit:
Fushat e klientit —> Email —> Mappers —> Email i verifikuar (Fshi)

Ne krijuam federatën për të importuar përdoruesit nga ActiveDirectory, do të lë fotografi më poshtë, mendoj se do të jetë më e qartë.

Federata e përdoruesve —> Shto ofrues… —> ldap

Organizimi i FederatësNe e lidhim autorizimin ActiveDirectory në Kubernetes duke përdorur Keycloak
Ne e lidhim autorizimin ActiveDirectory në Kubernetes duke përdorur Keycloak

Nëse gjithçka është mirë, atëherë pasi të shtypni butonin Sinkronizoni të gjithë përdoruesit do të shihni një mesazh në lidhje me importimin e suksesshëm të përdoruesve.

Më pas duhet të hartojmë grupet tona

Federata e përdoruesve --> ldap_localhost --> Mappers --> Krijo

Krijimi i një hartuesiNe e lidhim autorizimin ActiveDirectory në Kubernetes duke përdorur Keycloak

Konfigurimi i klientit

Është e nevojshme të krijohet një klient, përsa i përket Keycloak, ky është një aplikacion që do të autorizohet prej tij. Unë do të theksoj pikat e rëndësishme në pamjen e ekranit me të kuqe.

Klientët —> Krijo

Konfigurimi i klientitNe e lidhim autorizimin ActiveDirectory në Kubernetes duke përdorur Keycloak

Le të krijojmë hapësirë ​​për grupet:

Fushat e klientit —> Krijo

Krijo hapësirëNe e lidhim autorizimin ActiveDirectory në Kubernetes duke përdorur Keycloak

Dhe vendosni një hartë për ta:

Fushat e klientit —> grupet —> Hartuesit —> Krijo

HartuesNe e lidhim autorizimin ActiveDirectory në Kubernetes duke përdorur Keycloak

Shtoni hartën e grupeve tona në Fushat e paracaktuara të klientit:

Klientët —> kubernetes —> Fushat e klientit —> Fushat e paracaktuara të klientit
zgjedh Grupe в Fushat e disponueshme të klientit, shtypni Shto të zgjedhurit

Ne marrim sekretin (dhe e shkruajmë atë në fill) të cilin do ta përdorim për autorizim në Keycloak:

Klientët —> kubernetes —> Kredencialet —> Sekret
Kjo përfundon konfigurimin, por pata një gabim kur, pas autorizimit të suksesshëm, mora një gabim 403. Raporti i gabimeve.

Rregullo:

Fushat e klientit —> rolet —> Hartuesit —> Krijo

HartuesNe e lidhim autorizimin ActiveDirectory në Kubernetes duke përdorur Keycloak

Kodi i skriptit

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

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

Konfigurimi i Kubernetes

Duhet të specifikojmë se ku ndodhet certifikata jonë rrënjësore nga faqja dhe ku ndodhet ofruesi OIDC.
Për ta bërë këtë, modifikoni skedarin /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
...

Përditëso konfigurimin e kubeadm në grup:

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

Vendosja e përfaqësuesit të autorizuar

Ju mund të përdorni portierin e çelësave për të mbrojtur aplikacionin tuaj në internet. Përveç faktit që ky përfaqësues i kundërt do të autorizojë përdoruesin përpara se të shfaqë faqen, ai gjithashtu do të kalojë informacione rreth jush në aplikacionin përfundimtar në titujt. Kështu, nëse aplikacioni juaj mbështet OpenID, atëherë përdoruesi autorizohet menjëherë. Konsideroni shembullin e Panelit të Kubernetes

Instalimi i panelit të Kubernetes


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

vlerat_dashboard.yaml

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

Vendosja e të drejtave të aksesit:

Le të krijojmë një ClusterRoleBinding që do t'i japë të drejtat e administratorit të grupit (standarde ClusterRole-admin) për përdoruesit në grupin 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

Instaloni portierin e tastierës:


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

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

Pas kësaj, kur përpiqeni të shkoni në kubernetes-dashboard.example.org, do të ridrejtohemi te Keycloak dhe në rast të autorizimit të suksesshëm do të arrijmë te Paneli i kontrollit tashmë të identifikuar.

instalimi i rrugës

Për lehtësi, mund të shtoni një gangway që do të gjenerojë një skedar konfigurimi për kubectl, me ndihmën e të cilit do të futemi në Kubernetes nën përdoruesin tonë.


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

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

Duket kështu. Ju lejon të shkarkoni menjëherë skedarin e konfigurimit dhe ta gjeneroni atë duke përdorur një grup komandash:

Ne e lidhim autorizimin ActiveDirectory në Kubernetes duke përdorur Keycloak

Burimi: www.habr.com

Shto një koment