Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Use RRSA for pod-level access control

Última actualización: Sep 21, 2026

Asigne a cada pod un rol de RAM dedicado con tokens de STS de corta duración en lugar de usar credenciales de nodo compartidas.

RRSA ofrece dos propiedades de seguridad clave:

  • Privilegio mínimo: limite los permisos de RAM a una cuenta de servicio específica. De este modo, solo los pods que usen esa cuenta podrán acceder a dichos recursos y se elimina la necesidad de contar con pares de AccessKey estáticos.

  • Aislamiento de credenciales: los pods no pueden acceder a las credenciales que utilizan otros pods en el mismo nodo. Sin RRSA, todos los pods de un nodo comparten los permisos del rol de la instancia subyacente de Elastic Compute Service (ECS).

Cómo funciona RRSA

Sin RRSA, todos los pods de un nodo comparten los permisos del rol de la instancia de ECS mediante los metadatos de la instancia, lo cual representa un riesgo de seguridad importante.

RRSA resuelve este problema al vincular un rol de RAM con una cuenta de servicio de Kubernetes. Cuando un pod se inicia, recibe un token de OpenID Connect (OIDC) limitado a su cuenta de servicio. Luego llama a la API AssumeRoleWithOIDC y obtiene un token de STS asociado al rol para acceder a las API de la nube.

El flujo de autenticación es el siguiente:

  1. Inyección del token: cuando un pod se inicia, ACK utiliza la proyección de volumen de tokens de cuenta de servicio para montar un archivo de token OIDC asociado a la cuenta de servicio del pod.

  2. Asunción del rol: la aplicación llama a la API AssumeRoleWithOIDC mediante este token OIDC.

  3. Recepción de credenciales de STS: Alibaba Cloud RAM verifica el token OIDC con el proveedor OIDC del clúster y devuelve credenciales de STS asociadas al rol.

  4. Acceso a recursos: el pod usa las credenciales de STS de corta duración para acceder a las API autorizadas de Alibaba Cloud.

Los tokens OIDC tienen una duración breve. Lea el token desde el archivo en cada solicitud de autenticación y no lo almacene en caché. ACK renueva los tokens automáticamente antes de que caduquen.

Cuando se habilita RRSA, ACK realiza automáticamente las siguientes acciones:

  • Crea un emisor OIDC dedicado para el clúster.

  • Habilita la proyección de volumen de tokens de cuenta de servicio para el clúster.

  • Crea un proveedor de identidades (IdP) de RAM en su cuenta con el nombre ack-rrsa-<cluster_id>, configurado para el inicio de sesión único (SSO) con el emisor OIDC del clúster.

Antes de empezar

Asegúrese de cumplir con lo siguiente antes de configurar RRSA:

  • Versión del clúster: el clúster de ACK (Basic, Pro, Serverless o Edge) ejecuta Kubernetes 1.22 o posterior.

  • Permisos: acceso administrativo a la consola de ACK y a la consola de RAM.

  • Límite de validez del token: después de habilitar RRSA, los tokens de ServiceAccount recién creados tienen una validez máxima de 12 horas.

Paso 1: Habilite RRSA para su clúster

Habilite RRSA durante la creación del clúster o cuando ya esté en ejecución. En los clústeres ACK Serverless, habilítelo después de crear el clúster desde la página de detalles.

Habilitación durante la creación del clúster

Al crear un clúster administrado de ACK o un clúster ACK Edge, vaya al paso Cluster Configurations. Expanda Advanced Options (Optional) y haga clic en Enable junto a RRSA OIDC.

image

Habilitación en un clúster existente

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. Haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Cluster Information.

  3. En la pestaña Basic Information, desplácese hasta la sección Security and Auditing y haga clic en Enable junto a RRSA OIDC.

    image

  4. En el cuadro de diálogo Enable RRSA, haga clic en Confirm. Espere a que el estado del clúster cambie de Updating a Running. Una vez completado, RRSA quedará habilitado.

Obtención de la URL y el ARN del proveedor OIDC

Una vez habilitado RRSA, pase el cursor sobre la etiqueta Enabled junto a RRSA OIDC en la sección Security and Auditing. Se mostrarán la URL y el Alibaba Cloud Resource Name (ARN) del proveedor OIDC.

image

Anote ambos valores, ya que los necesitará al configurar los roles de RAM y las plantillas de la aplicación.

Paso 2: Configure una aplicación para usar RRSA

La configuración de una aplicación de ejemplo consta de dos partes:

  • Configuración a nivel de clúster (una sola vez por clúster): habilite RRSA e instale ack-pod-identity-webhook.

  • Configuración por aplicación (repita para cada aplicación): cree o utilice un rol de RAM existente, otorgue permisos y despliegue la aplicación.

Configuración de ejemplo

Item

Value

Namespace

rrsa-demo

Cuenta de servicio

demo-sa

Rol de RAM

demo-role-for-rrsa

Sample workflow

1. Instale ack-pod-identity-webhook

ack-pod-identity-webhook inyecta automáticamente la ruta del archivo de token OIDC y el ARN del rol de RAM en los pods como variables de entorno. Omita este paso si prefiere configurar las plantillas de pod manualmente. Consulte Manually configure pod templates.

  1. En la consola de ACK, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Add-ons.

  2. En la página Add-ons, haga clic en la pestaña Security.

  3. Busque ack-pod-identity-webhook y haga clic en Install.

  4. Confirme la información y haga clic en OK.

2. Cree o configure un rol de RAM para el proveedor de identidades OIDC

Creación de un rol de RAM

Cree un rol de RAM llamado demo-role-for-rrsa que confíe en el proveedor de identidades (IdP) OIDC del clúster. Consulte Create a RAM role for an OIDC IdP.

Utilice los siguientes valores de parámetro:

Parámetro

Valor

Identity Provider Type

Seleccione OIDC.

Identity Provider

Seleccione el IdP llamado ack-rrsa-<cluster_id>, donde <cluster_id> es el ID de su clúster.

Condition

  • oidc:iss: mantenga el valor predeterminado.

  • oidc:aud: mantenga el valor predeterminado.

  • oidc:sub: agregue esta condición manualmente.

    • Key: seleccione oidc:sub

    • Operator: seleccione StringEquals

    • Value: introduzca system:serviceaccount:<namespace>:<serviceAccountName>, donde <namespace> es el namespace de su aplicación y <serviceAccountName> es el nombre de la cuenta de servicio. Para la aplicación de prueba de este tema, introduzca system:serviceaccount:rrsa-demo:demo-sa.

Role Name

demo-role-for-rrsa

La condición oidc:sub limita la confianza a una cuenta de servicio específica dentro de un namespace determinado. Reemplace rrsa-demo y demo-sa con el namespace y el nombre de cuenta de servicio reales.

Configuración de un rol de RAM existente

Para utilizar un rol de RAM existente, actualice su política de confianza y permita que la cuenta de servicio lo asuma. Consulte Edit the trust policy of a RAM role.

Agregue una entrada Statement con la siguiente estructura:

{
  "Action": "sts:AssumeRole",
  "Condition": {
    "StringEquals": {
      "oidc:aud": "sts.aliyuncs.com",
      "oidc:iss": "<oidc_issuer_url>",
      "oidc:sub": "system:serviceaccount:<namespace>:<service_account>"
    }
  },
  "Effect": "Allow",
  "Principal": {
    "Federated": [
      "<oidc_provider_arn>"
    ]
  }
}

Reemplace los marcadores de posición:

Placeholder

Value

<oidc_issuer_url>

URL del proveedor OIDC del clúster; consulte Get the OIDC provider URL and ARN

<oidc_provider_arn>

ARN del proveedor OIDC del clúster; consulte Get the OIDC provider URL and ARN

<namespace>

Namespace de la aplicación

<service_account>

Cuenta de servicio que utiliza la aplicación

Para automatizar las actualizaciones de la política de confianza, utilice ack-ram-tool:

ack-ram-tool rrsa associate-role --cluster-id <cluster_id> \
    --namespace <namespace> --service-account <service_account> \
    --role-name <role_name> --create-role-if-not-exist

3. Otorgue permisos al rol de RAM

Adjunte la política AliyunCSReadOnlyAccess a demo-role-for-rrsa. Consulte Grant permissions to a RAM role.

Esto otorga a la aplicación acceso de solo lectura a la información del clúster de ACK.

4. Despliegue su aplicación

Cree un archivo llamado demo.yaml con el siguiente contenido. La etiqueta de namespace pod-identity.alibabacloud.com/injection: 'on' y la anotación de cuenta de servicio pod-identity.alibabacloud.com/role-name: demo-role-for-rrsa permiten la inyección automática mediante ack-pod-identity-webhook. Consulte ack-pod-identity-webhook.

---
apiVersion: v1
kind: Namespace
metadata:
  name: rrsa-demo
  labels:
    pod-identity.alibabacloud.com/injection: 'on'

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: demo-sa
  namespace: rrsa-demo
  annotations:
    pod-identity.alibabacloud.com/role-name: demo-role-for-rrsa

---
apiVersion: v1
kind: Pod
metadata:
  name: demo
  namespace: rrsa-demo
spec:
  serviceAccountName: demo-sa
  containers:
    - image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.3.0
      args:
        - rrsa
        - demo
      name: demo
  restartPolicy: OnFailure

Despliegue la aplicación:

kubectl apply -f demo.yaml

5. Compruebe la configuración inyectada

Compruebe que ack-pod-identity-webhook haya inyectado las variables de entorno y los montajes de volumen necesarios:

kubectl -n rrsa-demo get pod demo -o yaml

La salida esperada incluye los siguientes elementos inyectados:

Categoría

Elemento

Descripción

Variable de entorno

ALIBABA_CLOUD_ROLE_ARN

ARN del rol de RAM que se asumirá

ALIBABA_CLOUD_OIDC_PROVIDER_ARN

ARN del proveedor de identidades OIDC

ALIBABA_CLOUD_OIDC_TOKEN_FILE

Ruta al archivo de token OIDC

ALIBABA_CLOUD_STS_ENDPOINT

Endpoint de VPC de STS para la región actual

ALIBABA_CLOUD_STS_REGION

Identificador de región para el endpoint de STS

ALIBABA_CLOUD_VPC_ENDPOINT_ENABLED

Indica si se accede a STS mediante el endpoint interno de VPC

VolumeMount

rrsa-oidc-token

Monta el token OIDC en el contenedor

Volume

rrsa-oidc-token

Origen de volumen proyectado para el token OIDC

Una especificación de pod con la inyección correcta tiene el siguiente aspecto:

apiVersion: v1
kind: Pod
metadata:
  name: demo
  namespace: rrsa-demo
spec:
  containers:
  - args:
    - rrsa
    - demo
    env:
    - name: ALIBABA_CLOUD_ROLE_ARN
      value: acs:ram::1***:role/demo-role-for-rrsa
    - name: ALIBABA_CLOUD_OIDC_PROVIDER_ARN
      value: acs:ram::1***:oidc-provider/ack-rrsa-c***
    - name: ALIBABA_CLOUD_OIDC_TOKEN_FILE
      value: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token
    - name: ALIBABA_CLOUD_STS_ENDPOINT
      value: sts-vpc.cn-hangzhou.aliyuncs.com
    - name: ALIBABA_CLOUD_STS_REGION
      value: cn-hangzhou
    - name: ALIBABA_CLOUD_VPC_ENDPOINT_ENABLED
      value: "true"
    image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.3.0
    imagePullPolicy: Always
    name: demo
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-4bwdg
      readOnly: true
    - mountPath: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens
      name: rrsa-oidc-token
      readOnly: true
  restartPolicy: OnFailure
  serviceAccount: demo-sa
  serviceAccountName: demo-sa
  volumes:
  - name: kube-api-access-4bwdg
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
  - name: rrsa-oidc-token
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          audience: sts.aliyuncs.com
          expirationSeconds: 3600
          path: token

6. Revise los registros de la aplicación

Muestre el registro de la aplicación:

kubectl -n rrsa-demo logs demo

Si la ejecución es exitosa, se listarán los clústeres de su cuenta de Alibaba Cloud:

cluster id: cf***, cluster name: foo*
cluster id: c8***, cluster name: bar*
cluster id: c4***, cluster name: foob*

Opcional: para comprobar que se aplica el privilegio mínimo, quite la política AliyunCSReadOnlyAccess del rol de RAM (consulte Remove permissions from a RAM role). Espere 30 segundos y vuelva a ejecutar el comando de registros. La aplicación devolverá un error 403 similar al siguiente:

   StatusCode: 403
   Code: StatusForbidden
   Message: code: 403, STSToken policy Forbidden for action cs:DescribeClustersForRegion request id: E78A2E2D-***
   Data: {"accessDeniedDetail":{"AuthAction":"cs:DescribeClustersForRegion","AuthPrincipalDisplayName":"demo-role-for-rrsa:ack-ram-tool","AuthPrincipalOwnerId":"11***","AuthPrincipalType":"AssumedRoleUser","NoPermissionType":"ImplicitDeny","PolicyType":"ResourceGroupLevelIdentityBasedPolicy"},"code":"StatusForbidden","message":"STSToken policy Forbidden for action cs:DescribeClustersForRegion","requestId":"E78A2E2D-***","status":403,"statusCode":403}

Esto confirma que RRSA aplica los permisos a nivel de pod.

Avanzado: Configuración manual de plantillas de pod

Si decide omitir ack-pod-identity-webhook, agregue manualmente las variables de entorno necesarias y el volumen proyectado a la especificación del pod:

apiVersion: v1
kind: Pod
metadata:
  name: demo
  namespace: rrsa-demo
spec:
  containers:
  - args:
    - rrsa
    - demo
    env:
    - name: ALIBABA_CLOUD_ROLE_ARN
      value: <role_arn>
    - name: ALIBABA_CLOUD_OIDC_PROVIDER_ARN
      value: <oidc_provider_arn>
    - name: ALIBABA_CLOUD_OIDC_TOKEN_FILE
      value: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token
    image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.3.0
    imagePullPolicy: Always
    name: demo
    volumeMounts:
    - mountPath: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens
      name: rrsa-oidc-token
      readOnly: true
  restartPolicy: OnFailure
  serviceAccount: demo-sa
  serviceAccountName: demo-sa
  volumes:
  - name: rrsa-oidc-token
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          audience: sts.aliyuncs.com
          expirationSeconds: 3600
          path: token

Reemplace los valores de los marcadores de posición:

Placeholder

Value

Where to find it

<role_arn>

ARN del rol de RAM

Página Roles en la consola de RAM

<oidc_provider_arn>

ARN del proveedor OIDC

Sección Security and Auditing en la página de detalles del clúster. Consulte Get the OIDC provider URL and ARN.

Importante

Establezca audience en sts.aliyuncs.com. Este valor corresponde al ID de cliente del proveedor OIDC y no al dominio del endpoint de STS que utiliza el SDK.

Establezca expirationSeconds con un valor entre 600 y 43200 (segundos). Los valores superiores a 43200 se limitan a 12 horas.

Tras volver a desplegar, la aplicación leerá el token OIDC desde ALIBABA_CLOUD_OIDC_TOKEN_FILE, lo intercambiará por un token de STS mediante AssumeRoleWithOIDC y llamará a las API de la nube con dicho token. Consulte AssumeRoleWithOIDC.

Compatibilidad con SDK

Alibaba Cloud SDK V2.0 admite la autenticación con tokens OIDC de RRSA. Cualquier SDK de servicios en la nube basado en V2.0 que admita tokens de STS también es compatible con RRSA.

Versiones de SDK compatibles y demostraciones

Language

Minimum version

Demo

Go

Alibaba Cloud Credentials for Go 1.2.6 o posterior. Para obtener instrucciones, consulte Method 6: Use OIDCRoleArn.

Demostración del SDK de Go

Java

Alibaba Cloud Credentials for Java 0.2.10 o posterior. Para obtener instrucciones, consulte Method 6: OIDC role ARN.

Demostración del SDK de Java

Python 3

Alibaba Cloud Credentials for Python 0.3.1 o posterior. Para obtener instrucciones, consulte Manage access credentials.

Demostración del SDK de Python

Node.js / TypeScript

Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6 o posterior. Para obtener instrucciones, consulte Method 6: Use OIDCRoleArn.

Demostración del SDK de Node.js

Consulte la documentación de credenciales de cada lenguaje en la sección Method 6: Use the RAM role of an OIDC IdP.

Demostraciones de SDK para servicios específicos

Algunos SDK de servicios en la nube ofrecen compatibilidad nativa con tokens OIDC:

Servicio en la nube

SDK

Demostración

Object Storage Service (OSS)

OSS Go SDK. Para obtener instrucciones, consulte Method 5: Use an OIDC role ARN.

Demostración en Go

OSS Java SDK. Para obtener instrucciones, consulte Use an OIDCRoleARN.

Demostración en Java

OSS Python SDK. Para obtener instrucciones, consulte Use the role of an OIDC IdP.

Demostración en Python

Simple Log Service (SLS)

SLS SDK for Java. Para obtener instrucciones, consulte Get started with Simple Log Service SDK for Java.

Demostración en Java

Habilitación de la autenticación RRSA para CLI

Utilice ack-ram-tool para configurar las herramientas CLI y permitirles usar la autenticación con tokens OIDC de RRSA desde un pod.

Alibaba Cloud CLI

Alibaba Cloud CLI v3.0.206 y versiones posteriores admiten RRSA. Establezca region_id con la región de destino.

Opción A: Archivo de configuración. Establezca mode en OIDC dentro de ~/.aliyun/config.json:

{
  "current": "rrsa",
  "profiles": [
    {
      "name": "rrsa",
      "mode": "OIDC",
      "region_id": "cn-hangzhou",
      "ram_session_name": "test-rrsa"
    }
  ],
  "meta_path": ""
}

Opción B: Comando directo (no requiere archivo de configuración):

aliyun sts GetCallerIdentity --region cn-hangzhou --role-session-name=test-rrsa

Salida esperada:

{
  "AccountId": "11380***",
  "Arn": "acs:ram::1138***:assumed-role/test-rrsa-***/test-rrsa",
  "IdentityType": "AssumedRoleUser",
  "PrincipalId": "33300***:test-rrsa",
  "RequestId": "20F78881-F47E-5771-90D6-***",
  "RoleId": "33300***"
}

Consulte Credential types.

ossutil 2.0

ossutil V2.1.0 y versiones posteriores admiten RRSA. Reemplace region con su región real.

Establezca mode en oidcRoleArn dentro de ~/.ossutilconfig:

cat <<EOF > ~/.ossutilconfig
[default]
mode = oidcRoleArn
OIDCProviderArn = "${ALIBABA_CLOUD_OIDC_PROVIDER_ARN}"
OIDCTokenFilePath = "${ALIBABA_CLOUD_OIDC_TOKEN_FILE}"
roleArn = "${ALIBABA_CLOUD_ROLE_ARN}"
roleSessionName = test-rrsa
region = cn-hangzhou
EOF

Consulte Examples en la documentación de ossutil 2.0.

CLI de Simple Log Service

La CLI de Simple Log Service no admite archivos de configuración OIDC. Utilice ack-ram-tool para inyectar las credenciales en tiempo de ejecución:

ack-ram-tool export-credentials -f environment-variables -- aliyunlog log list_project --region-endpoint=cn-hangzhou.log.aliyuncs.com

Terraform

Alibaba Cloud Provider V1.222.0 y versiones posteriores admiten assume_role_with_oidc . Establezca region con la región de destino.

Agregue assume_role_with_oidc a la configuración de su proveedor:

provider "alicloud" {
  assume_role_with_oidc {
    role_session_name = "terraform-with-rrsa-auth-example"
  }
  region = "cn-hangzhou"
}

Consulte la demostración de RRSA con Terraform.

Solución de problemas

Errores del SDK

Error

Cause

Fix

AuthenticationFail.OIDCToken.Expired — "This JsonWebToken is expired."

La aplicación almacenó el token OIDC en caché y está usando una copia caducada.

Lea el token desde el archivo (ALIBABA_CLOUD_OIDC_TOKEN_FILE) cada vez que se autentique. Utilice un SDK de Alibaba Cloud para gestionar esto automáticamente. Consulte Compatibilidad con SDK.

Throttling.User — "Request was denied due to user flow control."

La aplicación llama a AssumeRoleWithOIDC con demasiada frecuencia.

Reutilice el token de STS hasta que caduque. Utilice un SDK de Alibaba Cloud para gestionar los tokens automáticamente. Consulte Compatibilidad con SDK.

AuthenticationFail.OIDCToken.AudienceNotMatch — "Invalid audience."

El parámetro audience en la especificación del pod no está establecido en sts.aliyuncs.com.

Establezca audience: sts.aliyuncs.com en el origen de volumen proyectado de la especificación del pod.

AuthenticationFail.OIDCToken.IssuerConfigurationBroken / IssuerNotMatch / AuthenticationFail.NoPermission — "No such OIDC Provider registered."

RRSA no está habilitado en el clúster.

Consulte Step 1: Enable RRSA for your cluster. Después de habilitarlo, vuelva a crear los pods que utilicen RRSA.

EntityNotExist.Role — "The role not exists: acs:ram::..."

El rol de RAM que asume la aplicación no existe.

Cree el rol de RAM. Consulte Create a RAM role for an OIDC IdP y Step 2: Create a RAM role for the OIDC identity provider.

AuthenticationFail.NoPermission — "There is no permission"

La política de confianza del rol de RAM no permite que la cuenta de servicio lo asuma.

Actualice la política de confianza. Consulte Configure an existing RAM role.

Referencias