使用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了。这是最麻烦的部分。。。。