AWS Terraform IAM 사용자 관리
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 아키텍처를 얻을 수 있습니다.