Salta al contenuto

Come posso utilizzare IRSA in Amazon EKS per limitare l'accesso a un bucket Amazon S3?

6 minuti di lettura
0

Desidero limitare l'accesso al bucket Amazon Simple Storage Service (Amazon S3) a livello di Pod in Amazon Elastic Kubernetes Service (Amazon EKS). Desidero inoltre mantenere le autorizzazioni minime per la mia applicazione con i ruoli AWS Identity and Access Management (AWS IAM) per gli account di servizio (IRSA).

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Prerequisiti: crea un provider di identità IAM OpenID Connect (OIDC) per il cluster..

Crea una policy e un ruolo IAM

Completa i seguenti passaggi:

  1. Crea un file JSON denominato iam-policy.json. Esempio di policy:
    {    
        "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/*"
            }
        ]
    }
    Nota: sostituisci YOUR_BUCKET con il nome del tuo bucket S3. L'esempio di policy precedente limita le autorizzazioni di Amazon S3 in modo che gli utenti IAM possano elencare e recuperare oggetti solo da un bucket S3.
  2. Per creare la policy IAM, esegui questo comando AWS CLI create-policy:
    aws iam create-policy \
        --policy-name YOUR_IAM_POLICY_NAME \
        --policy-document file://iam-policy.json
    Nota: sostituisci YOUR_IAM_POLICY_NAME con il nome della tua policy.
  3. Crea un ruolo IAM e associalo all'account AWS di servizio del cluster.
  4. Verifica di aver configurato correttamente la policy e il ruolo IAM.
  5. (Facoltativo) Per ottenere il nome del ruolo, esegui questo comando:
    kubectl get sa SERVICE_ACCOUNT_NAME -n NAMESPACE_NAME -o yaml | grep eks.amazonaws.com/role-arn | cut -d '/' -f 3
    Nota: sostituisci SERVICE_ACCOUNT_NAME con il nome del tuo account di servizio e NAMESPACE_NAME con il nome del tuo namespace.
    Esempio di output:
    eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE

Crea un Pod Amazon EKS

Verifica che il Pod possa assumere il ruolo IAM con le autorizzazioni corrette. Completa i seguenti passaggi per sostituire l'applicazione con un'immagine ufficiale in AWS CLI:

  1. Crea un file YAML denominato aws-cli-pod.yaml. Esempio di file:
    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
    Nota: sostituisci NAMESPACE_NAME con il tuo namespace e SERVICE_ACCOUNT_NAME con il nome del tuo account di servizio Kubernetes.
  2. Per creare un Pod Amazon EKS, esegui questo comando:
    kubectl apply -f ./aws-cli-pod.yaml

Testa il Pod Amazon EKS

Nota: nell'esempio seguente, il Pod può elencare e ottenere oggetti dal bucket S3 YOUR_BUCKET.

Per verificare che il Pod utilizzi le azioni e il ruolo IAM corretti per Amazon S3, completa i seguenti passaggi:

  1. Per individuare il ruolo IAM che utilizza le credenziali, esegui questo comando:

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

    Nota: sostituisci NAMESPACE_NAME con il nome del tuo namespace.
    Esempio di output:

    {   
        "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. Verifica che il Pod disponga delle autorizzazioni corrette per il bucket S3.
    Per verificare che il Pod disponga delle autorizzazioni s3:ListBuckets, esegui questo comando:

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

    Nota: sostituisci NAMESPACE_NAME con il nome del tuo namespace e YOUR_BUCKET con il tuo bucket.
    Esempio di output:

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

    Per verificare che il Pod disponga delle autorizzazioni s3:GetObject, esegui questo comando:

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

    Nota: sostituisci NAMESPACE_NAME con il nome del tuo namespace e YOUR_BUCKET con il tuo bucket. Inoltre, sostituisci DIR/S3_OBJECT_FILE con la directory e il nome del file dell'oggetto e S3_FILE_NAME_LOCAL con il nuovo oggetto Amazon S3 locale.
    Esempio di output:

    {
        "AcceptRanges": "bytes",
        "LastModified": "2025-03-14T01:49:38+00:00",
        "ContentLength": 19,
        "ETag": "\"678b33365329cce6cd2bb1882e62fe3a\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {}
    }
  3. Per verificare che il Pod non disponga delle autorizzazioni s3:DeleteObject, esegui questo comando:

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

    Nota: sostituisci NAMESPACE_NAME con il nome del tuo namespace e YOUR_BUCKET con il tuo bucket. Inoltre, sostituisci DEMO_TEST_FILE con il file del tuo oggetto Amazon S3.
    Se il Pod non dispone delle autorizzazioni s3:DeleteObject, nell'output viene visualizzato il seguente errore Access Denied:

    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

Risolvi i problemi

Importante: crea sempre nuovi Pod dopo aver apportato le modifiche. Amazon EKS riflette gli aggiornamenti solo nei Pod appena creati, non in quelli esistenti.

Errore NoSuchBucket

Se non riesci a trovare il bucket S3 perché non esiste, ricevi il seguente errore:

"An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation: The specified bucket does not exist command terminated with exit code 254"

Per risolvere il problema, assicurati di utilizzare il nome corretto del bucket S3 nei comandi.

Errore NoSuchKey

Se non riesci a scaricare da un percorso specifico del bucket S3, ricevi il seguente errore:

"An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist."

Per risolvere il problema, verifica che il percorso e il nome del file Amazon S3 esistano nell'account AWS.

Errori AccessDenied

Se non disponi delle autorizzazioni per eseguire un'azione sul bucket S3, ricevi un errore. Ad esempio, il seguente errore si verifica se non puoi eseguire l'azione ListObjectsV2:

"An error occurred (AccessDenied) when calling the ListObjectsV2 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"

Per risolvere il problema, assicurati di aver aggiunto l'autorizzazione alla policy del ruolo IAM.

Se è presente un errore riguardante il provider di identità IAM, ricevi il seguente errore:

"An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity command terminated with exit code 254"

Per risolvere il problema, verifica le seguenti configurazioni:

Errore InvalidIdentityToken

Se Amazon EKS non riesce a trovare il provider OIDC dell'account, ricevi il seguente errore:

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

Per risolvere il problema, verifica che in IAM esista il provider di identità per il protocollo OIDC.

Informazioni correlate

Test delle policy IAM con il simulatore di policy IAM

Azioni, risorse e chiavi di condizione per i servizi AWS

AWS UFFICIALEAggiornata un anno fa