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:
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.
Asunción del rol: la aplicación llama a la API
AssumeRoleWithOIDCmediante este token OIDC.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.
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.

Habilitación en un clúster existente
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.
Haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Cluster Information.
-
En la pestaña Basic Information, desplácese hasta la sección Security and Auditing y haga clic en Enable junto a RRSA OIDC.

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.

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 |
|
|
Cuenta de servicio |
|
|
Rol de RAM |
|

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.
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.
En la página Add-ons, haga clic en la pestaña Security.
Busque ack-pod-identity-webhook y haga clic en Install.
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 |
Condition |
|
Role Name |
|
La condiciónoidc:sublimita la confianza a una cuenta de servicio específica dentro de un namespace determinado. Reemplacerrsa-demoydemo-sacon 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 |
|
|
URL del proveedor OIDC del clúster; consulte Get the OIDC provider URL and ARN |
|
|
ARN del proveedor OIDC del clúster; consulte Get the OIDC provider URL and ARN |
|
|
Namespace de la aplicación |
|
|
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 |
| ARN del rol de RAM que se asumirá |
| ARN del proveedor de identidades OIDC | |
| Ruta al archivo de token OIDC | |
| Endpoint de VPC de STS para la región actual | |
| Identificador de región para el endpoint de STS | |
| Indica si se accede a STS mediante el endpoint interno de VPC | |
VolumeMount |
| Monta el token OIDC en el contenedor |
Volume |
| 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 |
|
|
ARN del rol de RAM |
Página Roles en la consola de RAM |
|
|
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. |
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. |
|
|
Java |
Alibaba Cloud Credentials for Java 0.2.10 o posterior. Para obtener instrucciones, consulte Method 6: OIDC role ARN. |
|
|
Python 3 |
Alibaba Cloud Credentials for Python 0.3.1 o posterior. Para obtener instrucciones, consulte Manage access credentials. |
|
|
Node.js / TypeScript |
Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6 o posterior. Para obtener instrucciones, consulte Method 6: Use OIDCRoleArn. |
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. | |
OSS Java SDK. Para obtener instrucciones, consulte Use an OIDCRoleARN. | ||
OSS Python SDK. Para obtener instrucciones, consulte Use the role of an OIDC IdP. | ||
Simple Log Service (SLS) | SLS SDK for Java. Para obtener instrucciones, consulte Get started with Simple Log Service SDK for 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 admitenassume_role_with_oidc. Establezcaregioncon 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 |
|
|
La aplicación almacenó el token OIDC en caché y está usando una copia caducada. |
Lea el token desde el archivo ( |
|
|
La aplicación llama a |
Reutilice el token de STS hasta que caduque. Utilice un SDK de Alibaba Cloud para gestionar los tokens automáticamente. Consulte Compatibilidad con SDK. |
|
|
El parámetro |
Establezca |
|
|
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. |
|
|
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. |
|
|
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. |