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

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

Solução

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

Crie uma política e um perfil 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 podem 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 com a sua 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 sua política.

3.    Use o console do IAM para criar um perfil do IAM para a sua conta de serviço e, em seguida, faça anotações em uma conta de serviço com esse perfil do IAM. Ou use eksctl para criar um perfil do IAM para a 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 nome do recurso da Amazon (ARN). Você também pode criar um perfil do IAM para a sua conta de serviço usando o console do IAM.

Criar um pod do Amazon EKS

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

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

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 Kubernetes.

2.    Crie um pod do Amazon EKS:

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

Teste seu pod do Amazon EKS

Confirme se o seu pod está usando o perfil do IAM correto 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 o perfil do IAM que está usando as credenciais:

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

A saída será semelhante a:

{
    "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"
}

Se você especificar um namespace, acrescente o argumento do namespace (-n) a todos os comandos kubectl. Substitua YOUR_NAMESPACE pelo seu namespace.

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

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

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

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

Saída:

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

3.    Verifique se o seu 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 seu pod tem as permissões na dynamodb:List para a sua tabela do DynamoDB (YOUR_TABLE):

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

**Observação:**Substitua YOUR_TABLE pela tabela do DynamoDB.

Saída:

{
    "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 seu 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 tabela do DynamoDB.

O comando retorna o seguinte erro de “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

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos