Configurar uma conta de serviço do Kubernetes para assumir um perfil do IAM - Amazon EKS

Ajudar a melhorar esta página

Quer contribuir para este guia do usuário? Role até o final desta página e selecione Editar esta página no GitHub. Suas contribuições ajudarão a tornar nosso guia do usuário melhor para todos.

Configurar uma conta de serviço do Kubernetes para assumir um perfil do IAM

Este tópico aborda como configurar uma conta de serviço do Kubernetes para assumir um perfil do AWS Identity and Access Management (IAM). Todos os Pods configurados para usar a conta de serviço podem então acessar quaisquer AWS service (Serviço da AWS) para os quais a função tenha permissões de acesso.

Pré-requisitos
  • Um cluster existente. Se você não tiver, poderá criar um, seguindo um dos guias Conceitos básicos do Amazon EKS.

  • Um provedor de OpenID Connect (OIDC) do IAM existente para o cluster. Para saber se você já tem um ou como criar um, consulte Criar um provedor OIDC do IAM para o cluster.

  • A versão 2.12.3 ou superior ou a versão 1.27.160 ou superior da AWS Command Line Interface (AWS CLI) instalada e configurada em seu dispositivo ou no AWS CloudShell. Para verificar sua versão atual, use aws --version | cut -d / -f2 | cut -d ' ' -f1. Gerenciadores de pacotes, como yum, apt-get ou Homebrew para macOS, geralmente estão várias versões atrás da versão mais recente da AWS CLI. Para instalar a versão mais recente, consulte Instalar, atualizar e desinstalar a AWS CLI e Configuração rápida com o aws configure no Guia do usuário da AWS Command Line Interface. A versão da AWS CLI instalada no AWS CloudShell também pode estar várias versões atrás da versão mais recente. Para atualizá-la, consulte Instalar a AWS CLI no diretório inicial no Guia do usuário do AWS CloudShell.

  • A ferramenta da linha de comando kubectl está instalada no seu dispositivo ou no AWS CloudShell. A versão pode ser idêntica ou até uma versão secundária anterior ou posterior à versão Kubernetes do seu cluster. Por exemplo, se a versão do cluster for a 1.29, você poderá usar o kubectl versão 1.28, 1.29 ou 1.30 com ele. Para instalar ou atualizar o kubectl, consulte Instalar ou atualizar o kubectl.

  • Um arquivo kubectl config existente que contém a configuração do seu cluster. Para criar um arquivo kubectl config, consulte Criar ou atualizar um arquivo kubeconfig para um cluster do Amazon EKS.

Para associar um perfil do IAM a uma conta de serviço do Kubernetes.
  1. Se você quiser associar uma política do IAM existente ao seu perfil do IAM, vá para a próxima etapa.

    Crie uma política do IAM. É possível criar a sua própria política ou copiar uma política gerenciada da AWS que já conceda algumas das permissões de que você precisa e a personalizar de acordo com seus requisitos específicos. Para obter mais informações, consulte Criar políticas do IAM no Guia do usuário do IAM.

    1. Crie um arquivo que inclua as permissões para os Serviços da AWS que você deseja que seus Pods acessem. Para obter uma lista de todas as ações para todos os Serviços da AWS, consulte a Referência de autorização do serviço.

      É possível executar o comando a seguir para criar um arquivo de política de exemplo que permita acesso somente leitura a um bucket do Amazon S3. É possível, opcionalmente, armazenar informações de configuração ou um script de bootstrap nesse bucket, e os contêineres no Pod podem ler o arquivo do bucket e carregá-lo na aplicação. Se você quiser criar esse exemplo de política, copie o conteúdo a seguir para o seu dispositivo. Substitua my-pod-secrets-bucket pelo nome do seu bucket e execute o comando.

      cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
    2. Crie a política do IAM.

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. Crie um perfil do IAM e associe-o a uma conta de serviço do Kubernetes. Você pode usar o eksctl ou a AWS CLI.

    eksctl
    Pré-requisito

    Versão 0.183.0 ou posterior da ferramenta da linha de comando do eksctl instalada no dispositivo ou no AWS CloudShell. Para instalar ou atualizar o eksctl, consulte Instalação na documentação do eksctl.

    Substitua my-service-account pelo nome da conta de serviço do Kubernetes Kubernetes que você deseja que o eksctl crie e associe a um perfil do IAM. Substitua default (padrão) pelo namespace em que você deseja que o eksctl crie a conta de serviço. Substitua my-cluster pelo nome do cluster. Substitua my-role pelo nome da função à qual você deseja associar a conta de serviço. Se ela ainda não existir, o eksctl a criará para você. Substitua 111122223333 pelo ID da sua conta e my-policy pelo nome de uma política existente.

    eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \ --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve
    Importante

    Se a função ou a conta de serviço já existir, o comando anterior poderá falhar. O eksctl tem opções diferentes que você pode oferecer nessas situações. Para obter mais informações, execute eksctl create iamserviceaccount --help.

    AWS CLI
    1. Se você já tem um conta de serviço do Kubernetes na qual você deseja assumir um perfil do IAM, você pode ignorar esta etapa.

      Criar uma conta de serviço do Kubernetes. Copie o conteúdo a seguir para o seu dispositivo. Substitua my-service-account pelo nome desejado e default (padrão) por um namespace diferente, se necessário. Se você alterar o default (padrão), o espaço de nome já deve existir.

      cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml
    2. Defina o ID da Conta da AWS como uma variável de ambiente com o comando a seguir.

      account_id=$(aws sts get-caller-identity --query "Account" --output text)
    3. Defina o provedor de identidade OIDC do seu cluster como uma variável de ambiente com o comando a seguir. Substitua o my-cluster pelo nome do cluster.

      oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
    4. Defina variáveis para o namespace e o nome da conta de serviço. Substitua my-service-account e pelo serviço do Kubernetes e a conta de serviço que você deseja associar ao perfil. Substitua default (padrão) pelo namespace da conta de serviço.

      export namespace=default export service_account=my-service-account
    5. Execute o seguinte comando para criar um arquivo de política de confiança para o perfil do IAM. Se você quiser permitir que todas as contas de serviço em um namespace usem o perfil, copie o conteúdo a seguir para o seu dispositivo. Substitua StringEquals por StringLike e substitua $service_account por *. É possível adicionar várias entradas nas condições StringEquals ou StringLike abaixo para permitir que várias contas de serviço ou namespaces assumam o perfil. Para permitir perfis uma Conta da AWS diferente da conta em que seu cluster está para assumir o perfil, consulte Permissões do IAM entre contas para obter mais informações.

      cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
    6. Crie a função. Substitua my-role por um nome para o perfil do IAM e my-role-description por uma descrição da função.

      aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
    7. Associe uma política do IAM ao seu perfil. Substitua my-role pelo o nome de seu perfil do IAM e my-policy pelo nome de uma política existente que você tenha criado.

      aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::$account_id:policy/my-policy
    8. Anote sua conta de serviço com o nome do recurso da Amazon (ARN) do perfil do IAM que você deseja que a conta de serviço assuma. Substitua my-role pelo nome do seu perfil do IAM existente. Suponha que você tenha permitido um perfil de outra Conta da AWS diferente da conta em que o cluster está para assumir o perfil em uma etapa anterior. Em seguida, especifique a Conta da AWS e o perfil da outra conta. Para ter mais informações, consulte Permissões do IAM entre contas.

      kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
  3. Confirme se o perfil e a conta de serviço estão configuradas corretamente.

    1. Confirme se a política de confiança do perfil do IAM está configurada corretamente.

      aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument

      Veja um exemplo de saída abaixo.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
    2. Confirme se a política que você anexou ao seu perfil em uma etapa anterior está vinculada ao perfil.

      aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text

      Veja um exemplo de saída abaixo.

      arn:aws:iam::111122223333:policy/my-policy
    3. Defina uma variável para armazenar o nome do recurso da Amazon (ARN) da política que deseja usar. Substitua my-policy pelo nome da política para a qual deseja confirmar permissões.

      export policy_arn=arn:aws:iam::111122223333:policy/my-policy
    4. Visualize a versão padrão da política.

      aws iam get-policy --policy-arn $policy_arn

      Veja um exemplo de saída abaixo.

      { "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
    5. Revise o conteúdo da política para garantir que ela inclua todas as permissões de que seu Pod precisa. Se necessário, substitua1 no comando a seguir pela versão retornada na saída anterior.

      aws iam get-policy-version --policy-arn $policy_arn --version-id v1

      Veja um exemplo de saída abaixo.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] }

      Se você criou a política de exemplo em uma etapa anterior, sua saída será a mesma. Se você criou uma política diferente, então o exemplo de conteúdo é diferente.

    6. Confirme que a conta do serviço do Kubernetes esteja anotada com o perfil.

      kubectl describe serviceaccount my-service-account -n default

      Veja um exemplo de saída abaixo.

      Name:                my-service-account
      Namespace:           default
      Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role
      Image pull secrets:  <none>
      Mountable secrets:   my-service-account-token-qqjfl
      Tokens:              my-service-account-token-qqjfl
      [...]
  4. (Opcional) Configurar o endpoint do AWS Security Token Service para uma conta de serviço. A AWS recomenda usar um endpoint AWS STS regional em vez do endpoint global. Isso reduz a latência, fornece redundância integrada e aumenta a validade do token da sessão.

Próxima etapa

Para configurar Pods para usar uma conta de serviço do Kubernetes