Atribua a cada pod uma função RAM dedicada com tokens STS de curta duração, em vez de usar credenciais compartilhadas do nó.
O RRSA oferece duas propriedades essenciais de segurança:
Privilégio mínimo: restrinja as permissões RAM a uma conta de service específica. Assim, apenas os pods que utilizam essa conta acessam os recursos correspondentes, eliminando a necessidade de pares de AccessKey estáticos.
Isolamento de credenciais: os pods não acessam as credenciais utilizadas 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 RAM a uma conta de service do Kubernetes. Quando um pod é iniciado, ele recebe um token OpenID Connect (OIDC) com escopo definido para sua conta de service, chama a API AssumeRoleWithOIDC e obtém um token STS com escopo de função para acessar APIs da cloud.
Fluxo de autenticação:
Injeção de token: ao iniciar um pod, o ACK utiliza a projeção de volume de token da conta de service para montar um arquivo de token OIDC com escopo limitado à conta de service do pod.
Assunção de função: a aplicação chama a API
AssumeRoleWithOIDCutilizando esse token OIDC.Recebimento de credenciais STS: o Alibaba Cloud RAM valida o token OIDC em relação ao provedor OIDC do cluster e retorna credenciais STS com escopo de função.
Acesso a recursos: o pod utiliza as credenciais STS de curta duração para acessar as APIs autorizadas do Alibaba Cloud.
Os tokens OIDC têm vida útil curta. Leia o token diretamente do arquivo em cada solicitação de autenticação — não faça cache. O ACK renova os tokens automaticamente antes da expiração.
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 service para o cluster.
Cria um provedor de identidade (IdP) RAM na sua conta, denominado
ack-rrsa-<cluster_id>, configurado para single sign-on (SSO) com o emissor OIDC do cluster.
Antes de começar
Verifique os seguintes 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 posterior.
Permissões: acesso administrativo ao console do ACK e ao console do RAM.
Limite de validade do token: após ativar o RRSA, os tokens de ServiceAccount recém-criados terão validade máxima de 12 horas.
Etapa 1: Ative o RRSA para seu cluster
Ative o RRSA durante a criação do cluster ou depois que ele estiver em execução. Para clusters ACK Serverless, ative o RRSA após a criação do cluster, na página de detalhes do cluster.
Ativar 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.

Ativar para um cluster existente
Faça login no 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 agora está ativado.
Obtenha 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 URL e o Alibaba Cloud Resource Name (ARN) do provedor OIDC serão exibidos.

Anote ambos os valores para utilizá-los na configuração das funções RAM e dos modelos de aplicação.
Etapa 2: Configure uma aplicação para usar o RRSA
A configuração de uma aplicação de exemplo divide-se em duas partes:
Configuração no nível do cluster (execute uma vez por cluster): ative o RRSA e instale o
ack-pod-identity-webhook.Configuração por aplicação (repita para cada app): crie ou utilize uma função RAM existente, conceda permissões e implante a aplicação.
Configuração de exemplo
|
Item |
Valor |
|
Namespace |
|
|
Conta de service |
|
|
Função RAM |
|

1. Instale o ack-pod-identity-webhook
O componente ack-pod-identity-webhook injeta automaticamente o caminho do arquivo de token OIDC e o ARN da função RAM nos pods como variáveis de ambiente. Pule esta etapa se preferir configurar os modelos de pod manualmente. Consulte Manually configure pod templates.
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.
Localize o ack-pod-identity-webhook e clique em Install.
Confirme as informações e clique em OK.
2. Crie ou configure uma função RAM para o provedor de identidade OIDC
Criar uma função RAM
Crie uma função RAM chamada demo-role-for-rrsa que confie no provedor de identidade (IdP) OIDC do cluster. Consulte Create a RAM role for an OIDC IdP.
Utilize 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 confiança a uma conta de service específica dentro de um namespace específico. Substituarrsa-demoedemo-sapelo seu namespace real e pelo nome da sua conta de service.
Configurar uma função RAM existente
Para utilizar uma função RAM existente, atualize sua política de confiança para permitir que a conta de service a assuma. Consulte Edit the trust policy of a RAM role.
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 espaços reservados:
|
Espaço reservado |
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 service utilizada 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. Conceda permissões à função RAM
Anexe a política AliyunCSReadOnlyAccess à função demo-role-for-rrsa. Consulte Grant permissions to a RAM role.
Essa ação concede à aplicação acesso somente leitura às informações do cluster ACK.
4. Implante sua aplicação
Crie um arquivo chamado demo.yaml com o conteúdo abaixo. O rótulo de namespace pod-identity.alibabacloud.com/injection: 'on' e a anotação da conta de service pod-identity.alibabacloud.com/role-name: demo-role-for-rrsa habilitam 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 RAM a ser assumida |
| ARN do provedor de identidade OIDC | |
| Caminho para o arquivo de token OIDC | |
| Endpoint VPC do STS para a região atual | |
| Identificador da região para o endpoint STS | |
| Indica se o acesso ao STS ocorre via endpoint interno da VPC | |
VolumeMount |
| Monta o token OIDC no contêiner |
Volume |
| Origem de volume projetado para o token OIDC |
Uma especificação de pod com injeção correta tem a seguinte aparência:
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
Imprima o log da aplicação:
kubectl -n rrsa-demo logs demo
Uma execução bem-sucedida lista os clusters na sua conta Alibaba Cloud:
cluster id: cf***, cluster name: foo*
cluster id: c8***, cluster name: bar*
cluster id: c4***, cluster name: foob*
Opcional: para verificar a aplicação do privilégio mínimo, desanexe a política AliyunCSReadOnlyAccess da função RAM (consulte Remove permissions from a RAM role). Aguarde 30 segundos e execute o comando de log novamente. A aplicação retornará 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 manualmente os modelos de pod
Para não utilizar 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 espaços reservados:
|
Espaço reservado |
Valor |
Onde encontrar |
|
|
ARN da função 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 STS utilizado pelo SDK.
Defina expirationSeconds com 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 SDKs
O Alibaba Cloud SDK V2.0 oferece suporte à autenticação por token OIDC do RRSA. Qualquer SDK de service da cloud desenvolvido na versão V2.0 que suporte 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 instruções, consulte Method 6: Use OIDCRoleArn. |
|
|
Java |
Alibaba Cloud Credentials for Java 0.2.10 ou posterior. Para instruções, consulte Method 6: OIDC role ARN. |
|
|
Python 3 |
Alibaba Cloud Credentials for Python 0.3.1 ou posterior. Para instruções, consulte Manage access credentials. |
|
|
Node.js / TypeScript |
Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6 ou posterior. Para instruções, consulte Method 6: Use OIDCRoleArn. |
Consulte a documentação de credenciais para cada linguagem — Método 6: Utilize a função RAM de um IdP OIDC.
Demonstrações de SDKs específicos para services da cloud
Alguns SDKs de services da cloud fornecem suporte nativo a tokens OIDC:
Serviço da cloud | SDK | Demonstração |
Object Storage Service (OSS) | OSS Go SDK. Para instruções, consulte Method 5: Use an OIDC role ARN. | |
OSS Java SDK. Para instruções, consulte Use an OIDCRoleARN. | ||
OSS Python SDK. Para instruções, consulte Use the role of an OIDC IdP. | ||
Simple Log Service (SLS) | SLS SDK for Java. Para instruções, consulte Get started with Simple Log Service SDK for Java. |
Ative a autenticação RRSA para CLIs
Utilize o ack-ram-tool para configurar CLIs visando 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 suportam o RRSA. Defina region_id como 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 suportam 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 suporta arquivos de configuração OIDC. Utilize 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 suportamassume_role_with_oidc. Definaregioncomo 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 |
Correçã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. Utilize um SDK do Alibaba Cloud para o gerenciamento automático de tokens. Consulte Suporte a SDKs. |
|
|
O parâmetro |
Defina |
|
|
O RRSA não está ativado para o cluster. |
Consulte Step 1: Enable RRSA for your cluster. Após ativar, recrie quaisquer pods que utilizem o RRSA. |
|
|
A função RAM que a aplicação tenta assumir não existe. |
Crie a função RAM. Consulte Create a RAM role for an OIDC IdP e Step 2: Create a RAM role for the OIDC identity provider. |
|
|
A política de confiança da função RAM não permite que a conta de service a assuma. |
Atualize a política de confiança. Consulte Configure an existing RAM role. |