Comment utiliser des fonctions de rôles IAM pour les comptes de service (IRSA) avec Amazon EKS pour restreindre l'accès à un compartiment Amazon S3 ?

Dernière mise à jour : 2021-10-11

Je souhaite restreindre l'accès à un compartiment Amazon Simple Storage Service (Amazon S3) au niveau du pod dans Amazon Elastic Kubernetes Service (Amazon EKS). Je souhaite également conserver des privilèges minimaux pour mon application avec des rôles AWS Identity and Access Management (IAM) pour les comptes de service (IRSA).

Solution

Important : Avant d'utiliser les IRSA avec Amazon EKS, vous devez créer un fournisseur OIDC IAM pour votre cluster.

Créez un rôle et une politique IAM

1.    Créez un fichier JSON appelé iam-policy.json.

L'exemple de politique suivant restreint les autorisations Amazon S3 et Amazon DynamoDB. Les utilisateurs IAM sont autorisés à accéder à un compartiment S3 et à accéder à une table DynamoDB précise.

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

Remarque : Remplacez YOUR_TABLE par votre table. Remplacez YOUR_NAMESPACE par votre espace de noms.

2.    Créez une politique IAM appelée YOUR-IAM-POLICY.

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

Remarque : Remplacez YOUR-IAM-POLICY par le nom de votre politique.

3.    Utilisez la console IAM pour créer un rôle IAM pour votre compte de service, puis annotez un compte de service avec ce rôle IAM. Vous pouvez également utiliser eksctl pour créer un rôle IAM pour votre compte de service. Par exemple :

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

Remarque : Remplacez 1111122222 votre Amazon Resource Name (ARN). Vous pouvez également créer un rôle IAM pour votre compte de service à l'aide de la console IAM.

Créez un pod Amazon EKS

Dans les étapes suivantes, remplacez votre propre application par une image aws-cli. Cela vous permet de vérifier si votre pod peut assumer le rôle IAM spécifié avec les autorisations IAM correctes.

1.    Créez un fichier YAML appelé aws-cli-pod.yaml. Par exemple :

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

Remarque : Remplacez YOUR_NAMESPACE par votre espace de noms. Remplacez SERVICE_ACCOUNT par votre nom de compte de service Kubernetes.

2.    Créez un pod Amazon EKS :

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

Testez votre pod Amazon EKS

Confirmez que votre pod utilise le rôle IAM approprié avec des actions de limitation pour Amazon S3 et DynamoDB. Dans l'exemple suivant, le pod ne peut répertorier que le compartiment S3 (YOUR_BUCKET) et la table DynamoDB (YOUR_TABLE).

1.    Recherchez le rôle IAM qui utilise les informations d'identification :

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

Sortie :

{
    "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.    Vérifiez que votre pod dispose des autorisations s3:ListBuckets pour votre compartiment S3 (YOUR_BUCKET) :

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

Remarque : Remplacez YOUR_BUCKET par votre IRSA.

Sortie :

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

3.    Vérifiez que votre pod ne peut pas supprimer le compartiment S3 (YOUR_BUCKET) :

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

Remarque : Remplacez YOUR_BUCKET par votre compartiment S3.

La commande renvoie l'erreur suivante « Accès refusé », car le pod ne dispose pas des autorisations 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.    Vérifiez que votre pod dispose des autorisations dynamodb:List pour votre table DynamoDB (YOUR_TABLE) :

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

Remarque : Remplacez YOUR_TABLE par votre table DynamoDB.

Sortie :

{
    "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.    Vérifiez que votre pod ne peut pas supprimer la table DynamoDB (YOUR_TABLE) :

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

Remarque : Remplacez YOUR_TABLE par votre table DynamoDB.

La commande renvoie l'erreur suivante « Accès refusé », car le pod dispose pas des autorisations 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

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?