IAM and STS:AssumeRole

Vamos a explicar cultura básica de IAM. IAM Roles y STS:AssumeRole.

¿QUÉ es un role?

An IAM role is an IAM entity that defines a set of permissions for making AWS service requests. IAM roles are not associated with a specific user or group. Instead, trusted entities assume roles, such as IAM users, applications, or AWS services such as EC2.

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

Creamos 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/AmazonS3ReadOnlyAccess

Ejecutamos 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-Profile

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"  
}

Links

One thought on “IAM and STS:AssumeRole

Leave a Reply

Your email address will not be published. Required fields are marked *