Autorización de pods para acceder a recursos que no son de OCI mediante la detección de OpenID Connect (OIDC)

Obtenga información sobre el uso de la detección de OpenID Connect (OIDC) para autenticar pods de aplicaciones que se ejecutan en clusters creados con Container Engine for Kubernetes (OKE), de modo que los pods puedan llamar a API de servicio en proveedores de nube externos.

Es posible que desee que los pods de aplicación se ejecuten en un cluster de Kubernetes que haya creado con Kubernetes Engine para comunicarse con las API de servicio en la nube alojadas en proveedores de nube externos (como GCP, AWS y Azure). Para garantizar la seguridad de los recursos alojados por un proveedor de nube externo, la aplicación que se ejecuta en el cluster debe autenticar y gestionar la identidad. Sin embargo, la gestión directa de credenciales puede ser un proceso engorroso para las aplicaciones, y la rotación de claves es un proceso manual con una sobrecarga considerable.

OpenID Connect (OIDC) es un estándar del sector para que dichas integraciones sean más sencillas. OpenID Connect es una capa de identidad creada sobre OAuth 2.0. OpenID Connect soporta un protocolo de detección (a menudo denominado "Detección de OIDC") que utiliza un documento de configuración de proveedor OpenID (conocido como "documento de detección") para autenticar aplicaciones.

Kubernetes Engine proporciona soporte para la detección de OIDC, lo que le permite crear aplicaciones que interactúan con otros servicios en la nube sin necesidad de código fijo y rotar manualmente las claves de autenticación de API. Opcionalmente, puede activar la detección de OIDC al crear o actualizar un cluster mejorado con Kubernetes Engine.

En un nivel superior, al activar la detección de OIDC para un cluster, el token de cuenta de servicio de la aplicación se autentica y (si es válido) se intercambia por un token de acceso. A continuación, el token de acceso se utiliza para autenticar la aplicación con la API en el proveedor de nube externo.

Para obtener más información, consulte Detección del emisor de cuentas de servicio en la documentación de Kubernetes.

Detección de OIDC con más detalle

Kubernetes proporciona una cuenta de servicio a cada pod de aplicación que se ejecuta en un cluster y crea un token de cuenta de servicio para cada cuenta de servicio. Kubernetes gestiona el ciclo de vida de los tokens de cuenta de servicio. El token de cuenta de servicio es un token portador que la aplicación asocia a solicitudes de API y está estructurado como un token web JSON (JWT).

Al activar la detección de OIDC para un cluster, Kubernetes Engine expone un emisor de OIDC y agrega la URL del emisor de OIDC al token de cuenta de servicio como valor de la reclamación iss.

La ubicación de un documento de detección de OIDC es relativa a la URL del emisor de OIDC y es un punto final conocido de acceso público y no autenticado. El documento de detección de OIDC incluye la ubicación de acceso público y no autenticada de un juego de claves web JSON (JWKS) que contiene las claves públicas para verificar el token de cuenta de servicio. El proveedor de identidad del proveedor de nube externo utiliza el documento de detección de OIDC para localizar el JWKS y utiliza el JWKS para verificar el token de cuenta de servicio.

Para mayor seguridad, la API de servicio en la nube llamada por un pod de aplicación puede requerir que un público concreto esté presente en el token de cuenta de servicio que crea Kubernetes. Si la API de servicio en la nube requiere un público concreto, puede especificar ese público definiendo la propiedad audience de un volumen proyectado en el manifiesto de pod. El público especificado se incluye como el valor de la reclamación aud en el token de cuenta de servicio y, a continuación, el proveedor de nube externo puede verificarlo. También puede especificar un período de validez para el token de cuenta de servicio definiendo el valor de la propiedad expirationSeconds del volumen proyectado en el manifiesto de pod. Para obtener más información, consulte proyección de volumen de token ServiceAccount en la documentación de Kubernetes.

Si el proveedor de identidad del proveedor de nube externo verifica correctamente el token de cuenta de servicio mediante JWKS, el proveedor de identidad intercambia el token de cuenta de servicio por un token de acceso. A continuación, el token de acceso se utiliza para autenticar la aplicación y autorizarla a utilizar la API en el proveedor de nube externo.

Proceso de intercambio de token de detección de OIDC

Al activar la detección de OIDC para un cluster para que un pod de aplicación pueda realizar una solicitud a una API externa, Kubernetes Engine muestra lo siguiente:
  • Emisor de OIDC. El emisor de OIDC se expone mediante HTTPS con un certificado TLS/SSL de confianza pública.
  • Juego de claves web JSON (JWKS), que contiene las claves públicas utilizadas para verificar el token de cuenta de servicio. El JWKS se almacena en un cubo no autenticado y de acceso público en el servicio Object Storage. Consulte JWKS Example.
  • Documento de detección de OIDC (en formato JSON) que incluye la ubicación de JWKS. El documento de detección se almacena en un cubo de acceso público y no autenticado en el servicio Object Storage. Consulte Ejemplo de Documento de Detección.

Al definir un pod de aplicación que envía solicitudes a una API externa, si el proveedor de identidad del proveedor de nube externo espera un público específico en el token de cuenta de servicio, especifique un serviceAccountToken proyectado en el manifiesto de pod y defina su propiedad audience en consecuencia. Consulte Ejemplo de manifiesto de pod.

A continuación, se muestra una descripción general del proceso de intercambio de tokens:

  1. Al crear el pod de aplicación en el cluster, Kubernetes proporciona al pod un token de cuenta de servicio. El token de cuenta de servicio incluye la URL del emisor de OIDC del motor de Kubernetes como el valor de la reclamación iss en el JWT. Si ha especificado un público en el manifiesto de pod, el público se incluye en el JWT como valor de la reclamación aud. Consulte Ejemplo de token de cuenta de servicio.

  2. El pod de aplicación realiza una solicitud a una API en un proveedor de nube externo y presenta el token de cuenta de servicio codificado al proveedor de nube externo en la cabecera de autorización de la solicitud de API.
  3. El proveedor de identidad del proveedor de nube externo descodifica el token de cuenta de servicio, extrae la URL del emisor de OIDC del motor de Kubernetes de la reclamación iss, agrega /.well-known/openid-configuration a la URL como ubicación del documento de detección de OIDC y envía una solicitud a esa URL para obtener el documento de detección.
  4. El emisor de OIDC del motor de Kubernetes devuelve el documento de detección de OIDC, que contiene la URL de la ubicación de JWKS en el campo jwks_uri. Consulte Ejemplo de Documento de Detección.
  5. El proveedor de identidad del proveedor de nube externo extrae la URL del documento de detección de OIDC y envía una solicitud a esa URL para obtener JWKS. Consulte JWKS Example.
  6. El proveedor de identidad del proveedor de nube externo utiliza JWKS para validar el token de cuenta de servicio presentado originalmente por el pod de aplicación.
  7. Suponiendo que el token de cuenta de servicio es válido, el proveedor de identidad del proveedor de nube externo devuelve un token de acceso al pod de la aplicación.
  8. El pod de aplicación presenta el token de acceso a la API en el proveedor de nube externo para probar su identidad y realiza correctamente solicitudes de API.

El proceso de intercambio de tokens se muestra en el siguiente diagrama:

En esta imagen se muestra el proceso de intercambio de tokens que se describe en el texto adyacente.

Notas sobre la detección de OIDC

Tenga en cuenta los siguientes puntos al utilizar la detección de OIDC:

  • La detección de OIDC está soportada en clusters que ejecutan la versión 1.21 o posterior de Kubernetes.
  • La detección de OIDC solo está soportada en clusters nativos de VCN (clusters con puntos finales de API de Kubernetes en una subred de su propia VCN). Consulte Migración a clusters nativos de VCN.
  • La detección de OIDC está soportada en nodos gestionados, nodos virtuales y nodos autogestionados.
  • La detección de OIDC está soportada en clusters mejorados (pero no en clusters básicos).

Manifiesto de pod de ejemplo, token de cuenta de servicio, documento de detección y JWKS para detección de OIDC

Ejemplo de manifiesto de pod

Un manifiesto de ejemplo para un pod de aplicación que llama a una API de servicio en la nube. En este ejemplo, el proveedor de identidad del proveedor de nube externo espera que el token de cuenta de servicio especifique un público denominado vault:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: /var/run/secrets/tokens
      name: vault-token
  serviceAccountName: build-robot
  volumes:
  - name: vault-token
    projected:
      sources:
      - serviceAccountToken:
          path: vault-token
          expirationSeconds: 7200
          audience: vault

Ejemplo de token de cuenta de servicio

Un token de cuenta de servicio de ejemplo que Kubernetes puede crear para el pod en Ejemplo de manifiesto de pod:

{
  "aud": [
    "vault"
  ],
  "exp": 1731613413,
  "iat": 1700077413,
  "iss": "https://objectstorage.us-ashburn-1.oci.customer-oci.com/n/okecustprod/b/oidc/o/{discoveryUUID}",
  "kubernetes.io": {
    "namespace": "kube-system",
    "node": {
      "name": "127.0.0.1",
      "uid": "58456cb0-dd00-45ed-b797-5578fdceaced"
    },
    "pod": {
      "name": "build-robot-69cbfb9798-jv9gn",
      "uid": "778a530c-b3f4-47c0-9cd5-ab018fb64f33"
    },
    "serviceaccount": {
      "name": "build-robot",
      "uid": "a087d5a0-e1dd-43ec-93ac-f13d89cd13af"
    },
    "warnafter": 1700081020
  },
  "nbf": 1700077413,
  "sub": "system:serviceaccount:kube-system:build-robot"
}

Ejemplo de documento de detección

Un documento de detección de ejemplo que puede emitir Kubernetes Engine, incluida la ubicación del JWKS especificado por el campo jwks_uri:

{
    "issuer": "https://objectstorage.us-ashburn-1.oci.customer-oci.com/n/okecustprod/b/oidc/o/{discoveryUUID}",
    "jwks_uri": "https://objectstorage.us-ashburn-1.oci.customer-oci.com/n/okecustprod/b/oidc/o/{discoveryUUID}/jwks",
    "response_types_supported": [
        "id_token"
    ],
    "subject_types_supported": [
        "public"
    ],
    "id_token_signing_alg_values_supported": [
        "RS256"
    ]
}

Ejemplo de JWKS

Un ejemplo de JWKS para autenticar el token de cuenta de servicio:

{
"keys": [
    {
        "kty": "RSA",
        "kid": "42148Kf",
        "use": "sig",
        "alg": "RS256",
        "n": "iGaLqP6y-SJCCBq5Hv6pGDbG_SQ______asdf3sC",
        "e": "AQAB"
    },
    {
        "kty": "RSA",
        "kid": "bEaunmA",
        "use": "sig",
        "alg": "RS256",
        "n": "BISvILNyn-lUu4goZSXBD9ackM9______RpUlq2w",
        "e": "AQAB"
    }
]
}

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

Para permitir que los pods de aplicaciones que se ejecutan en un cluster que cree con Kubernetes Engine se autentiquen mediante la detección de OIDC al acceder a las API alojadas en un proveedor de nube externo, debe definir la propiedad Activar detección de OIDC del cluster.

Uso de la consola para activar un cluster para la detección de OIDC

Creación de un nuevo cluster activado para la detección de OIDC

Para crear un cluster y permitir que los pods de aplicación que se ejecutan en el cluster se autentiquen mediante la detección de OIDC al acceder a las API alojadas en un proveedor de nube externo:

  1. Siga las instrucciones para crear un cluster mediante el flujo de trabajo "Creación personalizada". Consulte Uso de la consola para crear un cluster con configuración definida explícitamente en el flujo de trabajo "Creación personalizada.
  2. En la página de creación de cluster, acepte los detalles de configuración por defecto para el nuevo cluster o especifique alternativas de las siguientes formas:

    • Nombre: el nombre del nuevo cluster. Acepte el nombre por defecto o introduzca un nombre de su elección. Evite introducir información confidencial.
    • Compartimento: compartimento en el que se va a crear el nuevo cluster.
    • versión de Kubernetes: la versión de Kubernetes que se va a ejecutar en los nodos en los nodos en los que se va a ejecutar el cluster. Acepte la versión por defecto o seleccione la versión que desee. Entre otras cosas, la versión de Kubernetes seleccionada determina el juego por defecto de controladores de admisión activados en el cluster creado (consulte Controladores de admisión admitidos).
  3. Seleccione Mostrar opciones avanzadas y, en el panel OpenID Detección de Connect (OIDC), seleccione la opción Activar detección de OIDC.

  4. Introduzca otros detalles de configuración para el nuevo cluster como se describe en Uso de la consola para crear un cluster con valores definidos explícitamente en el flujo de trabajo "Creación personalizada.
  5. Seleccione Crear Cluster para crear el nuevo cluster ahora.

Edición de un cluster existente para activar la detección de OIDC

Para actualizar un cluster existente para permitir que los pods de aplicación que se ejecutan en el cluster se autentiquen mediante la detección de OIDC al acceder a las API alojadas en un proveedor de nube externo:

  1. Siga las instrucciones para actualizar un cluster existente mediante la consola. Consulte Updating a Cluster.
  2. En la página Detalles de cluster, seleccione Editar.

  3. En la ventana Editar cluster, en el panel OpenID Detección de Connect (OIDC), seleccione la opción Activar detección de OIDC.

  4. Seleccione Guardar para guardar los cambios.

Uso de la CLI para activar un cluster para la detección de 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 activación de la detección de OIDC

Para utilizar la CLI para crear un cluster mejorado que utilice la detección de OIDC para autenticar pods de aplicaciones al acceder a las API alojadas en un proveedor de nube externo, incluya el parámetro --open-id-connect-discovery-enabled en el comando oci ce cluster create.

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-discovery-enabled true

Edición de un cluster para activar la detección de OIDC

Para utilizar la CLI para actualizar un cluster mejorado a fin de utilizar la detección de OIDC para autenticar pods de aplicaciones al acceder a las API alojadas en un proveedor de nube externo, defina el atributo isOpenIdConnectDiscoveryEnabled en true:

  1. En un editor adecuado, cree un archivo JSON con el nombre que desee (estas instrucciones suponen que el archivo se denomina cluster-enable-oidc.json) que contiene lo siguiente:
    {
      "options": {
        "openIdConnectDiscovery": {
          "isOpenIdConnectDiscoveryEnabled": true
        }
      }
    }
  2. Guardar y cerrar el archivo cluster-enable-oidc.json.
  3. Actualice el cluster introduciendo:

    oci ce cluster update --cluster-id <cluster-ocid> --from-json file://<path-to-file>

    donde:

    • --cluster-id <cluster-ocid> es el OCID del cluster en el que desea activar la detección de OIDC.
    • --from-json file://<path-to-file> especifica la ubicación del archivo que se utilizará al actualizar el cluster.

    Por ejemplo:

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

Uso de la API para activar un cluster para la detección de OIDC

Ejecute la operación CreateCluster para crear un cluster o la operación UpdateCluster para editar un cluster y especifique true como valor del atributo isOpenIdConnectDiscoveryEnabled del recurso CreateClusterOptions o del recurso UpdateClusterOptionsDetails, respectivamente.