Rol de IAM de tarea de Amazon ECS
Sus tareas de Amazon ECS pueden tener un rol de IAM asociado a ellas. Los permisos que se ejecutan en la tarea asumen los permisos concedidos en el rol de IAM. Este rol permite que el código de la aplicación (en el contenedor) utilice otros servicios de AWS. El rol de tarea es obligatorio cuando la aplicación accede a otros servicios de AWS, como Amazon S3. Para conocer los permisos de IAM que Amazon ECS necesita para extraer imágenes de contenedores y ejecutar la tarea, consulte Rol de IAM de ejecución de tareas de Amazon ECS.
A continuación, se describen las ventajas de usar roles de tarea:
-
Aislamiento de credenciales: un contenedor solo puede recuperar credenciales desde el rol de IAM que está definido en la definición de tareas al que pertenece; un contenedor nunca tiene acceso a credenciales que están destinadas a otro contenedor que pertenece a otra tarea.
-
Autorización: los contenedores sin autorización no pueden obtener acceso a credenciales de rol IAM definidos para otras tareas.
-
Auditorías: el acceso y el registro de eventos se encuentra disponible a través de CloudTrail con el fin de garantizar una auditoría retrospectiva. Las credenciales de tareas tienen un contexto de
taskArn
que se asocia a la sesión, de modo que los registros de CloudTrail muestran la tarea que utiliza cada rol.
nota
Cuando se especifica un rol de IAM para una tarea, la AWS CLI u otros SDK de los contenedores de esa tarea utilizan las credenciales de AWS que proporciona el rol de tarea exclusivamente, y ya no heredan ningún permiso de Amazon EC2 de la instancia externa que ejecutan.
Creación del rol de IAM de tareas
Al crear una política de IAM para que utilicen sus tareas, la política debe incluir los permisos que desea que asuman los contenedores de sus tareas. Puede utilizar una política administrada de AWS existente o puede crear una política personalizada desde cero que satisfaga sus necesidades específicas. Para obtener más información, consulte Creación de políticas de IAM en la Guía del usuario de IAM.
importante
Para las tareas de Amazon ECS (para todos los tipos de lanzamientos), le recomendamos que utilice el rol y la política de IAM para sus tareas. Estas credenciales permiten a su tarea llevar a cabo peticiones a la API de AWS sin necesidad de llamar a sts:AssumeRole
para asumir el mismo rol que ya está asociado a la tarea. Si su tarea requiere que un rol se asuma a sí mismo, debe crear una política de confianza que permita explícitamente que ese rol se asuma a sí mismo. Para obtener más información, consulte Modificación de una política de confianza de rol en la Guía del usuario de IAM.
Una vez creada la política de IAM, puede crear un rol de IAM que incluya esa política a la que hace referencia en la definición de la tarea de Amazon ECS. Puede crear el rol usando el caso de uso Elastic Container Service Task (Tarea de Elastic Container Service) en la consola de IAM. A continuación, puede adjuntar la política de IAM específica al rol que proporciona a los contenedores de la tarea los permisos que desea. Los procedimientos siguientes describen cómo hacerlo.
Si tiene varias definiciones de tareas o servicios que requieran permisos de IAM, debería plantearse la creación de un rol para cada definición de tarea específica o servicio con los permisos mínimos requeridos para que las tareas operen, a fin de poder minimizar el acceso que proporciona para cada tarea.
Para obtener información acerca del punto de conexión de servicio para su región, consulte Service endpoints en la Guía de Referencia general de Amazon Web Services.
El rol de tarea de IAM debe tener una política de confianza que especifique el servicio ecs-tasks.amazonaws.com
. El permite sts:AssumeRole
permite que las tareas asuman el rol de IAM diferente de la que utiliza la instancia de Amazon EC2. De esta forma, la tarea no hereda el rol asociado con la instancia de Amazon EC2. A continuación, se muestra un ejemplo de una política de confianza. Sustituya el identificador de región y especifique el número de cuenta de AWS que utiliza al lanzar tareas.
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":[ "ecs-tasks.amazonaws.com" ] }, "Action":"sts:AssumeRole", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:
us-west-2
:111122223333
:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333
" } } } ] }
importante
Al crear el rol de IAM de su tarea, se recomienda utilizar las claves de condición aws:SourceAccount
o aws:SourceArn
en la relación de confianza o en la política de IAM asociada al rol para definir aún más el ámbito del permiso y evitar el problema de seguridad del suplente confuso. El uso de la clave de condición aws:SourceArn
para especificar un clúster concreto no se admite actualmente, debe utilizar el comodín para especificar todos los clústeres. Para obtener más información sobre el problema del suplente confuso y cómo proteger su cuenta de AWS, consulte El problema del suplente confuso en la Guía del usuario de IAM.
En los siguientes procedimientos, se describe cómo crear una política para recuperar objetos de Amazon S3 con un ejemplo de política. Sustituya cada entrada del usuario
por valores propios.
En los siguientes procedimientos se describe cómo adjuntar una política de IAM que haya creado para crear un rol de IAM de tarea.
Después de crear el rol, agregue permisos adicionales al rol para las siguientes características.
Característica | Permisos adicionales |
---|---|
Uso de ECS Exec |
|
Uso de instancias de EC2 (Windows y Linux) | |
Uso de instancias externas | |
Uso de instancias de EC2 de Windows | Configuración adicional de las instancias de Amazon EC2 de Windows |
Permisos de ECS Exec
La característica ECS Exec requiere un rol de IAM para tareas para conceder a los contenedores los permisos necesarios para la comunicación entre el SSM Agent administrado (agente execute-command
) y el servicio de SSM. Debe agregar los siguientes permisos a un rol de IAM para tareas e incluir el rol de IAM para tareas en la definición de tareas. Para obtener más información, consulte Adición y eliminación de políticas de IAM en la Guía del usuario de IAM.
Utilice la siguiente política para el rol de IAM para tareas a fin de agregar los permisos SSM requeridos.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }
Configuración adicional de instancias de Amazon EC2
Recomendamos que limite los permisos en el rol de instancia de contenedor a la lista mínima de permisos que se proporciona en la política de IAM administrada AmazonEC2ContainerServiceforEC2Role
.
Las instancias de Amazon EC2 requieren al menos la versión 1.11.0
del agente de contenedor para utilizar los roles para tareas; sin embargo, recomendamos utilizar la versión más reciente. Para obtener información sobre la comprobación de la versión del agente y la actualización a la versión más reciente, consulte Actualización del agente de contenedor de Amazon ECS. Si utiliza una AMI optimizada para Amazon ECS, la instancia también necesita al menos 1.11.0-1
del paquete ecs-init
. Si las instancias utilizan la versión de AMI optimizada para Amazon ECS más reciente, entonces contienen las versiones requeridas del agente de contenedor y ecs-init
. Para obtener más información, consulte AMI de Linux optimizadas para Amazon ECS.
Si no está utilizando la AMI optimizada para Amazon ECS para las instancias de contenedor, agregue la opción --net=host
al comando docker run que inicia el agente, junto con las siguientes variables de configuración de agente para la configuración deseada (para obtener más información, consulte Configuración del agente de contenedor de Amazon ECS):
ECS_ENABLE_TASK_IAM_ROLE=true
-
Usa roles de IAM para las tareas de contenedores con los modos de red
bridge
ydefault
. ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
-
Usa roles de IAM para las tareas de contenedores con el modo de red
host
. Esta variable solo se admite en versiones de agente 1.12.0 y posterior.
Para ver un ejemplo de un comando de ejecución, consulte Actualización manual del agente de contenedor de Amazon ECS (para AMI no optimizadas para Amazon ECS). También deberá establecer los siguientes comandos de redes en su instancia de contenedor para que los contenedores de sus tareas puedan recuperar las credenciales de AWS:
sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
Debe guardar estas reglas de iptables en su instancia de contenedor para que no se vean afectadas por un reinicio. Puede utilizar los comandos iptables-save e iptables-restore para guardar las reglas de iptables y restaurarlas en el arranque. Para obtener más información, consulte la documentación del sistema operativo específico.
Para impedir que los contenedores de las tareas que usan el modo de red awsvpc
obtengan acceso a la información sobre credenciales proporcionada al perfil de instancia de Amazon EC2, pero permitiendo los permisos que concede el rol de tarea, establezca la variable de configuración del agente ECS_AWSVPC_BLOCK_IMDS
en true
en el archivo de configuración del agente y reinicie este agente. Para obtener más información, consulte Configuración del agente de contenedor de Amazon ECS.
Para impedir que los contenedores de las tareas que utilizan el modo de red bridge
obtengan acceso a la información sobre credenciales proporcionada al perfil de instancia de Amazon EC2, pero permitiendo los permisos que concede el rol de tarea, ejecute el siguiente comando iptables en las instancias de Amazon EC2. Este comando no afecta a los contenedores de las tareas que usan los modos de red host
o awsvpc
. Para obtener más información, consulte Modo de red.
-
sudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP
Debe guardar esta regla de iptables en la instancia de Amazon EC2 para que se conserve tras un reinicio. Puede usar los siguientes comandos para la AMI optimizada para Amazon ECS. Para otros sistemas operativos, consulte la documentación correspondiente a dicho sistema operativo.
sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
Configuración adicional de las instancias externas
Las instancias externas requieren al menos la versión 1.11.0
del agente de contenedor para utilizar los roles de IAM para tareas; sin embargo, recomendamos utilizar la versión más reciente. Para obtener información sobre la comprobación de la versión del agente y la actualización a la versión más reciente, consulte Actualización del agente de contenedor de Amazon ECS. Si utiliza una AMI optimizada para Amazon ECS, la instancia también necesita al menos 1.11.0-1
del paquete ecs-init
. Si las instancias utilizan la versión de AMI optimizada para Amazon ECS más reciente, entonces contienen las versiones requeridas del agente de contenedor y ecs-init
. Para obtener más información, consulte AMI de Linux optimizadas para Amazon ECS.
Si no está utilizando la AMI optimizada para Amazon ECS para las instancias de contenedor, agregue la opción --net=host
al comando docker run que inicia el agente, junto con las siguientes variables de configuración de agente para la configuración deseada (para obtener más información, consulte Configuración del agente de contenedor de Amazon ECS):
ECS_ENABLE_TASK_IAM_ROLE=true
-
Usa roles de IAM para las tareas de contenedores con los modos de red
bridge
ydefault
. ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
-
Usa roles de IAM para las tareas de contenedores con el modo de red
host
. Esta variable solo se admite en versiones de agente 1.12.0 y posterior.
Para ver un ejemplo de un comando de ejecución, consulte Actualización manual del agente de contenedor de Amazon ECS (para AMI no optimizadas para Amazon ECS). También deberá establecer los siguientes comandos de redes en su instancia de contenedor para que los contenedores de sus tareas puedan recuperar las credenciales de AWS:
sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
Debe guardar estas reglas de iptables en su instancia de contenedor para que no se vean afectadas por un reinicio. Puede utilizar los comandos iptables-save e iptables-restore para guardar las reglas de iptables y restaurarlas en el arranque. Para obtener más información, consulte la documentación del sistema operativo específico.
Configuración adicional de las instancias de Amazon EC2 de Windows
importante
Esto se aplica únicamente a los contenedores de Windows en EC2 que utilizan roles de tareas.
El rol de tareas con características de Windows requiere una configuración adicional en EC2.
-
Cuando se lanzan las instancias de contenedor, se debe establecer la opción
-EnableTaskIAMRole
en el script de datos de usuario de las instancias de contenedor. El rolEnableTaskIAMRole
activa la característica de roles de IAM de tareas para las tareas. Por ejemplo:<powershell> Import-Module ECSTools Initialize-ECSAgent -Cluster '
windows
' -EnableTaskIAMRole </powershell> -
Debe arrancar el contenedor con los comandos de redes que se proporcionan en Script de arranque del contenedor de Amazon ECS.
-
Debe crear un rol y una política de IAM para las tareas. Para obtener más información, consulte Creación del rol de IAM de tareas.
-
Los roles de IAM para el proveedor de credenciales de tareas utilizan el puerto 80 en la instancia de contenedor. Por lo tanto, si configura roles de IAM para las tareas en la instancia de contenedor, los contenedores no pueden utilizar el puerto 80 como puerto del host en ningún mapeo de puertos. Para exponer los contenedores en el puerto 80, recomendamos configurar un servicio para ellos que utilice el balanceo de carga. Puede utilizar el puerto 80 en el balanceador de carga. De este modo, el tráfico se puede dirigir a otro puerto del host en las instancias de contenedor. Para obtener más información, consulte Uso del equilibrador de carga para distribuir el tráfico de servicio de Amazon ECS.
-
Si se reinicia la instancia de Windows, debe eliminar la interfaz de proxy y volver a inicializar el agente de contenedor de Amazon ECS para que se vuelva a activar el proxy de credenciales.
Script de arranque del contenedor de Amazon ECS
Antes de que los contenedores puedan obtener acceso al proxy de credenciales en la instancia de contenedor para obtener credenciales, el contenedor se debe arrancar con los comandos de redes requeridos. El siguiente script de ejemplo de código se debe ejecutar en los contenedores cuando se inician.
nota
No es necesario ejecutar este script cuando se utiliza el modo de red awsvpc
en Windows.
Si ejecuta contenedores de Windows que incluyen Powershell, utilice el siguiente script:
# 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 ejecuta contenedores de Windows que solo tienen el shell de comandos, utilice el siguiente script:
# 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