Asumir un rol de IAM - AWS SDK for PHP

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Asumir un rol de IAM

Uso de roles de IAM para credenciales variables de instancias de Amazon EC2

Si está ejecutando una aplicación en una instancia de Amazon EC2, la mejor manera de proporcionar credenciales para realizar llamadas a AWS es utilizar un rol de IAM para obtener credenciales de seguridad temporales.

Si utiliza roles de IAM, no tiene que ocuparse de la administración de credenciales desde la aplicación. Permiten que una instancia "asuma" un rol recuperando credenciales temporales del servidor de metadatos de la instancia de Amazon EC2.

Las credenciales temporales, que a menudo reciben el nombre de credenciales del perfil de instancia, permiten obtener acceso a las acciones y los recursos permitidos por la política del rol. Amazon EC2 administra todas las operaciones de autenticación segura de las instancias en el servicio de IAM para asumir el rol, así como las operaciones de actualización periódica de las credenciales del rol recuperadas. Esto mantiene su aplicación segura prácticamente sin esfuerzo por su parte. Para obtener una lista de los servicios que aceptan credenciales de seguridad temporales, consulte los serviciosAWS que funcionan con IAM en laGuía del usuario de IAM.

nota

Para evitar llegar siempre al servicio de metadatos, puede pasar una instancia de Aws\CacheInterface como opción 'credentials' a un constructor de clientes. De este modo, el SDK utiliza las credenciales del perfil de instancia en su lugar. Para obtener información detallada, consulte Configuración de la versión 3 de AWS SDK for PHP.

Para obtener más información sobre cómo desarrollar aplicaciones de Amazon EC2 con los SDK, consulte Uso de roles de IAM para instancias de Amazon EC2 en la Guía de referencia de los SDK y las herramientas de AWS.

Creación y asignación de un rol de IAM a una instancia de Amazon EC2

  1. Cree un cliente de IAM.

    Importaciones

    require 'vendor/autoload.php'; use Aws\Iam\IamClient;

    Código de muestra

    $client = new IamClient([ 'region' => 'us-west-2', 'version' => '2010-05-08' ]);
  2. Cree un rol de IAM con los permisos necesarios para las acciones y los recursos que vaya a utilizar.

    Código de muestra

    $result = $client->createRole([ 'AssumeRolePolicyDocument' => 'IAM JSON Policy', // REQUIRED 'Description' => 'Description of Role', 'RoleName' => 'RoleName', // REQUIRED ]);
  3. Cree un perfil de instancia de IAM y guarde el nombre de recurso de Amazon (ARN) del resultado.

    nota

    Si utiliza la consola de IAM en lugar del AWS SDK for PHP, la consola crea automáticamente un perfil de instancia y le asigna el mismo nombre que el rol con el que se corresponde.

    Código de muestra

    $IPN = 'InstanceProfileName'; $result = $client->createInstanceProfile([ 'InstanceProfileName' => $IPN , ]); $ARN = $result['Arn']; $InstanceID = $result['InstanceProfileId'];
  4. Cree un cliente de Amazon EC2.

    Importaciones

    require 'vendor/autoload.php'; use Aws\Ec2\Ec2Client;

    Código de muestra

    $ec2Client = new Ec2Client([ 'region' => 'us-west-2', 'version' => '2016-11-15', ]);
  5. Añada el perfil de instancia a una instancia de Amazon EC2 en ejecución o detenida. Utilice el nombre del perfil de instancia del rol de IAM.

    Código de muestra

    $result = $ec2Client->associateIamInstanceProfile([ 'IamInstanceProfile' => [ 'Arn' => $ARN, 'Name' => $IPN, ], 'InstanceId' => $InstanceID ]);

Para obtener más información, consulte Roles de IAM para Amazon EC2 en la Guía del usuario de Amazon EC2 para instancias de Linux.

Uso de roles de IAM para tareas de Amazon ECS

Una tarea de Amazon Elastic Container Service (Amazon ECS) puede asumir un rol de IAM para realizar llamadas a la API de AWS. Esta es una estrategia de administración de credenciales para que las utilicen las aplicaciones, similar al modo en que los perfiles de instancia de Amazon EC2 proporcionan credenciales a las instancias de Amazon EC2.

En lugar de crear y distribuir las credenciales de AWS a largo plazo a los contenedores o de utilizar el rol de la instancia de Amazon EC2, puede asociar el rol de IAM que use credenciales temporales a la definición de tarea de ECS o a la operación de la API de RunTask.

Para obtener más información sobre el uso de los roles de IAM que pueden asumir las tareas de contenedores, consulte el tema sobre los roles de IAM en las tareas de la Guía para desarrolladores de Amazon ECS. Para ver ejemplos del uso del rol de IAM de tareas en forma de taskRoleArn en las definiciones de tareas, consulte también Ejemplos de las definiciones de tareas en la Guía para desarrolladores de Amazon ECS.

Asumir un rol de IAM en otra Cuenta de AWS

Si trabaja en una cuenta de Cuenta de AWS (Cuenta A) y desea asumir un rol en otra cuenta (Cuenta B), primero debe crear un rol de IAM en la Cuenta B. Este rol permite a las entidades de su cuenta (Cuenta A) realizar acciones específicas en la Cuenta B. Para obtener más información sobre el acceso entre cuentas, consulte Tutorial: Delegación del acceso entre cuentas de AWS mediante roles de IAM.

Después de crear un rol en Cuenta B, registre los ARN de rol. Usará este ARN cuando asuma el rol de la Cuenta A. El rol se asume con las credenciales de AWS asociadas con su entidad en la Cuenta A.

Cree un cliente de AWS STS con credenciales para su cuenta de Cuenta de AWS. A continuación, utilizamos un perfil de credenciales, pero puede utilizar cualquier método. Con el cliente de AWS STS recién creado, llame a assume-role y proporcione un valor de sessionName personalizado. Recupere las nuevas credenciales temporales del resultado. De forma predeterminada, las credenciales duran una hora.

Código de muestra

$stsClient = new Aws\Sts\StsClient([ 'profile' => 'default', 'region' => 'us-east-2', 'version' => '2011-06-15' ]); $ARN = "arn:aws:iam::123456789012:role/xaccounts3access"; $sessionName = "s3-access-example"; $result = $stsClient->AssumeRole([ 'RoleArn' => $ARN, 'RoleSessionName' => $sessionName, ]); $s3Client = new S3Client([ 'version' => '2006-03-01', 'region' => 'us-west-2', 'credentials' => [ 'key' => $result['Credentials']['AccessKeyId'], 'secret' => $result['Credentials']['SecretAccessKey'], 'token' => $result['Credentials']['SessionToken'] ] ]);

Para obtener más información, consulte Uso de roles de IAM o AssumeRole en la referencia de la API de AWS SDK for PHP.

Uso de un rol de IAM con la identidad web

La federación de identidades web permite a los clientes utilizar proveedores de identidad de terceros para la autenticación al obtener acceso a los recursos de AWS. Para poder asumir un rol con identidad web, debe crear un rol de IAM y configurar un proveedor de identidad web (IdP). Para obtener más información, consulte Creación de un rol para identidades federadas web u OpenID Connect (consola).

Después de crear un proveedor de identidad y crear un rol para su identidad web, utilice un cliente de AWS STS para autenticar a un usuario. Proporcione webIdentityToken y ProviderId para la identidad, así como el ARN de rol correspondiente al rol de IAM con permisos de usuario.

Código de muestra

$stsClient = new Aws\Sts\StsClient([ 'profile' => 'default', 'region' => 'us-east-2', 'version' => '2011-06-15' ]); $ARN = "arn:aws:iam::123456789012:role/xaccounts3access"; $sessionName = "s3-access-example"; $duration = 3600; $result = $stsClient->AssumeRoleWithWebIdentity([ 'WebIdentityToken' => "FACEBOOK_ACCESS_TOKEN", 'ProviderId' => "graph.facebook.com", 'RoleArn' => $ARN, 'RoleSessionName' => $sessionName, ]); $s3Client = new S3Client([ 'version' => '2006-03-01', 'region' => 'us-west-2', 'credentials' => [ 'key' => $result['Credentials']['AccessKeyId'], 'secret' => $result['Credentials']['SecretAccessKey'], 'token' => $result['Credentials']['SessionToken'] ] ]);

Para obtener más información, consulte AssumeRoleWithWebIdentity: federación mediante un proveedor de identidad basado en web o AssumeRoleWithWebIdentity en la referencia de la API de AWS SDK for PHP.

Asumir rol con perfil

Definir perfiles en ~/.aws/credentials

Puede configurar AWS SDK for PHP () para utilizar un rol de IAM definiendo un perfil en ~/.aws/credentials.

Cree un nuevo perfil con la configuración de role_arn para el rol que quiere asumir. Incluya también la configuración de source_profile de otro perfil con credenciales que tenga permisos para asumir el rol de IAM. Para obtener más información sobre estas opciones de configuración, consulte Asumir credenciales de rol en la Guía de referencia de los SDK y las herramientas de AWS.

Por ejemplo, en el siguiente ~/.aws/credentials, el perfil de project1 establece role_arn y especifica el perfil de default como el origen de las credenciales para verificar la entidad asociada que puede asumir el rol.

[project1] role_arn = arn:aws:iam::123456789012:role/testing source_profile = default role_session_name = OPTIONAL_SESSION_NAME [default] aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY aws_session_token= YOUR_AWS_SESSION_TOKEN

Si se establece la variable de entorno AWS_PROFILE o se usa el parámetro profile al crear la instancia de un cliente de servicio, se asumirá el rol especificado en project1, utilizando el perfil default como credenciales de origen.

En el siguiente fragmento se muestra el uso del parámetro profile en un constructor S3Client. S3Client tendrá los permisos asociados al rol asociado al perfil de project1.

$s3 = new Aws\S3\S3Client([ 'region' => 'us-east-1', 'version' => '2006-03-01', 'profile' => 'project1' ]);

Definir perfiles en ~/.aws/config

El archivo ~/.aws/config también puede contener los perfiles que quiera que se asuman. Si establece la variable de entorno AWS_SDK_LOAD_NONDEFAULT_CONFIG, el SDK para PHP carga los perfiles del archivo config. Cuando AWS_SDK_LOAD_NONDEFAULT_CONFIG está establecido, el SDK carga los perfiles tanto de ~/.aws/config como de ~/.aws/credentials. Los perfiles de ~/.aws/credentials se cargan en último lugar y tienen prioridad sobre un perfil de ~/.aws/config con el mismo nombre. Los perfiles de cualquier ubicación pueden servir como source_profile o el perfil que se asumirá.

En el siguiente ejemplo se utiliza el perfil de project1 definido en el archivo config y el perfil de default del archivo credentials. También se ha establecido AWS_SDK_LOAD_NONDEFAULT_CONFIG.

# Profile in ~/.aws/config. [profile project1] role_arn = arn:aws:iam::123456789012:role/testing source_profile = default role_session_name = OPTIONAL_SESSION_NAME
# Profile in ~/.aws/credentials. [default] aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY aws_session_token= YOUR_AWS_SESSION_TOKEN

Cuando se ejecute el constructor S3Client que se muestra en el siguiente fragmento, se asumirá el rol definido en el perfil de project1 con las credenciales asociadas al perfil de default.

$s3 = new Aws\S3\S3Client([ 'region' => 'us-east-1', 'version' => '2006-03-01', 'profile' => 'project1' ]);