Como uso o recurso de funções do IAM para o recurso de contas de serviço (IRSA) com o Amazon EKS para restringir o acesso a um bucket do Amazon S3?

Data da última atualização: 11-10-2021

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 privilégios mínimos para minha aplicação com funções do AWS Identity and Access Management (IAM) para contas de serviço (IRSA).

Resolução

Importante: antes de usar o IRSA com o Amazon EKS, você deve criar um provedor IAM OIDC para o cluster.

Criar uma política e uma função do IAM

1.    Crie um arquivo JSON chamado iam-policy.json.

O exemplo de política a seguir restringe as permissões do Amazon S3 e do Amazon DynamoDB. Os usuários do IAM têm permissão para acessar um bucket do S3 e acessar uma tabela específica do DynamoDB.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListAndDescribe",
            "Effect": "Allow",
            "Action": [
                "dynamodb:List*",
                "dynamodb:Describe*"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/YOUR_TABLE"
        },
        {
            "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_TABLE pela tabela. Substitua YOUR_NAMESPACE pelo seu namespace.

2.    Crie uma política do IAM chamada YOUR-IAM-POLICY.

$ aws iam create-policy \
    --policy-name YOUR-IAM-POLICY \
    --policy-document file://iam-policy.json

Observação: substitua YOUR-IAM-POLICY pelo nome da política.

3.    Use o console do IAM para criar uma função do IAM para sua conta de serviço e, em seguida, faça anotações em uma conta de serviço com essa função do IAM. Ou use eksctl para criar uma função do IAM para sua conta de serviço. Por exemplo:

$ eksctl create iamserviceaccount \
  --name YOUR-SERVICEACCOUNT \
  --namespace YOUR-NAMESPACE \
  --cluster YOUR-CLUSTER \
  --attach-policy-arn arn:aws:iam::1111122222:policy/YOUR-IAM-POLICY \
  --approve

Observação: substitua 1111122222 pelo seu Amazon Resource Name (nome de recurso da Amazon - ARN). Você também pode criar uma função do IAM para sua conta de serviço usando o console do IAM.

Crie um pod do Amazon EKS

Nas etapas a seguir, substitua sua própria aplicação por uma imagem aws-cli. Isso permite que você verifique se o pod pode assumir a função do IAM especificada com as permissões do IAM corretas.

1.    Crie um arquivo YAML chamado aws-cli-pod.yaml. Por exemplo:

apiVersion: v1
kind: Pod
metadata:
  name: aws-cli
  namespace: YOUR_NAMESPACE
spec:
  serviceAccountName: YOUR_SERVICEACCOUNT
  containers:
  - name: aws-cli
    image: amazon/aws-cli:latest
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

Observação: substitua YOUR_NAMESPACE pelo seu namespace. Substitua SERVICE_ACCOUNT pelo nome da sua conta de serviço do Kubernetes.

2.    Crie um pod do Amazon EKS:

$ kubectl apply -f ./aws-cli.yaml

Teste seu pod do Amazon EKS

Confirme se o pod usa a função do IAM correta com ações de limite para o Amazon S3 e o DynamoDB. No exemplo a seguir, o pod pode listar somente o bucket do S3 (YOUR_BUCKET) e a tabela do DynamoDB (YOUR_TABLE).

1.    Encontre a função do IAM que está usando as credenciais:

$ kubectl exec -it aws-cli -- aws sts get-caller-identity

Resultado:

{
    "UserId": "AIDACKCEVSQ6C2EXAMPLE:botocore-session-1111122222",
    "Account": "111122223333",
    "Arn": "arn:aws:sts::111122223333:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-1111122222"
}

2.    Verifique se o pod tem permissões s3:ListBuckets para o bucket do S3 (YOUR_BUCKET):

$ kubectl exec -it aws-cli -- aws s3 ls s3://YOUR_BUCKET

Observação: substitua YOUR_BUCKET pelo seu IRSA.

Resultado:

2021-09-28 09:59:22        269 demo-test-file

3.    Verifique se o pod não pode excluir o bucket do S3 ( YOUR_BUCKET):

$ kubectl exec -it aws-cli -- aws s3 rm s3://YOUR_BUCKET/demo-test-file

Observação: substitua YOUR_BUCKET pelo seu bucket do S3.

O comando retorna o seguinte erro “Acesso negado” porque o pod não tem permissões s3:DeleteObject:

delete failed: s3://YOUR_BUCKET/demo-test-file An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied
command terminated with exit code 1

4.    Verifique se o pod tem permissões do dynamodb:List para a tabela do DynamoDB (YOUR_TABLE):

$ kubectl exec -it aws-cli -- aws dynamodb describe-table --table-name YOUR_TABLE

Observação: substitua YOUR_TABLE pela sua tabela do DynamoDB.

Resultado:

{
    "Table": {
        "AttributeDefinitions": [
            {
                "AttributeName": "demo",
                "AttributeType": "S"
            }
        ],
        "TableName": "YOUR_TABLE",
        "KeySchema": [
            {
                "AttributeName": "demo",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2021-09-28T10:05:53.599000+00:00",
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:eu-west-1:000000000000:table/YOUR_TABLE",
        "TableId": "42bd1238-e042-4016-b6b2-77548939c101"
    }
}

5.    Verifique se o pod não pode excluir a tabela do DynamoDB ( YOUR_TABLE):

$ kubectl exec -it aws-cli -- aws dynamodb delete-table --table-name YOUR_TABLE

Observação: substitua YOUR_TABLE pela sua tabela do DynamoDB.

O comando retorna o seguinte erro “Acesso negado” porque o pod não tem permissões dynamodb:DeleteTable:

An error occurred (AccessDeniedException) when calling the DeleteTable operation: User: arn:aws:sts::1111122222:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1U7NRNSEC/botocore-session-1632822777 is not authorized to perform: dynamodb:DeleteTable on resource: arn:aws:dynamodb:eu-west-1: 1111122222:table/MyTable
command terminated with exit code 254

Este artigo foi útil?


Precisa de ajuda com faturamento ou suporte técnico?