Fijamos la autorización LDAP a Kubernetes


Una breve instrucción sobre cómo usar Kubernetes con Keycloak para enlazar a su servidor LDAP y configurar la importación de usuarios y grupos. Esto le permitirá configurar RBAC para sus usuarios y usar el proxy de autenticación para proteger el Panel de control de Kubernetes y otras aplicaciones que no pueden autorizarse.


Instalar Keycloak


Supongamos que ya tiene un servidor LDAP. Podría ser Active Directory, FreeIPA, OpenLDAP o cualquier otra cosa. Si no tiene un servidor LDAP, entonces, en principio, puede crear usuarios directamente en la interfaz de Keycloak o utilizar proveedores públicos de oidc (Google, Github, Gitlab), el resultado será casi el mismo.


En primer lugar, instalaremos Keycloak en sí, la instalación se puede realizar por separado e inmediatamente en el clúster de Kubernetes, por regla general, si tiene varios clústeres de Kubernetes, sería más fácil instalarlo por separado. Por otro lado, siempre puedes usar el gráfico oficial de timón e instalarlo directamente en tu clúster.


Para almacenar datos de Keycloak, necesita una base de datos. Por defecto, h2 usa h2 (todos los datos se almacenan localmente), pero también es posible usar postgres , mysql o mariadb .
Si aún decide instalar Keycloak por separado, encontrará instrucciones más detalladas en la documentación oficial .


Configuración de federación


Primero, crea un nuevo reino. El reino es el espacio de nuestra aplicación. Cada aplicación puede tener su propio ámbito con diferentes usuarios y configuraciones de autorización. El dominio maestro es utilizado por Keycloak y no es correcto usarlo para nada más.


Haz clic en Agregar reino


OpcionValor
Nombrekubernetes
Nombre para mostrarKubernetes
Nombre para mostrar HTML<img src="https://kubernetes.io/images/nav_logo.svg" width="400" \>

Kubernetes por defecto verifica si el usuario tiene un correo electrónico o no. Como usamos nuestro propio servidor LDAP, esta verificación casi siempre devolverá false . Apaguemos la representación de este parámetro en Kubernetes:


Ámbitos del cliente -> Correo electrónico -> Mapeadores -> Correo electrónico verificado (Eliminar)


Ahora configure la federación, para esto iremos a:


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


Aquí hay un ejemplo de configuración para FreeIPA:


OpcionValor
Nombre para mostrar de la consolafreeipa.example.org
VendedorRed Hat Directory Server
Atributo LDAP UUIDipauniqueid
URL de conexiónldaps://freeipa.example.org
DN de usuarioscn=users,cn=accounts,dc=example,dc=org
Bind dnuid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Credencial de enlace<password>
Permitir autenticación Kerberos:on
Reino Kerberos:EXAMPLE.ORG
Principal del servidor:HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:/etc/krb5.keytab

El usuario keycloak-svc debe crearse previamente en nuestro servidor LDAP.


En el caso de Active Directory, simplemente seleccione Proveedor: Active Directory y la configuración necesaria se completará automáticamente en el formulario.


Haga clic en Guardar


Ahora sigamos adelante:


Federación de usuarios -> freeipa.example.org -> Mappers -> Nombre


OpcionValor
Atributo de LdapgivenName

Ahora habilite la asignación de grupo:


Federación de usuarios -> freeipa.example.org -> Mapeadores -> Crear


OpcionValor
Nombregroups
Tipo de mapeadorgroup-ldap-mapper
DN de grupos LDAPcn=groups,cn=accounts,dc=example,dc=org
Estrategia de recuperación de grupos de usuariosGET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Esto completa la configuración de la federación, pasemos a configurar el cliente.


Configuración del cliente


Cree un nuevo cliente (una aplicación que recibirá usuarios de Keycloak). Pasamos:


Clientes -> Crear


OpcionValor
ID del clientekubernetes
Tipo de accesoconfidenrial
URL raízhttp://kubernetes.example.org/
URI de redireccionamiento válidoshttp://kubernetes.example.org/*
URL de administradorhttp://kubernetes.example.org/

También cree un alcance para grupos:


Ámbitos del cliente -> Crear


OpcionValor
PlantillaNo template
Nombregroups
Ruta de grupo completafalse

Y configure el mapeador para ellos:


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


OpcionValor
Nombregroups
Tipo de mapeadorGroup membership
Nombre de reclamo de tokengroups

Ahora necesitamos habilitar el grupo de mapeo en el alcance de nuestro cliente:


Clientes -> kubernetes -> Ámbitos de cliente -> Ámbitos de cliente predeterminados


Seleccione grupos en Ámbitos de cliente disponibles , haga clic en Agregar seleccionados


Ahora configure la autenticación de nuestra aplicación, vaya a:


Clientes -> kubernetes


OpcionValor
Autorización habilitadaON

Haga clic en guardar y esto completa la configuración del cliente, ahora en la pestaña


Clientes -> kubernetes -> Credenciales


Puede obtener Secret, que usaremos en el futuro.


Configurar Kubernetes


Configurar Kubernetes para la autenticación OIDC es bastante trivial y no es muy complicado. Todo lo que necesita hacer es colocar el certificado de CA de su servidor /etc/kubernetes/pki/oidc-ca.pem en /etc/kubernetes/pki/oidc-ca.pem y agregar las opciones necesarias para kube-apiserver.
Para hacer esto, actualice /etc/kubernetes/manifests/kube-apiserver.yaml en todos sus asistentes:


 ... spec: containers: - command: - kube-apiserver ... - --oidc-ca-file=/etc/kubernetes/pki/oidc-ca.pem - --oidc-client-id=kubernetes - --oidc-groups-claim=groups - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes - --oidc-username-claim=email ... 

Y también actualice la configuración de kubeadm en el clúster, para no perder esta configuración al actualizar:


 kubectl edit -n kube-system configmaps kubeadm-config 

 ... data: ClusterConfiguration: | apiServer: extraArgs: oidc-ca-file: /etc/kubernetes/pki/oidc-ca.pem oidc-client-id: kubernetes oidc-groups-claim: groups oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes oidc-username-claim: email ... 

Esto completa la configuración de Kubernetes. Puede repetir estos pasos en todos sus grupos de Kubernetes.


Autorización inicial


Después de estos pasos, ya tendrá un clúster de Kubernetes con autenticación OIDC configurada. El único punto es que sus usuarios aún no tienen un cliente configurado, así como su propio kubeconfig. Para resolver este problema, debe configurar la emisión automática de kubeconfig a los usuarios después de una autorización exitosa.


Para hacer esto, puede usar aplicaciones web especiales que le permitan autenticar al usuario y luego descargar el kubeconfig terminado. Uno de los más convenientes es Kuberos , que le permite describir todos los clústeres de Kubernetes en una configuración y cambiar fácilmente entre ellos.


Para configurar Kuberos, solo describa la plantilla para kubeconfig y ejecute con los siguientes parámetros:


 kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template 

Vea Uso en Github para más detalles.


También es posible usar kubelogin si desea autorizar directamente en la computadora del usuario. En este caso, el usuario abre un navegador con un formulario de autorización en localhost.


El kubeconfig resultante se puede verificar en jwt.io. Simplemente copie el valor de users[].user.auth-provider.config.id-token desde su kubeconfig al formulario en el sitio e inmediatamente obtenga el descifrado.


Configuración RBAC


Al configurar RBAC, puede hacer referencia tanto al nombre de usuario (el campo de name en el token jwt) como al grupo de usuarios (el campo de groups en el token jwt). Aquí hay un ejemplo de configuración de permisos para el grupo kubernetes-default-namespace-admins :


kubernetes-default-namespace-admins.yaml
 apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: default-admins namespace: default rules: - apiGroups: - '*' resources: - '*' verbs: - '*' --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: kubernetes-default-namespace-admins namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: default-admins subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: kubernetes-default-namespace-admins 

Se pueden encontrar más ejemplos de RBAC en la documentación oficial de Kubernetes.


Configurar auth-proxy


Existe un maravilloso proyecto de keycloak-gatekeeper que le permite proteger cualquier aplicación y le brinda al usuario la posibilidad de autenticarse con el servidor OIDC. Le mostraré cómo puede configurarlo usando Kubernetes Dashboard como ejemplo:


dashboard-proxy.yaml
 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kubernetes-dashboard-proxy spec: replicas: 1 template: metadata: labels: app: kubernetes-dashboard-proxy spec: containers: - args: - --listen=0.0.0.0:80 - --discovery-url=https://keycloak.example.org/auth/realms/kubernetes - --client-id=kubernetes - --client-secret=<your-client-secret-here> - --redirection-url=https://kubernetes-dashboard.example.org - --enable-refresh-tokens=true - --encryption-key=ooTh6Chei1eefooyovai5ohwienuquoh - --upstream-url=https://kubernetes-dashboard.kube-system - --resources=uri=/* image: keycloak/keycloak-gatekeeper name: kubernetes-dashboard-proxy ports: - containerPort: 80 livenessProbe: httpGet: path: /oauth/health port: 80 initialDelaySeconds: 3 timeoutSeconds: 2 readinessProbe: httpGet: path: /oauth/health port: 80 initialDelaySeconds: 3 timeoutSeconds: 2 --- apiVersion: v1 kind: Service metadata: name: kubernetes-dashboard-proxy spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: kubernetes-dashboard-proxy type: ClusterIP 

Source: https://habr.com/ru/post/441112/


All Articles