Entender cómo funciona AWS IAM STS AssumeRole es la base para comprender muchas cosas que suceden en el ecosistema de AWS. AWS IAM es el sistema de control de acceso y gestión de identidades de Amazon Web Services. Entender cómo funcionan los roles y STS:AssumeRole es la base para diseñar arquitecturas seguras en AWS.
¿Pero qué es un IAM role?
Un IAM role es una identidad de AWS con un conjunto de permisos definidos para interactuar con los servicios de la plataforma. A diferencia de los usuarios IAM, un role no está vinculado a una persona ni a un grupo concreto: está pensado para ser asumido temporalmente por quien lo necesite. Pueden asumir un role entidades como usuarios IAM, aplicaciones o servicios de AWS como EC2 o Lambda.
Un IAM Role tiene dos partes. La “Permission Policy” y la “Trust Policy”. Son objetos JSON. La política de permisos describe los permisos del rol. La política de confianza describe quien puede asumir ese rol: EC2 service, Lambda service, etc.
Una vez el IAM Role está asumido por una entidad permitida, AWS STS (Security Token Service) otorga unas credenciales de seguridad temporales a esa entidad. Conteniendo:
- Session Token
- Access Key ID
- Secret Access Key
- Expiration
Un IAM Role es similar a un usuario en su estructura pero lejos de ser accedido por un conjunto de estático de credenciales, es utilizado cuando se asume su rol, lo que significa hacer peticiones para adquirir credenciales temporales que permitirán tomar acciones con ciertos privilegios asociados a ese rol.
Crear un IAM Role
Antes de poder crear un IAM role, debemos crear una política de confianza (“policy trust”). Política de confianza permite a los servicios de AWS tales como EC2 asumir un IAM role en nombre de tu aplicación.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}La acción sts:AssumeRole es la forma en la que las credenciales temporales son obtenidas. Para usarla, un usuario o aplicación hace llamadas a esta API usando algún tipo de credenciales previamente obtenidas, como las keys de un usuario y devuelve (si está permitido) un nuevo conjunto de credenciales para actuar como el role. Este es el mecanismo por el cual los servicios de AWS pueden llamar a otros servicios de AWS en su nombre, mediante el cual los perfiles de instancia funcionan en EC2 y mediante el cual un usuario puede temporalmente cambiar su nivel de acceso o de cuenta en la consola de AWS.
La política de assume role determina que principales (usuarios, otros roles, AWS services) pueden hacer llamadas a sts:AssumeRole para un role. En este ejemplo, el servicio EC2 mismo tendrá acceso, lo que significa que EC2 puede hacer acciones en su nombre utilizando ese rol.
Ahora que hemos creado la política de confianza o “trusted policy”, podemos acabar de crear nuestro rol.
aws iam create-role --role-name YourNewRole --assume-role-policy-document file://YourNewRole-Trust-Policy.jsonCreamos un rol, asignándole la política de confianza. Ahora vamos a asignarle una política. Con el comando “attach-role-policy” le damos permisos a este IAM Role para accede recursos en nuestra cuenta. Por ejemplo, vamos a darle permisos solo de ReadOnly en los buckets de S3.
aws iam attach-role-policy --role-name YourNewRole --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccessEjecutamos el comando “create-instance-profile” seguido del comando “add-role-to-instance-profile” donde crearemos el IAM instance profile o perfil de instancia. El instance profile permite a EC2 utilizar el IAM Role, YourNewRole, en la instancia EC2.
aws iam create-instance-profile --instance-profile-name YourNewRole-Instance-Profile
aws iam add-role-to-instance-profile --role-name YourNewRole --instance-profile-name YourNewRole-Instance-ProfileAWS IAM STS:ASSUME ROLE
AWS IAM Role nos otorga credenciales temporales a quien quiera que asuma un IAM Role. Las credenciales temporales son suministradas por AWS Security Token (STS) evaluando las políticas de permisos asignadas a ese rol.
Hay cinco API métodos principales ofrecidos por AWS STS:
- AssumeRole
- AssumeRoleWithWebIdentity
- AssumeRoleWithSAML
- GetFederationToken
- GetSessionToken
AssumeRole
This is typically used for cross-account access. The AWS account who wants to share a resource with another AWS account can create an IAM Role. Add the permission policy and the trust policy to the role. We can refer the other AWS account id in the trust policy. So the other account can use “Switch Role” feature in the AWS Console to enter the role name and account id of the resource sharing account and get access to the resource
AssumeRoleWithSAML
This API call returns a set of temporary security credentials for users who have been authenticated via a SAML authentication response. Typically used for Active Directory federation.
AssumeRoleWithWebIdentity
This API call returns a set of temporary security credentials for users who have been authenticated in a mobile or web application with a web identity provider. If you have a mobile app where the users need to access an AWS resource (E.g. Upload profile photo to a S3 bucket) you can set up the IAM role, configure web identity and allow all authenticated (With facebook, google, etc..) federated users to assume that role.

Example of STS AssumeRoleWithWebIdentity
GetFederationToken
GetFederationToken API call needs Long Term Credentials of an IAM User instead of IAM Role. Because of that, use this API method only in a safe environment where the long term credentials can be stored.
It returns a set of temporary security credentials (consisting of an access key ID, a secret access key, and a security token) for a federated user. Typical use is in a proxy application that gets temporary security credentials on behalf of distributed applications inside a corporate network.
GetSessionToken
Typically used to receive temporary credentials for Untrusted environments. It returns a set of temporary credentials for an AWS account or IAM user. The user must already be an IAM user. When he wants to access AWS resource in untrusted environments, he can use MFA to protect calls to AWS with GetSessionToken call.
Creando un IAM Role en Terraform
En versión Terraform sería algo asi:
# creamos el recurso IAM Role y
# establecemos una trust policy
resource "aws_iam_role" "iam_beanstalk_role_rubendobwp" {
name = "rubendobwp_beanstalk_role"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOF
}
# creamos el recurso IAM Instance profile
resource "aws_iam_instance_profile" "iam_beanstalk_profile_rubendobwp" {
name = "rubendobwp_beanstalk_instance_profile"
role = "${aws_iam_role.iam_beanstalk_role_rubendobwp.name}"
}
# le asignamos al role una política de permisos
resource "aws_iam_role_policy_attachment" "iam_beanstalk_role_rubendobwp_policy_attach_2" {
role = "${aws_iam_role.iam_beanstalk_role_rubendobwp.name}"
policy_arn = "arn:aws:iam::aws:policy/AWSElasticBeanstalkFullAccess"
}Resumen
En este post hemos visto los conceptos clave de AWS IAM STS AssumeRole:
Hemos visto cómo crear un role paso a paso tanto con la AWS CLI como con Terraform, incluyendo el instance profile necesario para que EC2 pueda utilizarlo. El uso de roles y credenciales temporales frente a credenciales estáticas reduce drásticamente la superficie de ataque en cualquier arquitectura
AWS.
Un IAM role es una identidad con permisos que no está vinculada a ningún usuario concreto, sino que es asumida temporalmente por quien la
necesite.
Todo role tiene dos partes: la permission policy (qué puede hacer) y la trust policy (quién puede asumirlo).
Al asumir un role, AWS STS emite credenciales temporales compuestas de Access Key ID, Secret Access Key, Session Token y fecha de expiración.
Existen cinco métodos de la API de STS según el caso de uso: AssumeRole, AssumeRoleWithSAML, AssumeRoleWithWebIdentity, GetFederationToken y GetSessionToken.
Links
- https://stackoverflow.com/questions/44623056/terraform-what-does-assumerole-service-ec2-do
- https://aws.amazon.com/about-aws/whats-new/2017/02/new-attach-an-iam-role-to-your-existing-amazon-ec2-instance/
- https://aws.amazon.com/iam/faqs/
- https://thecloudtutorials.com/2019/07/18/aws-iam-summary/
- https://www.rubenortiz.es/2020/08/06/guia-certificacion-aws/
¡Muy interesante Rubén!