O RAM Roles for Service Accounts (RRSA) permite implementar isolamento de permissões openapi no nível de pod dentro do cluster. Esse recurso oferece controle granular sobre o acesso a recursos cloud e reduz riscos de segurança. Este tópico descreve como usar o recurso RRSA.
Contexto
OIDC (OpenID Connect) é um protocolo de autenticação construído sobre o OAuth 2.0. O Alibaba Cloud RAM oferece suporte a OIDC-based role SSO. As aplicações em um cluster Kubernetes utilizam credenciais temporárias do Security Token service (STS) para acessar apis de recursos cloud. O Alibaba Cloud Container service (ACS) oferece suporte ao RRSA. Em cenários de múltiplos tenants, o RRSA fornece isolamento granular de permissões para acesso a recursos cloud entre pods de aplicação em um cluster. No ACS, o RRSA também permite controlar o período de validade das credenciais temporárias.
O RRSA funciona da seguinte forma:
-
Implante um pod de aplicação que use o recurso de projeção de volume de token de service account.
NotaO recurso de projeção de volume de token de service account está ativado por padrão em clusters ACS.
O cluster cria e monta o arquivo de token OIDC da service account correspondente para o pod da aplicação.
-
A aplicação no pod usa o arquivo de token OIDC montado para chamar a api
AssumeRoleWithOIDCdo STS e obter uma credencial temporária para uma função RAM especificada.NotaModifique antecipadamente a política de confiança da função RAM para permitir que a service account do pod assuma essa função. Para mais informações, consulte AssumeRoleWithOIDC.
A aplicação no pod usa a credencial temporária obtida para acessar apis de recursos cloud.
Ativar o RRSA
Acesse o console do ACS. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster desejado. No painel de navegação à esquerda, escolha Cluster Information.
Na página de detalhes do cluster, clique na aba Basic Information. Na seção Security and Auditing, clique em Enable ao lado de RRSA OIDC.
-
Na caixa de diálogo Enable RRSA, clique em OK.
NotaA ativação do recurso RRSA leva cerca de 2 a 3 minutos. Se o Cluster Status permanecer no estado Updating, clique no botão
no canto superior direito da página para atualizar.Quando o status do cluster mudar de Updating para Running, o recurso RRSA estará ativo no cluster. Passe o cursor sobre Enabled ao lado de RRSA OIDC para ver a URL e o ARN do provedor OIDC.
Após ativar o recurso RRSA em um cluster, o console do ACS executa as seguintes operações em segundo plano:
Cria automaticamente um serviço dedicado de OIDC Issuer para o cluster. Esse serviço é gerenciado pelo ACS e não requer manutenção manual.
Cria um OIDC identity provider na sua conta usando esse OIDC Issuer. O provedor de identidade OIDC recebe o nome
ack-rrsa-<cluster_id>, onde<cluster_id>é o ID do seu cluster.
Usar o RRSA
Após ativar o recurso RRSA, siga estas etapas para permitir que as aplicações no cluster obtenham credenciais temporárias e acessem apis de recursos cloud via RRSA.
Criar e autorizar uma nova função RAM
Para usar uma função RAM existente em vez de crie uma nova, consulte add the required permissions to the existing RAM role.
A aplicação implantada neste exemplo usa o recurso RRSA para assumir uma função especificada e recuperar uma lista de clusters na conta atual. Os principais recursos utilizados são:
Namespace:
rrsa-demo.Service account:
demo-sa.Função RAM:
demo-role-for-rrsa.
-
Crie uma função RAM chamada
demo-role-for-rrsa.Acesse o console do RAM com sua conta Alibaba Cloud.
No painel de navegação à esquerda, escolha . Na página Roles, clique em Create Role.
No painel Create Role, clique em Switch to Policy Editor para crie a função.
-
Na aba Visual Editor, configure as informações da função conforme a tabela a seguir e clique em OK.
Parâmetro
Descrição
Effect
O valor padrão é Allow.
Principal
Selecione Identity Provider e clique em Edit.
Defina Identity Provider Type como OIDC e selecione o provedor de identidade OIDC do cluster, como
ack-rrsa-<cluster_id>.<cluster_id>é o ID do seu cluster.Action
Por padrão, sts:AssumeRole está selecionado.
Condition
oidc:iss: Essa condição é adicionada automaticamente após selecionar Identity Provider. Mantenha a configuração padrão.
oidc:aud: Essa condição também é adicionada automaticamente após selecionar Identity Provider. Mantenha a configuração padrão.
oidc:sub: Adicione manualmente clicando em Add Condition.
Key:
oidc:subOperator:
StringEqualsValue: O formato é
system:serviceaccount:<namespace>:<serviceAccountName>.<namespace>: o namespace onde a aplicação reside.<serviceAccountName>: o nome da service account.
Com base nas informações da aplicação de teste, insira
system:serviceaccount:rrsa-demo:demo-sa.
Na caixa de diálogo exibida, insira o nome da função
demo-role-for-rrsae clique em OK.
Conceda à função criada a política de sistema AliyunCSReadOnlyAccess, necessária para a aplicação de teste. Para mais informações, consulte Manage permissions for a RAM role.
-
Implante a aplicação de teste.
-
Crie um arquivo chamado
demo.yamlcom o seguinte conteúdo.NotaSubstitua os seguintes placeholders no modelo da aplicação de exemplo.
<role_arn>: Substitua pelo ARN da função RAM que a aplicação utiliza. Obtenha o ARN no campo ARN na página Basic Information da função no console do RAM.<oidc_provider_arn>: Substitua pelo ARN do provedor OIDC do cluster. Obtenha esse ARN passando o cursor sobre Enabled ao lado de RRSA OIDC na aba Basic Information da página Cluster Information.
-
Execute o seguinte comando para implantar a aplicação de teste.
kubectl apply -f demo.yamlApós a implantação, o application pode usar o token OIDC montado, o ARN da função RAM e o ARN do provedor de identidade OIDC para chamar a api
AssumeRoleWithOIDCdo STS e obter uma credencial temporária para a função RAM especificada. Em seguida, a aplicação usa essa credencial temporária para acessar apis de recursos cloud. Para mais informações, consulte AssumeRoleWithOIDC.
-
-
Execute o seguinte comando para visualize os logs da aplicação de teste.
kubectl -n rrsa-demo logs demoA saída esperada é uma lista de clusters ACK:
20**/**/** 08:35:23 ======= [begin] list ACK clusters with RRSA ======= clusters: cluster id: cf***, cluster name: foo* cluster id: c8***, cluster name: bar* cluster id: c4***, cluster name: foob* 20**/**/** 08:35:24 ======= [end] list ACK clusters with RRSA ======= -
Opcional: Desanexe a política de sistema AliyunCSReadOnlyAccess da função. Para mais informações, consulte Remove permissions from a RAM role.
Aguarde cerca de 30 segundos e execute o seguinte comando para visualize os logs da aplicação novamente:
kubectl -n rrsa-demo logs demoO erro de permissão negada esperado é:
20**/**/** 10:09:33 ======= [begin] list ACK clusters with RRSA ======= 20**/**/** 10:09:33 SDKError: StatusCode: 403 Code: StatusForbidden Message: code: 403, STSToken policy Forbidden for action cs:DescribeClusters request id: XXXX Data: {"accessDeniedDetail":{"AuthAction":"cs:DescribeClusters","AuthPrincipalDisplayName":"demo-role-for-rrsa:ack-ram-tool","AuthPrincipalOwnerId":"XXXX","AuthPrincipalType":"AssumedRoleUser","EncodedDiagnosticMessage":"XXXX","NoPermissionType":"ImplicitDeny","PolicyType":"ResourceGroupLevelIdentityBasedPolicy"},"code":"StatusForbidden","message":"STSToken policy Forbidden for action cs:DescribeClusters","requestId":"XXXX","status":403,"statusCode":403}
Autorizar uma função RAM existente
Se a sua aplicação precisar usar uma função RAM existente em vez de crie uma nova, modifique a política de confiança dessa função adicionando uma instrução que permita às aplicações que usam uma service account específica assumir essa função RAM e obter credenciais temporárias. Para mais informações, consulte Modify the trust policy of a RAM role.
O código a seguir é um exemplo de entrada Statement a ser adicionada à política de confiança da função RAM.
Substitua os seguintes placeholders na entrada de exemplo Statement.
<oidc_issuer_url>: Substitua pela URL do provedor OIDC do cluster. Para obtê-la, passe o cursor sobre Enabled ao lado de RRSA OIDC na aba Basic Information da página Cluster Information.<oidc_provider_arn>: Substitua pelo ARN do provedor OIDC do cluster. Para obtê-lo, passe o cursor sobre Enabled ao lado de RRSA OIDC na aba Basic Information da página Cluster Information.<namespace>: Substitua pelo namespace onde a aplicação reside.<service_account>: Substitua pela service account que a aplicação utiliza.
{
"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>"
]
}
}
Referências
-
Alguns sdks oficiais da Alibaba Cloud oferecem suporte nativo à autenticação por tokens RRSA OIDC. A tabela a seguir descreve as versões do sdk compatíveis com esse recurso e fornece links para código de exemplo.
Linguagem
Versão do SDK
Código de exemplo
Go
Alibaba Cloud Credentials for Go 1.2.6 e posteriores
Java
Alibaba Cloud Credentials for Java 0.2.10 e posteriores
Python 3
Alibaba Cloud Credentials for Python 0.3.1 e posteriores
Node.js e TypeScript
Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6 e posteriores
Ao realizar SSO baseado em função OIDC, chame a api AssumeRoleWithOIDC para obter uma credencial temporária e assumir uma função RAM.