Configurar clústeres miembros de la flota para la autenticación LDAP

En este documento se describe cómo pueden configurar los administradores de clústeres o los operadores de aplicaciones los clústeres de Kubernetes para que admitan la autenticación de un proveedor de protocolo ligero de acceso a directorios (LDAP) de terceros, como ID de Microsoft Entra o Google LDAP. Para obtener más información, consulta el artículo Acerca de la autenticación con identidades de terceros.

Limitaciones

Debes usar un tipo de clúster que admita LDAP.

Antes de empezar

  1. Install the Google Cloud CLI.

  2. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  3. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  4. Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:

    gcloud components update
    gcloud components install kubectl
  5. Asegúrate de que el administrador de tu plataforma te ha proporcionado toda la información que necesitas sobre el proveedor. Para obtener más información, consulta Configurar proveedores de LDAP para autenticar clústeres.

Durante la configuración, es posible que tengas que consultar la documentación de tu servidor LDAP. En las siguientes guías para administradores se explica cómo configurar algunos proveedores de LDAP populares, así como dónde encontrar la información que necesitas para iniciar sesión en el servidor LDAP y configurar tus clústeres:

Rellenar el secreto de la cuenta de servicio de LDAP

Tu clúster necesita un secreto de cuenta de servicio para autenticarse en el servidor LDAP y obtener los detalles de los usuarios. La autenticación LDAP admite los siguientes mecanismos:

  • Autenticación básica, en la que se usa un nombre de usuario y una contraseña.
  • Autenticación con certificado de cliente, en la que se usa una clave privada de cliente y un certificado de cliente.

Tú o el administrador de tu plataforma deberíais tener esta información sobre vuestro proveedor después de seguir los pasos que se indican en el artículo Configurar proveedores de LDAP para autenticar clústeres. Para que el clúster pueda acceder a la información de inicio de sesión del servidor LDAP, debes crear un secreto de Kubernetes que contenga los detalles de inicio de sesión de LDAP. En los siguientes ejemplos se muestra cómo configurar secretos para ambos tipos de autenticación. En los ejemplos se muestra cómo se aplica el secreto al espacio de nombres anthos-identity-service.

Este es un ejemplo de configuración de Secret de autenticación básica:

apiVersion: v1
kind: Secret
metadata:
  name: SERVICE_ACCOUNT_SECRET_NAME
  namespace: "anthos-identity-service"
type: kubernetes.io/basic-auth     # Make sure the type is correct
data:
  username: USERNAME  # Use a base64-encoded username
  password: PASSWORD  # Use a base64-encoded password

donde SERVICE_ACCOUNT_SECRET_NAME es el nombre que has elegido para este secreto. Sustituye los valores de nombre de usuario y contraseña por los que has obtenido en el paso anterior. USERNAME es un nombre de usuario codificado en base64 PASSWORD es una contraseña codificada en base64

Este es un ejemplo de configuración de un secreto de certificado de cliente:

apiVersion: v1
kind: Secret
metadata:
  name: SERVICE_ACCOUNT_SECRET_NAME
  namespace: anthos-identity-service
type: kubernetes.io/tls            # Make sure the type is correct
data:
  # the data is abbreviated in this example
  tls.crt: |
       MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
  tls.key: |
       MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...

Sustituye SERVICE_ACCOUNT_SECRET_NAME por el nombre que has elegido para este secreto. Sustituye los valores de la clave y el certificado TLS por los valores codificados de la clave y el certificado que has obtenido en el paso anterior.

En los ejemplos se muestra cómo se aplica el secreto al espacio de nombres anthos-identity-service. De forma predeterminada, los componentes del sistema tienen permiso para leer secretos en este espacio de nombres. Para usar otro espacio de nombres, cambia los metadatos del secreto y, a continuación, añade una nueva política de RBAC para conceder permiso de lectura de secretos en ese espacio de nombres a la default ServiceAccount del espacio de nombres anthos-identity-service, como se indica a continuación:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: NAMESPACE
  name: ais-secret-reader-role
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get","list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ais-secret-reader-role-binding
  namespace: NAMESPACE
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ais-secret-reader-role
subjects:
- kind: ServiceAccount
  name: default
  namespace: anthos-identity-service
---

Configurar el clúster

Para configurar la autenticación en un clúster mediante LDAP, añade la siguiente información a un recurso personalizado de Kubernetes llamado ClientConfig:

  • Información sobre el proveedor de identidad y los parámetros que necesita para devolver información del usuario.
  • El nombre y el espacio de nombres del secreto que has creado y aplicado en el paso anterior, que permite que el clúster se autentique en el servidor LDAP.

Para configurar el clúster, edita default ClientConfig en el espacio de nombres kube-public:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n kube-public edit clientconfig default

Sustituye USER_CLUSTER_KUBECONFIG por la ruta al archivo kubeconfig del clúster. Si hay varios contextos en el archivo kubeconfig, se usa el contexto actual. Es posible que tengas que restablecer el contexto actual al clúster correcto antes de ejecutar el comando.

A continuación se muestra el formato de la configuración de ClientConfig:

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
  name: default
  namespace: kube-public
spec:
  authentication:
  - name: NAME
    ldap:
      certificateAuthorityData: CERTIFICATE_AUTHORITY_DATA
      connectionType: CONNECTION_TYPE
      host: HOST_NAME
      serviceAccountSecret:
        name: SERVICE_ACCOUNT_SECRET_NAME
        namespace: NAMESPACE
        type: SECRET_FORMAT
      user:
        baseDN: BASE_DN
        filter: FILTER
        identifierAttribute: IDENTIFIER_ATTRIBUTE
        loginAttribute: LOGIN_ATTRIBUTE
      group:
        baseDN: BASE_DN
        filter: FILTER
        identifierAttribute: IDENTIFIER_ATTRIBUTE

Puedes añadir varias configuraciones de proveedor de identidades OIDC, LDAP y SAML al mismo ClientConfig. El clúster intenta autenticarse con cada configuración en el orden en que se definen y se detiene después de la primera autenticación correcta. En el siguiente ejemplo de ClientConfig se definen varios proveedores de identidad en un orden específico:

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
  name: default
  namespace: kube-public
spec:
  authentication:
  - aws:
      region: us-west-2
    name: AWS Login
  - ldap:
  # Multiple lines are omitted here.
  - saml:
  # Multiple lines are omitted here.
  - azureAD:
  # Multiple lines are omitted here.
  - oidc:
    name: Okta OIDC
  # Multiple lines are omitted here.
  - oidc:
    name: Google OIDC
  # Multiple lines are omitted here.

Campos LDAP de ClientConfig

En la siguiente tabla se describen los campos del objeto ClientConfig ldap. Los campos que debes añadir dependen de los tokens de tu proveedor de identidades y de cómo haya configurado el proveedor el administrador de tu plataforma.

Campo Obligatorio Descripción Formato
name yes Nombre para identificar esta configuración de LDAP cadena
host yes Nombre de host o dirección IP del servidor LDAP. El puerto es opcional y, si no se especifica, se usará el 389 de forma predeterminada. Por ejemplo, ldap.server.example.com o 10.10.10.10:389. cadena
certificateAuthorityData Obligatorio para determinados tipos de conexión LDAP Contiene un certificado de autoridad de certificación con formato PEM y codificado en Base64 para el servidor LDAP. Solo se debe proporcionar para las conexiones ldaps y startTLS. cadena
connectionType yes Tipo de conexión LDAP que se debe usar al conectarse al servidor LDAP. El valor predeterminado es startTLS. El modo insecure solo debe usarse para el desarrollo, ya que toda la comunicación con el servidor será en texto sin formato. cadena
serviceAccountSecret
name yes Nombre del secreto de Kubernetes que almacena las credenciales de la cuenta de servicio LDAP. cadena
espacio de nombres yes Espacio de nombres del secreto de Kubernetes que almacena las credenciales de la cuenta de servicio de LDAP. cadena
tipo yes Define el formato del secreto de la cuenta de servicio para admitir diferentes tipos de secretos. Si has especificado basic-auth en la configuración de Secret, debe ser basic. De lo contrario, debe ser tls. Si no se especifica, se asigna el valor basic de forma predeterminada. cadena
usuario
baseDN yes Ubicación del subárbol en el directorio LDAP en el que se buscarán las entradas de usuario. cadena
filtrar no Filtro opcional que se aplica al buscar el usuario. Se puede usar para restringir aún más las cuentas de usuario que pueden iniciar sesión. Si no se especifica, se asigna el valor (objectClass=User) de forma predeterminada. cadena
identifierAttribute no Determina qué atributo se debe usar como identidad del usuario una vez que se haya autenticado. Este campo es distinto del campo loginAttribute para permitir que los usuarios inicien sesión con un nombre de usuario, pero que su identificador real sea una dirección de correo o un nombre completo (DN). Por ejemplo, si se asigna el valor sAMAccountName a loginAttribute y el valor userPrincipalName a identifierAttribute, un usuario podrá iniciar sesión como bsmith, pero las políticas de RBAC reales del usuario se escribirán como bsmith@example.com. Se recomienda usar userPrincipalName, ya que será único para cada usuario. Si no se especifica, el valor predeterminado es userPrincipalName. cadena
loginAttribute no Nombre del atributo que coincide con el nombre de usuario introducido. Se usa para buscar el usuario en la base de datos LDAP, por ejemplo, (<LoginAttribute>=<username>), y se combina con el campo de filtro opcional. El valor predeterminado es userPrincipalName. cadena
Grupo (campo opcional)
baseDN yes Ubicación del subárbol en el directorio LDAP en el que se buscarán las entradas de grupo. cadena
filtrar no Filtro opcional que se usa al buscar los grupos a los que pertenece un usuario. Se puede usar para que solo se incluyan determinados grupos y, de esta forma, reducir el número de grupos devueltos por usuario. El valor predeterminado es (objectClass=Group). cadena
identifierAttribute no Nombre identificativo de cada grupo al que pertenece un usuario. Por ejemplo, si se define como distinguishedName, los RBACs y otras expectativas de grupo deben escribirse como DNs completos. Si no se especifica, el valor predeterminado es distinguishedName. cadena

Siguientes pasos

Una vez que se haya aplicado la configuración, configura el acceso de los usuarios de proveedores externos a los clústeres.