Kopjojmë autorizimin ActiveDirectory në Kubernetes me ndihmën e Keycloak

Ky kjo artikull është shkruar me qëllimin për të zgjeruar tashmë ekzistuesen, por tregon për karakteristikat e lidhjes pikërisht me Microsoft ActiveDirectory, si dhe e plotëson atë.

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

  • Keycloak — është një projekt me kod të hapur. Që siguron një pikë të vetme hyrjeje për aplikacionet. Punon me shumë protokolle, përfshirë LDAP dhe OpenID të cilat na interesojnë.
  • Keycloak gatekeeper — është një aplikacion me proxy të reversuar që lejon integrimin e autorizimit përmes Keycloak.
  • Gangway — është një aplikacion që gjeneron konfigurimin për kubectl me të cilin përmes OpenID mund të jeni të autorizuar dhe të lidheni me Kubernetes API.

Si funksionojnë të drejtat në Kubernetes.

Menaxhim i të drejtave të përdoruesve/grupeve mund të bëhet përmes RBAC, për të cilin janë krijuar tashmë shumë artikuj, nuk do të ndalem në këtë. Problemi është që mund të përdorni RBAC për të kufizuar të drejtat e përdoruesve, por Kubernetes nuk di asgjë për përdoruesit. Kështu, ne kemi nevojë për një mekanizëm që sjell përdoruesin në Kubernetes. Për këtë, do të shtojmë një ofrues OpenID në Kubernetes, i cili do të bëjë të ditur që ai përdorues vërtet ekziston, ndërsa të drejtat do t'i lëhtësojë vetë Kubernetes.

Përgatitja

  • Do t'ju nevojitet një klaster Kubernetes ose minikube
  • Active Directory
  • Domainet:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certifikata për domainet ose një certifikatë të vetë-nënshkruar

Nuk do të ndalem në mënyrën si të krijoni certifikata të vetë-nënshkruar, duhet të krijoni 2 certifikata, një root (Qendra e Certifikimit) dhe një certifikatë klienti wildcard për domenin *.example.org

Pas marrjes/se shkrimit të certifikatave, certifikata klient duhet të shtohet në Kubernetes, për këtë krijojmë një sekret:

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

Më tej do ta përdorim atë për kontrolerin tonë të Ingress

Instalimi i Keycloak

Kam vendosur se është më e lehtë të përdorim zgjidhje të gatshme për këtë, sidomos helm chart-et.

Shtojmë repository-n dhe e përditësojmë atë:

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

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

keycloak.yml

keycloak:
  # Emri i administratorit
  username: "test_admin"
  # Fjalëkalimi i administratorit  
  password: "admin"
  # Këto flamuj janë të nevojshëm për të lejuar ngarkimin e skripteve në Keycloak drejtpërdrejt përmes ndërfaqes web. Kjo na nevojitet 
  për të riparuar një bug, për të cilin do flasim më poshtë.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled" 
  # Aktivizojmë ingress, tregojmë emrin e hostit dhe certifikatën e cila e ruajmë më parë në sekretet
  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 kërkon një bazë të dhënash për funksionimin e tij, për qëllime testimi unë do ta instaloj Postgresql direkt në Kubernetes, në prodhim kështu nuk është më mirë të bëhet!
  persistence:
    deployPostgres: true
    dbVendor: postgres

postgresql:
  postgresUser: keycloak
  postgresPassword: ""
  postgresDatabase: keycloak
  persistence:
    enabled: true

Konfigurimi i federatës

Më pas hyjmë në ndërfaqen e webit keycloak.example.org

Në këndin e majtë shtypim Shto realm

Key
Vlera

Emri
kubernetes

Emri i Shfaqjes
Kubernetes

Çaktivizojmë verifikimin e konfirmimit të emailit të përdoruesit:
Client scopes —> Email —> Mappers —> Email verified (Fshi)

Konfiguroni federatën për importimin e përdoruesve nga ActiveDirectory, do të lëviz poshtë disa foto mendoj se kështu do të jetë më e qartë.

User federation —> Shto ofrues… —> ldap

Konfigurimi i federatësKopjojmë autorizimin ActiveDirectory në Kubernetes me ndihmën e Keycloak
Kopjojmë autorizimin ActiveDirectory në Kubernetes me ndihmën e Keycloak

Nëse gjithçka shkon mirë, pas klikimit të butonit Synchronize all users do të shihni një mesazh për importimin e suksesshëm të përdoruesve.

Më pas duhet të mapojmë grupet tona

User federation —> ldap_localhost —> Mappers —> Krijo

Krijimi i mapper-itKopjojmë autorizimin ActiveDirectory në Kubernetes me ndihmën e Keycloak

Konfigurimi i klientit

Duhet të krijoni një klient, në konceptet e Keycloak, ky është aplikacioni që do të autorizohet prej tij. Pikat e rëndësishme do t'i theksoj në skenën e kuqe.

Clients —> Krijo

Konfigurimi i klientitKopjojmë autorizimin ActiveDirectory në Kubernetes me ndihmën e Keycloak

Do të krijojmë një skoup për grupet:

Client Scopes —> Krijo

Krijimi i skoupitKopjojmë autorizimin ActiveDirectory në Kubernetes me ndihmën e Keycloak

Dhe do të konfiguroni mapper për to:

Client Scopes —> groups —> Mappers —> Krijo

MapperKopjojmë autorizimin ActiveDirectory në Kubernetes me ndihmën e Keycloak

Shtojmë mapimin e grupeve tona në Default Client Scopes:

Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Zgjidhni groupsSkopet e Disponueshme të Klientit, klikoni Shto të zgjedhurat

Marrim sekretin (dhe e shkruajmë diku) që do të përdorim për autorizimin në Keycloak:

Clients —> kubernetes —> Credentials —> Secret
Me këtë përfundon konfigurimi, por kam pasur një gabim kur pas autorizimit të suksesshëm merrja një gabim 403. Raporti i bug-ëve.

Rregullimi:

Client Scopes —> roles —> Mappers —> Krijo

MapperKopjojmë autorizimin ActiveDirectory në Kubernetes me ndihmën e 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

Na nevojitet të tregojmë ku ndodhet certifikata jonë rrënjësore të faqes dhe ku ndodhet ofruesi OIDC.
Për këtë redaktojmë 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
...

Diftojmë konfigurimin e kubeadm në klaster:

kubeadm config

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

Konfigurimi i auth-proxy

Për mbrojtjen e aplikacionit tuaj web mund të përdorni keycloak gatekeeper. Përveç faktit që ky reverse proxy do të autorizojë përdoruesin përpara se të tregojë faqen, ai do të kalojë gjithashtu informacionin tuaj në aplikacionin përfundimtar në headers. Kështu që nëse aplikacioni juaj mbështet OpenID, përdoruesi do të autorizohet menjëherë. Le ta shqyrtojmë duke marrë si shembull Kubernetes Dashboard

Instalimi i 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'

Konfigurimi i të drejtave të qasjes:

Do të krijojmë ClusterRoleBinding që do të japë të drejta admin të klasterit (standard ClusterRole cluster-admin) për përdoruesit që janë anëtarë të grupit 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

Instalimi i 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"

Pas kësaj, në përpjekjen për t'u regjistruar në kubernetes-dashboard.example.org, do të ndodhë një ridrejtim në Keycloak dhe në rastin e një autorizimi të suksesshëm do të arrijmë në Dashboard duke qenë të kyçur.

Instalimi i gangway

Për lehtësi, mund të shtoni gangway i cili do të gjenerojë një skedar konfigursi për kubectl, përmes të cilit ne tashmë nën përdoruesin tonë do të kalojmë në Kubernetes.


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

values_gangway.yaml


gangway:
  # Emri i rastësishëm i klasterit
  clusterName: "my-k8s"
  # Ku kemi ofruesin 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"
  # Teorikisht, këtu mund të shtojmë grupe që kemi mapuar
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Emri i klientit
  clientID: "kubernetes"
  # Sekreti
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Nëse lëvizim vlerën e paracaktuar, emri i përdoruesit do të marrë <b>Emri i parë</b> <b>Emri i dytë</b>, dhe kur "sub" emri i tij
  usernameClaim: "sub"
  # Emri i domenit ose adresa IP e serverit API
  apiServerURL: "https://192.168.99.111:8443"

# Aktivizojmë 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

# Nëse përdorim një certifikatë të vetë-nënshkruar, atëherë duhet ta tregojmë atë (certifikatën e korrespondentit)
trustedCACert: |-
 -----BEGIN CERTIFICATE-----
 MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzMwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
 -----END CERTIFICATE-----

Duket diku si kjo. Lejon si shkarkimin e menjëhershëm të skedarit të konfiguracionit ashtu edhe formimin e tij duke përdorur një set komandash:

Kopjojmë autorizimin ActiveDirectory në Kubernetes me ndihmën e Keycloak

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster