Configurare un account Kubernetes di servizio per assumere un ruolo IAM - Amazon EKS

Aiutaci a migliorare questa pagina

Vuoi contribuire a questa guida per l'utente? Scorri fino alla fine di questa pagina e seleziona Modifica questa pagina su GitHub. I tuoi contributi contribuiranno a rendere la nostra guida utente migliore per tutti.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Configurare un account Kubernetes di servizio per assumere un ruolo IAM

Questo argomento spiega come configurare un account Kubernetes di servizio per assumere un ruolo AWS Identity and Access Management (IAM). Qualsiasi Pods configurato per utilizzare l'account del servizio può quindi accedere a qualsiasi Servizio AWS per cui il ruolo dispone delle autorizzazioni di accesso.

Prerequisiti
Per associare un ruolo IAM a un account del servizio Kubernetes.
  1. Se desideri associare una policy IAM esistente al tuo ruolo IAM, passa al prossimo passaggio.

    Creare una policy IAM È possibile creare una politica personalizzata o copiare una politica AWS gestita che già concede alcune delle autorizzazioni necessarie e personalizzarla in base alle proprie esigenze specifiche. Per ulteriori informazioni, consulta Creazione di policy IAM nella Guida per l'utente di IAM.

    1. Crea un file che includa le autorizzazioni per il Servizi AWS quale desideri accederePods. Per un elenco di tutte le azioni per tutti Servizi AWS, consulta il Service Authorization Reference.

      Puoi eseguire il comando seguente per creare un file policy di esempio che consenta l'accesso in sola lettura a un bucket Amazon S3. Puoi facoltativamente archiviare le informazioni di configurazione o uno script di bootstrap in questo bucket; i container nel Pod possono leggere il file dal bucket e caricarlo nell'applicazione. Se desideri creare questa policy di esempio, copia i seguenti contenuti sul dispositivo. Sostituisci my-pod-secrets-bucket con il nome del bucket ed esegui il comando.

      cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
    2. Creare la policy IAM.

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. Crea un ruolo IAM e associalo a un account del servizio Kubernetes. In alternativa, è possibile utilizzare eksctl o la AWS CLI.

    eksctl
    Prerequisito

    La versione 0.183.0 o quelle successive dello strumento a riga di comando eksctl deve essere installata sul dispositivo o nella AWS CloudShell. Per l'installazione o l'aggiornamento di eksctl, consulta la sezione Installation nella documentazione di eksctl.

    Sostituisci my-service-account con il nome dell'account del servizio Kubernetes per cui desideri che eksctl crei e associ il ruolo IAM. Sostituisci default con lo spazio dei nomi in cui desideri che eksctl crei l'account del servizio. Sostituisci my-cluster con il nome del tuo cluster. Sostituisci my-role con il nome del ruolo a cui associare l'account di servizio. Se non esiste già, eksctl lo crea per te. Sostituisci 111122223333 con il tuo ID account e my-policy con il nome della policy .

    eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \ --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve
    Importante

    Se il ruolo o l'account del servizio esiste già, il comando precedente potrebbe non riuscire. eksctl ha diverse opzioni che puoi fornire in queste situazioni. Per ulteriori informazioni, esegui eksctl create iamserviceaccount --help.

    AWS CLI
    1. Se disponi di un account di servizio Kubernetes esistente che desideri assuma un ruolo IAM, puoi saltare questa fase.

      Crea un account di servizio Kubernetes. Copia i seguenti contenuti sul dispositivo. Sostituisci my-service-account con il nome desiderato e default con uno spazio dei nomi diverso, se necessario. Se si cambia default, lo spazio dei nomi deve già esistere.

      cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml
    2. Imposta il tuo Account AWS ID su una variabile di ambiente con il seguente comando.

      account_id=$(aws sts get-caller-identity --query "Account" --output text)
    3. Impostare il provider di identità OIDC del cluster su una variabile di ambiente con il comando seguente. Sostituisci my-cluster con il nome del cluster.

      oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
    4. Imposta le variabili per lo spazio dei nomi e il nome dell'account del servizio. Sostituisci my-service-account con l'account di servizio Kubernetes che desideri assuma il ruolo. Sostituisci default con lo spazio dei nomi dell'account del servizio.

      export namespace=default export service_account=my-service-account
    5. Per creare una policy di attendibilità del ruolo IAM, esegui il comando seguente. Se desideri consentire a tutti gli account di servizio all'interno di uno spazio dei nomi di utilizzare il ruolo, copia i seguenti contenuti sul tuo dispositivo. Sostituisci StringEqualscon StringLike e sostituisci $service_account con. * È possibile aggiungere più voci nelle condizioni StringEquals e StringLike riportate di seguito per utilizzare più account di servizio o spazi dei nomi con il ruolo. Per consentire a ruoli di un diverso Account AWS rispetto all'account in cui si trova il cluster di assumere il ruolo, consulta Autorizzazioni multi-account IAM per ulteriori informazioni.

      cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
    6. Crea il ruolo. Sostituisci my-role con un nome per il ruolo IAM e my-role-description con una descrizione per il tuo ruolo.

      aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
    7. Allegare una policy IAM al ruolo. Sostituisci my-role con il nome del ruolo IAM e my-policy con il nome di una policy esistente che hai creato.

      aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::$account_id:policy/my-policy
    8. Annota l'account del servizio con il nome della risorsa Amazon (ARN) del ruolo IAM che desideri che l'account del servizio assuma. Sostituisci my-role con il nome del ruolo IAM esistente. Supponiamo di aver consentito a un ruolo di un account Account AWS diverso da quello in cui si trova il cluster di assumere il ruolo in un passaggio precedente. Quindi, assicurati di specificare il ruolo Account AWS and dell'altro account. Per ulteriori informazioni, consulta Autorizzazioni multi-account IAM.

      kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
  3. Conferma che il ruolo e l'account del servizio siano configurati correttamente.

    1. Conferma che la policy di attendibilità del ruolo IAM sia configurata correttamente.

      aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument

      Di seguito viene riportato un output di esempio:

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
    2. Conferma che la policy che hai associato al tuo ruolo in un passaggio precedente sia associata al ruolo.

      aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text

      Di seguito viene riportato un output di esempio:

      arn:aws:iam::111122223333:policy/my-policy
    3. Imposta una variabile per memorizzare il nome della risorsa Amazon (ARN) della policy che desideri utilizzare. Sostituisci my-policy con il nome della policy per la quale desideri confermare le autorizzazioni.

      export policy_arn=arn:aws:iam::111122223333:policy/my-policy
    4. Visualizza la versione predefinita della policy.

      aws iam get-policy --policy-arn $policy_arn

      Di seguito viene riportato un output di esempio:

      { "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
    5. Visualizza il contenuto della policy per assicurarti che la policy includa tutte le autorizzazioni di cui Pod ha bisogno. Se necessario, sostituisci 1 nel comando seguente con la versione restituita nell'output della fase precedente.

      aws iam get-policy-version --policy-arn $policy_arn --version-id v1

      Di seguito viene riportato un output di esempio:

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] }

      Se hai creato la policy di esempio in un passaggio precedente, il risultato è lo stesso. Se hai creato una policy diversa, allora il contenuto dell'esempio è diverso.

    6. Conferma che l'account del servizio Kubernetes sia annotato con il ruolo.

      kubectl describe serviceaccount my-service-account -n default

      Di seguito viene riportato un output di esempio:

      Name:                my-service-account
      Namespace:           default
      Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role
      Image pull secrets:  <none>
      Mountable secrets:   my-service-account-token-qqjfl
      Tokens:              my-service-account-token-qqjfl
      [...]
  4. (Facoltativo)Configurare l' AWS Security Token Service endpoint per un account di servizio. AWS consiglia di utilizzare un AWS STS endpoint regionale anziché un endpoint globale. Ciò riduce la latenza, fornisce una ridondanza integrata e aumenta la validità del token di sessione.

Approfondimenti

PodsConfigurare l'utilizzo di un account Kubernetes di servizio