AWS Identity and Access Management
Guía del usuario

Uso de un rol de IAM para conceder permisos a aplicaciones que se ejecutan en instancias Amazon EC2

Las aplicaciones que se ejecutan en una instancia EC2 deben incluir credenciales de AWS en sus solicitudes de API de AWS. Los desarrolladores pueden almacenar las credenciales de AWS directamente en la instancia EC2 y permitir que las aplicaciones de dicha instancia las utilicen. Sin embargo, en este caso, los desarrolladores tendrían que encargarse de administrar las credenciales y asegurarse de transferir de forma segura las credenciales a cada instancia y actualizar cada instancia EC2 cuando tocase rotar las credenciales. Todo esto supone mucho trabajo adicional.

En su lugar, puede y debe utilizar un rol de IAM para administrar las credenciales temporales de las aplicaciones que se ejecutan en una instancia EC2. Al utilizar un rol, no tiene que distribuir credenciales a largo plazo (como un nombre de usuario y una contraseña o claves de acceso) a una instancia EC2. En vez de ello, el rol proporciona permisos temporales que las aplicaciones pueden utilizar al realizar llamadas a otros recursos de AWS. Cuando lanza una instancia EC2, usted especifica un rol de IAM que se asocia a la instancia. Esto permite a las aplicaciones que se ejecutan en dicha instancia utilizar las credenciales temporales facilitadas por el rol para firmar las solicitudes de API.

El uso de roles para conceder permisos a aplicaciones que se ejecutan en instancias EC2 requiere una configuración adicional. El sistema operativo virtualizado extrae de AWS una aplicación que se ejecuta en una instancia EC2. Debido a esta separación adicional, se necesita un paso más para asignar un rol de AWS y sus permisos asociados a una instancia EC2 y para ponerlos a disposición de las aplicaciones. Este paso adicional consiste en crear un perfil de instancia que se asocia a la instancia. El perfil de instancia contiene el rol y puede proporcionar las credenciales temporales de este a una aplicación que se ejecute en la instancia. La aplicación, a su vez, puede utilizar estas credenciales temporales en las llamadas a la API para obtener acceso a los recursos y para restringir el acceso únicamente a aquellos recursos que el rol especifica. Tenga en cuenta que solo se puede asignar un rol a la vez a una instancia EC2 y que todas las aplicaciones de la instancia comparten ese mismo rol y los mismos permisos.

Este uso de los roles tiene varios beneficios. Dado que las credenciales del rol son temporales y se rotan de forma automática, no es preciso administrar las credenciales ni preocuparse por los riesgos de seguridad a largo plazo. Además, si utiliza un único rol para varias instancias, puede especificar un cambio en ese rol y el cambio se propagará automáticamente a todas las instancias.

nota

Aunque normalmente un rol se asigna a una instancia EC2 cuando esta se lanza, también se puede asociar un rol a una instancia EC2 que ya esté en ejecución. Para obtener información sobre cómo asociar una función a una instancia en ejecución, consulte Roles de IAM para Amazon EC2.

¿Cómo funcionan los roles de instancias EC2?

En la figura siguiente, un desarrollador ejecuta una aplicación en una instancia EC2 que necesita obtener acceso a un bucket de S3 denominado photos. Un administrador crea el rol de servicio Get-pics y lo asocia a la instancia EC2. El rol incluye una política de permisos que otorga acceso de solo lectura al bucket de S3 especificado. También incluye una política de confianza que permite a la instancia EC2 asumir el rol y obtener las credenciales temporales. Cuando la aplicación se ejecuta en la instancia, puede utilizar las credenciales temporales del rol para obtener acceso al bucket photos. El administrador no tiene que conceder al desarrollador permiso para acceder al bucket photos y el desarrollador no tiene que compartir ni administrar en ningún momento las credenciales.


        Aplicación en una instancia EC2 que obtiene acceso a un recurso de AWS
  1. El administrador usa IAM para crear el rol Get-pics. En la política de confianza del rol, el administrador especifica que solo las instancias EC2 pueden asumir el rol. En la política de permisos del rol, el administrador especifica permisos de solo lectura para el bucket photos.

  2. Un desarrollador lanza una instancia EC2 y asigna el rol Get-pics a dicha instancia.

    nota

    Si utiliza la consola de IAM, el perfil de instancia se administra de forma prácticamente transparente en su lugar. Sin embargo, si utiliza la AWS CLI o la API para crear y administrar el rol y la instancia EC2, debe crear el perfil de instancia y asignarle el rol en pasos diferentes. A continuación, al lanzar la instancia, debe especificar el nombre del perfil de instancia en lugar del nombre del rol.

  3. Cuando se ejecuta la aplicación, esta obtiene credenciales de seguridad temporales desde los Amazon EC2 metadatos de instancias, tal y como se describe en Recuperación de las credenciales de seguridad en los metadatos de la instancia. Se trata de las credenciales de seguridad temporales que representan el rol y son válidas durante un periodo de tiempo limitado.

    Con algunos SKD de AWS, el desarrollador puede utilizar un proveedor que administre las credenciales de seguridad temporales de forma transparente. (La documentación de los AWS SDK individuales describe las características compatibles con el SDK de administración de credenciales).

    De forma alternativa, la aplicación puede obtener credenciales temporales directamente desde los metadatos de la instancia EC2. Las credenciales y los valores asociados están disponibles en la categoría iam/security-credentials/role-name (en este caso, iam/security-credentials/Get-pics) de los metadatos. Si la aplicación obtiene las credenciales de los metadatos de la instancia, puede almacenar en caché las credenciales.

  4. Con las credenciales temporales recuperadas, la aplicación obtiene acceso al bucket photo. Debido a la política asociada al rol Get-pics, la aplicación tiene permisos de solo lectura.

    Las credenciales de seguridad temporales que están disponibles en la instancia se rotan automáticamente antes de que caduquen, de modo que siempre haya un conjunto válido disponible. La aplicación solo debe asegurarse de obtener un conjunto nuevo de credenciales de los metadatos de la instancia antes de que las credenciales actuales caduquen. Si el AWS SDK administra credenciales, la aplicación no necesita incluir una lógica adicional para actualizar las credenciales. No obstante, si la aplicación obtiene las credenciales de seguridad temporales de los metadatos de la instancia y los almacena en caché, debería obtener un conjunto de credenciales actualizado cada hora, o al menos 15 minutos antes de que el conjunto en curso caduque. El plazo de vencimiento está indicado en la información que se devuelve, en la categoría iam/security-credentials/role-name.

Permisos necesarios para usar roles con Amazon EC2

Para lanzar una instancia con un rol, el desarrollador debe tener permiso para lanzar instancias EC2 y transferir roles de IAM.

La siguiente política de ejemplo permite a los usuarios utilizar la Consola de administración de AWS para lanzar una instancia con un rol. La política incluye comodines (*) para permitir a los usuarios transferir cualquier rol y llevar a cabo todas las acciones de Amazon EC2. La acción ListInstanceProfiles permite a los usuarios ver todos los roles que están disponibles en la cuenta de AWS.

ejemplo política que concede permiso a un usuario para utilizar la consola de Amazon EC2 para lanzar una instancia con cualquier rol

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iam:PassRole", "iam:ListInstanceProfiles", "ec2:*" ], "Resource": "*" }] }

Restricción de los roles que se pueden transferir a instancias EC2 (usando PassRole)

Puede utilizar el permiso PassRole para restringir qué rol puede transferir un usuario a una instancia EC2 cuando el usuario lanza la instancia. Esto es útil para evitar que el usuario ejecute aplicaciones que tengan más permisos de los que se le han concedido; —es decir, evita que se puedan obtener privilegios superiores. Por ejemplo, supongamos que la usuaria Alice tenga permiso solo para lanzar instancias EC2 y trabajar con buckets de Amazon S3, pero el rol que pasa a una instancia EC2 tiene permisos para trabajar con IAM y Amazon DynamoDB. En este caso, Alice podría lanzar la instancia, iniciar sesión en ella, obtener credenciales de seguridad temporales y, a continuación, realizar acciones de IAM o DynamoDB para las que carece de autorización.

Para restringir los roles que un usuario puede transferir a una instancia EC2, debe crear una política que permita la acción PassRole. A continuación, debe asociar la política al usuario (o a un grupo de IAM al que pertenezca el usuario), el cual, a su vez, lanzará las instancias EC2. En el elemento Resource de la política, se genera una lista con el rol o los roles que el usuario tiene permiso para transferir a las instancias EC2. Cuando el usuario lanza una instancia y le asocia un rol, Amazon EC2 comprueba si el usuario tiene permiso para transmitir dicho rol. Desde luego, también debe asegurarse de que el rol que el usuario puede transferir no incluya más permisos de los que se supone que debe tener el usuario.

nota

PassRole no es una acción de API de la misma forma que RunInstances o ListInstanceProfiles. Se trata de un permiso que AWS comprueba siempre que un ARN de rol se transfiere como parámetro a una API (o la consola se encarga de ello en nombre del usuario). Sirve de ayuda para que el administrador controle qué roles pueden pasar según qué usuarios. En este caso, se asegura de que el usuario pueda asociar un rol específico a una instancia Amazon EC2.

ejemplo política que concede permiso a un usuario para lanzar una instancia EC2 con un rol concreto

La siguiente política de ejemplo permite a los usuarios utilizar la API de Amazon EC2 para lanzar una instancia con un rol. El elemento Resource especifica el nombre de recurso de Amazon (ARN) de un rol. Al especificar el ARN, la política concede al usuario permiso para transferir únicamente el rol Get-pics. Si el usuario intenta especificar otro rol al lanzar una instancia, la acción dará un error. El usuario tiene permisos para ejecutar cualquier instancia, independientemente de si transmiten una función.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:role/Get-pics" } ] }

Permitir que una función de perfil de instancia cambie una función en otra cuenta

Puede permitir que una aplicación que se ejecuta en una instancia Amazon EC2 ejecute comandos en otra cuenta. Para ello, debe permitir la función de instancia EC2 en la primera cuenta para cambiar a una función en la segunda cuenta.

Imagine que está utilizando dos cuentas de AWS y desea permitir que una aplicación se ejecute en una instancia Amazon EC2 para ejecutar comandos AWS CLI en ambas cuentas. Supongamos que la instancia EC2 existe en la cuenta 111111111111. Dicha instancia incluye la función de perfil de instancia abcd que permite que la aplicación realice tareas de solo lectura de Amazon S3 en el bucket my-bucket-1 dentro de la misma cuenta 111111111111. Sin embargo, la aplicación también debe tener permitido asumir la función entre cuentas efgh para acceder al bucket my-bucket-2 Amazon S3 de la cuenta 222222222222.

Para ello, la función del perfil de instancia EC2 abcd debe tener la siguiente política de permisos para permitir que la aplicación acceda al bucket my-bucket-1 Amazon S3:

Política de permisos de la función de la cuenta 111111111111 abcd

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountLevelS3Actions", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:HeadBucket" ], "Resource": "*" }, { "Sid": "AllowListAndReadS3ActionOnMyBucket", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::my-bucket-1/*", "arn:aws:s3:::my-bucket-1" ] }, { "Sid": "AllowIPToAssumeCrossAccountRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::222222222222:role/efgh" } ] }

La función abcd debe confiar en el servicio Amazon EC2 para asumir la función. Para ello, la función abcd debe tener la siguiente política de confianza:

Política de confianza de función de la cuenta 111111111111 abcd

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

Supongamos que la función entre cuentas efgh permite tareas de solo lectura de Amazon S3 en el bucket my-bucket-2 dentro de la misma cuenta 222222222222. Para ello, la función entre cuentas efgh debe tener la siguiente política de permisos:

Política de permisos de la función de la cuenta 222222222222 efgh

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountLevelS3Actions", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:HeadBucket" ], "Resource": "*" }, { "Sid": "AllowListAndReadS3ActionOnMyBucket", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::my-bucket-2/*", "arn:aws:s3:::my-bucket-2" ] } ] }

La función efgh debe confiar en la función de perfil de instancia abcd para asumirla. Para ello, la función efgh debe tener la siguiente política de confianza:

Política de confianza de función de la cuenta 222222222222 efgh

{ "Version": "2012-10-17", "Statement": [ { "Sid": "efghTrustPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"} } ] }

¿Cómo puedo comenzar?

Para comprender cómo funcionan los roles con instancias EC2, debe utilizar la consola de IAM para crear un rol, lanzar una instancia EC2 que use dicho rol y, a continuación, estudiar la instancia mientras se ejecuta. Puede examinar los metadatos de la instancia para ver cómo se ponen las credenciales temporales de la función a disposición de la instancia. También puede ver cómo una aplicación que ejecuta una instancia puede utilizar el rol. Utilice los siguientes recursos para obtener más información.

  • Introducción a los roles de IAM con instancias EC2. El vídeo del enlace muestra cómo utilizar un rol de IAM con una instancia EC2 para controlar lo que una aplicación puede hacer cuando se ejecuta en la instancia. El vídeo muestra cómo la aplicación (escrita en el AWS SDK) puede obtener credenciales de seguridad temporales mediante el rol.

  • Tutoriales de SDK. La documentación del SDK de AWS contiene tutoriales que muestran una aplicación que se ejecuta en una instancia EC2 que utiliza credenciales temporales para los roles para leer un bucket de Amazon S3. Cada uno de los siguientes tutoriales presenta pasos similares con un lenguaje de programación diferente:

Para obtener más información sobre cómo crear roles o roles para instancias EC2, consulte la siguiente información: