Atribua a cada pod uma função do RAM dedicada com tokens STS de curta duração em vez de credenciais de nó compartilhadas.
O RRSA oferece duas propriedades de segurança fundamentais:
Privilégio mínimo: restrinja as permissões do RAM a uma conta de serviço específica, permitindo que apenas os pods associados a ela acessem esses recursos. Isso elimina a necessidade de pares de AccessKey estáticos.
Isolamento de credenciais: os pods não podem acessar as credenciais usadas por outros pods no mesmo nó. Sem o RRSA, todos os pods em um nó compartilham as permissões da função da instância subjacente do Elastic Compute Service (ECS).
Como o RRSA funciona
Sem o RRSA, todos os pods em um nó compartilham as permissões da função da instância ECS por meio dos metadados da instância, o que representa um risco significativo de segurança.
O RRSA resolve esse problema vinculando uma função do RAM a uma conta de serviço do Kubernetes. Quando um pod é iniciado, ele recebe um token OpenID Connect (OIDC) com escopo para sua conta de serviço, chama a API AssumeRoleWithOIDC e recebe um token STS com escopo de função para acesso às APIs da cloud.
O fluxo de autenticação:
Injeção de token: quando um pod é iniciado, o ACK usa a projeção de volume de token da conta de serviço para montar um arquivo de token OIDC com escopo para a conta de serviço do pod.
Assunção de função: a aplicação chama a API
AssumeRoleWithOIDCcom esse token OIDC.Recebimento de credenciais STS: o RAM da Alibaba Cloud verifica o token OIDC no provedor OIDC do cluster e retorna credenciais STS com escopo de função.
Acesso a recursos: o pod usa as credenciais STS de curta duração para acessar as APIs autorizadas da Alibaba Cloud.
Os tokens OIDC têm curta duração. Leia o token do arquivo em cada solicitação de autenticação — não o armazene em cache. O ACK renova os tokens automaticamente antes do vencimento.
Quando o RRSA está ativado, o ACK executa automaticamente as seguintes ações:
Cria um emissor OIDC dedicado para o cluster.
Ativa a projeção de volume de token da conta de serviço para o cluster.
Cria um provedor de identidade (IdP) do RAM na sua conta, chamado
ack-rrsa-<cluster_id>, configurado para single sign-on (SSO) com o emissor OIDC do cluster.
Antes de começar
Verifique os seguintes pré-requisitos antes de configurar o RRSA:
Versão do cluster: o cluster ACK (Basic, Pro, Serverless ou Edge) deve executar o Kubernetes 1.22 ou superior.
Permissões: acesso administrativo ao console do ACK e ao console do RAM.
Limite de validade do token: após a ativação do RRSA, os tokens de ServiceAccount recém-criados têm validade máxima de 12 horas.
Etapa 1: Ative o RRSA para o seu cluster
Ative o RRSA durante a criação do cluster ou com o cluster em execução. Para clusters ACK Serverless, ative o RRSA após a criação do cluster na página de detalhes do cluster.
Ative durante a criação do cluster
Ao criar um cluster gerenciado ACK ou um cluster ACK Edge, acesse a etapa Cluster Configurations, expanda Advanced Options (Optional) e clique em Enable ao lado de RRSA OIDC.

Ative para um cluster existente
Acesse o console do ACK. No painel de navegação à esquerda, clique em Clusters.
Clique no nome do seu cluster. No painel de navegação à esquerda, clique em Cluster Information.
-
Na aba Basic Information, role até a seção Security and Auditing e clique em Enable ao lado de RRSA OIDC.

Na caixa de diálogo Enable RRSA, clique em Confirm. Aguarde o status do cluster mudar de Updating para Running. O RRSA estará ativado.
Obter a URL e o ARN do provedor OIDC
Após ativar o RRSA, passe o mouse sobre o rótulo Enabled ao lado de RRSA OIDC na seção Security and Auditing. A interface exibirá a URL e o Alibaba Cloud Resource Name (ARN) do provedor OIDC.

Anote ambos os valores e configure as funções do RAM e os modelos de aplicação.
Etapa 2: Configure uma aplicação para usar o RRSA
A configuração de uma aplicação de exemplo tem duas partes:
Configuração no nível do cluster (faça uma vez por cluster): ative o RRSA e instale o
ack-pod-identity-webhook.Configuração por aplicação (repita para cada aplicação): crie ou use uma função do RAM existente, conceda permissões e implante a aplicação.
Configuração de exemplo
|
Item |
Valor |
|
Namespace |
|
|
Conta de serviço |
|
|
Função do RAM |
|

1. Instale o ack-pod-identity-webhook
O ack-pod-identity-webhook injeta automaticamente o caminho do arquivo de token OIDC e o ARN da função do RAM nos pods como variáveis de ambiente. Ignore esta etapa e configure os modelos de pod manualmente. Consulte configure manualmente os modelos de pod.
No console do ACK, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Add-ons.
Na página Add-ons, clique na aba Security.
Encontre o ack-pod-identity-webhook e clique em Install.
Confirme as informações e clique em OK.
2. Crie ou configure uma função do RAM para o provedor de identidade OIDC
Crie uma função do RAM
Crie uma função do RAM chamada demo-role-for-rrsa que confie no provedor de identidade (IdP) OIDC do cluster. Consulte Crie uma função do RAM para um IdP OIDC.
Use os seguintes valores de parâmetro:
Parâmetro | Valor |
Identity Provider Type | Selecione OIDC. |
Identity Provider | Selecione o IdP chamado |
Condition |
|
Role Name |
|
A condiçãooidc:subrestringe a relação de confiança a uma conta de serviço específica em um namespace específico. Substituarrsa-demoedemo-sapelos valores reais do seu namespace e do nome da conta de serviço.
Configure uma função do RAM existente
Para usar uma função do RAM existente, atualize sua política de confiança para permitir que a conta de serviço a assuma. Consulte edite a política de confiança de uma função do RAM.
Adicione uma entrada Statement com a seguinte estrutura:
{
"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>"
]
}
}
Substitua os placeholders:
|
Placeholder |
Valor |
|
|
URL do provedor OIDC do cluster — consulte Get the OIDC provider URL and ARN |
|
|
ARN do provedor OIDC do cluster — consulte Get the OIDC provider URL and ARN |
|
|
Namespace da aplicação |
|
|
Conta de serviço usada pela aplicação |
Para automatizar as atualizações da política de confiança, use o 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. Conceder permissões à função do RAM
Anexe a política AliyunCSReadOnlyAccess à demo-role-for-rrsa. Consulte Grant permissions to a RAM role.
Isso concede à aplicação acesso somente leitura às informações do cluster ACK.
4. Implantar sua aplicação
Crie um arquivo chamado demo.yaml com o seguinte conteúdo. O rótulo de namespace pod-identity.alibabacloud.com/injection: 'on' e a anotação da conta de serviço pod-identity.alibabacloud.com/role-name: demo-role-for-rrsa permitem a injeção automática pelo 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
Implante a aplicação:
kubectl apply -f demo.yaml
5. Verifique a configuração injetada
Confirme se o ack-pod-identity-webhook injetou as variáveis de ambiente e as montagens de volume necessárias:
kubectl -n rrsa-demo get pod demo -o yaml
A saída esperada inclui os seguintes itens injetados:
Categoria | Item | Descrição |
Variável de ambiente |
| ARN da função do RAM a ser assumida |
| ARN do provedor de identidade OIDC | |
| Caminho para o arquivo de token OIDC | |
| Endpoint da VPC do STS para a região atual | |
| Identificador de região para o endpoint do STS | |
| Indica se o acesso ao STS ocorre pelo endpoint interno da VPC | |
VolumeMount |
| Monta o token OIDC no contêiner |
Volume |
| source de volume projetado para o token OIDC |
Veja um exemplo de especificação de pod com a injeção correta:
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. Verifique os logs da aplicação
Visualize os logs da aplicação:
kubectl -n rrsa-demo logs demo
Uma execução bem-sucedida lista os clusters na sua conta da Alibaba Cloud:
cluster id: cf***, cluster name: foo*
cluster id: c8***, cluster name: bar*
cluster id: c4***, cluster name: foob*
Opcional: verifique a aplicação do privilégio mínimo, remova a política AliyunCSReadOnlyAccess da função do RAM (consulte Remove permissions from a RAM role). Aguarde 30 segundos e execute o comando de log novamente. A aplicação retorna um erro 403 semelhante a:
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}
Isso confirma que o RRSA aplica as permissões no nível do pod.
Avançado: Configure modelos de pod manualmente
Para ignorar o ack-pod-identity-webhook, adicione manualmente as variáveis de ambiente necessárias e o volume projetado à especificação do 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
Substitua os valores dos placeholders:
|
Placeholder |
Valor |
Onde encontrar |
|
|
ARN da função do RAM |
Página Roles no console do RAM |
|
|
ARN do provedor OIDC |
Seção Security and Auditing na página de detalhes do cluster. Consulte Get the OIDC provider URL and ARN. |
Defina audience como sts.aliyuncs.com. Este é o ID do cliente do provedor OIDC, e não o domínio do endpoint do STS usado pelo SDK.
Defina expirationSeconds como um valor entre 600 e 43200 (segundos). Valores acima de 43200 são limitados a 12 horas.
Após a nova implantação, a aplicação lê o token OIDC de ALIBABA_CLOUD_OIDC_TOKEN_FILE, troca-o por um token STS via AssumeRoleWithOIDC e chama as APIs da cloud com o token STS. Consulte AssumeRoleWithOIDC.
Suporte a SDK
O Alibaba Cloud SDK V2.0 é compatível com a autenticação por token OIDC do RRSA. Qualquer SDK de service de cloud baseado na V2.0 com suporte a tokens STS também é compatível com o RRSA.
Versões de SDK suportadas e demonstrações
|
Linguagem |
Versão mínima |
Demonstração |
|
Go |
Alibaba Cloud Credentials for Go 1.2.6 ou posterior. Para obter instruções, consulte Method 6: Use OIDCRoleArn. |
|
|
Java |
Alibaba Cloud Credentials for Java 0.2.10 ou posterior. Para obter instruções, consulte Method 6: OIDC role ARN. |
|
|
Python 3 |
Alibaba Cloud Credentials for Python 0.3.1 ou posterior. Para obter instruções, consulte gerencie as credenciais de acesso. |
|
|
Node.js / TypeScript |
Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6 ou posterior. Para obter instruções, consulte Method 6: Use OIDCRoleArn. |
Consulte a documentação de credenciais de cada linguagem — Método 6: Use a função do RAM de um IdP OIDC.
Demonstrações de SDK específicas para services de cloud
Alguns SDKs de service de cloud oferecem suporte nativo a tokens OIDC:
service de cloud | SDK | Demonstração |
Object Storage Service (OSS) | OSS Go SDK. Para obter instruções, consulte Method 5: Use an OIDC role ARN. | |
OSS Java SDK. Para obter instruções, consulte Use an OIDCRoleARN. | ||
OSS Python SDK. Para obter instruções, consulte Use the role of an OIDC IdP. | ||
Simple Log Service (SLS) | SLS SDK for Java. Para obter instruções, consulte Get started with Simple Log Service SDK for Java. |
Ative a autenticação RRSA para CLIs
Use o ack-ram-tool e configure CLIs para a autenticação por token OIDC do RRSA a partir de um pod.
Alibaba Cloud CLI
O Alibaba Cloud CLI v3.0.206 e versões posteriores são compatíveis com o RRSA. Defina region_id como a sua região de destino.
Opção A: Arquivo de configuração. Defina mode como OIDC em ~/.aliyun/config.json:
{
"current": "rrsa",
"profiles": [
{
"name": "rrsa",
"mode": "OIDC",
"region_id": "cn-hangzhou",
"ram_session_name": "test-rrsa"
}
],
"meta_path": ""
}
Opção B: Comando direto (sem necessidade de arquivo de configuração):
aliyun sts GetCallerIdentity --region cn-hangzhou --role-session-name=test-rrsa
Saída 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
O ossutil V2.1.0 e versões posteriores são compatíveis com o RRSA. Substitua region pela sua região real.
Defina mode como oidcRoleArn em ~/.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 na documentação do ossutil 2.0.
Simple Log Service CLI
O Simple Log Service CLI não é compatível com arquivos de configuração OIDC. Use o ack-ram-tool para injetar credenciais em tempo de execução:
ack-ram-tool export-credentials -f environment-variables -- aliyunlog log list_project --region-endpoint=cn-hangzhou.log.aliyuncs.com
Terraform
O Alibaba Cloud Provider V1.222.0 e versões posteriores são compatíveis comassume_role_with_oidc. Definaregioncomo a sua região de destino.
Adicione assume_role_with_oidc à configuração do seu provedor:
provider "alicloud" {
assume_role_with_oidc {
role_session_name = "terraform-with-rrsa-auth-example"
}
region = "cn-hangzhou"
}
Consulte a demonstração do RRSA com Terraform.
Solução de problemas
Erros de SDK
|
Erro |
Causa |
Solução |
|
|
A aplicação armazenou o token OIDC em cache e está usando uma cópia expirada. |
Leia o token do arquivo ( |
|
|
A aplicação está chamando a API |
Reutilize o token STS até que ele expire. Use um SDK da Alibaba Cloud para o gerenciamento automático de tokens. Consulte Suporte a SDK. |
|
|
O parâmetro |
Defina |
|
|
O RRSA não está ativado para o cluster. |
Consulte Etapa 1: Ative o RRSA para o seu cluster. Após a ativação, recrie quaisquer pods que usem o RRSA. |
|
|
A função do RAM assumida pela aplicação não existe. |
Crie a função do RAM. Consulte Crie uma função do RAM para um IdP OIDC e Etapa 2: Crie uma função do RAM para o provedor de identidade OIDC. |
|
|
A política de confiança da função do RAM não permite que a conta de serviço a assuma. |
Atualize a política de confiança. Consulte Configure uma função do RAM existente. |