Configurer un compte Kubernetes de service pour qu'il assume un rôle IAM - Amazon EKS

Aidez à améliorer cette page

Vous souhaitez contribuer à ce guide de l'utilisateur ? Faites défiler cette page vers le bas et sélectionnez Modifier cette page sur GitHub. Vos contributions aideront à améliorer notre guide de l'utilisateur pour tout le monde.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Configurer un compte Kubernetes de service pour qu'il assume un rôle IAM

Cette rubrique explique comment configurer un compte de Kubernetes service pour qu'il assume un rôle AWS Identity and Access Management (IAM). Tous les Pods configurés pour utiliser le compte de service peuvent ensuite accéder à n'importe quel Service AWS auxquels le rôle est autorisé à accéder.

Prérequis
  • Un cluster existant. Si vous n'en avez pas, vous pouvez en créer un en suivant l'un des guides Démarrer 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éez un OIDC fournisseur IAM pour votre cluster.

  • Version 2.12.3 ou ultérieure ou version 1.27.160 ou ultérieure du AWS Command Line Interface (AWS CLI) installé et configuré sur votre appareil ou AWS CloudShell. Pour vérifier votre version actuelle, utilisez aws --version | cut -d / -f2 | cut -d ' ' -f1. Les gestionnaires de package, par exemple yum, apt-get, Homebrew ou macOS, sont souvent antérieurs de plusieurs versions à la AWS CLI. Pour installer la dernière version, consultez Installation, mise à jour et désinstallation de l’ AWS CLI et Configuration rapide avec aws configure dans le Guide de l’utilisateur AWS Command Line Interface . La AWS CLI version installée AWS CloudShell peut également avoir plusieurs versions de retard par rapport à la dernière version. Pour le mettre à jour, consultez la section Installation AWS CLI dans votre répertoire personnel dans le guide de AWS CloudShell l'utilisateur.

  • L'outil de ligne de commande kubectl est installé sur votre appareil ou AWS CloudShell. La version peut être identique à la version Kubernetes de votre cluster ou être maximum une version mineure antérieure ou ultérieure. 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 Installation ou mise à jour de kubectl.

  • Un fichier existant kubectl config qui contient la configuration de votre cluster. Pour créer un fichier kubectl config, consultez Création ou mise à jour d'un fichier kubeconfig pour un cluster Amazon EKS.

Pour associer un rôle IAM à un compte de service Kubernetes
  1. Si vous souhaitez associer une politique IAM existante à votre rôle IAM, passez à l'étape suivante.

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

    1. Créez un fichier qui inclut les autorisations pour le fichier Services AWS auquel vous Pods souhaitez accéder. Pour obtenir la liste de toutes les actions pour tous Services AWS, consultez la référence d'autorisation 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 choisir de stocker les informations de configuration ou un script d'amorçage dans ce compartiment, et les conteneurs de votre Podpeuvent lire le fichier à partir du 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
    2. Créez la politique IAM.

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. Créez un rôle IAM et associez-le à un compte de service Kubernetes. Sinon, vous pouvez utiliser eksctl ou AWS CLI.

    eksctl
    Prérequis

    Version 0.183.0 ou ultérieure de l'outil de ligne de commande eksctl installée sur votre appareil ou AWS CloudShell. Pour installer ou mettre à jour eksctl, veuillez consulter Installation dans la documentation de eksctl.

    Remplacez my-service-account avec le nom du compte de service Kubernetes pour lequel vous souhaitez que eksctl crée et associe avec un rôle IAM. Remplacez default (défaut) par l'espace de noms dans lequel vous souhaitez que eksctl créer le compte de service. Remplacez my-cluster par le nom de votre cluster. Remplacez my-role par le nom du rôle auquel vous souhaitez associer le compte de service. S'il n'existe pas déjà, eksctl le crée pour vous. Remplacez 111122223333 par l'ID de votre compte et my-policy par le nom d'une stratégie existante.

    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.

    AWS CLI
    1. Si vous avez un compte de service Kubernetes existant pour lequel vous souhaitez endosser un rôle IAM, vous pouvez ignorer cette étape.

      Création d'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 Compte AWS ID sur une variable d'environnement à l'aide de 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 sur une variable d'environnement avec 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 auquel vous souhaitez 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 StringEqualspar 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 autoriser des rôles provenant d'un autre Compte AWS que le compte dans lequel se trouve votre cluster pour assumer le rôle, consultez Autorisations IAM entre comptes pour en savoir plus.

      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 avec un nom pour votre rôle IAM, et my-role-description avec une 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 ayez autorisé un rôle provenant d'un compte différent de Compte AWS celui dans lequel se trouve votre cluster à assumer ce rôle lors d'une étape précédente. Assurez-vous ensuite de spécifier le rôle Compte AWS et à partir de l'autre compte. Pour plus d’informations, consultez Autorisations IAM entre comptes.

      kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
  3. Vérifiez que le rôle et le compte de service sont correctement configurés.

    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 que la stratégie inclut toutes les autorisations que nécessite votre Pod. Si nécessaire, remplacez 1 dans la commande suivante par la version indiquée dans la sortie précédente.

      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
      [...]
  4. (Facultatif)Configuration du AWS Security Token Service point de terminaison pour un compte de service. AWS recommande d'utiliser un point de AWS STS terminaison régional plutôt que le point de terminaison global. Cela réduit la latence, fournit une redondance intégrée et augmente la validité des jetons de session.

Étape suivante

Configurer Pods pour utiliser un compte Kubernetes de service