Roles de IAM para las tareas - Amazon Elastic Container Service

Roles de IAM para las tareas

Con los roles de IAM para tareas de Amazon ECS, puede especificar un rol de IAM que pueden utilizar los contenedores en una tarea. Las aplicaciones deben firmar sus solicitudes de API de AWS con credenciales de AWS, y esta característica brinda una estrategia de administración de credenciales que pueden utilizar las aplicaciones, del mismo modo que los perfiles de instancia de Amazon EC2 ofrecen credenciales a las instancias EC2. En lugar de crear y distribuir las credenciales de AWS a los contenedores o de utilizar el rol de la instancia EC2, puede asociar el rol de IAM a la definición de tareas de ECS o a la operación de la API RunTask. Las aplicaciones de los contenedores de la tarea pueden utilizar el SDK o la CLI de AWS para realizar solicitudes de API a los servicios de AWS autorizados.

importante

No se impide que los contenedores que se ejecutan en sus instancias de contenedor accedan a las credenciales proporcionadas al perfil de instancia de contenedor (a través del servidor de metadatos de la instancia de Amazon EC2). Le recomendamos que limite los permisos en el rol de instancia de contenedor a la lista mínima de permisos mostrados en Rol de IAM de instancia de contenedor de Amazon ECS.

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 contenedor (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. 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 contenedor (pero permitiendo los permisos que concede el rol de tarea), ejecute el siguiente comando iptables en las instancias de contenedor. Tenga en cuenta que 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 FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP

Debe guardar esta regla de iptables en la instancia de contenedor para que se conserve tras un reinicio. Utilice siguientes comandos para la AMI optimizada para Amazon ECS. Para otros sistemas operativos, consulte la documentación correspondiente a dicho sistema operativo.

  • Para la AMI de Amazon Linux 2 optimizada para Amazon ECS:

    sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
  • Para la AMI de Amazon Linux optimizada para Amazon ECS:

    sudo service iptables save

Puede definir el rol de IAM que se va a utilizar en las definiciones de tareas o usar una invalidación detaskRoleArn al ejecutar una tarea manualmente con la operación de la API RunTask. El agente de Amazon ECS recibe un mensaje de carga para iniciar la tarea con campos adicionales que contienen las credenciales del rol. El agente de Amazon ECS define un ID único de credenciales de la tarea como un token de identificación y actualiza su caché de credenciales internas de modo que el token de identificación de la tarea apunte a las credenciales del rol que se reciben en la carga. El agente de Amazon ECS rellena la variable de entorno AWS_CONTAINER_CREDENTIALS_RELATIVE_URI en el objeto Env (disponible con el comando docker inspect container_id) para todos los contenedores que pertenecen a esta tarea con la siguiente URI relativa: /credential_provider_version/credentials?id=task_credential_id.

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 proporcionadas por el rol de tarea exclusivamente, y ya no heredan ningún permiso de IAM de la instancia de contenedor.

Desde dentro del contenedor, puede consultar el punto de enlace de credenciales con el siguiente comando:

curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

Salida:

{ "AccessKeyId": "ACCESS_KEY_ID", "Expiration": "EXPIRATION_DATE", "RoleArn": "TASK_ROLE_ARN", "SecretAccessKey": "SECRET_ACCESS_KEY", "Token": "SECURITY_TOKEN_STRING" }
nota

El tiempo de vencimiento predeterminado para las credenciales generadas para el rol de IAM es de 6 horas.

Si la instancia de contenedor está utilizando al menos la versión 1.11.0 del agente de contenedor y una versión admitida de los SDK o la CLI de AWS, el cliente de SDK verá que la variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI está disponible y utilizará las credenciales facilitadas para hacer llamadas a las API de AWS. Para obtener más información, consulte Habilitar roles de IAM para tareas en las instancias de contenedor y Uso de un SDK de AWS soportado.

Cada vez que se utiliza el proveedor de credenciales, la solicitud se registra localmente en la instancia de contenedor del host en /var/log/ecs/audit.log.YYYY-MM-DD-HH. Para obtener más información, consulte Registro de auditoría de credenciales en roles de IAM para tareas.

Beneficios de utilizar roles de IAM para las tareas

  • 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.

  • Auditabilidad: 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.

Habilitar roles de IAM para tareas en las instancias de contenedor

Las instancias de contenedor de Amazon ECS requieren al menos la versión 1.11.0 del agente de contenedor para habilitar 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 está utilizando la AMI optimizada para Amazon ECS, la instancia necesita al menos la versión 1.11.0-1 del paquete ecs-init. Si las instancias de contenedor se lanzan desde la versión 2016.03.e o posterior, entonces contienen las versiones requeridas del agente de contenedor y ecs-init. Para obtener más información, consulte AMI optimizada para Amazon ECS.

Si no está utilizando la AMI optimizada para Amazon ECS para las instancias de contenedor, asegúrese de agregar la opción --net=host al comando docker run que inicia el agente, junto con las variables de configuración de agente adecuadas 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

Habilita roles de IAM para las tareas de contenedores con los modos de red bridge y default.

ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true

Habilita 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.

Creación de un rol y una política de IAM para las tareas

Debe crear una política de IAM para que las tareas la utilicen, donde se especifiquen los permisos que desea que tengan los contenedores de sus tareas. Dispone de varias formas para crear una política de permisos de IAM nueva. Puede copiar una política administrada por AWS completa que ya haga en parte lo que desea y, a continuación, personalizarla según sus requisitos concretos. Para obtener más información, consulte Creación de una política nueva en la Guía del usuario de IAM.

También debe crear un rol para que lo utilicen las tareas antes de poder especificarlo en sus definiciones de tareas. Para crear el rol, puede utilizar la función de servicio Amazon Elastic Container Service Task Role (Rol de tarea de Amazon Elastic Container Service) en la consola de IAM. A continuación, puede asociar 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 enlace de servicio de su región, consulte Puntos de enlace de servicio en la Guía de referencia general de Amazon Web Services.

La relación de confianza del rol de tarea de Amazon ECS se muestra a continuación.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

Para crear una política de IAM para sus tareas

En este ejemplo, creamos una política para conceder acceso de solo lectura a un bucket de Amazon S3. Podría almacenar credenciales de base de datos u otros secretos en este depósito, y los contenedores de su tarea pueden leer las credenciales del depósito y cargarlas en su aplicación.

  1. Abra la consola de IAM en https://console.aws.amazon.com/iam/.

  2. En el panel de navegación, elija Policies (Políticas) y, a continuación, seleccione Create policy (Crear política).

  3. Siga los pasos que aparecen en una de las siguientes pestañas, que le muestran cómo utilizar los editores visuales o JSON.

Using the visual editor
  1. En Service, seleccione S3.

  2. En Actions (Acciones), expanda la opción Read (Leer) y seleccione GetObject.

  3. En Resources (Recursos), seleccione Add ARN (Agregar ARN), ingrese el nombre de recurso de Amazon (ARN) completo del bucket de Amazon S3 y, a continuación, elija Review policy (Revisar política).

  4. En la página Review policy (Revisar política), en Name (Nombre), escriba un nombre único como, por ejemplo, AmazonECSTaskS3BucketPolicy.

  5. Para terminar, elija Create policy (Crear política).

Using the JSON editor
  1. En el campo Policy Document, pegue la política que se aplicará a sus tareas. En el siguiente ejemplo, se concede permiso para el bucket de Amazon S3 my-task-secrets-bucket. Puede modificar el documento de la política para que se adapte mejor a sus necesidades específicas.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-task-secrets-bucket/*" ] } ] }
  2. Elija Create Policy.

Para crear un rol de IAM para las tareas

  1. Abra la consola de IAM en https://console.aws.amazon.com/iam/.

  2. En el panel de navegación, elija Roles, Create role.

  3. En la sección Select type of trusted entity (Seleccionar tipo de entidad de confianza), elija AWS service (Servicio de AWS).

  4. En Choose the service that will use this role (Elegir el servicio que usará este rol), elija Elastic Container Service.

  5. En Select your use case (Seleccione su caso de uso), elija Elastic Container Service Task (Tarea de servicio de contenedor elástico) y, a continuación, seleccione Next: Permissions (Siguiente: Permisos).

  6. En Attach permissions policy (Asociar política de permisos), seleccione la política que se va a usar para sus tareas (en este ejemplo, AmazonECSTaskS3BucketPolicy) y, a continuación, elija Next: Tags (Siguiente: Etiquetas).

  7. En Add tags (optional) (Añadir etiquetas [opcional]), escriba las etiquetas de metadatos que desea asociar con el rol de IAM y, a continuación, elija Next: Review (Siguiente: Revisión).

  8. Escriba un nombre para el rol en Role name (Nombre de rol). En este ejemplo, escriba AmazonECSTaskS3BucketRole como nombre del rol y, a continuación, elija Create role (Crear rol) para finalizar.

Uso de un SDK de AWS soportado

A fecha de 13 de julio de 2016, se agregó a los SDK de AWS compatibilidad con roles de IAM para las tareas. Los contenedores de las tareas deben usar una versión del SDK de AWS creada en esa fecha o con posterioridad. AWS Los SDK que se encuentran incluidos en administradores de paquetes de distribución de Linux podrían no estar lo suficientemente actualizados para soportar esta característica.

Para asegurarse de que está utilizando un SDK compatible, siga las instrucciones de instalación de su SDK preferido en Herramientas para Amazon Web Services para obtener la última versión al crear los contenedores.

Especificación de un rol de IAM para las tareas

Una vez que haya creado un rol y haya asociado una política a dicho rol, puede ejecutar tareas que asuman el rol. Dispone de varias opciones para hacerlo:

  • Especificar un rol de IAM para las tareas en la definición de tareas. Puede crear una nueva definición de tareas o una nueva revisión de una definición de tareas existente y especificar el rol que ha creado con anterioridad. Si utiliza la consola para crear la definición de tareas, elija el rol de IAM en el campo Task Role (Rol de tarea). Si utiliza los SDK o la AWS CLI, especifique el ARN del rol de tarea utilizando el parámetro taskRoleArn. Para obtener más información, consulte Creación de una definición de tareas.

    nota

    Esta opción es obligatoria si desea utilizar los roles de tarea de IAM en un servicio de Amazon ECS.

  • Especifique un reemplazo del rol de tareas de IAM al ejecutar una tarea. Puede especificar la cancelación del rol de tarea de IAM al ejecutar una tarea. Si utiliza la consola para ejecutar la tarea, elija Advanced Options (Opciones avanzadas) y, a continuación, el rol de IAM en el campo Task Role (Rol de tarea). Si utiliza los SDK o la AWS CLI, especifique el ARN del rol de tareas utilizando el parámetro taskRoleArn en el objeto JSON overrides. Para obtener más información, consulte Ejecución de una tarea independiente.

nota

Además de los permisos estándar de Amazon ECS requeridos para ejecutar tareas y servicios, los usuarios de IAM también requieren permisos iam:PassRole para utilizar roles de IAM para las tareas.