โ† IaC/Terraform Management

ISMS-P 2.9.1 ๋ณ€๊ฒฝ๊ด€๋ฆฌ High Risk

๋ณ€๊ฒฝ๊ด€๋ฆฌ๊ฐ€ ์ฒด๊ณ„์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋Š”๊ฐ€?

ISMS-P 2.9.1์€ ์ •๋ณด์‹œ์Šคํ…œ ๋„์ž…ยท๋ณ€๊ฒฝ ์‹œ ์„ฑ๋Šฅ ๋ฐ ๋ณด์•ˆ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋ถ„์„ํ•˜๊ณ  ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๊ด€๋ฆฌํ•˜๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” Drift Detection๊ณผ PR ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ์ฒด๊ณ„์ ์ธ ๋ณ€๊ฒฝ๊ด€๋ฆฌ ์ฒด๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹

ISMS-P ์ธ์ฆ ๊ธฐ์ค€

ISMS-P 2.9.1 ๋ณ€๊ฒฝ๊ด€๋ฆฌ ์š”๊ตฌ์‚ฌํ•ญ

2.9.1

๋ณ€๊ฒฝ๊ด€๋ฆฌ

์ธ์ฆ ๊ธฐ์ค€ ์ •์˜

"์ •๋ณด์‹œ์Šคํ…œ ๋„์ž… ๋˜๋Š” ๋ณ€๊ฒฝ ์‹œ ์„ฑ๋Šฅ ๋ฐ ๋ณด์•ˆ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋ถ„์„ยทํ˜‘์˜ํ•˜๊ณ  ๊ด€๋ จ ์ด๋ ฅ์„ ๊ด€๋ฆฌํ•˜์—ฌ์•ผ ํ•œ๋‹ค."

๐Ÿ“Œ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ ์ ์šฉ ํฌ์ธํŠธ

  • Terraform drift detection์œผ๋กœ ๊ณ„ํš๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ํƒ์ง€
  • PR ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๋ณ€๊ฒฝ ์š”์ฒญ-๊ฒ€ํ† -์Šน์ธ ์ฒด๊ณ„
  • terraform plan ๊ฒฐ๊ณผ ๊ฒ€ํ† ๋กœ ๋ณด์•ˆ ์˜ํ–ฅ ๋ถ„์„
  • AWS Config๋กœ ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ ์ด๋ ฅ ์ž๋™ ๊ธฐ๋ก
  • ๋ณ€๊ฒฝ๊ด€๋ฆฌ์‹œ์Šคํ…œ(ITSM)๊ณผ IaC ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๋™

โš ๏ธ ๋ฏธ์ค€์ˆ˜ ์‹œ ์‹ฌ์‚ฌ ์˜ํ–ฅ

  • ๊ฒฐํ•จ: ๋ณ€๊ฒฝ๊ด€๋ฆฌ์‹œ์Šคํ…œ ์—†์ด ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • ๊ฒฐํ•จ: ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์ ˆํžˆ ๊ฒ€ํ† ๋˜์ง€ ์•Š์Œ
  • ๊ฒฐํ•จ: ๋ณ€๊ฒฝ ์ด๋ ฅ์ด ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Œ
  • ๊ถŒ๊ณ : ๋“œ๋ฆฌํ”„ํŠธ(์Šน์ธ ์—†๋Š” ๋ณ€๊ฒฝ)๊ฐ€ ๋ฐฉ์น˜๋จ
๐Ÿ“„ KISA ISMS-P ์ธ์ฆ๊ธฐ์ค€ ์•ˆ๋‚ด์„œ โ†—
๐Ÿ“ฐ

์‹ค์ œ ๋ณด์•ˆ ์‚ฌ๊ณ  ์‚ฌ๋ก€

๋ณ€๊ฒฝ๊ด€๋ฆฌ ๋ฏธํก์œผ๋กœ ๋ฐœ์ƒํ•œ ์‹ค์ œ ์‚ฌ๊ณ 

2013-2023๋…„

Toyota 10๋…„๊ฐ„ ์„ค์ • ์˜ค๋ฅ˜ ๋ฐฉ์น˜

ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ ์„ค์ • ์˜ค๋ฅ˜๊ฐ€ 10๋…„๊ฐ„ ๋ฐฉ์น˜๋˜์–ด ์•ฝ 26๋งŒ ๋ช…์˜ ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋จ. ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ด€๋ฆฌ์™€ ์ •๊ธฐ ์ ๊ฒ€์ด ์—†์–ด ์žฅ๊ธฐ๊ฐ„ ํƒ์ง€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ๊ตํ›ˆ: ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ด€๋ฆฌ ํ•„์ˆ˜, ์ •๊ธฐ์  drift detection ๋ฐ ๋ณด์•ˆ ์ ๊ฒ€

2024๋…„

Firebase ์„ค์ • ์˜ค๋ฅ˜ 1,900๋งŒ ๋น„๋ฐ€๋ฒˆํ˜ธ ์œ ์ถœ

Firebase ์ธ์Šคํ„ด์Šค ์„ค์ • ์˜ค๋ฅ˜๋กœ 1,900๋งŒ ๊ฐœ์˜ ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์œ ์ถœ. ์„ค์ • ๋ณ€๊ฒฝ ์‹œ ๋ณด์•ˆ ์˜ํ–ฅ ๋ถ„์„ ์—†์ด ๋ฐฐํฌ๋˜์–ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ๊ตํ›ˆ: ๋ชจ๋“  ์„ค์ • ๋ณ€๊ฒฝ์€ ๋ณด์•ˆ ๊ฒ€ํ†  ํ•„์ˆ˜, Policy as Code ์ž๋™ ๊ฒ€์ฆ

โšก

ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์˜ ์œ„ํ—˜

์ฝ˜์†” ์ง์ ‘ ๋ณ€๊ฒฝ๊ณผ ๋“œ๋ฆฌํ”„ํŠธ ๋ฏธํƒ์ง€์˜ ์œ„ํ—˜์„ฑ

โŒ ์œ„ํ—˜: ์ฝ˜์†” ์ง์ ‘ ๋ณ€๊ฒฝ, ๋“œ๋ฆฌํ”„ํŠธ ๋ฏธํƒ์ง€

# Terraform์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” Security Group
resource "aws_security_group" "web" {
  ingress {
    from_port   = 443
    cidr_blocks = ["10.0.0.0/8"]  # ๋‚ด๋ถ€๋งŒ
  }
}

# ๋ฌธ์ œ: AWS ์ฝ˜์†”์—์„œ ์ง์ ‘ ๋ณ€๊ฒฝ!
# ๋ˆ„๊ตฐ๊ฐ€ 0.0.0.0/0 ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™ ์ถ”๊ฐ€
# โ†’ State์™€ ์‹ค์ œ ์ธํ”„๋ผ ๋ถˆ์ผ์น˜
# โ†’ ๋ณด์•ˆ ์ทจ์•ฝ์  ํƒ์ง€ ์•ˆ ๋จ

์ฝ˜์†” ์ง์ ‘ ๋ณ€๊ฒฝ ์‹œ State ๋ถˆ์ผ์น˜๋กœ ๋ณด์•ˆ ์ทจ์•ฝ์  ํƒ์ง€ ๋ถˆ๊ฐ€

โœ“ ๊ถŒ์žฅ: Drift Detection + AWS Config

# Terraform Cloud Drift Detection
# Settings > Health > Enable drift detection
# โ†’ Daily ์Šค์บ”์œผ๋กœ ๋ณ€๊ฒฝ ์ž๋™ ํƒ์ง€

# AWS Config๋กœ ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ธฐ๋ก
resource "aws_config_configuration_recorder" "main" {
  recording_group {
    all_supported = true
  }
}

# โ†’ ๋ชจ๋“  ๋ณ€๊ฒฝ ์ž๋™ ๊ธฐ๋ก + ์•Œ๋ฆผ

Drift Detection์œผ๋กœ ๊ณ„ํš๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์ž๋™ ํƒ์ง€

๐Ÿšจ ISMS-P 2.9.1 ์œ„๋ฐ˜ ์‚ฌํ•ญ

โ—

๋ณ€๊ฒฝ๊ด€๋ฆฌ์‹œ์Šคํ…œ ์—†์ด ์ฝ˜์†”์—์„œ ์ง์ ‘ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

โ—

๋“œ๋ฆฌํ”„ํŠธ ํƒ์ง€ ์ฒด๊ณ„ ๋ถ€์žฌ

โ—

๋ณ€๊ฒฝ ์ด๋ ฅ ๊ด€๋ฆฌ ๋ฏธ์ˆ˜ํ–‰

โ—

๋ณด์•ˆ ์˜ํ–ฅ ๋ถ„์„ ์—†์ด ๋ณ€๊ฒฝ ์ ์šฉ

๐Ÿ”

์‚ฌ์ „ ํƒ์ง€ ๋ฐฉ์•ˆ

IaC ์ •์  ๋ถ„์„ ๊ธฐ๋ฐ˜ ๋ณ€๊ฒฝ ๊ฒ€์ฆ

terraform plan ๊ธฐ๋ฐ˜ ๋ณ€๊ฒฝ ํƒ์ง€ ๋กœ์ง

ํŒ๋‹จ ์กฐ๊ฑด ์กฐ๊ฑด ๊ฐ’ ๊ฒฐ๊ณผ
terraform plan ๋ณ€๊ฒฝ์‚ฌํ•ญ ํƒ์ง€ Info - ๊ฒ€ํ†  ํ•„์š”
terraform plan Security Group ๋ณ€๊ฒฝ High - ๋ณด์•ˆ ๊ฒ€ํ†  ํ•„์ˆ˜
terraform plan IAM Policy ๋ณ€๊ฒฝ High - ๋ณด์•ˆ ๊ฒ€ํ†  ํ•„์ˆ˜
terraform plan ์˜ˆ์ƒ์น˜ ๋ชปํ•œ destroy Critical - ์Šน์ธ ํ•„์ˆ˜
Policy Check ์œ„๋ฐ˜ ํƒ์ง€ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๊ฒฝ๊ณ /์ฐจ๋‹จ

๐Ÿ“ Policy as Code ์˜ˆ์‹œ (OPA/Rego)

# OPA/Rego Policy - ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ ๊ฒ€์ฆ
package terraform.change_management

# Security Group ๋ณ€๊ฒฝ ์‹œ ๋ณด์•ˆํŒ€ ์Šน์ธ ํ•„์š”
warn[msg] {
  resource := input.resource_changes[_]
  resource.type == "aws_security_group"
  resource.change.actions[_] != "no-op"
  msg := sprintf("Security Group %s ๋ณ€๊ฒฝ - ๋ณด์•ˆํŒ€ ๊ฒ€ํ†  ํ•„์ˆ˜ (ISMS-P 2.9.1)", [resource.address])
}

# IAM Policy ๋ณ€๊ฒฝ ์‹œ ๋ณด์•ˆํŒ€ ์Šน์ธ ํ•„์š”
warn[msg] {
  resource := input.resource_changes[_]
  contains(resource.type, "aws_iam")
  resource.change.actions[_] != "no-op"
  msg := sprintf("IAM ๋ฆฌ์†Œ์Šค %s ๋ณ€๊ฒฝ - ๋ณด์•ˆํŒ€ ๊ฒ€ํ†  ํ•„์ˆ˜", [resource.address])
}

# ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฆฌ์†Œ์Šค ์‚ญ์ œ ๋ฐฉ์ง€
deny[msg] {
  resource := input.resource_changes[_]
  resource.change.actions[_] == "delete"
  not contains(input.approved_deletions, resource.address)
  msg := sprintf("๋ฆฌ์†Œ์Šค %s ์‚ญ์ œ - ์‚ฌ์ „ ์Šน์ธ ํ•„์š”", [resource.address])
}
๐Ÿ””

์‚ฌํ›„ ๋Œ€์‘ ๋ฐฉ์•ˆ

Runtime ํƒ์ง€ ๋ฐ ๋“œ๋ฆฌํ”„ํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง

๋ณ€๊ฒฝ ํƒ์ง€ ์ด๋ฒคํŠธ ๋Œ€์‘ ๋กœ์ง

ํŒ๋‹จ ์กฐ๊ฑด ์กฐ๊ฑด ๊ฐ’ ๊ฒฐ๊ณผ ์ž๋™ ๋Œ€์‘
๐Ÿ”„ Drift Detection
๋“œ๋ฆฌํ”„ํŠธ ํƒ์ง€ High - ์ฆ‰์‹œ ์•Œ๋ฆผ Auto Alert
๋ณด์•ˆ ๊ด€๋ จ ๋“œ๋ฆฌํ”„ํŠธ Critical - ๊ธด๊ธ‰ ์กฐ์น˜ Auto Remediate
โš™๏ธ AWS Config
๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ ๊ธฐ๋ก Info - ์ด๋ ฅ ์ €์žฅ Auto Log
๊ทœ์ • ์œ„๋ฐ˜ ๋ณ€๊ฒฝ High - ์•Œ๋ฆผ Auto Notify
๐Ÿ“ CloudTrail
Terraform ์™ธ ๋ณ€๊ฒฝ High - ์Šน์ธ ํ™•์ธ ํ•„์š” Auto Alert

๐Ÿ”„ Terraform Cloud Drift Detection

# Terraform Cloud Workspace ์„ค์ •
# Settings > Health > Drift Detection

# 1. Drift Detection ํ™œ์„ฑํ™”
# - Enable drift detection: ON
# - Detection frequency: Daily (๊ถŒ์žฅ) ๋˜๋Š” Weekly

# 2. ์•Œ๋ฆผ ์„ค์ •
# - Slack webhook ์—ฐ๋™
# - Email ์•Œ๋ฆผ
# - Webhook (ITSM ์—ฐ๋™)

# ๋“œ๋ฆฌํ”„ํŠธ ํƒ์ง€ ์‹œ ๋Œ€์‘ ์˜ต์…˜:
# 1. Refresh-only plan: State ์—…๋ฐ์ดํŠธ (๋“œ๋ฆฌํ”„ํŠธ ์ˆ˜์šฉ)
# 2. Regular plan & apply: ์›๋ž˜ ์ƒํƒœ๋กœ ๋ณต์›

# CLI์—์„œ ๋“œ๋ฆฌํ”„ํŠธ ํ™•์ธ
terraform plan -refresh-only
# ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ๋“œ๋ฆฌํ”„ํŠธ ๋ฐœ์ƒ
โœ“

์กฐ์น˜ ๊ฐ€์ด๋“œ

์ฆ‰์‹œ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ถŒ์žฅ ์„ค์ •

โœ“ ๊ถŒ์žฅ ๊ตฌ์„ฑ: AWS Config + Drift Detection

# AWS Config - ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ธฐ๋ก
resource "aws_config_configuration_recorder" "main" {
  name     = "config-recorder"
  role_arn = aws_iam_role.config.arn

  recording_group {
    all_supported                 = true
    include_global_resource_types = true
  }
}

resource "aws_config_delivery_channel" "main" {
  name           = "config-delivery"
  s3_bucket_name = aws_s3_bucket.config.id
  sns_topic_arn  = aws_sns_topic.config_changes.arn

  snapshot_delivery_properties {
    delivery_frequency = "TwentyFour_Hours"
  }
}

# Config Rule - Security Group ๋ณ€๊ฒฝ ๊ฐ์ง€
resource "aws_config_config_rule" "security_group_changes" {
  name = "security-group-open-to-world"

  source {
    owner             = "AWS"
    source_identifier = "RESTRICTED_INCOMING_TRAFFIC"
  }

  tags = {
    Purpose = "Change-Detection"
    ISMS-P  = "2.9.1"
  }
}

๐Ÿ’ก ํ•ต์‹ฌ ํฌ์ธํŠธ

  • Terraform Cloud Drift Detection์œผ๋กœ ๊ณ„ํš๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์ž๋™ ํƒ์ง€
  • AWS Config๋กœ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ ์ด๋ ฅ ์ž๋™ ๊ธฐ๋ก
  • ๋ชจ๋“  ์ธํ”„๋ผ ๋ณ€๊ฒฝ์€ PR ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ terraform plan ๊ฒ€ํ† 
  • ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ ์‹œ ๋ณด์•ˆํŒ€ ์ถ”๊ฐ€ ๊ฒ€ํ†  ํ•„์ˆ˜

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ

๐Ÿ“˜ Terraform Drift Detection ๋ฌธ์„œ โ†— โ˜๏ธ AWS Config ๊ฐ€์ด๋“œ โ†—
๐Ÿ“Š

๋ฆฌํฌํŠธ ๋ฐฉ์•ˆ

ISMS-P ์‹ฌ์‚ฌ ์ฆ์  ๋ฐ ์ •๊ธฐ ๋ณด๊ณ 

๐Ÿ“‹ ์ ๊ฒ€ ํ•ญ๋ชฉ๋ณ„ ์ฆ์ 

์ ๊ฒ€ ํ•ญ๋ชฉ ์ฆ์  ์ž๋ฃŒ
๋ณ€๊ฒฝ๊ด€๋ฆฌ ์ฒด๊ณ„ PR ์›Œํฌํ”Œ๋กœ์šฐ ์„ค์ •, ์Šน์ธ ํ”„๋กœ์„ธ์Šค
๋ณ€๊ฒฝ ์ด๋ ฅ Terraform Run History, AWS Config
์˜ํ–ฅ ๋ถ„์„ terraform plan ๊ฒ€ํ† , ๋ณด์•ˆ ๋ฆฌ๋ทฐ ๋กœ๊ทธ
๋“œ๋ฆฌํ”„ํŠธ ๊ด€๋ฆฌ Drift Detection ์„ค์ •, ์•Œ๋ฆผ/๋Œ€์‘ ์ด๋ ฅ
์Šน์ธ ์ ˆ์ฐจ PR ์Šน์ธ ๋กœ๊ทธ, ITSM ์—ฐ๋™ ๊ธฐ๋ก

๐Ÿค– ์ž๋™ํ™” ์ฆ์  ์ˆ˜์ง‘

# Terraform Cloud Run History ์กฐํšŒ
curl -H "Authorization: Bearer $TFE_TOKEN" \
  "https://app.terraform.io/api/v2/\
workspaces/{id}/runs"

# AWS Config ๋ณ€๊ฒฝ ์ด๋ ฅ
aws configservice \
  get-resource-config-history \
  --resource-type AWS::EC2::SecurityGroup \
  --resource-id sg-12345678

# CloudTrail ๋ณ€๊ฒฝ ๋กœ๊ทธ
aws cloudtrail lookup-events \
  --lookup-attributes \
  AttributeKey=EventSource,\
AttributeValue=ec2.amazonaws.com
โšก

BSG ์ฐจ๋ณ„์ 

๊ธฐ์กด ๋„๊ตฌ๊ฐ€ ๋†“์น˜๋Š” ์ ๊ฒ€ ์˜์—ญ

๊ธฐ์กด ๋„๊ตฌ ๋ฐฉ์‹

์ˆ˜๋™ terraform plan ์‹คํ–‰

  • ๊ฐœ๋ฐœ์ž ์˜์กด์  ๋ณ€๊ฒฝ ํ™•์ธ
  • ๋“œ๋ฆฌํ”„ํŠธ ์ž๋™ ํƒ์ง€ ๋ถˆ๊ฐ€
  • ๋ณ€๊ฒฝ ์ด๋ ฅ ํ†ตํ•ฉ ๊ด€๋ฆฌ ๋ถˆ๊ฐ€

ํ•œ๊ณ„: ๋ณด์•ˆ ์˜ํ–ฅ ๋ถ„์„ ์ž๋™ํ™” ๋ถˆ๊ฐ€, ์ฝ˜์†” ์ง์ ‘ ๋ณ€๊ฒฝ ํƒ์ง€ ๋ถˆ๊ฐ€

BSG ์ ‘๊ทผ ๋ฐฉ์‹

Drift Detection + AWS Config + CloudTrail ํ†ตํ•ฉ

  • ์‚ฌ์ „ ํƒ์ง€: terraform plan ์ž๋™ ๋ถ„์„, ๋ณด์•ˆ ๋ณ€๊ฒฝ ์‹๋ณ„
  • ์‚ฌํ›„ ๋Œ€์‘: ๋“œ๋ฆฌํ”„ํŠธ ์‹ค์‹œ๊ฐ„ ํƒ์ง€, ์ž๋™ ์•Œ๋ฆผ
  • ํ†ตํ•ฉ ์ ๊ฒ€: PR ์›Œํฌํ”Œ๋กœ์šฐ + Config Rule ๊ฒ€์ฆ

์ฐจ๋ณ„์ : ๋ณ€๊ฒฝ ์˜ํ–ฅ ๋ถ„์„ + ๋“œ๋ฆฌํ”„ํŠธ ์ž๋™ํ™” + ์‹ฌ์‚ฌ ์ฆ์  ์ž๋™ํ™”๋กœ ํƒ์ง€ โ†’ ์กฐ์น˜ โ†’ ์ฆ์  ์ „ ๊ณผ์ • ์ž๋™ํ™”

โ† ISMS-P ํ†ต์ œ ํ•ญ๋ชฉ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ