Fixem l'autorització d'ActiveDirectory a Kubernetes mitjançant Keycloak

Aquest article ja s'ha escrit per ampliar-lo existents, però parla de les característiques del paquet amb Microsoft ActiveDirectory, i també el complementa.

En aquest article us explicaré com instal·lar i configurar:

  • mantell de claus és un projecte de codi obert. Que proporciona un únic punt d'entrada per a les sol·licituds. Funciona amb una varietat de protocols, inclosos LDAP i OpenID que ens interessen.
  • porter de claus - aplicació de proxy invers que us permet integrar l'autorització mitjançant Keycloak.
  • Passerella - una aplicació que genera una configuració per a kubectl amb la qual podeu iniciar sessió i connectar-vos a l'API de Kubernetes mitjançant OpenID.

Com funcionen els permisos a Kubernetes.

Podem gestionar els drets d'usuari/grup mitjançant RBAC, ja s'han creat un munt d'articles sobre això, no m'atendré en això en detall. El problema és que podeu utilitzar RBAC per restringir els drets dels usuaris, però Kubernetes no sap res dels usuaris. Resulta que necessitem un mecanisme de lliurament dels usuaris a Kubernetes. Per fer-ho, afegirem un proveïdor a Kuberntes OpenID, que dirà que aquest usuari realment existeix, i el mateix Kubernetes li donarà els drets.

Entrenament

  • Necessitareu un clúster o minikube de Kubernetes
  • Active Directory
  • Dominis:
    keycloak.example.org
    kubernetes-dashboard.example.org
    passarel·la.exemple.org
  • Certificat per a dominis o certificat autofirmat

No em detendré en com crear un certificat autofirmat, cal que creeu 2 certificats, aquesta és l'arrel (Autoritat de certificació) i el client comodí per al domini *.example.org

Després de rebre/emetre certificats, el client s'ha d'afegir a Kubernetes, per a això li creem un secret:

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

A continuació, l'utilitzarem per al nostre controlador d'entrada.

Instal·lació de Keycloak

Vaig decidir que la manera més senzilla és utilitzar solucions ja fetes per a això, és a dir, gràfics de timó.

Instal·leu el repositori i actualitzeu-lo:

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

Creeu un fitxer keycloak.yml amb el contingut següent:

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

Configuració de la federació

A continuació, aneu a la interfície web keycloak.example.org

Feu clic a la cantonada esquerra Afegeix regne

Clau
Valor

Nom
kubernets

Mostra nom
Kubernetes

Desactiva la verificació del correu electrònic de l'usuari:
Àmbits del client —> Correu electrònic —> Mappers —> Correu electrònic verificat (Suprimeix)

Hem configurat la federació per importar usuaris d'ActiveDirectory, deixaré captures de pantalla a continuació, crec que serà més clar.

Federació d'usuaris —> Afegeix un proveïdor... —> ldap

Configuració de la federacióFixem l'autorització d'ActiveDirectory a Kubernetes mitjançant Keycloak
Fixem l'autorització d'ActiveDirectory a Kubernetes mitjançant Keycloak

Si tot va bé, després de prémer el botó Sincronitza tots els usuaris veureu un missatge sobre la importació correcta dels usuaris.

A continuació, hem de fer un mapa dels nostres grups

Federació d'usuaris --> ldap_localhost --> Mappers --> Crear

Creació d'un mapeadorFixem l'autorització d'ActiveDirectory a Kubernetes mitjançant Keycloak

Configuració del client

Cal crear un client, pel que fa a Keycloak, aquesta és una aplicació que estarà autoritzada des d'ell. Destacaré els punts importants de la captura de pantalla en vermell.

Clients —> Crear

Configuració del clientFixem l'autorització d'ActiveDirectory a Kubernetes mitjançant Keycloak

Creem un scoupe per a grups:

Àmbits del client —> Crear

Crea abastFixem l'autorització d'ActiveDirectory a Kubernetes mitjançant Keycloak

I configureu-los un mapeador:

Àmbits del client —> grups —> Mappers —> Crear

CartografiadorFixem l'autorització d'ActiveDirectory a Kubernetes mitjançant Keycloak

Afegiu el mapeig dels nostres grups als àmbits de client predeterminats:

Clients —> kubernetes —> Àmbits de client —> Àmbits de client predeterminats
seleccionar grups в Àmbits de client disponibles, premeu Afegeix seleccionats

Obtenim el secret (i l'escriurem al fil) que utilitzarem per a l'autorització a Keycloak:

Clients —> kubernetes —> Credencials —> Secret
Això completa la configuració, però vaig tenir un error quan, després de l'autorització correcta, vaig rebre un error 403. Informe d'error.

Correcció:

Àmbits del client —> rols —> Mappers —> Crear

mapperFixem l'autorització d'ActiveDirectory a Kubernetes mitjançant Keycloak

Codi 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();

Configuració de Kubernetes

Hem d'especificar on es troba el nostre certificat arrel del lloc i on es troba el proveïdor OIDC.
Per fer-ho, editeu el fitxer /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
...

Actualitzeu la configuració de kubeadm al clúster:

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

configuració d'auth-proxy

Podeu utilitzar Keycloak gatekeeper per protegir la vostra aplicació web. A més del fet que aquest proxy invers autoritzarà l'usuari abans de mostrar la pàgina, també passarà informació sobre tu a les capçaleres a l'aplicació final. Així, si la vostra aplicació és compatible amb OpenID, l'usuari està immediatament autoritzat. Considereu l'exemple de Kubernetes Dashboard

Instal·lació de 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'

Configuració de permisos:

Creem un ClusterRoleBinding que donarà drets d'administrador del clúster (clúster-administrador estàndard de ClusterRole) per als usuaris del grup 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

Instal·leu 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"

Després d'això, quan intenteu anar-hi kubernetes-dashboard.example.org, serem redirigits a Keycloak i en cas d'autorització correcta arribarem al Dashboard ja connectat.

instal·lació de passarel·la

Per comoditat, podeu afegir una passarel·la que generarà un fitxer de configuració per a kubectl, amb l'ajuda del qual entrarem a Kubernetes sota el nostre usuari.


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

Sembla això. Us permet descarregar immediatament el fitxer de configuració i generar-lo mitjançant un conjunt d'ordres:

Fixem l'autorització d'ActiveDirectory a Kubernetes mitjançant Keycloak

Font: www.habr.com

Afegeix comentari