AWS Terraform IAM 사용자 관리

발행: (2025년 12월 15일 오후 03:43 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

Introduction

AWS에서 IAM 사용자를 수동으로 관리하면 복잡해지고 오류가 발생하기 쉬우며 확장하기 어려워집니다. 팀이 성장함에 따라 사용자를 관리하고, 그룹을 만들고, 권한 및 MFA와 같은 보안 제어를 관리하는 반복 가능하고, 감사 가능하며, 안전한 방법이 필요합니다. 이 가이드는 단일 진실 소스로 CSV 파일을 사용하여 Terraform으로 AWS IAM 사용자 관리를 구현하는 방법을 보여줍니다.

Advantages of Terraform for IAM

  • 중앙 집중식이며 버전 관리된 사용자 관리
  • 사용자의 온보딩 및 오프보딩이 쉬움
  • 팀 전체에 일관된 보안 정책 적용
  • 수동 오류 감소
  • 멱등성(idempotent) 및 감사 가능한 변경

Setup Overview

  • CSV 파일에서 동적으로 생성되는 IAM 사용자
  • Education, Managers, Engineers용 IAM 그룹
  • 사용자 속성에 따라 자동으로 그룹에 할당
  • 비밀번호 재설정이 강제된 콘솔 접근
  • 모든 그룹에 대한 MFA 적용
  • 그룹 기반 권한 관리

CSV 파일이 신원 데이터에 대한 단일 진실 소스가 됩니다.

Load User Data from CSV

locals {
  users = csvdecode(file("users.csv")) // List of maps for the data
}

Terraform은 각 행을 맵으로 변환하여 사용자를 동적으로 반복 처리할 수 있게 합니다. 사용자를 추가하거나 제거하는 것은 CSV 파일을 편집하는 것만큼 간단합니다.

IAM Users

resource "aws_iam_user" "users" {
  for_each = { for user in local.users : user.first_name => user }

  name = lower("${substr(each.value.first_name, 0, 1)}${each.value.last_name}")
  path = "/users/"

  tags = {
    DisplayName = "${each.value.first_name} ${each.value.last_name}"
    Department  = each.value.department
    JobTitle    = each.value.job_title
    Email       = each.value.email
    Phone       = each.value.phone
  }
}
  • 사용자 이름이 자동으로 생성됩니다(첫 글자 + 성)
  • 태그에 풍부한 메타데이터를 저장해 필터링, 감사 및 정책에 활용
  • 사용자를 하드코딩하지 않음

Console Access (Login Profiles)

resource "aws_iam_user_login_profile" "users" {
  for_each                 = aws_iam_user.users
  user                     = each.value.name
  password_reset_required = true

  lifecycle {
    ignore_changes = [
      password_reset_required,
      password_length
    ]
  }
}

첫 로그인 시 비밀번호 재설정을 강제하여 보안 모범 사례에 부합합니다.

IAM Groups

resource "aws_iam_group" "education" {
  name = "Education"
  path = "/groups/"
}

resource "aws_iam_group" "managers" {
  name = "Managers"
  path = "/groups/"
}

resource "aws_iam_group" "engineers" {
  name = "Engineers"
  path = "/groups/"
}

그룹 수준에서 권한을 관리하면 관리가 간소화됩니다.

Automatic Group Membership

resource "aws_iam_group_membership" "education_members" {
  name  = "education-group-membership"
  group = aws_iam_group.education.name

  users = [
    for user in aws_iam_user.users : user.name
    if user.tags.Department == "Education"
  ]
}

resource "aws_iam_group_membership" "managers_members" {
  name  = "managers-group-membership"
  group = aws_iam_group.managers.name

  users = [
    for user in aws_iam_user.users : user.name
    if contains(keys(user.tags), "JobTitle") &&
       can(regex("Manager|CEO", user.tags.JobTitle))
  ]
}

resource "aws_iam_group_membership" "engineers_members" {
  name  = "engineers-group-membership"
  group = aws_iam_group.engineers.name

  users = [
    for user in aws_iam_user.users : user.name
    if user.tags.Department == "Engineering"
  ]
}

수동 그룹 할당을 없애고 정확성을 보장합니다.

MFA Enforcement

Terraform은 MFA 디바이스를 생성할 수 없지만 IAM 정책을 통해 MFA 사용을 강제할 수 있습니다.

resource "aws_iam_policy" "require_mfa" {
  name        = "Require-MFA"
  description = "Deny access unless MFA is enabled"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid      = "DenyAllExceptMFA"
        Effect   = "Deny"
        Action   = "*"
        Resource = "*"
        Condition = {
          BoolIfExists = {
            "aws:MultiFactorAuthPresent" = "false"
          }
        }
      }
    ]
  })
}

Attach MFA Policy to Groups

resource "aws_iam_group_policy_attachment" "mfa_enforcement" {
  for_each = {
    education = aws_iam_group.education.name
    managers  = aws_iam_group.managers.name
    engineers = aws_iam_group.engineers.name
  }

  group      = each.value
  policy_arn = aws_iam_policy.require_mfa.arn
}

이 그룹에 속한 모든 사용자는 AWS에 접근하기 위해 MFA를 활성화해야 합니다.

Permissions via Managed Policies

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

resource "aws_iam_group_policy_attachment" "managers_admin" {
  group      = aws_iam_group.managers.name
  policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"
}

resource "aws_iam_group_policy_attachment" "engineers_poweruser" {
  group      = aws_iam_group.engineers.name
  policy_arn = "arn:aws:iam::aws:policy/PowerUserAccess"
}
  • Education 사용자는 읽기 전용 액세스
  • Managers는 전체 관리자 액세스
  • Engineers는 PowerUser 액세스(리소스 관리 가능하지만 IAM은 제외)

Additional Useful Data

data "aws_caller_identity" "current" {}

출력, 디버깅 및 Terraform이 올바른 AWS 계정에서 실행되고 있는지 확인하는 데 유용합니다.

Summary

  • 모든 사용자에 MFA 적용
  • 권한은 개별 사용자 대신 그룹에 적용
  • 감사용 메타데이터를 태그에 저장
  • CSV 기반 사용자 라이프사이클 관리
  • 인프라가 완전히 재현 가능하고 감사 가능

프로덕션 환경에서는 IAM 사용자 대신 AWS IAM Identity Center (SSO) 사용을 고려하십시오. 이 Terraform 기반 솔루션은 신원을 코드로 다루는 방법을 보여줍니다. CSV 기반 데이터, 동적 그룹 멤버십, MFA 적용 및 최소 권한 접근을 결합함으로써 실제 환경에 적합한 확장 가능하고 안전한 IAM 아키텍처를 얻을 수 있습니다.

Back to Blog

관련 글

더 보기 »

AWS 모듈 3: Go와 Lambda

Mac을 떠나지 않고 Linux용으로 컴파일했으며 비용은 $0.06였습니다. 시리즈: AWS Zero to Architect - 모듈 3 읽는 시간: 20분 구현 시간: 120분...