Como faço para configurar um usuário de SSO para acessar o cluster do Amazon EKS?

7 minuto de leitura
0

Estou usando o Centro de Identidade do AWS IAM (sucessor do AWS Single Sign-On). No entanto, não consigo acessar o cluster do Amazon Elastic Kubernetes Service (Amazon EKS). Quero configurar o usuário de SSO para acessar o cluster.

Resolução

Certifique-se de que os seguintes pré-requisitos foram atendidos:

Observação: As etapas a seguir usam o kubectl para acessar o cluster. Depois de configurar o acesso ao kubectl, você pode ver os recursos do cluster no console do Amazon EKS fazendo login como usuário do Centro de Identidade do IAM.

Observação: Se você receber erros ao executar comandos na AWS Command Line Interface (AWS CLI), confirme se você está executando uma versão recente da AWS CLI.

Configure a AWS CLI para usar o usuário de SSO

Crie um perfil da AWS Command Line Interface (AWS CLI) que use a autenticação SSO ao executar os comandos da AWS CLI. Para obter mais informações, consulte Configurar a AWS CLI para usar o Centro de Identidade do AWS IAM (sucessor do AWS Single Sign-On).

Veja a seguir um exemplo de configuração da autenticação SSO da AWS CLI usando o procedimento automático:

aws configure sso
SSO start URL [None]: https://my-sso-portal.awsapps.com/start
SSO region [None]: us-east-1

A AWS CLI tentará abrir seu navegador padrão e iniciar o processo de login da conta do Centro de Identidade do IAM.

Attempting to automatically open the SSO authorization page in your default browser.

Se a AWS CLI não conseguir abrir o navegador, você receberá a seguinte mensagem com instruções sobre como iniciar manualmente o processo de login:

If the browser does not open or you wish to use a different device to authorize this request, open the following URL:
https://device.sso.us-east-2.amazonaws.com/
Then enter the code:
XXXX-XXXX
The only AWS account available to you is: 123456789999
Using the account ID 123456789999
The only role available to you is: ViewOnlyAccess
Using the role name "ViewOnlyAccess"
CLI default client Region [us-east-2]:
CLI default output format [json]:
CLI profile name [ViewOnlyAccess-123456789999]: test-profile
To use this profile, specify the profile name using --profile, as shown:
aws s3 ls --profile test-profile

Agora você pode executar os comandos da AWS CLI usando esse novo perfil. Essa configuração permite que o usuário de SSO faça o seguinte:

  • Autenticar-se com a AWS.
  • Adotar um perfil do AWS Identity and Management (IAM) criado pelo Centro de Identidade do IAM.

Exemplo:

$ aws sts get-caller-identity
{
    "UserId": "AROAXMRV33N1234567890:test-user",
    "Account": "123456789999",
    "Arn": "arn:aws:sts::123456789999:assumed-role/AWSReservedSSO_ViewOnlyAccess_05a3861234567890/test-user"
}

Configure o contexto do kubectl para usar o perfil da AWS CLI criado para autenticações SSO

O kubectl usa comandos da AWS CLI. Dessa forma, você deve especificar o novo perfil da AWS CLI no contexto atual do kubectl. Para atualizar o contexto do kubectl e usar o novo perfil, execute o seguinte comando:

aws eks update-kubeconfig --name $CLUSTER-NAME --profile test-profile

Depois de executar esse comando, o kubectl usará o perfil test-profile para a autenticação com o servidor da API do cluster.

Criar uma versão do ARN excluindo o diretório

Os perfis do IAM mapeados no aws-auth ConfigMap não incluem o caminho. Por padrão, o nome do recurso da Amazon (ARN) do perfil do IAM associado ao seu usuário de SSO inclui o caminho.

Exemplo:

arn:aws:iam::123456789999:role/aws-reserved/sso.amazonaws.com/us-east-2/AWSReservedSSO_ViewOnlyAccess_05a3861234567890

Se você adicionar o ARN completo ao aws-auth ConfigMap, o usuário de SSO não será autenticado. Não será possível acessar o cluster usando o usuário de SSO. Certifique-se de criar uma versão desse ARN sem incluir o caminho. Essa versão deve ser usada na próxima etapa.

Exemplo:

arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01

Também é possível obter o perfil do IAM sem o caminho, executando os seguintes comandos:

ssorole=$(aws sts get-caller-identity --query Arn --output text --profile test-profile | cut -d/ -f2)
account=$(aws sts get-caller-identity --query Account --output text --profile  test-profile)
echo "arn:aws:iam::$account:role/$ssorole"
arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01

Adicione o ARN ao aws-auth ConfigMap

Para que o usuário de SSO acesse o cluster do Amazon EKS, o perfil do IAM associado ao usuário de SSO deve ser mapeado para as permissões de RBAC do Kubernetes. Para fazer isso, inclua o ARN do perfil do IAM sem o caminho no aws-auth ConfigMap. Em seguida, mapeie-o para o usuário do Kubernetes e os grupos vinculados ao Kubernetes Role e RoleBinding (ou ClusterRole e ClusterRoleBinding). Use as instruções de qualquer uma das seções a seguir com base no seu caso de uso.

Usuário de SSO com permissões de administrador em todo o cluster

Por padrão, o grupo system:masters do Kubernetes fornece permissões de administrador para todo o cluster. Esse grupo está vinculado ao cluster-admin do ClusterRole e ao cluster-admin do ClusterRoleBinding. Dessa forma, não é necessário precisa criar os objetos ClusterRole e ClusterBindingRole. É necessário apenas mapear o perfil do IAM sem caminho para o grupo system:masters.

Para fazer isso, edite o aws-auth ConfigMap:

kubectl edit configmap aws-auth -n kube-system

Em seguida, adicione o seguinte:

- groups:
  - system:masters
  rolearn: arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01
  username: cluster-admin

Usuário de SSO com permissões de leitura vinculadas ao namespace

Nesse caso, é necessário criar um objeto Role e um RoleBinding com permissões de leitura em um namespace específico. Em seguida, vincule esses objetos ao perfil do IAM usando um nome de usuário ou nome de grupo personalizado no aws-auth ConfigMap.

1.    Crie um objeto Role do Kubernetes que fornece somente permissões de leitura no namespace desejado:

cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: $MY-NAMESPACE
  name: reader-role
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["*"]
  verbs: ["get", "watch", "list"]
EOF

Observação:

  • Substitua $MY-NAMESPACE pelo nome do namespace.
  • Substitua reader-role pelo nome do usuário personalizado.

2.    Crie um objeto RoleBinding do Kubernetes que vincula as permissões do perfil do Kubernetes ao grupo read-only-group:

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: reader-binding
  namespace: MY-NAMESPACE
subjects:
- kind: Group
  name: read-only-group
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: reader-role
  apiGroup: rbac.authorization.k8s.io
EOF

3.    Mapeie o ARN do perfil do IAM sem caminho para o grupo read-only-group no aws-auth ConfigMap.

É possível mapear o perfil do IAM automaticamente, executando o seguinte comando:

eksctl create iamidentitymapping \
    --cluster $CLUSTER-NAME \
    --region $REGION \
    --arn arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01 \
    --group read-only-group \
    --no-duplicate-arns \
    --username read-only-user1

Observação: substitua $CLUSTER-NAME e $REGION pelo nome do cluster e da região, respectivamente. Ou, mapeie o perfil do IAM manualmente. Para fazer isso, edite o aws-auth ConfigMap:

kubectl edit configmap aws-auth -n kube-system

Em seguida, adicione o seguinte na seção MapRules:

- groups:
  - read-only-group
  rolearn: arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01
  username: read-only-user1

Importante: o perfil do IAM deve aparecer somente uma vez no aws-auth ConfigMap. Portanto, certifique-se de que somente uma seção inclua o perfil do IAM.

Agora é possível usar o usuário de SSO para acessar o cluster:

$ kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          24h

Informações relacionadas

Habilitar o acesso de usuário e perfil do IAM ao cluster

AWS OFICIAL
AWS OFICIALAtualizada há um ano