¿Cómo utilizo la función de roles de IAM para cuentas de servicio (IRSA) de Amazon EKS para restringir el acceso a un bucket de Amazon S3?

5 minutos de lectura
0

Quiero restringir el acceso a un bucket de Amazon Simple Storage Service (Amazon S3) a nivel de pod en Amazon Elastic Kubernetes Service (Amazon EKS). También quiero mantener los privilegios mínimos para mi aplicación con los roles de AWS Identity and Access Management (IAM) para cuentas de servicio (IRSA).

Resolución

Importante: Antes de utilizar IRSA con Amazon EKS, usted debe crear un proveedor de OIDC de IAM para su clúster.

Crear una política y un rol de IAM

1.    Cree un archivo JSON llamado iam-policy.json.

La siguiente política de ejemplo restringe los permisos de Amazon S3 y Amazon DynamoDB. Los usuarios de IAM pueden acceder a un bucket de S3 y acceder a una tabla de DynamoDB específica.

{
    "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/*"
        }
    ]
}

Nota: Sustituya YOUR\ _TABLE por su tabla. Sustituya YOUR\ _NAMESPACE por su espacio de nombres.

2.    Cree una política de IAM denominada YOUR-IAM-POLICY.

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

Nota: Sustituya YOUR-IAM-POLICY por el nombre de su política.

3.    Utilice la consola de IAM para crear un rol de IAM para su cuenta de servicio y, a continuación, anote una cuenta de servicio con ese rol de IAM. O bien, utilice eksctl para crear un rol de IAM para su cuenta de servicio. Por ejemplo:

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

Nota: Sustituya 1111122222 por su nombre de recurso de Amazon (ARN). También puede crear un rol de IAM para su cuenta de servicio mediante la consola de IAM.

Creación de un pod de Amazon EKS

En los siguientes pasos, sustituya su propia aplicación por una imagen de aws-cli. Esto le permite comprobar si su pod puede asumir el rol IAM especificado con los permisos IAM correctos.

1.    Cree un archivo YAML llamado 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

Nota: Sustituya YOUR\ _NAMESPACE por su espacio de nombres. Reemplace SERVICE\ _ACCOUNT por el nombre de su cuenta de servicio de Kubernetes.

2.    Cree un pod de Amazon EKS:

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

Probar su pod de Amazon EKS

Confirme que su pod utiliza el rol de IAM correcto con acciones de límite para Amazon S3 y DynamoDB. En el siguiente ejemplo, el pod solo puede mostrar el bucket de S3 (YOUR\ _BUCKET) y la tabla de DynamoDB (YOUR\ _TABLE).

1.    Busque el rol de IAM que usa las credenciales:

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

El resultado tendrá un aspecto similar al siguiente:

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

Si especifica un espacio de nombres, añada el argumento del espacio de nombres (-n) a todos los comandos de kubectl. Sustituya YOUR\ _NAMESPACE por su espacio de nombres. 

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

2.    Compruebe que su pod tenga permisos de s3:ListBuckets para su bucket de S3 (YOUR\ _BUCKET):

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

Nota: Sustituya YOUR\ _BUCKET por su bucket S3.

Salida:

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

3.    Compruebe que su pod no pueda eliminar el bucket de S3 (YOUR\ _BUCKET):

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

Nota: Sustituya YOUR\ _BUCKET por su bucket S3.

El comando devuelve el siguiente error «Acceso denegado» porque el pod no tiene los permisos 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.    Compruebe que su pod tenga permisos de dynamodb:List para su tabla de DynamoDB (YOUR\ _TABLE):

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

Nota: Sustituya** YOUR\ _TABLE** por su tabla de DynamoDB.

Salida:

{
    "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.    Compruebe que su pod no pueda eliminar la tabla de DynamoDB (YOUR\ _TABLE):

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

Nota: Sustituya** YOUR\ _TABLE** por su tabla de DynamoDB.

El comando devuelve el siguiente error «Acceso denegado» porque el pod no tiene permisos de 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

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años