2014-02-22 43 views
12

我試圖在我的PHP程序中使用AWS sts調用AssumeRole函數,因爲我想創建臨時憑證以允許用戶爲AWS存儲桶創建對象。AWS AssumeRole授權不起作用

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

不過,我不斷收到以下錯誤:

用戶阿爾恩:AWS:IAM :: 123456789012:用戶/ TVMUser無權執行:STS:AssumeRole資源:阿爾恩:AWS:IAM :: 123456789012:角色/ 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": [ 
{ 
    "Action": [ 

    "s3:Get*", 
    "s3:List*", 
    "s3:Put*", 

    ], 
    "Effect": "Allow", 
    "Resource": "*" 
    }, 
{ 
    "Effect": "Allow", 

    "Action": "sts:AssumeRole", 
    "Resource": "arn:aws:iam::123456789012:role/createPic" 
} 
] 
} 

難道現在的人什麼我在AWS政策聲明和在AWS上設置的思念,所以我沒有得到錯誤:用戶阿爾恩:AWS :iam :: 123456789012:user/TVMUser未被授權執行:sts:資源上的AssumeRole:arn:aws:iam :: 123456789012:role/createPic?

我錯過了什麼嗎?

+2

我認爲在許可的資源assumeRole 791758789361是一個錯字,你的意思是123456789012。 –

回答

32

您還需要編輯角色的信任關係,以允許帳戶(即使它是相同的)承擔角色。

  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服務已經在那裏了。

在我做完這些之後,我能夠毫無問題地承擔起這個角色。花了我幾個小時才弄明白這一點,希望能幫助別人。

+1

這是一個巨大的幫助,謝謝。對於任何感興趣的人來說,這是記錄[這裏](http://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-sharing-logs-third-party.html)。不清楚的是,即使是擁有角色的賬戶,也必須這樣做。 –

+1

哥們你是救命的人。花了我幾個小時,不知道爲什麼我被拒絕。 – gkrizek

+0

很有幫助。順便說一句,我更新了這個例子,以使用比'root'更安全的角色。 – jtblin

0

也許你應該分配您的STS區和端點:

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

我有同樣的錯誤,花了幾個小時試圖處理權限和信任關係解決它......但是這不是我的問題。

我正在關注this tutorial,我按照規定在美國西部(俄勒岡州)部署了集羣。

爲了使其工作,我需要激活該地區的STS here

enter image description here