🌟

【Terraform】IAMポリシー、IAMグループ、IAMユーザを作成

2025/01/14に公開

はじめに

TerraformでIAMポリシーとIAMグループ、IAMユーザを作成していきます。

ファイル構成

.
├── cert
│   └── master.public.gpg
├── iam_group.tf
├── iam_policy.tf
├── iam_user.tf
├── main.tf
└── terraform.tfvars

IAMポリシーの作成

以下の3つのポリシーを作成します。

  • ビリングを全て拒否 : aws-portal:*
  • EC2の再起動を許可 : ec2:RebootInstances
  • パスワード変更を許可 : iam:ChangePassword
iam_policy.tf
# ---------------------------------------------
# IAM Policy
# ---------------------------------------------
resource "aws_iam_policy" "billing_deny" {
  name        = "${var.project}-${var.environment}-billing-deny-iam-policy"
  description = "Blling deny policy"
  policy      = data.aws_iam_policy_document.billing_deny.json
}

data "aws_iam_policy_document" "billing_deny" {
  statement {
    effect    = "Deny"
    actions   = ["aws-portal:*"]
    resources = ["*"]
  }
}

resource "aws_iam_policy" "ec2_rebootable" {
  name        = "${var.project}-${var.environment}-ec2-rebootable-iam-policy"
  description = "EC2 rebootable policy"
  policy      = data.aws_iam_policy_document.ec2_rebootable.json
}

data "aws_iam_policy_document" "ec2_rebootable" {
  statement {
    effect = "Allow"
    actions = [
      "ec2:RebootInstances"
    ]
    resources = ["*"]
  }
}

resource "aws_iam_policy" "iam_change_own_password" {
  name        = "${var.project}-${var.environment}-iam-change_own_password-iam-policy"
  description = "IAM Change own password policy"
  policy      = data.aws_iam_policy_document.iam_change_own_password.json
}

data "aws_iam_policy_document" "iam_change_own_password" {
  statement {
    effect = "Allow"
    actions = [
      "iam:ChangePassword"
    ]
    #自分自身のパスワードを変更する
    resources = ["arn:aws:iam::*:user/$${aws:username}"]
  }
}

IAMグループの作成

  • 全リソース読み取り許可 : AWS管理ポリシーReadOnlyAccess
  • ビリングの拒否 : 上記で作成したポリシー
  • EC2再起動の許可 : 上記で作成したポリシー
  • パスワード変更の許可 : 上記で作成したポリシー
iam_group.tf
# ---------------------------------------------
# IAM Group
# ---------------------------------------------

resource "aws_iam_group" "developers" {
  name = "developers"
}

resource "aws_iam_group_policy_attachment" "developers_readonly_policy" {
  group      = aws_iam_group.developers.name
  policy_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
}

resource "aws_iam_group_policy_attachment" "developers_billing_deny" {
  group      = aws_iam_group.developers.name
  policy_arn = aws_iam_policy.billing_deny.arn
}

resource "aws_iam_group_policy_attachment" "developers_ec2_rebootable" {
  group      = aws_iam_group.developers.name
  policy_arn = aws_iam_policy.ec2_rebootable.arn
}

resource "aws_iam_group_policy_attachment" "developers_iam_change_own_password" {
  group      = aws_iam_group.developers.name
  policy_arn = aws_iam_policy.iam_change_own_password.arn
}

GPGを使った暗号/復号

  • masterキーペアを作成
    • RSA 2048bit
    • パスワードなし
  • 任意文字を暗号化
  • 暗号化されたデータを復号

GPGのインストール

$ brew install gpg

鍵の作成

$ gpg --gen-key

鍵の確認

$ gpg --list-keys

ここで出てくるuidを次で使用。

秘密鍵をエクスポート

$ gpg -o master.public.pgp --export 上記のuid

certに移動させておく。

IAMユーザーの作成

main.tf
variable "user_name" {
  type = string
}
terraform.tfvars
user_name = "testname"
iam_user.tf
# ---------------------------------------------
# IAM User
# ---------------------------------------------
resource "aws_iam_user" "user" {
  name = var.user_name
  force_destroy = true
}

resource "aws_iam_user_group_membership" "developers" {
  user = aws_iam_user.user.name
  groups = [ aws_iam_group.developers.name ]
}

resource "aws_iam_user_login_profile" "login_profile" {
  user = aws_iam_user.user.name
  pgp_key = filebase64("先ほど作ったmasterキーのパス")
  password_length = 20
  password_reset_required = true
}

output "password" {
    value = aws_iam_user_login_profile.login_profile.encrypted_password
}
  • apply後にoutputsで暗号化されたパスワードが表示される
  • password.txtなどに保存しておく
  • 以下のコマンドでデクリプト
$ cat password.txt | base64 -d | gpg -r master --decrypt
  • 表示されたパスワードを保存しておく

Discussion