Todos os produtos
Search
Central de documentação

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

Última atualização: Sep 21, 2026

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:

  1. 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.

  2. Assunção de função: a aplicação chama a API AssumeRoleWithOIDC com esse token OIDC.

  3. 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.

  4. 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.

image

Ative para um cluster existente

  1. Acesse o console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Clique no nome do seu cluster. No painel de navegação à esquerda, clique em Cluster Information.

  3. Na aba Basic Information, role até a seção Security and Auditing e clique em Enable ao lado de RRSA OIDC.

    image

  4. 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.

image

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

rrsa-demo

Conta de serviço

demo-sa

Função do RAM

demo-role-for-rrsa

Sample workflow

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.

  1. No console do ACK, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Add-ons.

  2. Na página Add-ons, clique na aba Security.

  3. Encontre o ack-pod-identity-webhook e clique em Install.

  4. 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 ack-rrsa-<cluster_id>, onde <cluster_id> é o ID do seu cluster.

Condition

  • oidc:iss: Mantenha o valor padrão.

  • oidc:aud: Mantenha o valor padrão.

  • oidc:sub: Adicione esta condição manualmente.

    • Key: Selecione oidc:sub

    • Operator: Selecione StringEquals

    • Value: Insira system:serviceaccount:<namespace>:<serviceAccountName>, onde <namespace> é o namespace da sua aplicação e <serviceAccountName> é o nome da conta de serviço. Para a aplicação de teste neste tópico, insira system:serviceaccount:rrsa-demo:demo-sa.

Role Name

demo-role-for-rrsa

A condição oidc:sub restringe a relação de confiança a uma conta de serviço específica em um namespace específico. Substitua rrsa-demo e demo-sa pelos 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

<oidc_issuer_url>

URL do provedor OIDC do cluster — consulte Get the OIDC provider URL and ARN

<oidc_provider_arn>

ARN do provedor OIDC do cluster — consulte Get the OIDC provider URL and ARN

<namespace>

Namespace da aplicação

<service_account>

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

ALIBABA_CLOUD_ROLE_ARN

ARN da função do RAM a ser assumida

ALIBABA_CLOUD_OIDC_PROVIDER_ARN

ARN do provedor de identidade OIDC

ALIBABA_CLOUD_OIDC_TOKEN_FILE

Caminho para o arquivo de token OIDC

ALIBABA_CLOUD_STS_ENDPOINT

Endpoint da VPC do STS para a região atual

ALIBABA_CLOUD_STS_REGION

Identificador de região para o endpoint do STS

ALIBABA_CLOUD_VPC_ENDPOINT_ENABLED

Indica se o acesso ao STS ocorre pelo endpoint interno da VPC

VolumeMount

rrsa-oidc-token

Monta o token OIDC no contêiner

Volume

rrsa-oidc-token

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

<role_arn>

ARN da função do RAM

Página Roles no console do RAM

<oidc_provider_arn>

ARN do provedor OIDC

Seção Security and Auditing na página de detalhes do cluster. Consulte Get the OIDC provider URL and ARN.

Importante

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.

Demonstração do SDK Go

Java

Alibaba Cloud Credentials for Java 0.2.10 ou posterior. Para obter instruções, consulte Method 6: OIDC role ARN.

Demonstração do SDK Java

Python 3

Alibaba Cloud Credentials for Python 0.3.1 ou posterior. Para obter instruções, consulte gerencie as credenciais de acesso.

Demonstração do SDK Python

Node.js / TypeScript

Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6 ou posterior. Para obter instruções, consulte Method 6: Use OIDCRoleArn.

Demonstração do SDK Node.js

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.

Demonstração em Go

OSS Java SDK. Para obter instruções, consulte Use an OIDCRoleARN.

Demonstração em Java

OSS Python SDK. Para obter instruções, consulte Use the role of an OIDC IdP.

Demonstração em Python

Simple Log Service (SLS)

SLS SDK for Java. Para obter instruções, consulte Get started with Simple Log Service SDK for Java.

Demonstração em 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 com assume_role_with_oidc . Defina region como 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

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

A aplicação armazenou o token OIDC em cache e está usando uma cópia expirada.

Leia o token do arquivo (ALIBABA_CLOUD_OIDC_TOKEN_FILE) sempre que autenticar. Use um SDK da Alibaba Cloud para lidar com isso automaticamente. Consulte Suporte a SDK.

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

A aplicação está chamando a API AssumeRoleWithOIDC com muita frequência.

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.

AuthenticationFail.OIDCToken.AudienceNotMatch — "Invalid audience."

O parâmetro audience na especificação do pod não está definido como sts.aliyuncs.com.

Defina audience: sts.aliyuncs.com na origem do volume projetado da especificação do pod.

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

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.

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

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.

AuthenticationFail.NoPermission — "There is no permission"

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.

Referências