¿Cómo puedo utilizar la característica de roles de IAM para cuentas de servicio (IRSA) con Amazon EKS para restringir el acceso a un bucket de Amazon S3?

Última actualización: 11/10/2021

Quiero restringir el acceso de 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, debe crear un proveedor de OIDC de IAM para el clúster.

Crear una política y un rol de IAM

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

La política de ejemplo siguiente 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: Reemplace YOUR_TABLE por su tabla. Reemplace 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: Reemplace 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, use 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: Reemplace 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.

Crear un pod de Amazon EKS

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

1.    Cree un archivo YAML denominado aws-cli-pod.yaml. Por ejemplo:

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: Reemplace YOUR_NAMESPACE por su espacio de nombres. Nota: 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

Pruebe su pod de Amazon EKS

Confirme que el pod utiliza el rol de IAM correcto con acciones 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 utiliza las credenciales:

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

Salida:

{
    "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.    Compruebe que su pod tenga permisos s3:ListBuckets para su bucket de S3 (YOUR_BUCKET):

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

Nota: Reemplace YOUR_BUCKET por su IRSA.

Salida:

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

3.    Compruebe que su pod no puede eliminar el bucket de S3 (YOUR_BUCKET):

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

Nota: Reemplace YOUR_BUCKET por su bucket de S3.

El comando devuelve el siguiente error “Acceso denegado” porque el pod no tiene 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 el pod tiene permisos de DynamoDB:list para la tabla de DynamoDB (YOUR_TABLE):

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

Nota: Reemplace 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 el pod no puede eliminar la tabla de DynamoDB (YOUR_TABLE):

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

Nota: Reemplace YOUR_TABLE por su tabla de DynamoDB.

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

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?