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.3ou ultérieure ou version1.27.160ou 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, utilisezaws --version | cut -d / -f2 | cut -d ' ' -f1. Les gestionnaires de package tels queyum,apt-getou 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
kubectlest 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 est1.29, vous pouvez utiliser la versionkubectl1.28,1.29ou1.30. Pour installer ou mettre à niveaukubectl, veuillez consulter Configuration de kubectl et eksctl. -
Un fichier existant
kubectlconfigqui contient la configuration de votre cluster. Pour créer un fichierkubectlconfig, 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.
-
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.
-
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-bucketpar 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 -
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 Installationeksctl.
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.
-
Créez un compte de service Kubernetes. Copiez les contenus suivants sur votre appareil. Remplacez
my-service-accountpar le nom de votre choix etdefaultpar un espace de noms différent, si nécessaire. Si vous changezdefault, 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 -
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) -
Définissez le fournisseur d’identité OIDC de votre cluster dans une variable d’environnement à l’aide de la commande suivante. Remplacez
my-clusterpar 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:\/\///") -
Définissez des variables pour l'espace de noms et le nom du compte de service. Remplacez
my-service-accountpar le compte de service Kubernetes devant assumer le rôle. Remplacezdefaultpar l'espace de noms du compte de service.export namespace=default export service_account=my-service-account -
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
StringEqualsparStringLikeet remplacez$service_accountpar*. Vous pouvez ajouter plusieurs entrées dans les conditionsStringEqualsouStringLikepour 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 -
Créez le rôle. Remplacez
my-rolepar le nom de votre rôle IAM etmy-role-descriptionpar 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" -
Liez une politique IAM à votre rôle. Remplacez
my-rolepar le nom de votre rôle IAM etmy-policypar 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 -
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-rolepar 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 -
(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
-
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.AssumeRolePolicyDocumentL'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" } } } ] } -
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 textL'exemple qui suit illustre un résultat.
arn:aws:iam::111122223333:policy/my-policy -
Définissez une variable pour stocker l'Amazon Resource Name (ARN) de la stratégie que vous souhaitez utiliser. Remplacez
my-policypar le nom de la stratégie pour laquelle vous voulez confirmer les autorisations.export policy_arn=arn:aws:iam::111122223333:policy/my-policy -
Affichez la version par défaut de la stratégie.
aws iam get-policy --policy-arn $policy_arnL'exemple qui suit illustre un résultat.
{ "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } } -
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
1dans 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 v1L'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. -
Confirmez que le compte de service Kubernetes est annoté avec le rôle.
kubectl describe serviceaccount my-service-account -n defaultL'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 [...]