gpt4 book ai didi

amazon-web-services - 有没有办法跨用户和 EC2 实例角色重用 AWS IAM 权限策略?

转载 作者:行者123 更新时间:2023-12-04 08:05:07 26 4
gpt4 key购买 nike

我开始使用 AWS IAM instance roles这对于提升我们的安全管理水平非常有用,但它增加了维护轻量级开发流程的一些挑战。

手头的问题是:

  • 我定义了一个AWS 实例角色,并将安全策略附加到该角色。此策略指定授予在此角色下启动的新 EC2 实例的权限,它是一个长而复杂的 json 文档,其中包含“允许访问 S3 存储桶 x”和“拒绝访问 SQS y”等规则。这在 EC2 上运行良好。

  • 接下来,当开发人员在 IDE 中进行本地开发时,我想让开发人员在他们的本地机器上运行我们的代码,并使用与之前定义的完全相同的安全策略。当开发人员生成新代码时,这很重要 b/c 我希望他们测试它 WRT 到与他们在生产中运行时完全相同的安全策略。如果他们以不同的安全策略运行,那么事情就有可能会出错。

  • 问题是我还没有找到执行此操作的方法。可以定义 IAM 组,并将开发人员加入组(例如“开发人员”组)。在这个组中,我可以定义适用于该组中所有开发人员的 IAM 安全策略。但是(我发现)无法在实例角色的上下文中重用附加到组的策略。或者在组的上下文中使用附加到角色的策略。 (我完全错过了吗?...)

  • 总而言之,我想要的是:1) 一次定义一个安全策略文档。 2)在两个地方重用这个文档,一个是在IAM实例角色定义中,另一个是IAM组。

  • 不能这样做意味着我将不得不为每种类型的服务(我们有很多这样的服务)和每个环境(例如舞台/产品)。我可以很容易地看出这是如何成为维护噩梦的。

到目前为止,我想到的最好的方法可能是将策略文档存储在磁盘上,在版本控制下,并编写一个使用 aws api 将策略文档上传到实例角色和组的工具。这有点麻烦,所以我希望能更灵活一点。

你有更好的建议给我吗?...谢谢!

最佳答案

感谢@Steffen 指出 CloudFormation,但我想我找到了一个更适合我的解决方案。
AWS 提供一个 Security Token Service简而言之,它允许您承担一个角色
这正是我一直在寻找的,因为我想定义一个角色一次(例如一组 AWS 权限),然后让 AWS EC2 实例自动承担这个角色(很容易做到)以及开发人员承担特定服务的角色他们正在发展。开发人员部分涉及更多,但我将在下面粘贴一些 Java 代码来说明如何执行此操作。

首先,在定义角色时,您必须说明允许哪些负责人 担任此角色。为此,您可以编辑角色的信任关系部分(位于 AWS Web UI 上角色定义页面的底部)

例如,这里有一个信任关系文档,它允许 EC2 实例以及我域中的一些用户(替换 your-service-id-numberyour -user@example.com):

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::your-service-id-number:user/your-user@example.com",
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

接下来是在本地开发中运行时承担此角色的 Java 代码:

此代码检查我是否在 EC2 实例上运行,如果是,将承担实例的角色(否则,DefaultAWSCredentialsProviderChain 定义的任何内容,但在我的情况下,以及最佳实践是 - EC2 实例角色)。如果在开发环境中运行,例如在 EC2 之外然后它承担由 roleName

提供的角色
AWSCredentialsProvider getCredentialsProvider(String roleName) {
if (isRunningOnEc2()) {
return new DefaultAWSCredentialsProviderChain();
}

// If not running on EC2, then assume the role provided
final AWSCredentials longLivedCredentialsProvider = new DefaultAWSCredentialsProviderChain().getCredentials(); // user credentials provided by env variables for ex.
// The String roleArn is defined at the top of the Role page titled "Role ARN" ;-)
final String roleArn = String.format("arn:aws:iam::your-service-id-number:role/%s", roleName);
final String roleSessionName = "session" + Math.random(); // not sure it's really needed but what the heck..
final STSAssumeRoleSessionCredentialsProvider credentialsProvider =
new STSAssumeRoleSessionCredentialsProvider(longLivedCredentialsProvider, roleArn, roleSessionName);
return credentialsProvider;
}

提供实用程序 isRunningOnEc2():

public static boolean isRunningOnEc2() {
try {
final InetAddress byName = InetAddress.getByName("instance-data");
return byName != null;
} catch (final UnknownHostException e) {
return false;
}
}

按照 Steffen 的建议使用 CloudFormation,在一般意义上也可能有用,主要是为了保持我的代码库和实际 AWS 部署的一致性,但这是另外一回事。

但有一个烦人的地方:可以将主体定义为实际的用户名而不是用户组,因此您实际上不能说“允许所有开发人员担任角色 x”,而是您必须列出每个开发人员具体来说。这很烦人,但我想 I'm not the only one with this complaint .

关于amazon-web-services - 有没有办法跨用户和 EC2 实例角色重用 AWS IAM 权限策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27963576/

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