我有一个运行服务器的 Amazon EC2 实例,该服务器需要为其客户端(Windows 7/8、iPad 等)提供对 S3 资源的联合访问。到目前为止,我已经创建了以下内容:
- 一个 IAM 角色,用于限制服务器对 S3 资源和其他 亚马逊云科技服务的访问。
- 能够使用 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* 函数的实现,但我知道这些工作。
这是一件奇怪的事情。如果我使用与访问策略与上面显示的 EC2 实例角色完全相同的用户绑定的 IAM 用户凭证,则一切按预期工作,客户端能够执行所有预期的 S3 操作。
因此,在所有这些背景下,我的问题是:已分配特定角色的 EC2 实例上的应用程序是否仍能提供对其客户端的联合访问?如果是这样,上述策略是否正确地授予应用程序对这些 AWS 操作的访问权限,即请求和提供可以访问 S3 资源的 sts 联合令牌?如果不是,应如何修改它们以允许此类访问?
为了使此方案正常工作,我必须将策略的 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"
}
]
}
不知道为什么会这样。如果有人能解释为什么需要两个政策而不是一个政策背后的原因,那就太好了。
希望这对某人有所帮助。