6

我有一个运行服务器的 Amazon EC2 实例,该服务器需要为其客户端(Windows 7/8、iPad 等)提供对 S3 资源的联合访问。到目前为止,我已经创建了以下内容:

  • 一个 IAM 角色,用于限制服务器对 S3 资源和其他 Amazon Web 服务的访问。
  • 能够使用 STS 服务的 IAM 用户,即 GetFederationToken。

通常,客户端将请求访问以获取或将对象放入 S3,从不删除。因此,在放置文件的情况下,与其让客户端将文件上传到服务器,然后将其从服务器转发到 S3,我想为客户端提供临时访问凭证,以便将文件直接放入适当的 S3 存储桶中.

EC2 实例 IAM 角色如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": "arn:aws:s3:::devtestbucket/*"
    },
    {
      "Effect": "Allow",
      "Action": [ "sqs:*" ],
      "Resource": "arn:aws:sqs:us-west-2::dev-*"      
    },
    {
      "Effect": "Allow",
      "Action": [ "dynamodb:*" ],
      "Resource": "arn:aws:dynamodb:us-west-2::dev-*"      
    },
    {
      "Effect": "Allow",
      "Action": [ "sts:*" ],
      "Resource": "*"      
    }
  ]
}

STS 令牌颁发者 IAM 用户政策是:

{
  "Statement": [
    {
      "Action": [
        "sts:GetFederationToken"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:sts:::federated-user/*"
      ]
    },
    {
      "Action": [
        "s3:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::devtestbucket"
      ]
    }
  ]
}

在我的服务器端代码中,我创建了 STS 客户端、联合令牌请求并进行 GetFederationToken 调用,如下所示:

    var stsClient = new AmazonSecurityTokenServiceClient(stsTokenIssuerAwsAccessKeyId, stsTokenIssuerAwsSecretAccessKey);

    var request = new GetFederationTokenRequest
    {
        Name = GenerateIamFederatedUserName(),  // I know this is correct
        DurationSeconds = (int)TimeSpan.FromHours(6).TotalSeconds,
        Policy = GenerateSTSPolicy(objectPrefix, permittedActions) // This works as expected too
    };


    var fedTokenResponse = stsClient.GetFederationToken(request);

我无法分享 Generate* 函数的实现,但我知道那些工作。

这是奇怪的事情。如果我使用与用户绑定的 IAM 用户凭证,其访问策略与上面显示的 EC2 实例角色完全相同,那么一切都会按预期工作,并且客户端能够执行所有预期的 S3 操作。

因此,在所有这些背景下,我的问题是:EC2 实例上的应用程序是否仍能提供对其客户端的联合访问?如果是这样,上述策略对于授予应用程序访问这些 AWS 操作的权限是否正确,即请求和提供可以访问 S3 资源的 sts 联合令牌?如果不是,应如何修改它们以允许此类访问?

4

1 回答 1

4

为了让这个场景发挥作用,我不得不将策略的 STS GetFederationToken 部分分离到它自己的策略中。因此,必须有 2 个策略,一个用于 STS,一个用于其他 AWS 服务:

STS 政策:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "sts:GetFederationToken"
      ],
      "Sid": "Stmt1382573256000",
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  ]
}

S3 访问策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:List*"
      ],
      "Sid": "Stmt1382573312476",
      "Resource": [
        "arn:aws:s3:::devtestbucket"
      ],
      "Effect": "Allow"
    },
    {
      "Action": [
        "s3:*"
      ],
      "Sid": "Stmt1382573312000",
      "Resource": [
        "arn:aws:s3:::devtestbucket/*"
      ],
      "Effect": "Allow"
    }
  ]
}

不知道为什么会这样。如果有人能解释为什么需要制定两项政策而不是一项政策的原因,那就太好了。

希望这可以帮助某人。

于 2013-10-24T17:38:58.580 回答