【问题标题】:AWS AssumeRole - User is not authorized to perform: sts:AssumeRole on resourceAWS AssumeRole - 用户无权执行:sts:AssumeRole on resource
【发布时间】:2014-03-24 06:54:17
【问题描述】:

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

下面是我调用 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');

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

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

我错过了什么吗?

【问题讨论】:

  • 我假设权限中的资源假设角色 791758789361 是错字,您的意思是 123456789012。

标签: php amazon-web-services


【解决方案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 服务已经存在。

完成之后,我能够毫无问题地担任该角色。我花了几个小时才弄清楚这一点,希望对某人有所帮助。

【讨论】:

  • 这是一个巨大的帮助,谢谢。对于任何感兴趣的人,这都记录在 here 中。不清楚的是,即使是拥有该角色的帐户也必须这样做。
  • 老兄,你是救生员。花了我几个小时,我无法弄清楚为什么我被拒绝了。
  • 很高兴它有帮助。顺便说一句,我更新了示例以使用比 root 更受限制的角色,这从安全角度来看更好。
  • 非常感谢。它帮助我解决了我的问题。我们需要让信任实体中的每个想要担任此角色的用户执行操作
  • 谢谢。只是要补充一点,您可以通过在 Principal 对象中将它们合并为不同的字段,其中一个是服务,另一个是 AWS,从而将这两个语句合并为一个。如果您有多个相同的字段 Principal,您甚至可以将字段值作为字符串数组而不是字符串。
【解决方案2】:

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

我关注this tutorial,并按照指定在美国西部(俄勒冈)部署了集群。

为了让它工作,我需要为这个区域激活 STS here

【讨论】:

    【解决方案3】:

    也许您应该分配您的 sts 区域和端点:

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

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多