我有一个运行服务器的 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 联合令牌?如果不是,应如何修改它们以允许此类访问?