Attribution de rôles IAM aux comptes de service Kubernetes - Amazon EKS

Aidez à améliorer cette page

Pour contribuer à ce guide de l’utilisateur, cliquez sur le lien Modifier cette page sur GitHub qui se trouve dans le volet droit de chaque page.

Attribution de rôles IAM aux comptes de service Kubernetes

Cette section explique comment configurer un compte de service Kubernetes pour qu’il assume un rôle IAM (Gestion des identités et des accès AWS). Tout pod configuré pour utiliser ce compte de service peut ensuite accéder à n’importe quel service AWS pour lequel ce rôle dispose d’autorisations.

Prérequis

  • Un cluster existant. Si vous n’en avez pas, vous pouvez en créer un en suivant l’un des guides Mise en route avec Amazon EKS.

  • Un fournisseur IAM OpenID Connect (OIDC) existant pour votre cluster. Pour déterminer si vous en avez déjà un ou comment en créer un, consultez Créer un fournisseur d'identité OIDC IAM pour votre cluster.

  • Version 2.12.3 ou ultérieure ou version 1.27.160 ou ultérieure de l’interface de la ligne de commande AWS (AWS CLI) installée et configurée sur votre appareil ou dans AWS CloudShell. Pour vérifier votre version actuelle, utilisez aws --version | cut -d / -f2 | cut -d ' ' -f1. Les gestionnaires de package tels que yum, apt-get ou Homebrew pour macOS ont souvent plusieurs versions de retard par rapport à la dernière version de l’AWS CLI. Pour installer la dernière version, consultez les sections Installation et Configuration rapide avec aws configure du Guide de l’utilisateur de l’interface de la ligne de commande AWS. La version de l’AWS CLI installée dans AWS CloudShell peut également être plusieurs versions derrière la dernière version. Pour la mettre à jour, consultez la section Installation de l’AWS CLI dans votre répertoire personnel dans le Guide de l’utilisateur AWS CloudShell.

  • L’outil de ligne de commande kubectl est installé sur votre appareil ou dans AWS CloudShell. La version peut correspondre à celle utilisée par votre cluster Kubernetes, ou différer d’au plus une version mineure, qu’elle soit antérieure ou plus récente. Par exemple, si la version de votre cluster est 1.29, vous pouvez utiliser la version kubectl 1.28, 1.29 ou 1.30. Pour installer ou mettre à niveau kubectl, veuillez consulter Configuration de kubectl et eksctl.

  • Un fichier existant kubectl config qui contient la configuration de votre cluster. Pour créer un fichier kubectl config, consultez Connexion de kubectl à un cluster EKS en créant un fichier kubeconfig.

Étape 1 : créer une politique IAM

Si vous souhaitez associer une politique IAM existante à votre rôle IAM, passez à l'étape suivante.

  1. Créez une politique IAM. Vous pouvez créer votre propre politique ou copier une politique gérée par AWS, qui accorde certaines des autorisations dont vous avez besoin et la personnalise en fonction de vos besoins spécifiques. Pour plus d’informations, consultez Création de politiques IAM dans le Guide de l’utilisateur IAM.

  2. Créez un fichier contenant les autorisations relatives aux services AWS auxquels vous souhaitez que vos pods accèdent. Pour obtenir la liste complète des actions de tous les services AWS, consultez la Référence des autorisations de service.

    Vous pouvez exécuter la commande suivante pour créer un exemple de fichier de politique autorisant l'accès en lecture seule à un compartiment Amazon S3. Vous pouvez, si vous le souhaitez, stocker des informations de configuration ou un script d’amorçage dans ce compartiment et les conteneurs de votre pod pourront lire le fichier dans le compartiment et le charger dans votre application. Si vous souhaitez créer cet exemple de politique, copiez le contenu suivant sur votre appareil. Remplacez my-pod-secrets-bucket par le nom de votre compartiment et exécutez la commande.

    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. Créez la politique IAM.

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

Étape 2 : créer et associer un rôle IAM

Créez un rôle IAM, puis associez-le à un compte de service Kubernetes. Vous pouvez utiliser eksctl ou la CLI AWS.

Création et association du rôle (eksctl)

Cette commande eksctl crée un compte de service Kubernetes dans l’espace de noms spécifié, crée un rôle IAM (s’il n’existe pas) portant le nom indiqué, attache une politique IAM existante au rôle, puis annote le compte de service avec l’ARN du rôle IAM. Veillez à remplacer les valeurs d’exemple de cette commande par vos propres valeurs. Pour installer ou mettre à jour eksctl, veuillez consulter Installation dans la documentation de 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
Important

Si le rôle ou le compte de service existe déjà, la commande précédente peut échouer. eksctl propose différentes options que vous pouvez fournir dans ces situations. Pour de plus amples informations, exécutez eksctl create iamserviceaccount --help.

Création et association du rôle (CLI AWS)

Si vous avez déjà un compte de service Kubernetes devant assumer un rôle IAM, vous pouvez ignorer cette étape.

  1. Créez un compte de service Kubernetes. Copiez les contenus suivants sur votre appareil. Remplacez my-service-account par le nom de votre choix et default par un espace de noms différent, si nécessaire. Si vous changez default, l'espace de noms doit déjà exister.

    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. Définissez votre ID de compte AWS sur une variable d'environnement avec la commande suivante.

    account_id=$(aws sts get-caller-identity --query "Account" --output text)
  3. Définissez le fournisseur d’identité OIDC de votre cluster dans une variable d’environnement à l’aide de la commande suivante. Remplacez my-cluster par le nom de votre 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. Définissez des variables pour l'espace de noms et le nom du compte de service. Remplacez my-service-account par le compte de service Kubernetes devant assumer le rôle. Remplacez default par l'espace de noms du compte de service.

    export namespace=default export service_account=my-service-account
  5. Exécutez la commande suivante pour créer un fichier de stratégie d'approbation pour le rôle IAM. Si vous souhaitez autoriser tous les comptes de service d'un espace de noms à utiliser le rôle, copiez le contenu suivant sur votre appareil. Remplacez StringEquals par StringLike et remplacez $service_account par *. Vous pouvez ajouter plusieurs entrées dans les conditions StringEquals ou StringLike pour autoriser plusieurs comptes de service ou espaces de noms à endosser le rôle. Pour permettre à des rôles provenant d’un autre compte AWS que celui de votre cluster d’assumer ce rôle, consultez Authentifiez-vous sur un autre compte avec IRSA pour plus d’informations.

    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. Créez le rôle. Remplacez my-role par le nom de votre rôle IAM et my-role-description par la description de votre rôle.

    aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
  7. Liez une politique IAM à votre rôle. Remplacez my-role par le nom de votre rôle IAM et my-policy par le nom d’une politique existante que vous avez créée.

    aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::$account_id:policy/my-policy
  8. Annotez votre compte de service avec l'Amazon Resource Name (ARN) du rôle IAM que vous souhaitez que le compte de service endosse. Remplacez my-role par le nom de votre rôle IAM existant. Supposons que vous avez autorisé, à l’étape précédente, un rôle provenant d’un autre compte AWS que celui de votre cluster à assumer ce rôle. Alors assurez-vous de spécifier le compte AWS et le rôle provenant de l’autre compte. Pour de plus amples informations, consultez Authentifiez-vous sur un autre compte avec IRSA.

    kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
  9. (Facultatif) Configurez le point de terminaison du service de jetons de sécurité AWS pour un compte de service. AWS recommande d’utiliser un point de terminaison AWS STS régional au lieu du point de terminaison international. Cela réduit la latence, fournit une redondance intégrée et augmente la validité des jetons de session.

Étape 3 : confirmer la configuration

  1. Vérifiez que la stratégie d’approbation du rôle IAM est correctement configurée.

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

    L'exemple qui suit illustre un résultat.

    { "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. Vérifiez que la stratégie que vous avez associée à votre rôle lors d'une étape précédente est associée au rôle.

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

    L'exemple qui suit illustre un résultat.

    arn:aws:iam::111122223333:policy/my-policy
  3. Définissez une variable pour stocker l'Amazon Resource Name (ARN) de la stratégie que vous souhaitez utiliser. Remplacez my-policy par le nom de la stratégie pour laquelle vous voulez confirmer les autorisations.

    export policy_arn=arn:aws:iam::111122223333:policy/my-policy
  4. Affichez la version par défaut de la stratégie.

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

    L'exemple qui suit illustre un résultat.

    { "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
  5. Consultez le contenu de la stratégie pour vous assurer qu’elle inclut toutes les autorisations nécessaires pour votre pod. Si nécessaire, remplacez la valeur 1 dans la commande ci-dessous par la version indiquée dans le résultat précédent.

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

    L'exemple qui suit illustre un résultat.

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

    Si vous avez créé l'exemple de stratégie lors d'une étape précédente, le résultat est le même. Si vous avez créé une stratégie différente, alors le contenu example (exemple) est différent.

  6. Confirmez que le compte de service Kubernetes est annoté avec le rôle.

    kubectl describe serviceaccount my-service-account -n default

    L'exemple qui suit illustre un résultat.

    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 [...]

Étapes suivantes