AWS AssumeRole - 用户无权执行: sts:AssumeRole on resource

2022-08-30 16:16:08

我正在尝试在我的PHP程序中使用AWS sts调用AcsucthRole函数,因为我想创建临时凭证以允许用户为AWS存储桶创建对象。

以下是我称之为PHP的fumction:

  $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');

但是,我不断收到以下错误:

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

以下是我在 AWS 控制台上对用户 TVMUser 的权限策略:

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

以下是我对角色 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"
      }
   ]
}

现在是否有人在 AWS 策略语句和 AWS 上的设置中遗漏了什么,因此我不会收到以下错误?

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

我错过了什么吗?


答案 1

您还需要编辑角色的信任关系,以允许账户(即使相同)代入该角色。

  1. 在控制台中打开要代入的角色
  2. 点击“信任关系”标签
  3. 点击“编辑关系船”
  4. 为要添加的帐户添加语句(通常您只会在“受信任的实体”中拥有ec2服务),例如
{
  "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"
    }
  ]
}

在此示例中,我必须添加具有正确帐号的“AWS”委托人,ec2.amazonaws.com 服务已经存在。

在我完成此操作后,我能够毫无问题地承担这个角色。我花了几个小时才弄清楚这一点,希望这能帮助别人。


答案 2

我遇到了同样的错误,并花了几个小时试图用权限和信任关系来修复它......但这不是我的问题。

我按照本教程进行了操作,并按照指定在美国西部(俄勒冈)部署了群集。

为了使其正常工作,我需要在此处激活此区域的 STS。

enter image description here


推荐