Como uso o IRSA no Amazon EKS para restringir o acesso a um bucket do Amazon S3?

6 minuto de leitura
0

Quero restringir o acesso de um bucket do Amazon Simple Storage Service (Amazon S3) no nível do pod no Amazon Elastic Kubernetes Service (Amazon EKS). Também quero manter as permissões mínimas para a minha aplicação com perfis do AWS Identity and Access Management (AWS IAM) para contas de serviço (IRSA).

Resolução

Observação: Se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Pré-requisitos: Crie um provedor IAM OpenID Connect (OIDC) para seu cluster.

Crie uma política e um perfil do IAM

Conclua as seguintes etapas:

  1. Crie um arquivo JSON chamado iam-policy.json. Exemplo de política:
    {    
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": "arn:aws:s3:::YOUR_BUCKET"
            },
            {
                "Sid": "List",
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:GetObjectVersion"
                ],
                "Resource": "arn:aws:s3:::YOUR_BUCKET/*"
            }
        ]
    }
    Observação: Substitua YOUR_BUCKET pelo seu bucket do S3. O exemplo anterior de política restringe as permissões do Amazon S3 para que os usuários do IAM só possam listar e recuperar objetos de um bucket do S3.
  2. Para criar a política do IAM, execute o seguinte comando create-policy da AWS CLI:
    aws iam create-policy \
        --policy-name YOUR_IAM_POLICY_NAME \
        --policy-document file://iam-policy.json
    Observação: substitua YOUR_IAM_POLICY_NAME pelo nome da sua política.
  3. Crie um perfil do IAM e associe-a à sua conta da AWS do serviço de cluster.
  4. Confirme se você configurou corretamente a política e a perfil do IAM.
  5. (Opcional) Para obter o nome do perfil, execute o seguinte comando:
    kubectl get sa SERVICE_ACCOUNT_NAME -n NAMESPACE_NAME -o yaml | grep eks.amazonaws.com/role-arn | cut -d '/' -f 3
    Observação: substitua SERVICE_ACCOUNT_NAME pelo nome da sua conta de serviço e NAMESPACE_NAME pelo nome do seu namespace.
    Exemplo de saída:
    eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE

Crie um pod do Amazon EKS

Confirme se seu pod pode assumir o perfil do IAM com as permissões corretas. Conclua as etapas a seguir para substituir sua aplicação por uma imagem oficial na AWS CLI:

  1. Crie um arquivo YAML chamado aws-cli-pod.yaml. Arquivo de exemplo:
    apiVersion: v1
    kind: Pod
    metadata:
      name: aws-cli
      namespace: NAMESPACE_NAME
    spec:
      serviceAccountName: SERVICE_ACCOUNT_NAME
      containers:
      - name: aws-cli
        image: amazon/aws-cli:latest
        command:
          - sleep
          - "3600"
        imagePullPolicy: IfNotPresent
      restartPolicy: Always
    Observação: substitua NAMESPACE_NAME pelo seu namespace e SERVICE_ACCOUNT_NAME pelo nome da sua conta de serviço do Kubernetes.
  2. Para criar um pod Amazon EKS, execute o seguinte comando:
    kubectl apply -f ./aws-cli-pod.yaml

Teste seu pod do Amazon EKS

Observação: no exemplo a seguir, o pod pode listar e obter objetos do bucket YOUR_BUCKET S3.

Para confirmar que seu pod usa o perfil e as ações corretas do IAM para o Amazon S3, conclua as seguintes etapas:

  1. Para encontrar o perfil do IAM que usa as credenciais, execute o seguinte comando:

    kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws sts get-caller-identity

    Observação: Substitua NAMESPACE_NAME pelo nome do seu namespace.
    Exemplo de saída:

    {   
        "UserId": "AIDACKCEVSQ6C2EXAMPLE:botocore-session-123456789012",
        "Account": "123456789012",
        "Arn": "arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012"
    }
  2. Verifique se seu pod tem as permissões corretas para seu bucket do S3.
    Para verificar se seu pod tem permissões s3:ListBuckets, execute o seguinte comando:

    kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3 ls s3://YOUR_BUCKET

    Observação: substitua NAMESPACE_NAME pelo nome do seu namespace e YOUR_BUCKET pelo seu bucket.
    Exemplo de saída:

    2025-03-25 22:28:06         14 hello_s3.txt

    Para verificar se seu pod tem permissões s3:GetObject, execute o seguinte comando:

    kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3api get-object --bucket YOUR_BUCKET --key DIR/S3_OBJECT_FILE S3_FILE_NAME_LOCAL

    Observação: substitua NAMESPACE_NAME pelo nome do seu namespace e YOUR_BUCKET pelo seu bucket. Além disso, substitua DIR/S3_OBJECT_FILE pelo nome do arquivo do diretório e do objeto e S3_FILE_NAME_LOCAL pelo novo objeto local do Amazon S3.
    Exemplo de saída:

    {
        "AcceptRanges": "bytes",
        "LastModified": "2025-03-14T01:49:38+00:00",
        "ContentLength": 19,
        "ETag": "\"678b33365329cce6cd2bb1882e62fe3a\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {}
    }
  3. Para verificar se seu pod não tem permissões s3:DeleteObject, execute o seguinte comando:

    kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3 rm s3://YOUR_BUCKET/DEMO_TEST_FILE

    Observação: substitua NAMESPACE_NAME pelo nome do seu namespace e YOUR_BUCKET pelo seu bucket. Além disso, substitua DEMO_TEST_FILE pelo seu arquivo de objeto do Amazon S3.
    Se o pod não tiver permissões s3:DeleteObject, você receberá o erro Acesso Negado na saída:

    delete failed: s3://YOUR_BUCKET/DEMO_TEST_FILE An error occurred (AccessDenied) when calling the DeleteObject operation: User: arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012 is not authorized to perform: s3:DeleteObject on resource: "arn:aws:s3:::YOUR_BUCKET/DEMO_TEST_FILE" because no identity-based policy allows the s3:DeleteObject action
    command terminated with exit code 1

Solucionar problemas

Importante: Sempre crie novos pods depois de fazer alterações. O Amazon EKS reflete as atualizações somente nos pods recém-criados, não nos existentes.

Erro NoSuchBucket

Se você não conseguir encontrar o bucket do S3 porque ele não existe, você receberá o seguinte erro:

“An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation: The specified bucket does not exist command terminated with exit code 254”

Para solucionar esse problema, certifique-se de usar o nome correto do bucket do S3 em seus comandos.

Erro NoSuchKey

Se você não conseguir fazer o download de um caminho de bucket específico do S3, receberá o seguinte erro:

“An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist.”

Para solucionar esse problema, verifique se o caminho e o nome do arquivo do Amazon S3 existem na sua conta da AWS.

Erros de acesso negado

Se você não tiver permissões para realizar uma ação no bucket do S3, receberá um erro. Por exemplo, o erro a seguir ocorre se você não conseguir executar a ação ListObjectsV2:

“An error occurred (AccessDenied) when calling the ListObjectsV2 operation: User: arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012 is not authorized to perform: s3:ListBucket on resource: “arn:aws:s3:::YOUR_BUCKET” because no identity-based policy allows the s3:ListBucket action command terminated with exit code 254”

Para solucionar esse problema, certifique-se de ter adicionado a permissão à sua política de perfil do IAM.

Se houver um erro no provedor de identidade do IAM, você receberá o seguinte erro:

“An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity command terminated with exit code 254”

Para solucionar esse problema, confirme as seguintes configurações:

Erro InvalidIdentityToken

Se o Amazon EKS não conseguir encontrar o provedor de OIDC em sua conta, você receberá o seguinte erro:

“An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: No OpenIDConnect provider found in your account for https://oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE command terminated with exit code 254”

Para solucionar esse problema, verifique se o provedor de identidade do OIDC existe no IAM.

Informações relacionadas

Teste de política do IAM com o simulador de políticas do IAM

Ações, recursos e chaves de condição para serviços da AWS

AWS OFICIAL
AWS OFICIALAtualizada há um mês