Assegnare ruoli IAM agli account di servizio Kubernetes - Amazon EKS

Contribuisci a migliorare questa pagina

Per contribuire a questa guida per l’utente, seleziona il link Edit this page on GitHub che si trova nel riquadro destro di ogni pagina.

Assegnare ruoli IAM agli account di servizio Kubernetes

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

Prerequisiti

  • Un cluster esistente. Se non ne possiedi già uno, crealo seguendo una delle guide in Nozioni di base su Amazon EKS.

  • Creare un provider di identità OpenID Connect (OIDC) IAM per il cluster. Per sapere se disponi di un account o, per crearne uno, consulta Per creare un provider di identità IAM OIDC per il cluster.

  • La versione 2.12.3 o successive oppure 1.27.160 o successive dell’interfaccia a riga di comando AWS (AWS CLI) installata e configurata sul dispositivo o in AWS CloudShell. Per verificare la versione attuale, usa aws --version | cut -d / -f2 | cut -d ' ' -f1. I programmi di gestione dei pacchetti, come yum, apt-get o Homebrew per macOS, spesso sono aggiornati a versioni precedenti di AWS CLI. Per installare la versione più recente, consulta Installing e Quick configuration with aws configure nella Guida per l’utente dell’interfaccia a riga di comando AWS. La versione della AWS CLI installata in AWS CloudShell potrebbe anche essere precedente di diverse versioni rispetto alla più recente. Per aggiornarla, consulta Installing AWS CLI to your home directory nella Guida per l’utente di AWS CloudShell.

  • Lo strumento a riga di comando kubectl è installato sul dispositivo o su AWS CloudShell. La versione può essere uguale oppure immediatamente precedente o successiva a quella di Kubernetes del cluster. Ad esempio, se la versione del cluster è 1.29, puoi usare kubectl versione 1.28, 1.29 o 1.30. Per installare o aggiornare kubectl, consulta Impostazione di kubectl e eksctl:

  • Un file kubectl config esistente che contiene la configurazione del cluster. Per creare un file kubectl config, consulta Connettere kubectl a un cluster EKS creando un file kubeconfig.

Fase 1: creare la policy IAM

Se desideri associare una policy IAM esistente al ruolo IAM, passa al prossimo passaggio.

  1. Creare una policy IAM Puoi creare una policy personalizzata o copiare una policy AWS gestita che concede già alcune delle autorizzazioni necessarie e personalizzarla a seconda dei requisiti specifici desiderati. Per ulteriori informazioni, consulta Creating IAM policies nella Guida per l’utente di IAM.

  2. Crea un file che includa le autorizzazioni per i servizi AWS a cui desideri che accedano i Pod. Per un elenco di tutte le azioni per tutti i servizi AWS, consultare 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. Facoltativamente, puoi 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
  3. Creare la policy IAM.

    aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json

Fase 2: creare e associare il ruolo IAM

Creare un ruolo IAM e associarlo a un account di servizio Kubernetes. Puoi utilizzare eksctl o AWS CLI.

Creare e associare il ruolo (eksctl)

Questo comando eksctl crea un account di servizio Kubernetes nel namespace specificato, crea un ruolo IAM (se non esiste) con il nome specificato, allega un ARN della policy IAM esistente al ruolo e annota l’account di servizio con l’ARN del ruolo IAM. Assicurati di sostituire i valori segnaposto di esempio in questo comando con i valori specifici. Per l’installazione o l’aggiornamento di eksctl, consulta la sezione Installation nella documentazione di eksctl.

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.

Creare e associare un ruolo (AWS CLI)

Se disponi di un account di servizio Kubernetes esistente che deve assumere un ruolo IAM, puoi saltare questa fase.

  1. Creare un account di servizio Kubernetes. Copia i seguenti contenuti sul dispositivo. Sostituisci my-service-account con il nome desiderato e default con un namespace diverso, se necessario. Se cambi default, il namespace 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. Impostare l’ID account AWS su una variabile di ambiente con il comando seguente.

    account_id=$(aws sts get-caller-identity --query "Account" --output text)
  3. Imposta 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. Impostare le variabili per il namespace e il nome dell’account del servizio. Sostituisci my-service-account con l’account di servizio Kubernetes che deve assumere il ruolo. Sostituire default con il namespace 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 un namespace di utilizzare il ruolo, copia i seguenti contenuti sul dispositivo. Sostituire StringEquals con StringLike e sostituire $service_account con *. Puoi aggiungere più voci nelle condizioni StringEquals e StringLike riportate di seguito per utilizzare più account di servizio o namespace con il ruolo. Per consentire ai ruoli di un account AWS diverso rispetto all’account in cui si trova il cluster di assumere il ruolo, consulta Eseguire l’autenticazione a un altro account con IRSA 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 del 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 creata.

    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 diverso account AWS, rispetto all’account utilizzato dal cluster, di assumere il ruolo in una fase precedente. Quindi, assicurarsi di specificare l’account AWS e il ruolo dall’altro account. Per ulteriori informazioni, consulta Eseguire l’autenticazione a un altro account con IRSA.

    kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
  9. (Facoltativo) Configurare l’endpoint AWS Security Token Service per un account di servizio. AWS consiglia di utilizzare un endpoint AWS STS regionale anziché l’endpoint globale. Ciò riduce la latenza, fornisce una ridondanza integrata e aumenta la validità del token di sessione.

Fase 3: confermare la configurazione

  1. Confermare 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 si desidera 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 includa tutte le autorizzazioni di cui il pod ha bisogno. Se necessario, sostituire 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. Confermare che l’account di 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 [...]

Fasi successive