Autenticación de Usuarios de Cluster mediante un Proveedor de Identidad de OpenID Connect Externo (OIDC)

Obtenga información sobre el uso de proveedores de identidad externos de OpenID Connect (OIDC) para autenticar usuarios de clusters creados con Kubernetes Engine (OKE).

Por defecto, los clusters que crea con el motor de Kubernetes utilizan Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) para autenticar usuarios. OCI IAM y el responsable de autorización de Kubernetes RBAC trabajan conjuntamente para permitir a los usuarios que han sido autorizados correctamente por al menos uno de ellos que completen la operación de Kubernetes solicitada. Consulte Acerca de control de acceso y Kubernetes Engine (OKE).

Además de OCI IAM, puede especificar que los clusters que cree con el motor de Kubernetes utilicen un proveedor de identidad de OpenID Connect (OIDC) externo (IdP) para autenticar usuarios. Puede especificar un proveedor de identidad de OIDC diferente para diferentes clusters. El uso de un proveedor de identidad de OIDC externo (como Keycloak) para la autenticación de usuarios le permite aprovechar los proveedores de identidad existentes que su organización ya mantiene, en lugar de crear nuevas cuentas de usuario en OCI IAM. Y como los usuarios no están definidos en OCI IAM, solo pueden acceder al cluster y no tienen acceso a otros recursos de OCI.

Una vez activado un cluster para la autenticación de OIDC, el cluster utiliza un plugin de autenticador de OIDC para autenticar usuarios con un proveedor de identidad de OIDC designado. En resumen, el flujo de autenticación es el siguiente:

  1. El usuario se conecta al proveedor de identidad de OIDC para obtener id_token.
  2. El usuario ejecuta un comando kubectl en el cluster y transfiere id_token como argumento.
  3. El servidor de API de Kubernetes que se ejecuta en el cluster valida id_token mediante la información del proveedor de identidad de OIDC.
  4. El servidor de API de Kubernetes realiza la autorización de RBAC de Kubernetes.
  5. Si el usuario está autorizado, el servidor de API de Kubernetes realiza la operación solicitada y kubectl devuelve una respuesta al usuario.

Para obtener una descripción completa del flujo de autenticación de OIDC en Kubernetes, consulte OpenID Connect Tokens en la documentación de Kubernetes.

Si activa un cluster para la autenticación de OIDC, también puede utilizar el responsable de autorización de RBAC de Kubernetes para aplicar un control de acceso detallado adicional a los usuarios de clusters específicos. Puede configurar roles y clusters de RBAC de Kubernetes de la misma forma que si estuviera utilizando la autenticación de OCI IAM, como se describe en Acerca del control de acceso y el motor de Kubernetes (OKE). Sin embargo, al definir un enlace de roles o un enlace de rol de ClusterRolebinding de Kubernetes RBAC para asignar un rol o un rol de cluster a un usuario o grupo, en lugar de especificar un OCID definido en OCI IAM, especifique el nombre del usuario o grupo definido en el proveedor de identidad de OIDC externo.

Tenga en cuenta lo siguiente:

  • Puede especificar un proveedor de identidad de OIDC para clusters con nodos virtuales, nodos gestionados y nodos autogestionados.
  • La autenticación de OCI IAM siempre está activada, incluso cuando la autenticación de OIDC está activada. Por lo tanto, los usuarios de OCI IAM y los usuarios de OIDC se pueden autenticar mediante el mismo cluster y realizar operaciones en ese cluster para el que están autorizados.
  • Kubernetes Engine no implementa un cliente de OIDC. Es su responsabilidad configurar y mantener los detalles de autenticación de usuario en el proveedor de identidad de OIDC externo y obtener un id_token del proveedor de identidad.
  • Utilice el log de kubernetes-apiserver para solucionar problemas con el inicio del plugin de autenticador de OIDC y problemas con la validación de token. Para obtener más información, consulte Visualización de logs de servicio de Kubernetes Engine (OKE).

Requisitos para la autenticación de OIDC

Tenga en cuenta los siguientes requisitos para activar un cluster para la autenticación de OIDC:

  • El cluster debe ser un cluster mejorado. La autenticación OIDC no está soportada para los clusters básicos.
  • El cluster debe ser un nuevo cluster o un "cluster nativo de VCN". Es decir, un cluster que tiene su punto final de API de Kubernetes integrado en su propia VCN (consulte Migración a clusters nativos de VCN). La autenticación OIDC no está soportada para clusters con puntos finales de API de Kubernetes que no estén integrados en su propia VCN.
  • El cluster debe ejecutar la versión 1.21 de Kubernetes (o posterior).

Tenga en cuenta los siguientes requisitos para acceder a un cluster activado para OIDC:

  • Los detalles de autenticación de usuario deben existir en el proveedor de identidad de OIDC externo.
  • Debe existir una regla de salida para la subred de punto final de API de Kubernetes del cluster que permita el tráfico a la dirección IP y el número de puerto del proveedor de identidad de OIDC externo:
    Estado: Destino Protocolo/puerto de destino Descripción:
    Con estado Dirección IP del proveedor de identidad Dependiente del proveedor de identidad

    Permitir tráfico al proveedor de identidad de OIDC externo.

Activación de un cluster para la autenticación de OIDC

Para activar un cluster que cree con Kubernetes Engine para autenticar usuarios con un proveedor de identidad de OIDC, debe definir las propiedades URL de emisor de OIDC y ID de cliente de OIDC del cluster como mínimo.

Además, puede definir otras propiedades para controlar la autenticación de OIDC. Para obtener una lista completa de las propiedades, consulte Configuración del servidor de API en la documentación de Kubernetes.

Uso de la CLI para especificar un proveedor de identidad externo de OpenID Connect (OIDC)

Para obtener información sobre el uso de la CLI, consulte Interfaz de línea de comandos (CLI). Para obtener una lista completa de los indicadores y las opciones disponibles para los comandos de la CLI, consulte Referencia de la línea de comandos.

Creación de un cluster y especificación de un único proveedor de identidad externo de OpenID Connect (OIDC)

Para utilizar la CLI para crear un cluster mejorado que utilice un único proveedor de identidad externo de OpenID Connect (OIDC), utilice el comando oci ce cluster create e incluya al menos los siguientes parámetros necesarios para la configuración de OIDC:

  • --open-id-connect-auth-enabled definido en true
  • --oidc-issuer-url definido en la URL pública base del proveedor de identidad que permite al servidor de API de Kubernetes detectar claves de firma públicas. Normalmente, se trata de la URL de detección de OIDC del proveedor de identidad, que se ha cambiado para tener una ruta de acceso vacía. Por ejemplo, si la URL de detección de OIDC del emisor es https://accounts.provider.example/.well-known/openid-configuration, especifique https://accounts.provider.example
  • --oidc-client-id se define en un ID de cliente para el que se deben emitir todos los tokens. Por ejemplo, kubernetes

Por ejemplo:

oci ce cluster create \
--compartment-id ocid1.compartment.oc1..aaaaaaaa______n5q \
--name sales \
--vcn-id ocid1.vcn.oc1.phx.aaaaaaaa______lhq \
--type ENHANCED_CLUSTER \
--kubernetes-version v1.25.4 \
--service-lb-subnet-ids "[\"ocid1.subnet.oc1.phx.aaaaaaaa______g7q"]" \
--endpoint-subnet-id ocid1.subnet.oc1.phx.aaaaaaaa______sna \
--endpoint-public-ip-enabled true \
--endpoint-nsg-ids "[\"ocid1.networksecuritygroup.oc1.phx.aaaaaaaa______5qq\"]" \
--cluster-pod-network-options '[{"cniType":"OCI_VCN_IP_NATIVE"}]' \
--open-id-connect-auth-enabled true
--oidc-issuer-url https://accounts.provider.example
--oidc-client-id kubernetes

Además de las propiedades URL del emisor de OIDC y ID de cliente de OIDC del cluster, puede configurar otras propiedades para controlar la autenticación de OIDC. Para obtener una lista completa de las propiedades, consulte Configuración del servidor de API en la documentación de Kubernetes.

Actualización de un cluster y especificación de un único proveedor de identidad externo de OpenID Connect (OIDC)

Para utilizar la CLI para actualizar un cluster mejorado existente a fin de utilizar un único proveedor de identidad externo de OpenID Connect (OIDC):

  1. Con su editor de JSON preferido, cree un nuevo archivo en formato JSON para actualizar la configuración del proveedor de identidad de OIDC externo del cluster e incluya al menos los siguientes parámetros necesarios para la configuración:
    {
        "options": {
            "openIdConnectTokenAuthenticationConfig": {
                "isOpenIdConnectAuthEnabled": true,
                "issuerUrl": "<idp-base-url>",
                "clientId": "<client-id>"
            }
        }
    }
    donde:
    • isOpenIdConnectAuthEnabled está definido en true
    • "issuerUrl": "<idp-base-url>" es la URL pública base del proveedor de identidad que permite al servidor de API de Kubernetes detectar claves de firma públicas. Normalmente, se trata de la URL de detección de OIDC del proveedor de identidad, que se ha cambiado para tener una ruta de acceso vacía. Por ejemplo, si la URL de detección de OIDC del emisor es https://accounts.provider.example/.well-known/openid-configuration, especifique https://accounts.provider.example
    • "clientId": "<client-id>" es el ID de cliente para el que se deben emitir todos los tokens. Por ejemplo, kubernetes

    Por ejemplo:

    {
        "options": {
            "openIdConnectTokenAuthenticationConfig": {
                "isOpenIdConnectAuthEnabled": true,
                "issuerUrl": "https://accounts.provider.example",
                "clientId": "kubernetes"
            }
        }
    }
    Además de las propiedades URL del emisor de OIDC y ID de cliente de OIDC del cluster, puede configurar otras propiedades para controlar la autenticación de OIDC. Por ejemplo:
    {
        "options": {
            "openIdConnectTokenAuthenticationConfig": {
                "clientId": "kubernetes",
                "usernameClaim": "sub",
                "issuerUrl": "https://token.actions.githubusercontent.com",
                "isOpenIdConnectAuthEnabled": true,
                "usernamePrefix": "actions-oidc:",
                "requiredClaim": [
                    "repository=GH_ACCOUNT/REPO",
                    "ref=refs/heads/main"
                ]
            }
        }
    }

    Para obtener una lista completa de las propiedades, consulte Configuración del servidor de API en la documentación de Kubernetes.

  2. Guarde el archivo JSON que contiene la configuración del proveedor de identidad OpenID Connect (OIDC) externo, con un nombre y en una ubicación de su elección. Por ejemplo, como /users/jdoe/update-oidc-config
  3. Utilice el comando oci ce cluster update para actualizar el cluster existente:
    oci ce cluster update --cluster-id <cluster-ocid> --from-json file://<path-to-file>

    Por ejemplo:

    oci ce cluster update --cluster-id ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd --from-json file:///users/jdoe/update-oidc-config

Creación de un cluster y especificación de varios proveedores de identidad externos de OpenID Connect (OIDC)

Para utilizar la CLI para crear un cluster mejorado que utilice varios proveedores de identidad externos de OpenID Connect (OIDC) (disponible para clusters que ejecutan la versión 1.30 de Kubernetes y posteriores):

  1. Cree un nuevo archivo de configuración de autenticación de Kubernetes como archivo .yaml para contener detalles de los proveedores de identidad. Para obtener más información sobre los archivos de configuración de autenticación, consulte Configuración de autenticación desde un archivo en la documentación de Kubernetes.
  2. Para cada proveedor de identidad:
    1. Defina el campo jwt.issuer.url en la URL pública base del proveedor de identidad que permite al servidor de API de Kubernetes detectar claves de firma públicas. Normalmente, se trata de la URL de detección de OIDC del proveedor de identidad, que se ha cambiado para tener una ruta de acceso vacía. Por ejemplo, si la URL de detección de OIDC del emisor es https://accounts.provider.example/.well-known/openid-configuration, especifique https://accounts.provider.example
    2. También puede definir otros campos para controlar la autenticación de OIDC. Tenga en cuenta que al utilizar un archivo de configuración de autenticación, se debe especificar cualquier configuración de OIDC en este archivo. Para obtener más información sobre los campos de un archivo de configuración de autenticación, consulte Configuración de autenticación desde un archivo en la documentación de Kubernetes.

    Por ejemplo:

    apiVersion: apiserver.config.k8s.io/v1beta1
    kind: AuthenticationConfiguration
    jwt:
      - issuer:
          url: https://accounts.google.com
          audiences:
            - 838763820337-6vt12pbavkteafx08f32z48u7gpll6on.apps.googleusercontent.com
            - 838763820337-elyce7g28ep5b7uzq4dt1uzh1h86jki9.apps.googleusercontent.com
          audienceMatchPolicy: MatchAny
        claimMappings:
          username:
            claim: "sub"
            prefix: ""
          groups:
            claim: "groups"
            prefix: ""
          uid:
            claim: "sub"
      - issuer:
          url: https://dev-dx7mdewuu7xhb4mw.us.auth0.com/
          audiences:
            - 7w7qJsa3brl5OHV6uljAAYhfknVTsVAw
          audienceMatchPolicy: MatchAny
        claimMappings:
          username:
            claim: "sub"
            prefix: ""
          groups:
            claim: "groups"
            prefix: ""
          uid:
            claim: "sub"
  3. Convierta el archivo .yaml de configuración de autenticación en una cadena codificada Base64.
  4. Utilice el comando oci ce cluster create e incluya los siguientes parámetros:

    • --open-id-connect-auth-enabled definido en true
    • --oidc-configuration-file definido en la cadena codificada Base64 que ha creado a partir del archivo de configuración de autenticación.

    Por ejemplo:

    oci ce cluster create \
    --compartment-id ocid1.compartment.oc1..aaaaaaaa______n5q \
    --name sales \
    --vcn-id ocid1.vcn.oc1.phx.aaaaaaaa______lhq \
    --type ENHANCED_CLUSTER \
    --kubernetes-version v1.30.1 \
    --service-lb-subnet-ids "[\"ocid1.subnet.oc1.phx.aaaaaaaa______g7q"]" \
    --endpoint-subnet-id ocid1.subnet.oc1.phx.aaaaaaaa______sna \
    --endpoint-public-ip-enabled true \
    --endpoint-nsg-ids "[\"ocid1.networksecuritygroup.oc1.phx.aaaaaaaa______5qq\"]" \
    --cluster-pod-network-options '[{"cniType":"OCI_VCN_IP_NATIVE"}]' \
    --open-id-connect-auth-enabled true
    --oidc-configuration-file <base64-encoded-config-file>

    Tenga en cuenta que, después de definir el parámetro --oidc-configuration-file, no utilice otros parámetros del comando oci ce cluster create para configurar la autenticación de OIDC. Utilice solo campos en el archivo de configuración de autenticación para controlar la autenticación de OIDC.

Uso de la API para especificar un proveedor de identidad externo de OpenID Connect (OIDC)

Creación de un cluster y especificación de un único proveedor de identidad externo de OpenID Connect (OIDC)

Para utilizar la API para crear un cluster que utilice un único proveedor de identidad externo de OpenID Connect (OIDC), utilice la operación CreateCluster para crear un cluster y especifique valores para los atributos de la propiedad openIdConnectTokenAuthenticationConfig, incluidos al menos los siguientes atributos necesarios:

  • isOpenIdConnectAuthEnabled definido en true
  • issuerUrl definido en la URL pública base del proveedor de identidad que permite al servidor de API de Kubernetes detectar claves de firma públicas. Normalmente, se trata de la URL de detección de OIDC del proveedor de identidad, que se ha cambiado para tener una ruta de acceso vacía. Por ejemplo, si la URL de detección de OIDC del emisor es https://accounts.provider.example/.well-known/openid-configuration, especifique https://accounts.provider.example
  • clientId se define en un ID de cliente para el que se deben emitir todos los tokens. Por ejemplo, kubernetes

Además de los atributos issuerURL y clientId, puede definir otros atributos openIdConnectTokenAuthenticationConfig para controlar la autenticación de OIDC. Para obtener una lista completa de atributos, consulte openIdConnectTokenAuthenticationConfig Reference

Creación de un cluster y especificación de varios proveedores de identidad externos de OpenID Connect (OIDC)

Para utilizar la API para crear un cluster que utilice varios proveedores de identidad de OIDC externos (disponible para clusters que ejecutan la versión 1.30 de Kubernetes y posteriores):

  1. Cree un nuevo archivo de configuración de autenticación de Kubernetes como archivo .yaml para contener detalles de los proveedores de identidad. Para obtener más información sobre los archivos de configuración de autenticación, consulte Configuración de autenticación desde un archivo en la documentación de Kubernetes.
  2. Para cada proveedor de identidad:
    1. Defina el campo jwt.issuer.url en la URL pública base del proveedor de identidad que permite al servidor de API de Kubernetes detectar claves de firma públicas. Normalmente, se trata de la URL de detección de OIDC del proveedor de identidad, que se ha cambiado para tener una ruta de acceso vacía. Por ejemplo, si la URL de detección de OIDC del emisor es https://accounts.provider.example/.well-known/openid-configuration, especifique https://accounts.provider.example
    2. También puede definir otros campos para controlar la autenticación de OIDC. Tenga en cuenta que al utilizar un archivo de configuración de autenticación, se debe especificar cualquier configuración de OIDC en este archivo. Para obtener más información sobre los campos de un archivo de configuración de autenticación, consulte Configuración de autenticación desde un archivo en la documentación de Kubernetes.

    Por ejemplo:

    apiVersion: apiserver.config.k8s.io/v1beta1
    kind: AuthenticationConfiguration
    jwt:
      - issuer:
          url: https://accounts.google.com
          audiences:
            - 838763820337-6vt12pbavkteafx08f32z48u7gpll6on.apps.googleusercontent.com
            - 838763820337-elyce7g28ep5b7uzq4dt1uzh1h86jki9.apps.googleusercontent.com
          audienceMatchPolicy: MatchAny
        claimMappings:
          username:
            claim: "sub"
            prefix: ""
          groups:
            claim: "groups"
            prefix: ""
          uid:
            claim: "sub"
      - issuer:
          url: https://dev-dx7mdewuu7xhb4mw.us.auth0.com/
          audiences:
            - 7w7qJsa3brl5OHV6uljAAYhfknVTsVAw
          audienceMatchPolicy: MatchAny
        claimMappings:
          username:
            claim: "sub"
            prefix: ""
          groups:
            claim: "groups"
            prefix: ""
          uid:
            claim: "sub"
  3. Convierta el archivo .yaml de configuración de autenticación en una cadena codificada Base64.
  4. Utilice la operación CreateCluster para crear el cluster y especifique valores para los siguientes atributos de la propiedad openIdConnectTokenAuthenticationConfig:

    • isOpenIdConnectAuthEnabled definido en true
    • configurationFile definido en la cadena codificada Base64 que ha creado a partir del archivo de configuración de autenticación.

    Tenga en cuenta que, al definir el atributo configurationFile, no defina otros atributos de la propiedad openIdConnectTokenAuthenticationConfig para configurar la autenticación de OIDC. Utilice solo campos en el archivo de configuración de autenticación para controlar la autenticación de OIDC.

Acceso a un cluster activado para OIDC

Una forma de acceder a un cluster que autentica usuarios con un proveedor de identidad de OIDC externo es utilizar el autenticador de OIDC. Para utilizar el autenticador de OIDC para acceder a un cluster activado para OIDC, debe introducir detalles para el usuario, el proveedor de identidad de OIDC y el token de OIDC en el archivo kubeconfig, como se describe en esta sección. También puede acceder a un cluster activado para OIDC mediante la inclusión de un token directamente en los comandos de kubectl mediante la opción --token. Para obtener más información sobre el uso del autenticador de OIDC o de la opción --token de kubectl, consulte Tokens de conexión OpenID en la documentación de Kubernetes.

Tenga en cuenta que hay otras formas de acceder a los clusters activados para OIDC. Por ejemplo, mediante un plugin de kubectl como kubelogin (para obtener más información, consulte la documentación de kubelogin en GitHub).

Para utilizar el autenticador de OIDC para acceder a un cluster activado para OIDC:

  1. Conéctese al proveedor de identidad de OIDC externo.
  2. Anote id_token y refresh_token que proporciona el proveedor de identidad de OIDC.
  3. Configure un archivo kubeconfig para acceder al cluster activado para OIDC siguiendo las instrucciones de Configuración del acceso de Cloud Shell a los clusters o Configuración del acceso local a los clusters según corresponda, según cómo desee acceder al cluster.
  4. Defina un usuario en el archivo kubeconfig que se va a autenticar con el proveedor de identidad de OIDC externo ejecutando el siguiente comando:
    kubectl config set-credentials <username> \
        --auth-provider=oidc \
        --auth-provider-arg=idp-issuer-url=<base-url> \
        --auth-provider-arg=client-id=<client-name> \
        --auth-provider-arg=client-secret=<client-secret> \
        --auth-provider-arg=refresh-token=<refresh-token> \
        --auth-provider-arg=id-token=<id-token> \
        --auth-provider-arg=extra-scopes=groups

    donde:

    • <username> del usuario para autenticarse con el proveedor de identidad de OIDC externo. Por ejemplo, oidc-admin-user
    • idp-issuer-url=<base-url> es la URL pública base del proveedor de identidad de OIDC externo que permite al servidor de API de Kubernetes detectar claves de firma públicas. Normalmente, se trata de la URL de detección de OIDC del proveedor de identidad, que se ha cambiado para tener una ruta de acceso vacía. Por ejemplo, si la URL de detección de OIDC del emisor es https://accounts.provider.example/.well-known/openid-configuration, especifique https://accounts.provider.example
    • client-id=<client-name> es un identificador de cadena asociado al cliente de OIDC que forma parte de las credenciales del cliente. Por ejemplo, client-id=kubernetes
    • client-secret=<CLIENT_SECRET> es una cadena secreta, es decir, la contraseña para las credenciales de cliente.
    • refresh-token=<refresh-token> es el token de refrescamiento OAuth 2.0 proporcionado por el proveedor de identidad de OIDC externo después de la autenticación.
    • id-token=<id-token> es OAuth 2.0 id_token proporcionado por el proveedor de identidad de OIDC externo después de la autenticación. id_token representa el usuario IdP al que desea permitir el acceso al cluster mediante la autenticación de OIDC.
    • extra-scopes=groups es una lista de ámbitos OAuth 2.0 adicionales que se pueden solicitar al proveedor de identidad de OIDC externo cuando se refrescan los tokens.

    Por ejemplo:

    kubectl config set-credentials oidc-admin-user \
        --auth-provider=oidc \
        --auth-provider-arg=idp-issuer-url=https://accounts.provider.example \
        --auth-provider-arg=client-id=kubernetes \
        --auth-provider-arg=client-secret=1db158______c5 \
        --auth-provider-arg=refresh-token=q1b______KtQA= \
        --auth-provider-arg=id-token=eyJr______4knw \
        --auth-provider-arg=extra-scopes=groups
  5. Defina un contexto en el archivo kubeconfig para el nuevo usuario que se va a autenticar mediante el proveedor de identidad de OIDC externo ejecutando el siguiente comando:
    kubectl config set-context <context-name> --cluster=<cluster-name> --user=<oidc-username>

    donde:

    • <context-name> es el nombre que elija para el contexto. Por ejemplo, OIDC-auth
    • --cluster=<cluster-name> es el nombre del cluster activado para OIDC. Por ejemplo, OIDC-development
    • --user=<oidc-username> es el nombre del usuario que se va a autenticar con el proveedor de identidad de OIDC externo. Por ejemplo, oidc-admin-user

    Por ejemplo:

    kubectl config set-context OIDC-auth --cluster=OIDC-development --user=oidc-admin-user