使用Terraform管理AWS的IAM用户组策略

首先/第一

大家在AWS的IAM权限管理方面是如何处理的呢?IAM是在使用AWS时无法避开的功能,但它的易用性较差,是一个令人头疼的问题。如果人数少的话,每个人都是管理员可能还可以,但人数增多了,每个人都是管理员就有点微妙了。然而,如果在开发团队内限制IAM权限,那么一旦尝试进行与现有业务无关的新事物时,就会出现权限不足的错误,需要向有权限的人请求才能进行权限更改,这会导致开发速度下降。另外,拥有权限的人还需要为其他人查找和编写IAM策略,这是一种痛苦。如果可能的话,我们希望权限申请者能自己查找和编写策略。

因此,我考虑使用Terraform来管理IAM策略,这样就可以摆脱在IAM控制台上编辑JSON的劳苦,可以用git进行管理,而且希望获得权限的人可以通过Pull Request来请求。这样一来,我们可以审查权限变更的差异,还可以有记录,非常方便和好处多多。

使用Terraform管理IAM用户组的策略。

政策

在管理IAM用户策略时,应考虑到Terraform的特点。这是因为Terraform将已知的资源保存在一个名为terraform.tfstate的中间文件中,所以无法在Terraform中操作已存在的AWS资源。

特别是IAM用户,如果重新创建,访问密钥等会发生变化,还需要重新设置MFA设备,不太容易随意重新创建。

因此,本次战略是创建一个新的组,并将策略分配给该组,然后向该组添加用户,以应用策略于用户。我认为以组为单位管理策略本身是最佳实践,但最终我还是希望将用户置于Terraform的管理之下,为了在不影响当前操作的情况下进行迁移,暂时将用户视为Terraform之外的管理对象。

(2016/5/26更新)关于如何使用Terraforming将现有的IAM用户纳入Terraform的管理范围,以下进行了说明。

Terraform的安装与配置

Terraform是由HashiCorp开发的云资源配置管理工具。简单来说,它是类似于AWS的CloudFormation,但它是一款不仅限于AWS的供应商无关工具。

与CloudFormation不同的是,Terraform还有一个称为”terraform plan”的功能,可以进行试运行并带来许多好处。

安装只需从官方网站下载二进制zip文件并解压,然后设置路径即可,因此我将省略此步骤。

由于有很多解释文章可以参考,因此请自行上网搜索有关Terraform的详细说明。

创建Terraform的配置文件

那么,让我们开始编写具体的Terraform配置文件吧。

我已将成品放置在GitHub的以下存储库中。
https://github.com/minamijoyo/iam-terraform-example

首先我们要定义一个群组。

resource "aws_iam_group" "group1" {
    name = "group1"
}

resource "aws_iam_group" "group2" {
    name = "group2"
}

然后,将策略分配给组。
策略的JSON本身可以用内联的Here Document方式编写,但是如果使用内置的file函数,可以从外部读取JSON文件,这样策略的JSON本身就可以在喜欢的编辑器中实现语法高亮,可能会感到很幸福。

resource "aws_iam_group_policy" "group1_policy" {
    name = "group1_policy"
    group = "${aws_iam_group.group1.id}"
    policy = "${file("aws_iam_group_policies/group1_policy.json")}"
}

resource "aws_iam_group_policy" "group2_policy" {
    name = "group2_policy"
    group = "${aws_iam_group.group2.id}"
    policy = "${file("aws_iam_group_policies/group2_policy.json")}"
}

根据需求,我们将灵活地定制JSON策略。

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "iam:ChangePassword",
            "iam:GetAccountPasswordPolicy"
        ],
        "Resource": "*"
    }
}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "aws-portal:View*",
            "Resource": "*"
        }
    ]
}

最后,我们向组中添加成员。为了让用户在Terraform之外进行管理,我们需要指定现有的IAM用户名称。

resource "aws_iam_group_membership" "group1" {
    name = "group1-membership"
    users = [
        "user1",
        "user2",
    ]
    group = "group1"
}

resource "aws_iam_group_membership" "group2" {
    name = "group2-membership"
    users = [
        "user2",
    ]
    group = "group2"
}

由于一个用户可以加入多个组,因此可以为每个角色准备一个组,用户通过加入所需的组来获得权限。组策略只是一个简单的JSON文件,可以通过Git进行管理,如果需要添加权限,可以进行基于Pull Request的操作。

通过Terraform将变更应用到AWS中。

当准备好文件后,我们将使用Terraform实际创建AWS资源。
虽然可以在Terraform的配置中进行AWS访问密钥等设置,但我们会简单地从环境变量中读取。

$ export AWS_ACCESS_KEY_ID=XXXX
$ export AWS_SECRET_ACCESS_KEY=XXXX
$ export AWS_DEFAULT_REGION=ap-northeast-1

通过使用terraform plan命令,查看变更的内容并确认。

$ terraform plan

使用Terraform apply来应用更改。

$ terraform apply

从AWS控制台上确认,可以确实看到已经创建了IAM组,并且可以确认已经分配了策略和用户。

使用Atlas管理terraform.tfstate文件。

由于 terraform 的状态是通过 terraform.tfstate 文件进行管理的,所以如果多人使用 terraform,就需要共享此文件。

不建议使用git来管理这个文件,因为在多个分支上工作时会发生冲突。terraform.tfstate文件将由Atlas来管理。

Atlas是一個由HashiCorp開發的統合管理基礎架構的平台。目前可以免費使用,如果沒有帳號,請先註冊一個。

(2016/5/26补充)据说Atlas将收费。如果只是共享tfstate文件,也可以选择将其放置在S3上。在Amazon S3上管理/共享Terraform的状态管理文件terraform.tfstate。

当你登录Atlas后,可以从设置中的令牌部分获取API令牌。
https://atlas.hashicorp.com/settings/tokens

获取令牌后,请将其导出为环境变量ATLAS_TOKEN。

$ export ATLAS_TOKEN=XXXXXXXXXX

在terraform命令中,将Atlas指定为后端。
请根据需要相应地将name部分解释为(用户名)/(环境)。Environments类似于Atlas上的项目名称,如果不存在相关项目,则会创建一个新的项目。

$ terraform remote config -backend-config "name=minamijoyo/iam-terraform-example"

使用此设置,terraform.tfstate 将自动与Atlas同步。
一旦设置,基本上只需要运行 terraform apply 就会自动反映,但如果需要显式地进行pull/push操作,则可以使用 terraform remote pull / terraform remote push。

由于Atlas可以与Github进行集成,我也想尝试一下这方面的功能。

(2016/02/02新增)下面是Atlas与GitHub的集成方法。
通过Terraform+Atlas+GitHub来有效地管理AWS IAM用户组策略。

最后

只剩下写IAM组策略的JSON了。这是最麻烦的部分。。。。

广告
将在 10 秒后关闭
bannerAds