Comment utiliser IRSA dans Amazon EKS pour restreindre l'accès à un compartiment Amazon S3 ?

Lecture de 7 minute(s)
0

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 autorisations minimales pour mon application avec des rôles AWS Identity and Access Management (IAM) pour les comptes de service (IRSA).

Résolution

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'interface.

Prérequis : Créez un fournisseur OpenID Connect (OIDC) IAM pour votre cluster.

Créer une politique et un rôle IAM

Procédez comme suit :

  1. Créez un fichier JSON appelé iam-policy.json. Exemple de politique :
    {    
        "Version": "2012-10-17",
        "Statement": [
            {
                "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_BUCKET par le nom de votre compartiment S3. L'exemple de politique précédent restreint les autorisations Amazon S3 afin que les utilisateurs IAM puissent uniquement répertorier et récupérer des objets à partir d'un compartiment S3.
  2. Pour créer la politique IAM, exécutez la commande de l'interface de ligne de commande AWS create-policy suivante :
    aws iam create-policy \
        --policy-name YOUR_IAM_POLICY_NAME \
        --policy-document file://iam-policy.json
    Remarque : Remplacez YOUR_IAM_POLICY_NAME par le nom de votre politique.
  3. Créez un rôle IAM et associez-le à votre compte AWS de service de cluster.
  4. Vérifiez que vous avez correctement configuré la politique et le rôle IAM.
  5. (Facultatif) Pour obtenir le nom du rôle, exécutez la commande suivante :
    kubectl get sa SERVICE_ACCOUNT_NAME -n NAMESPACE_NAME -o yaml | grep eks.amazonaws.com/role-arn | cut -d '/' -f 3
    Remarque : Remplacez SERVICE_ACCOUNT_NAME par le nom de votre compte de service et NAMESPACE_NAME par le nom de votre espace de noms.
    Exemple de sortie :
    eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE

Créer un pod Amazon EKS

Vérifiez que votre pod peut endosser le rôle IAM avec les autorisations appropriées. Procédez comme suit pour remplacer votre application par une image officielle dans l'AWS CLI :

  1. Créez un fichier YAML appelé aws-cli-pod.yaml. Exemple de fichier :
    apiVersion: v1
    kind: Pod
    metadata:
      name: aws-cli
      namespace: NAMESPACE_NAME
    spec:
      serviceAccountName: SERVICE_ACCOUNT_NAME
      containers:
      - name: aws-cli
        image: amazon/aws-cli:latest
        command:
          - sleep
          - "3600"
        imagePullPolicy: IfNotPresent
      restartPolicy: Always
    Remarque : Remplacez NAMESPACE_NAME par votre espace de noms et SERVICE_ACCOUNT_NAME par le nom de votre compte de service Kubernetes.
  2. Pour créer un pod Amazon EKS, exécutez la commande suivante :
    kubectl apply -f ./aws-cli-pod.yaml

Tester votre pod Amazon EKS

Remarque : Dans l'exemple suivant, le pod peut répertorier et récupérer des objets depuis le compartiment S3 YOUR_BUCKET.

Pour vérifier que votre pod utilise le rôle et les actions IAM appropriés pour Amazon S3, procédez comme suit :

  1. Pour trouver le rôle IAM qui utilise les informations d'identification, exécutez la commande suivante :

    kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws sts get-caller-identity

    Remarque : Remplacez NAMESPACE_NAME par le nom de votre espace de noms.
    Exemple de sortie :

    {   
        "UserId": "AIDACKCEVSQ6C2EXAMPLE:botocore-session-123456789012",
        "Account": "123456789012",
        "Arn": "arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012"
    }
  2. Vérifiez que votre pod dispose des autorisations appropriées pour votre compartiment S3.
    Pour vérifier que votre pod dispose des autorisations s3:ListBuckets, exécutez la commande suivante :

    kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3 ls s3://YOUR_BUCKET

    Remarque : Remplacez NAMESPACE_NAME par le nom de votre espace de noms et YOUR_BUCKET par votre compartiment.
    Exemple de sortie :

    2025-03-25 22:28:06         14 hello_s3.txt

    Pour vérifier que votre pod dispose des autorisations s3:GetObject, exécutez la commande suivante :

    kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3api get-object --bucket YOUR_BUCKET --key DIR/S3_OBJECT_FILE S3_FILE_NAME_LOCAL

    Remarque : Remplacez NAMESPACE_NAME par le nom de votre espace de noms et YOUR_BUCKET par votre compartiment. Remplacez également DIR/S3_OBJECT_FILE par le nom du répertoire et du fichier objet et S3_FILE_NAME_LOCAL par le nouvel objet Amazon S3 local.
    Exemple de sortie :

    {
        "AcceptRanges": "bytes",
        "LastModified": "2025-03-14T01:49:38+00:00",
        "ContentLength": 19,
        "ETag": "\"678b33365329cce6cd2bb1882e62fe3a\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {}
    }
  3. Pour vérifier que votre pod ne dispose pas des autorisations s3:DeleteObject, exécutez la commande suivante :

    kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3 rm s3://YOUR_BUCKET/DEMO_TEST_FILE

    Remarque : Remplacez NAMESPACE_NAME par le nom de votre espace de noms et YOUR_BUCKET par votre compartiment. Remplacez également DEMO_TEST_FILE par votre fichier objet Amazon S3.
    Si le pod ne dispose pas des autorisations s3:DeleteObject, le message d'erreur Accès refusé suivant s'affiche dans la sortie :

    delete failed: s3://YOUR_BUCKET/DEMO_TEST_FILE An error occurred (AccessDenied) when calling the DeleteObject operation: User: arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012 is not authorized to perform: s3:DeleteObject on resource: "arn:aws:s3:::YOUR_BUCKET/DEMO_TEST_FILE" because no identity-based policy allows the s3:DeleteObject action
    command terminated with exit code 1

Résoudre les problèmes

Important : Créez toujours de nouveaux pods après avoir apporté des modifications. Amazon EKS répercute les mises à jour uniquement dans les pods nouvellement créés, pas dans les pods existants.

Erreur NoSuchBucket

Si vous ne trouvez pas le compartiment S3 parce qu'il n'existe pas, le message d'erreur suivant s'affiche :

« An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation: The specified bucket does not exist command terminated with exit code 254). (Une erreur s'est produite (NoSuchBucket) lors de l'appel de l'opération ListObjectsV2 : Le compartiment spécifié n'existe pas, commande interrompue avec le code de sortie 254)

Pour résoudre ce problème, assurez-vous d'utiliser le nom de compartiment S3 correct dans vos commandes.

Erreur NoSuchKey

Si vous ne parvenez pas à effectuer un téléchargement à partir d'un chemin de compartiment S3 spécifique, le message d'erreur suivant s'affiche :

« An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist. (Une erreur s'est produite (NoSuchKey) lors de l'appel de l'opération GetObject : La clé spécifiée n'existe pas.)

Pour résoudre ce problème, vérifiez que le chemin et le nom de fichier Amazon S3 existent dans votre compte AWS.

Erreurs AccessDenied

Si vous n'êtes pas autorisé à effectuer une action sur le compartiment S3, un message d'erreur s'affiche. Par exemple, l'erreur suivante se produit si vous ne pouvez pas exécuter l'action ListObjectsV2 :

« An error occurred (AccessDenied) when calling the PutObject operation: User: arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012 is not authorized to perform: s3:ListBucket on resource: "arn:aws:s3:::YOUR_BUCKET" because no identity-based policy allows the s3:ListBucket action command terminated with exit code 254 » (Une erreur s’est produite (AccessDenied) lors de l’appel de l’opération PutObject : L’utilisateur : arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012 n’est pas autorisé à effectuer : s3:ListBucket sur la ressource : « arn:aws:s3:::YOUR_BUCKET » car aucune politique basée sur l’identité n’autorise l’action s3:ListBucket, commande interrompue avec le code de sortie 254)

Pour résoudre ce problème, assurez-vous d'avoir ajouté l'autorisation à votre politique de rôle IAM.

En cas d'erreur dans le fournisseur d'identité IAM, le message d'erreur suivant s'affiche :

« An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity command terminated with exit code 254 » (Une erreur s’est produite (AccessDenied) lors de l’appel de l’opération AssumeRoleWithWebIdentity : Non autorisé à exécuter STS:AssumeRoleWithWebIdentity, commande interrompue avec le code de sortie 254)

Pour résoudre ce problème, confirmez les configurations suivantes :

Erreur InvalidIdentityToken

Si Amazon EKS ne trouve pas le fournisseur OIDC de votre compte, le message d'erreur suivant s'affiche :

« An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: No OpenIDConnect provider found in your account for https://oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE command terminated with exit code 254 » (Une erreur s’est produite (InvalidIdentityToken) lors de l’appel de l’opération AssumeRoleWithWebIdentity : Aucun fournisseur OpenIDConnect trouvé dans votre compte pour https://oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE, commande interrompue avec le code de sortie 254)

Pour résoudre ce problème, vérifiez que le fournisseur d'identité de l'OIDC existe dans IAM.

Informations connexes

Test de la politique IAM à l'aide du simulateur de politique IAM

Actions, ressources et clés de condition pour les services AWS

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un mois