TerraformでIAMユーザーにパスワード変更権限を付ける(IAMUserChangePassword)

AWS, Terraform01 December 2020

Terraformで管理しているユーザーに初回ログイン時のパスワード変更権限を付ける時。 AWSで予め用意しているポリシーに「IAMUserChangePassword」があります。

これをTerraformから使用する場合の方法として、以下の2通りの方法があるのでそのメモです。

  • 「IAMUserChangePassword」のARNを直接指定しアタッチする。
  • 作成するポリシーのアクションに、「iam:ChangePassword」と「iam:GetAccountPasswordPolicy」を追加する。

「IAMUserChangePassword」のARNを直接指定しアタッチする。

こちらは簡単なパターン。

# ユーザーにアタッチ
resource "aws_iam_user_policy_attachment" "test-attach" {
user = "ユーザー名"
policy_arn = "arn:aws:iam::aws:policy/IAMUserChangePassword"
}
# グループにアタッチ
resource "aws_iam_group_policy_attachment" "test-attach" {
user = "グループ名"
policy_arn = "arn:aws:iam::aws:policy/IAMUserChangePassword"
}

アタッチしたいユーザーやグループに直接ARNを指定するだけです

ポリシーに「iam:ChangePassword」と「iam:GetAccountPasswordPolicy」を追加する。

こちらの使いどころとしては、グループにアタッチするポリシーを自作していて、

そのグループに対する権限周りは1つにまとめたい。とかって時(だと思っている。)

要は、「自作したポリシー」と「IAMChangePassword」の2つのアタッチをしたくない時

# 自作のポリシードキュメント
data "aws_iam_policy_document" "pd" {
# iam:ChangePasswordを追加
statement {
effect = "Allow"
actions = [
"iam:ChangePassword",
]
resources = [
"arn:aws:iam::*:user/$${aws:username}", # ここに注意!「$$」もしは「&」にする
]
}
# iam:GetAccountPasswordPolicyを追加
statement {
effect = "Allow"
actions = [
"iam:GetAccountPasswordPolicy",
]
resources = [
"*",
]
}
}

こんな感じで、ポリシーの内容に追加してあげます。 どうしてこうなるかというと、「IAMUserChangePassword」のポリシー内容の実態が上記だからです。

1つ注意点として、 iam:ChangePasswordのresourcesにuserのARNを指定するのですが以下のように$$もしくは&を使用する必要があります。

arn:aws:iam::*:user/$${aws:username}
arn:aws:iam::*:user/&{aws:username}

理由としては、terraformにより$が展開されてしまうのですが、 最終的なポリシーのJSON上では「arn:aws:iam::*:user/$${aws:username}」となる必要があるためです。

なぜ&でもOKなのかあまりわかってません。(githubのissueに書いてありました)

tags: AWS, Terraform