Fijamos la autorizaci贸n de ActiveDirectory a Kubernetes con Keycloak

Este art铆culo fue escrito para expandir uno existente , pero habla sobre las caracter铆sticas del paquete con Microsoft ActiveDirectory y lo complementa.

En este art铆culo te dir茅 c贸mo instalar y configurar:

  • Keycloak es un proyecto de c贸digo abierto. Que proporciona un 煤nico punto de entrada para las aplicaciones. Funciona con muchos protocolos, incluidos LDAP y OpenID que nos interesan.
  • Keycloak gatekeeper : aplicaci贸n de proxy inverso que le permite integrar la autorizaci贸n a trav茅s de Keycloak.
  • Pasarela : la aplicaci贸n que genera una configuraci贸n para kubectl con la que puede iniciar sesi贸n y conectarse a la API de Kubernetes a trav茅s de OpenID

C贸mo funcionan los derechos en Kubernetes.


Podemos administrar los derechos de usuario / grupo usando RBAC, ya se han creado muchos art铆culos sobre esto, no me detendr茅 en esto en detalle. El problema es que puede usar RBAC para restringir los derechos de los usuarios, pero Kubernetes no sabe nada sobre los usuarios. Resulta que necesita un mecanismo de entrega de usuarios en Kubernetes. Para hacer esto, agregaremos un proveedor de OpenID a Kuberntes, que dir谩 que tal usuario realmente existe, y Kubernetes mismo le otorgar谩 derechos.

Formaci贸n

  • Necesitar谩 un cl煤ster Kubernetes o un minikube
  • Directorio Activo
  • Dominios:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certificado para dominios o certificado autofirmado

No me detendr茅 en c贸mo crear un certificado autofirmado, debe crear 2 certificados, esta es la ra铆z (Autoridad de certificaci贸n) y el cliente comod铆n para el dominio * .example.org

Despu茅s de recibir / escribir los certificados, el cliente debe agregarse a Kubernetes, para esto crea un secreto para ello:

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

Luego lo usaremos para nuestro controlador de Ingress

Instalar Keycloak


Decid铆 que la forma m谩s f谩cil de usar soluciones preparadas para esto, es decir, gr谩ficos de tim贸n.

Instale el repositorio y actual铆celo:

helm repo add codecentric https://codecentric.imtqy.com/helm-charts
helm repo update

Cree el archivo keycloak.yml con los siguientes contenidos:

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贸n de federaci贸n


A continuaci贸n, vaya a la interfaz web keycloak.example.org

En la esquina izquierda, haga clic en Agregar reino
LlaveValor
Nombrekubernetes
Nombre para mostrarKubernetes

Desactivamos la verificaci贸n de la confirmaci贸n por correo electr贸nico del usuario:
脕mbitos del cliente -> Correo electr贸nico -> Mapeadores -> Correo electr贸nico verificado (Eliminar)

Configuramos la federaci贸n para importar usuarios desde ActiveDirectory, dejar茅 las capturas de pantalla a continuaci贸n, creo que ser谩 m谩s claro.

Federaci贸n de usuarios -> Agregar proveedor ... -> ldap

Configuraci贸n de federaci贸n



Si todo est谩 bien, luego de hacer clic en el bot贸n Sincronizar todos los usuarios , recibir谩 un mensaje sobre la importaci贸n exitosa de los usuarios.

A continuaci贸n, debemos mapear nuestros grupos

Federaci贸n de usuarios -> ldap_localhost -> Mapeadores -> Crear

Creaci贸n del mapeador


Configuraci贸n del cliente


Es necesario crear un cliente, en t茅rminos de Keycloak es una aplicaci贸n que ser谩 autorizada por 茅l. Destacar茅 los puntos importantes en la captura de pantalla en rojo.

Clientes -> Crear

Configuraci贸n del cliente


Cree un scoupe para grupos:

脕mbitos del cliente -> Crear

Haciendo scoupe


Y configure el mapeador para ellos:

脕mbitos del cliente -> grupos -> Mapeadores -> Crear

Mapper


Agregue la asignaci贸n de nuestros grupos a 脕mbitos de cliente predeterminados:

Clientes -> kubernetes -> 脕mbitos de cliente -> 脕mbitos de cliente predeterminados
Seleccione grupos en 脕mbitos de cliente disponibles , haga clic en Agregar seleccionado

Obtenemos un secreto (y lo escribimos en el hilo) que usaremos para autorizaci贸n en Keycloak:

Clientes -> kubernetes -> Credenciales -> Secreto
Este es el final de la configuraci贸n, pero recib铆 un error cuando despu茅s de una autorizaci贸n exitosa recib铆 un error 403. Informe de error .

Arreglo:

脕mbitos del cliente -> roles -> Mapeadores -> Crear

Mapper


C贸digo de script
// add current client-id to token audience
token.addAudience(token.getIssuedFor());

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


Configurar Kubernetes


Necesitamos indicar d贸nde se encuentra nuestro certificado ra铆z del sitio y d贸nde se encuentra el proveedor OIDC.
Para hacer esto, edite el archivo /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
...


Actualice la configuraci贸n de kubeadm en el cl煤ster:

configuraci贸n de kubeadm
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
...


Configurar auth-proxy


Puede usar keycloak gatekeeper para proteger su aplicaci贸n web. Adem谩s del hecho de que este proxy inverso autorizar谩 al usuario antes de mostrar la p谩gina, tambi茅n transmitir谩 informaci贸n sobre usted en los encabezados a la aplicaci贸n final. Por lo tanto, si su aplicaci贸n es compatible con OpenID, el usuario inicia sesi贸n inmediatamente. Veamos el ejemplo del panel de Kubernetes

Instalar el panel de Kubernetes



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'


Establecer permisos:


Cree un ClusterRoleBinding que otorgar谩 derechos de administrador de cl煤ster (ClusterRole cluster-admin est谩ndar) para los usuarios del grupo 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


Instalar keycloak gatekeeper:



helm repo add gabibbo97 https://gabibbo97.imtqy.com/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml

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


Despu茅s de eso, cuando intente ir a kubernetes-dashboard.example.org , ser谩 redirigido a Keycloak y, si la autorizaci贸n es exitosa, ya iniciaremos sesi贸n en Dashboard.

Instalaci贸n de pasarela


Para mayor comodidad, puede agregar una pasarela que generar谩 un archivo de configuraci贸n para kubectl, con el que ya ingresaremos a Kubernetes bajo nuestro usuario.


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


Se ve algo como esto. Le permite descargar inmediatamente el archivo de configuraci贸n y crearlo usando un conjunto de comandos:


All Articles