AWS AssumeRole: el usuario no está autorizado para realizar: sts:AssumeRole en el recurso

4 minutos de lectura

avatar de usuario
dave

Estoy intentando llamar a la función AssumeRole usando AWS sts en mi programa PHP porque quiero crear credenciales temporales para permitir que un usuario cree un objeto para un depósito de AWS.

A continuación se muestra la función a la que llamo PHP:

  $sts = StsClient::factory(array(
                'key'    => 'XXXXXXXXXXXXXX',
                'secret' => 'XXXXXXXXXXXXXXXX',
                'token.ttd' => $timetodie
            ));             
  $bucket = "mybucket";             
            $result1 = $sts->assumeRole(array(          
                'RoleArn' => 'arn:aws:iam::123456789012:role/createPic',
                'RoleSessionName' => 'mytest',
                'Policy' => json_encode(array(
                        'Statement' => array(
                             array(
                                  'Sid' => 'Deny attributes',
                                  'Action' => array(
                                  's3:deleteObject', 
                                  's3:deleteBucket'
                                  ),
                                  'Effect' => 'Deny',
                                  'Resource' => array(
                                  "arn:aws:s3:::{$bucket}",
                                  "arn:aws:s3:::{$bucket}/AWSLogs/*"
                                  ),
                                  'Principal' => array(
                                  'AWS' =>   "*"
                                  )
                              ) 
                          )
                      )
                  ),
                'DurationSeconds' => 3600,
             //   'ExternalId' => 'string',
            ));
            
            $credentials  = $result1->get('Credentials');

Sin embargo, sigo recibiendo el siguiente error:

User arn:aws:iam::123456789012:user/TVMUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/createPic

A continuación se muestra mi política de permisos para el usuario TVMUser en mi consola de AWS:

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":"ec2:RunInstances",
         "Resource":"*"
      },
      {
         "Effect":"Allow",
         "Action":"iam:PassRole",
         "Resource":"arn:aws:iam::791758789361:user/TVMUser"
      },
      {
         "Effect":"Allow",
         "Action":"sts:AssumeRole",
         "Resource":"arn:aws:iam::791758789361:role/createPic"
      }
   ]
}

A continuación se muestra mi política de roles para el rol createPic:

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":"ec2:RunInstances",
         "Resource":"*"
      },
      {
         "Effect":"Allow",
         "Action":"iam:PassRole",
         "Resource":"arn:aws:iam::791758789361:user/TVMUser"
      },
      {
         "Effect":"Allow",
         "Action":"sts:AssumeRole",
         "Resource":"arn:aws:iam::791758789361:role/createPic"
      }
   ]
}

¿Alguien sabe lo que me falta en mis declaraciones de política de AWS y la configuración en AWS para que no reciba el siguiente error?

User arn:aws:iam::123456789012:user/TVMUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/createPic

¿Me estoy perdiendo de algo?

  • Supongo que el recurso en el permiso de asumir Role 791758789361 es un error tipográfico y te refieres a 123456789012.

    – bennie j

    24 de febrero de 2014 a las 12:08

avatar de usuario
WispyCloud

También debe editar la relación de confianza del rol para permitir que la cuenta (incluso si es la misma) asuma el rol.

  1. abra el rol que desea asumir en la consola
  2. haga clic en la pestaña “Relaciones de confianza”
  3. haga clic en “Editar relación”
  4. agregue un estado de cuenta para la cuenta que desea agregar (por lo general, solo tendrá el servicio ec2 en las “Entidades de confianza”), por ejemplo
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/some-role"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

En este ejemplo, tuve que agregar el principal “AWS” con el número de cuenta adecuado, el servicio ec2.amazonaws.com ya estaba allí.

Después de hacer eso, pude asumir el papel sin problemas. Me tomó literalmente horas resolver esto, espero que ayude a alguien.

  • Esto fue de gran ayuda, gracias. Para quien le interese, esto está documentado. aquí. Lo que no está claro es que esto debe hacerse incluso para la cuenta que posee el rol.

    – Matt Cole

    20 dic 2015 a las 13:30

  • Amigo eres un salvavidas. Me tomó horas y no podía entender por qué me negaban.

    – gkrizek

    30 de septiembre de 2016 a las 3:51

  • Me alegro de que ayude Por cierto, actualicé el ejemplo para usar un rol más restringido que root que es mejor desde una perspectiva de seguridad.

    – WispyCloud

    30/09/2016 a las 10:40

  • Muchas gracias. Me ayudó a resolver mi problema. Necesitamos dar a cada usuario en entidades de confianza que quiera asumir este rol para realizar operaciones

    – SASI

    11 de octubre de 2016 a las 13:19

  • Gracias. Solo para agregar que puede combinar ambas declaraciones en una fusionándolas dentro del objeto Principal como un campo diferente donde uno es Servicio y el otro es AWS. Incluso puede poner el valor del campo como matriz de cadena en lugar de cadena si tiene más de un mismo campo principal.

    – Sany Liew

    10 de enero a las 15:46

Tuve el mismo error y pasé horas tratando de solucionarlo con permisos y relaciones de confianza… pero ese no era mi problema.

yo estaba siguiendo este tutorial e implementé el clúster en EE. UU. Oeste (Oregón) como se especifica.

Para que funcione, necesitaba activar STS para esta región aquí.

ingrese la descripción de la imagen aquí

Tal vez debería asignar su región sts y punto final:

$sts = StsClient::factory(array(
    //...      
    'region'   => 'us-west-2',                                                                                                                                                                              
    'endpoint' => 'https://sts.us-west-2.amazonaws.com', 
));

¿Ha sido útil esta solución?