rôle IAM de tâche Amazon ECS
Vos tâches Amazon ECS peuvent être associées à un rôle IAM. Les autorisations octroyées dans le rôle IAM sont transmises aux conteneurs exécutés dans la tâche. Ce rôle permet au code de votre application (exécuté dans le conteneur) d’utiliser d’autres services AWS. Le rôle de tâche est requis lorsque votre application accède à d’autres services AWS, tels qu’Amazon S3.
Note
Le conteneur Amazon ECS et les agents Fargate n’accèdent pas à ces autorisations. Pour connaître les autorisations IAM dont Amazon ECS a besoin pour extraire des images de conteneurs et exécuter la tâche, veuillez consulter Rôle IAM d'exécution de tâche Amazon ECS.
Voici les avantages liés à l’utilisation des rôles de tâche :
-
Séparation des préoccupations : si vous utilisez EC2, les rôles IAM de tâche vous permettent de spécifier des autorisations IAM pour vos conteneurs sans avoir à spécifier ces autorisations à l’aide des profils d’instance EC2 (pour plus d’informations, consultez la section Utilisation des profils d’instance dans le Guide de l’utilisateur AWS Identity and Access Management). Par conséquent, vous pouvez déployer vos applications de manière indépendante et uniforme sur les instances de conteneur ECS sans avoir à modifier les autorisations IAM associées aux instances EC2.
-
Capacité d’audit : la journalisation des événements et des accès est disponible via CloudTrail afin de permettre les contrôles rétrospectifs. Les informations d’identification ont un contexte de «
taskArn» qui est lié à la session ; les journaux CloudTrail indiquent donc le rôle utilisé par chaque tâche. -
Fourniture d’informations d’identification uniforme : ECS fournit des informations d’identification de rôle IAM à vos conteneurs et les rend accessibles via une interface bien définie, quelle que soit l’option de calcul associée à vos tâches. Sur ECS Fargate, les profils d’instance EC2 ne sont pas disponibles pour les conteneurs de vos tâches. Les rôles IAM de tâche vous permettent d’associer des autorisations IAM à vos conteneurs, quelle que soit l’option de calcul, lorsque vous utilisez un kit SDK AWS ou la CLI AWS dans vos conteneurs. Pour plus d’informations sur la manière dont le kit SDK AWS accède à ces informations d’identification, consultez la section Fournisseur d’informations d’identification du conteneur.
Important
Les conteneurs ne constituent pas une limite de sécurité et l’utilisation de rôles IAM de tâche ne change rien à cela. Chaque tâche s’exécutant sur Fargate possède sa propre limite d’isolement et ne partage pas le noyau sous-jacent, les ressources d’UC, les ressources de mémoire ou l’interface réseau Elastic avec une autre tâche. Pour les instances de conteneur EC2 et externes sur ECS, il n’y a pas d’isolation des tâches (contrairement à Fargate) et les conteneurs peuvent potentiellement accéder aux informations d’identification pour d’autres tâches sur la même instance de conteneur. Ils peuvent également accéder aux autorisations attribuées au rôle d’instance de conteneur ECS. Suivez les recommandations de la section Recommandations relatives aux rôles pour bloquer l’accès au service de métadonnées d’instance Amazon EC2 pour les conteneurs (pour plus d’informations, consultez la section Utilisation du service de métadonnées d’instance pour accéder aux métadonnées d’instance dans le Guide de l’utilisateur Amazon EC2).
Notez que lorsque vous spécifiez un rôle IAM pour une tâche, l’interface CLI AWS ou d’autres kits SDK dans les conteneurs pour cette tâche utilisent exclusivement les informations d’identification AWS fournies par le rôle de la tâche et n’héritent d’aucune autorisation IAM provenant d’Amazon EC2 ou de l’instance externe sur laquelle ils s’exécutent.
Création du rôle IAM de tâche
Lorsque vous créez une politique IAM à utiliser pour vos tâches, celle-ci doit inclure les autorisations que vous souhaitez attribuer aux conteneurs de vos tâches. Vous pouvez utiliser une politique gérée par AWS existante ou créer à partir de zéro une politique personnalisée qui répond à vos besoins spécifiques. Pour plus d’informations, consultez Création de politiques IAM dans le Guide de l’utilisateur IAM.
Important
Pour les tâches Amazon ECS (pour tous les types de lancement), nous vous recommandons d'utiliser la politique et le rôle IAM pour vos tâches. Ces informations d'identification permettent à votre tâche d'effectuer Requêtes API AWS sans appeler sts:AssumeRole pour assumer le même rôle qui est déjà associé à la tâche. Si votre tâche nécessite qu'un rôle s'assume, vous devez créer une politique de confiance qui autorise explicitement ce rôle à s'assumer. Pour de plus amples informations, consultez la section Mise à jour d’une stratégie d’approbation de rôle dans le Guide de l’utilisateur IAM.
Après la création de la politique IAM, vous pouvez créer un rôle IAM qui inclut la politique que vous référencez dans votre définition de tâche Amazon ECS. Vous pouvez créer le rôle à l'aide du cas d'utilisation Amazon Elastic Container Service Task dans la console IAM. Vous pouvez ensuite lier votre politique IAM spécifique au rôle qui attribue aux conteneurs de votre tâche les autorisations que vous souhaitez. Les procédures ci-dessous expliquent comment procéder.
Si vous avez plusieurs définitions de tâche ou services qui requièrent des autorisations IAM, nous vous conseillons de créer un rôle pour chaque définition de tâche ou service en lui affectant les autorisations minimales requises pour les tâches à exécuter, afin de minimiser les accès octroyés à chaque tâche.
Pour plus d’informations sur le point de terminaison de service de votre région, consultez la section Points de terminaison de service dans le Guide Référence générale d'Amazon Web Services.
Le rôle de tâche IAM doit posséder une politique de confiance qui spécifie le service ecs-tasks.amazonaws.com. L'autorisation sts:AssumeRole permet à vos tâches de prendre un rôle IAM différent de celui utilisé par votre instance Amazon EC2. De cette façon, votre tâche n'hérite pas du rôle associé à l'instance Amazon EC2. Voici un exemple de politique de confiance. Remplacez l’identificateur de région et spécifiez le numéro de compte AWS que vous utilisez lors du lancement des tâches.
Important
Lorsque vous créez votre rôle IAM de tâche, il est recommandé d’utiliser les clés de condition aws:SourceAccount ou aws:SourceArn dans la stratégie de relation de confiance associée au rôle afin de restreindre davantage les autorisations et d’éviter ainsi le problème de sécurité lié de l’adjoint confus. L'utilisation de la clé de condition aws:SourceArn pour spécifier un cluster spécifique n'est actuellement pas prise en charge, vous devez utiliser le caractère générique pour spécifier tous les clusters. Pour en savoir plus sur le problème de l'adjoint confus et comment protéger votre compte AWS, consultez Le problème de l'adjoint confus dans le Guide de l'utilisateur IAM.
Utilisez la procédure suivante pour créer une politique de récupération d’objets depuis Amazon S3 avec un exemple de stratégie. Remplacez chaque user input par vos propres valeurs.
Utilisez la procédure suivante pour créer le rôle de service.
Après avoir créé le rôle, ajoutez-y des autorisations supplémentaires pour les fonctionnalités suivantes.
| Fonctionnalité | Autorisations supplémentaires |
|---|---|
|
Utiliser ECS Exec |
|
| Utiliser une image provenant d’un référentiel Amazon ECR privé | |
| Utiliser des instances EC2 (Windows et Linux) | |
| Utiliser des instances externes | |
| Utiliser des instances Windows EC2 |
Autorisations Amazon ECR
Les autorisations suivantes sont requises lorsque le code de votre application doit interagir directement avec les référentiels Amazon ECR. Notez que pour une implémentation de base où vous n’avez besoin que d’extraire des images d’Amazon ECR, ces autorisations ne sont pas requises au niveau du rôle IAM de tâche. Au lieu de cela, le rôle d’exécution de tâche Amazon ECS doit avoir ces autorisations. Pour plus d'informations sur le rôle d'exécution de tâche, consultez Rôle IAM d'exécution de tâche Amazon ECS.
Si le code de votre application exécuté dans le conteneur doit interagir directement avec les API Amazon ECR, vous devez ajouter les autorisations suivantes à un rôle IAM de tâche et inclure le rôle IAM de tâche dans votre définition de tâche. Pour obtenir des informations, consultez la section Ajout et suppression de politiques IAM dans le Guide de l’utilisateur IAM.
Utilisez la politique suivante pour votre rôle IAM de tâche afin d’ajouter les autorisations Amazon ECR requises pour les applications de conteneur qui doivent interagir directement avec Amazon ECR :
Autorisations ECS Exec
La fonctionnalité ECS Exec nécessite un rôle IAM de tâche pour octroyer aux conteneurs les autorisations nécessaires à la communication entre l’agent SSM géré (agent execute-command) et le service SSM. Vous devez ajouter les autorisations suivantes à un rôle IAM de tâche et inclure le rôle IAM de tâche dans votre définition de tâche. Pour obtenir des informations, consultez la section Ajout et suppression de politiques IAM dans le Guide de l’utilisateur IAM.
Utilisez la stratégie suivante pour votre rôle IAM de tâche afin d'ajouter les autorisations SSM requises.
Configuration supplémentaire des instances Amazon EC2
Nous vous recommandons de limiter les autorisations dans votre rôle d'instance de conteneur à la liste minimale des autorisations utilisées dans la politique IAM gérée AmazonEC2ContainerServiceforEC2Role.
Pour utiliser les rôles IAM de tâche, vos instances Amazon EC2 doivent au moins disposer de la version 1.11.0 de l’agent de conteneur ; nous vous conseillons cependant d’utiliser la dernière version de l’agent de conteneur. Pour plus d'informations sur la vérification de la version de votre agent et la mise à jour à la dernière version, consultez Mise à jour de l'agent de conteneur Amazon ECS. Si vous utilisez l’AMI optimisée pour Amazon ECS, votre instance doit également au moins disposer de la version 1.11.0-1 du package ecs-init. Si vos instances utilisent la dernière AMI optimisée pour Amazon ECS, elles contiennent les versions requises de l'agent de conteneur et ecs-init. Pour de plus amples informations, consultez AMI Amazon Linux optimisée pour Amazon ECS.
Si vous n’utilisez pas l’AMI optimisée pour Amazon ECS pour vos instances de conteneur, veillez à ajouter l’option --net=host à la commande docker run qui lance l’agent, ainsi que les variables de configuration de l’agent suivantes pour la configuration souhaitée (pour plus d’informations, consultez la section Configuration de l'agent de conteneur Amazon ECS) :
ECS_ENABLE_TASK_IAM_ROLE=true-
Utilise les rôles IAM pour les tâches des conteneurs associés aux modes réseau
bridgeetdefault. ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true-
Utilise les rôles IAM pour les tâches des conteneurs associés au mode réseau
host. Cette variable est uniquement prise en charge sur les versions d'agent 1.12.0 et ultérieures.
Pour obtenir un exemple de commande d'exécution, consultez Mise à jour manuelle de l'agent de conteneur Amazon ECS (pour des AMI non optimisées pour Amazon ECS). Vous devrez également définir les commandes de mise en réseau suivantes sur votre instance de conteneur afin que les conteneurs dans vos tâches puissent récupérer leurs informations d'identification AWS :
sudo sysctl -w net.ipv4.conf.all.route_localnet=1sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
Pour garantir le maintien de ces règles iptables après un redémarrage, vous devez les enregistrer sur votre instance de conteneur. Vous pouvez utiliser les commandes iptables-save et iptables-restore pour enregistrer vos règles iptables et les restaurer au démarrage. Pour plus d'informations, consultez la documentation de votre système d'exploitation.
Pour empêcher les conteneurs exécutés par des tâches utilisant le mode réseau awsvpc d'accéder aux informations d'identification fournies par le profil d'instance Amazon EC2, tout en accordant les autorisations fournies par le rôle de la tâche, définissez la variable de configuration d'agent ECS_AWSVPC_BLOCK_IMDS sur true dans le fichier de configuration de l'agent et redémarrez l'agent. Pour de plus amples informations, consultez Configuration de l'agent de conteneur Amazon ECS.
Pour empêcher les conteneurs exécutés par des tâches utilisant le mode réseau bridge d'accéder aux informations d'identification fournies par le profil d'instance Amazon EC2, tout en accordant les autorisations fournies par le rôle de la tâche, exécutez la commande iptables suivante sur vos instances Amazon EC2. Cette commande n'a pas d'incidence sur les conteneurs dans les tâches utilisant le mode réseau host ou awsvpc. Pour de plus amples informations, consultez Mode réseau.
-
sudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROPPour garantir le maintien de la règle iptables après un redémarrage, vous devez l'enregistrer sur votre instance Amazon EC2. Lors de l'utilisation de l'AMI optimisée pour Amazon ECS, vous pouvez utiliser la commande qui suit. Pour les autres systèmes d'exploitation, consultez la documentation correspondante.
sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
Configuration supplémentaire d’instance externe
Pour utiliser les rôles IAM de tâche, vos instances externes doivent au moins disposer de la version 1.11.0 de l’agent de conteneur ; nous vous conseillons cependant d’utiliser la dernière version de l’agent de conteneur. Pour plus d'informations sur la vérification de la version de votre agent et la mise à jour à la dernière version, consultez Mise à jour de l'agent de conteneur Amazon ECS. Si vous utilisez l'AMI Linux optimisée pour Amazon ECS, votre instance doit également au moins disposer de la version 1.11.0-1 du package ecs-init. Si vos instances utilisent la dernière AMI optimisée pour Amazon ECS, elles contiennent les versions requises de l'agent de conteneur et ecs-init. Pour de plus amples informations, consultez AMI Amazon Linux optimisée pour Amazon ECS.
Si vous n’utilisez pas l’AMI optimisée pour Amazon ECS pour vos instances de conteneur, veillez à ajouter l’option --net=host à la commande docker run qui lance l’agent, ainsi que les variables de configuration de l’agent suivantes pour la configuration souhaitée (pour plus d’informations, consultez la section Configuration de l'agent de conteneur Amazon ECS) :
ECS_ENABLE_TASK_IAM_ROLE=true-
Utilise les rôles IAM pour les tâches des conteneurs associés aux modes réseau
bridgeetdefault. ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true-
Utilise les rôles IAM pour les tâches des conteneurs associés au mode réseau
host. Cette variable est uniquement prise en charge sur les versions d'agent 1.12.0 et ultérieures.
Pour obtenir un exemple de commande d'exécution, consultez Mise à jour manuelle de l'agent de conteneur Amazon ECS (pour des AMI non optimisées pour Amazon ECS). Vous devrez également définir les commandes de mise en réseau suivantes sur votre instance de conteneur afin que les conteneurs dans vos tâches puissent récupérer leurs informations d'identification AWS :
sudo sysctl -w net.ipv4.conf.all.route_localnet=1sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
Pour garantir le maintien de ces règles iptables après un redémarrage, vous devez les enregistrer sur votre instance de conteneur. Vous pouvez utiliser les commandes iptables-save et iptables-restore pour enregistrer vos règles iptables et les restaurer au démarrage. Pour plus d'informations, consultez la documentation de votre système d'exploitation.
Configuration supplémentaire d’instance Windows Amazon EC2
Important
Cela ne s’applique qu’aux conteneurs Windows sur EC2 qui utilisent des rôles de tâche.
Le rôle de tâche associé aux fonctionnalités Windows nécessite une configuration supplémentaire sur EC2.
-
Lorsque vous lancez vos instances de conteneur, vous devez définir l'option
-EnableTaskIAMRoledans le script de données utilisateur des instances de conteneur.EnableTaskIAMRoleactive la fonction Rôles IAM pour les tâches. Par exemple :<powershell> Import-Module ECSTools Initialize-ECSAgent -Cluster 'windows' -EnableTaskIAMRole </powershell> -
Vous devez amorcer votre conteneur avec les commandes de mise en réseau fournies dans Script d’amorçage de conteneur Amazon ECS.
-
Vous devez créer un rôle et une stratégie IAM pour vos tâches. Pour de plus amples informations, consultez Création du rôle IAM de tâche.
-
Les rôles IAM pour le fournisseur d'informations d'identification de tâche utilisent le port 80 sur l'instance de conteneur. Par conséquent, si vous configurez des rôles IAM pour les tâches sur votre instance de conteneur, vos conteneurs ne peuvent pas utiliser le port 80 pour le port hôte des mappages de ports. Pour exposer vos conteneurs sur le port 80, nous vous recommandons de configurer un service pour ceux qui utilisent l'équilibrage de charge. Vous pouvez utiliser le port 80 sur l'équilibreur de charge. Ce faisant, le trafic peut être acheminé vers un autre port hôte sur vos instances de conteneur. Pour de plus amples informations, consultez Use load balancing to distribute Amazon ECS service traffic.
-
Si votre instance Windows est redémarrée, vous devez supprimer l'interface proxy et initialiser à nouveau l'agent conteneur Amazon ECS pour rétablir la sauvegarde du proxy d'informations d'identification.
Script d’amorçage de conteneur Amazon ECS
Avant que les conteneurs puissent accéder au proxy d'informations d'identification sur l'instance de conteneur afin d'obtenir des informations d'identification, le conteneur doit être amorcé avec les commandes de mise en réseau requises. L'exemple de script de code suivant doit être exécuté sur vos conteneurs lorsqu'ils démarrent.
Note
Vous n'avez pas besoin d'exécuter ce script lorsque vous utilisez le mode réseau awsvpc sur Windows.
Si vous exécutez des conteneurs Windows qui incluent Powershell, utilisez le script suivant :
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You may # not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either # express or implied. See the License for the specific language governing # permissions and limitations under the License. $gateway = (Get-NetRoute | Where { $_.DestinationPrefix -eq '0.0.0.0/0' } | Sort-Object RouteMetric | Select NextHop).NextHop $ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select ifIndex).ifIndex New-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # credentials API New-NetRoute -DestinationPrefix 169.254.169.254/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # metadata API
Si vous exécutez des conteneurs Windows qui n'ont que le shell Command, utilisez le script suivant :
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You may # not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either # express or implied. See the License for the specific language governing # permissions and limitations under the License. for /f "tokens=1" %i in ('netsh interface ipv4 show interfaces ^| findstr /x /r ".*vEthernet.*"') do set interface=%i for /f "tokens=3" %i in ('netsh interface ipv4 show addresses %interface% ^| findstr /x /r ".*Default.Gateway.*"') do set gateway=%i netsh interface ipv4 add route prefix=169.254.170.2/32 interface="%interface%" nexthop="%gateway%" store=active # credentials API netsh interface ipv4 add route prefix=169.254.169.254/32 interface="%interface%" nexthop="%gateway%" store=active # metadata API