如何将 IAM 策略变量与联合身份用户一起使用?

上次更新时间:2020 年 8 月 19 日

当我使用 GetFederationToken API 生成临时凭证时,${aws:userName} 策略变量不起作用。

解决方法

当使用 GetFederationToken API 时,请使用 ${aws:userID} 策略变量,而不是 ${aws:userName} 策略变量。这是因为如果委托人是联合身份用户,则变量 ${aws:userName} 将不存在。有关更多信息,请参阅策略变量的使用位置

以下 JSON IAM 策略提供了一个示例,其中 ${aws:userName} 策略变量已替换为 ${aws:userID} 策略变量:

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Sid":"AllowListingOfUserFolder",
         "Action":[
            "s3:ListBucket"
         ],

         "Effect":"Allow",

         "Resource":[
            "arn:aws:s3:::TESTBUCKET"
         ],
         "Condition":{
            "StringLike":{
               "s3:prefix":[
                  "TESTBUCKET/${aws:userid}/*"
               ]
            }
         }
      },
      {
         "Sid":"AllowAllS3ActionsInUserFolder",
         "Action":[
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject"
         ],
         "Effect":"Allow",
         "Resource":[
            "arn:aws:s3:::TESTBUCKET/${aws:userid}/*"
         ]
      }
   ]
}

aws:userid 变量的值为“ACCOUNTNUMBER:caller-specified-name”。

调用 GetFederationToken API 时,名称参数值必须遵循 GetFederationToken 中建立的指导原则。例如,如果您指定友好名称 Bob,则正确的格式是“123456789102:Bob”。它将为您的会话命名,并允许使用匹配的前缀访问 Amazon Simple Storage Service (Amazon S3) 存储桶。

注意:此示例假定 aws:userid 变量的调用方指定名称(友好名称)部分是唯一的。唯一的友好名称可防止出现以下情况:无法向具有相同友好名称的另一个用户授予访问 JSON 策略中指定的资源的权限。有关更多信息,请参阅唯一标识符