gpt4 book ai didi

c# - 从在已分配 IAM 角色的 Amazon EC2 实例上运行的 C# .NET 应用程序为联合用户创建 STS token

转载 作者:太空狗 更新时间:2023-10-29 21:44:59 24 4
gpt4 key购买 nike

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

  • 一个 IAM 角色,限制服务器对 S3 资源和其他亚马逊网络服务的访问权限。
  • 能够使用 STS 服务的 IAM 用户,即 GetFederationToken。

通常,客户端会请求获取或将对象放入 S3 的访问权限,绝不会删除。所以在放文件的情况下,与其让客户端将文件上传到服务器,再从服务器转发到S3,不如提供临时访问凭证让客户端直接将文件放入合适的S3 bucket .

这是 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 token 发行者 IAM 用户策略是:

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

在我的服务器端代码中,我创建了 STS 客户端、联合 token 请求并进行了 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* 函数的实现,但我知道这些工作。

奇怪的是。如果我使用与用户绑定(bind)的 IAM 用户凭证,该用户的访问策略看起来与上面显示的 EC2 实例角色完全一样,则一切都按预期工作,并且客户端能够执行所有预期的 S3 操作。

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

最佳答案

为了让这个场景起作用,我必须将策略的 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"
}
]
}

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

希望这对某人有帮助。

关于c# - 从在已分配 IAM 角色的 Amazon EC2 实例上运行的 C# .NET 应用程序为联合用户创建 STS token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19552659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com