【问题标题】:Is there a way to reuse AWS IAM permissions policy across users and EC2 instance roles?有没有办法跨用户和 EC2 实例角色重用 AWS IAM 权限策略?
【发布时间】:2015-03-13 20:30:45
【问题描述】:

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

手头的问题是:

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

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

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

  • 所以总结一下,我想要的是:1)定义一个安全策略文档一次。 2)在两个地方复用这个文档,一个是IAM实例角色定义,另一个是IAM组。

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

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

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

【问题讨论】:

    标签: amazon-web-services amazon-iam


    【解决方案1】:

    感谢@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

    【讨论】:

      【解决方案2】:

      更新

      AWS 刚刚推出了Managed Policies for AWS Identity & Access Management,它提供了一种在 IAM 实体之间共享和维护 IAM 策略的全新方法,专门用于减少当前信息重复和工作量

      随着您的 AWS 安装规模和复杂性的增长,您可能会发现自己正在编辑多个权限文档以添加新权限或删除现有权限。审核和确认权限也比必要的困难。

      安全博客文章An Easier Way to Manage Your Policies 提供了详细信息。


      初步回答

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

      这样的工具已经存在,实际上是许多 AWS 自己的和第 3 方服务的主要支持技术 - 请查看 AWS CloudFormation,它为开发人员和系统管理员提供了一种简单的创建方法并管理一组相关的 AWS 资源,以有序且可预测的方式预置和更新它们

      更具体地说,AWS::IAM::Policy 资源将 IAM 策略与 IAM 用户、角色或组相关联

      {
         "Type": "AWS::IAM::Policy",
         "Properties": {
            "Groups" : [ String, ... ],
            "PolicyDocument" : JSON,
            "PolicyName" : String,
            "Roles" : [ String, ...
            "Users" : [ String, ... ],
         }
      }
      

      CloudFormation 当然还有更多功能,它是一个非常强大的工具(请参阅Getting Started with AWS CloudFormation)。

      【讨论】:

      • 感谢 Steffen,我一直很好奇这个 CloudFormation 是什么 ;-) 但实际上我认为我找到了一个更简单的解决方案。我可以使用 STS 来承担角色,这样我就可以在角色中定义策略,然后开发人员将承担角色。
      猜你喜欢
      • 2019-07-13
      • 2017-10-01
      • 2016-05-15
      • 2019-08-06
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 2021-02-06
      相关资源
      最近更新 更多