Rol de IAM de tarea de Amazon ECS - Amazon Elastic Container Service

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.

AWS Management Console
Utilización del editor de política de JSON para la creación de una política
  1. Inicie sesión en AWS Management Console Management Console y abra la consola IAM en https://console.aws.amazon.com/iam/.

  2. En el panel de navegación de la izquierda, elija Políticas.

    Si es la primera vez que elige Políticas, aparecerá la página Welcome to Managed Policies (Bienvenido a políticas administradas). Elija Comenzar.

  3. En la parte superior de la página, seleccione Crear política.

  4. En la sección Editor de políticas, seleccione la opción JSON.

  5. Ingrese el siguiente documento de política JSON:

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject" ], "Resource":[ "arn:aws:s3:::my-task-secrets-bucket/*" ], "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:region:123456789012:*" }, "StringEquals":{ "aws:SourceAccount":"123456789012" } } } ] }
  6. Elija Siguiente.

    nota

    Puede alternar entre las opciones Visual y JSON del editor en todo momento. No obstante, si realiza cambios o selecciona Siguiente en la opción Visual del editor, es posible que IAM reestructure la política, con el fin de optimizarla para el editor visual. Para obtener más información, consulte Reestructuración de política en la Guía del usuario de IAM.

  7. En la página Revisar y crear, introduzca el Nombre de la política y la Descripción (opcional) para la política que está creando. Revise los Permisos definidos en esta política para ver los permisos que concede la política.

  8. Elija Crear política para guardar la nueva política.

AWS CLI

Sustituya cada entrada del usuario por valores propios.

  1. Cree un archivo denominado s3-policy.json con el siguiente contenido.

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject" ], "Resource":[ "arn:aws:s3:::my-task-secrets-bucket/*" ], "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:region:123456789012:*" }, "StringEquals":{ "aws:SourceAccount":"123456789012" } } } ] }
  2. Utilice el siguiente comando para crear la política de IAM con el archivo de documento de política de JSON.

    aws iam create-policy \ --policy-name taskRolePolicy \ --policy-document file://s3-policy.json

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.

AWS Management Console
Creación de un rol de servicio de Elastic Container Service (consola de IAM)
  1. Inicie sesión en AWS Management Console Management Console y abra la consola IAM en https://console.aws.amazon.com/iam/.

  2. En el panel de navegación de la consola de IAM, seleccione Roles y, a continuación, elija Crear rol.

  3. En Tipo de entidad de confianza, elija Servicio de AWS.

  4. En Servicio o caso de uso, seleccione Elastic Container Service y, a continuación, seleccione el caso de uso Tarea de Elastic Container Service.

  5. Elija Siguiente.

  6. En Agregar permisos, busque y seleccione la política que haya creado.

  7. Elija Siguiente.

  8. Escriba un nombre para el rol en Nombre de rol. En este ejemplo, escriba AmazonECSTaskS3BucketRole para nombrar el rol.

  9. Revise el rol y, a continuación, elija Crear rol.

AWS CLI

Sustituya cada entrada del usuario por valores propios.

  1. Cree un archivo con el nombre ecs-tasks-trust-policy.json que contenga la política de confianza que se va a utilizar para el rol de IAM de la tarea. El archivo debe contener lo siguiente. 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" } } } ] }
  2. Cree un rol de IAM con el nombre ecsTaskRole, que utilice la política de confianza creada en el paso anterior.

    aws iam create-role \ --role-name ecsTaskRole \ --assume-role-policy-document file://ecs-tasks-trust-policy.json
  3. Recupere el ARN de la política de IAM que creó mediante el siguiente comando. Sustituya taskRolePolicy por el nombre de la política que haya creado.

    aws iam list-policies --scope Local --query 'Policies[?PolicyName==`taskRolePolicy`].Arn'
  4. Adjunte la política de IAM que haya creado al rol ecsTaskRole. Sustituya el valor de policy-arn por el ARN de la política que haya creado.

    aws iam attach-role-policy \ --role-name ecsTaskRole \ --policy-arn arn:aws:iam:111122223333:aws:policy/taskRolePolicy

Después de crear el rol, agregue permisos adicionales al rol para las siguientes características.

Característica Permisos adicionales

Uso de ECS Exec

Permisos de ECS Exec

Uso de instancias de EC2 (Windows y Linux)

Configuración adicional de instancias de Amazon EC2

Uso de instancias externas

Configuración adicional de las 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 y default.

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 y default.

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 rol EnableTaskIAMRole 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