โ† IaC/Terraform Management

ISMS-P 2.8.5 ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ ๊ด€๋ฆฌ High Risk

์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ์ด ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋Š”๊ฐ€?

ISMS-P 2.8.5๋Š” ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œํ•œํ•˜๊ณ  ์šด์˜ํ™˜๊ฒฝ๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” VCS ๊ธฐ๋ฐ˜ ์ ‘๊ทผํ†ต์ œ์™€ Git ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ์ •์ฑ…์„ ํ†ตํ•ด ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹

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

ISMS-P 2.8.5 ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ ๊ด€๋ฆฌ ์š”๊ตฌ์‚ฌํ•ญ

2.8.5

์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ ๊ด€๋ฆฌ

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

"์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ์€ ์ธ๊ฐ€๋œ ์‚ฌ์šฉ์ž๋งŒ์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ฆฌํ•˜๊ณ , ์šด์˜ํ™˜๊ฒฝ์— ๋ณด๊ด€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•˜์—ฌ์•ผ ํ•œ๋‹ค."

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

  • Terraform Cloud VCS-driven ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ์†Œ์Šค์ฝ”๋“œ ์ค‘์•™ ๊ด€๋ฆฌ
  • Git ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™์œผ๋กœ ์ธ๊ฐ€๋œ ์‚ฌ์šฉ์ž๋งŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • State ํŒŒ์ผ S3 Backend ์ €์žฅ (์•”ํ˜ธํ™” + ๋ฒ„์ „๊ด€๋ฆฌ + ์ž ๊ธˆ)
  • ๋น„๋ฐ€์ •๋ณด(Credentials) ์ ˆ๋Œ€ ์ฝ”๋“œ์— ํฌํ•จ ๊ธˆ์ง€

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

  • ๊ฒฐํ•จ: ํ˜•์ƒ๊ด€๋ฆฌ์‹œ์Šคํ…œ ์—†์ด ๊ฐœ๋ฐœ์ž PC์—๋งŒ ์†Œ์Šค์ฝ”๋“œ ๋ณด๊ด€
  • ๊ฒฐํ•จ: ์†Œ์Šค์ฝ”๋“œ ์ ‘๊ทผ๊ถŒํ•œ ๊ด€๋ฆฌ ๋ฏธํก (์ „ ์ง์› ์ ‘๊ทผ ๊ฐ€๋Šฅ)
  • ๊ฒฐํ•จ: ์šด์˜ ์„œ๋ฒ„์— ์†Œ์Šค์ฝ”๋“œ ์ง์ ‘ ๋ฐฐํฌ ๋ฐ ๋ณด๊ด€
  • ๊ถŒ๊ณ : ์†Œ์Šค์ฝ”๋“œ ๋ณ€๊ฒฝ์ด๋ ฅ ๊ด€๋ฆฌ ๋ฏธ์ˆ˜ํ–‰
๐Ÿ“„ KISA ISMS-P ์ธ์ฆ๊ธฐ์ค€ ์•ˆ๋‚ด์„œ โ†— โ˜๏ธ AWS K-ISMS ๊ทœ์ • ์ค€์ˆ˜ โ†—
๐Ÿ“ฐ

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

์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ ๊ด€๋ฆฌ ๋ฏธํก์œผ๋กœ ๋ฐœ์ƒํ•œ ์‹ค์ œ ์‚ฌ๊ณ 

2023๋…„

ํŠธ์œ„ํ„ฐ ์†Œ์Šค์ฝ”๋“œ GitHub ์œ ์ถœ

ํŠธ์œ„ํ„ฐ์˜ ๋น„๋ฐ€ ์†Œ์Šค์ฝ”๋“œ ์ผ๋ถ€๊ฐ€ GitHub์— 3๊ฐœ์›”๊ฐ„ ๊ณต๊ฐœ๋˜๋Š” ์‚ฌ๊ณ  ๋ฐœ์ƒ. ๋‚ด๋ถ€ ์ง์›์ด ์‹ค์ˆ˜ ๋˜๋Š” ์˜๋„์ ์œผ๋กœ ๊ณต๊ฐœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์—…๋กœ๋“œํ•˜์—ฌ ๋ณด์•ˆ ์ทจ์•ฝ์  ๋…ธ์ถœ ๋ฐ ์ €์ž‘๊ถŒ ์นจํ•ด ์šฐ๋ ค๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ๊ตํ›ˆ: Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ ‘๊ทผ๊ถŒํ•œ ์—„๊ฒฉ ๊ด€๋ฆฌ, ๋ฏผ๊ฐ ์ฝ”๋“œ ๊ฐ์ง€ ์‹œ์Šคํ…œ ํ•„์š”

2024.05

Git ์„œ๋ธŒ๋ชจ๋“ˆ RCE ์ทจ์•ฝ์  CVE-2024-32002

Git์˜ ์„œ๋ธŒ๋ชจ๋“ˆ ๊ธฐ๋Šฅ ์ทจ์•ฝ์ ์œผ๋กœ ์•…์˜์  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ clone ์‹œ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE) ๊ฐ€๋Šฅ. git clone --recurse-submodules ๋ช…๋ น์–ด๋กœ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ .git ๋””๋ ‰ํ† ๋ฆฌ์— ๊ธฐ๋ก๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ๊ตํ›ˆ: Git ํด๋ผ์ด์–ธํŠธ ์ตœ์‹  ๋ฒ„์ „ ์œ ์ง€, ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ clone ์ฃผ์˜

โšก

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

Terraform์—์„œ ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ ๊ด€๋ฆฌ๊ฐ€ ์œ„๋ฐ˜๋˜๋Š” ์ƒํ™ฉ

๋กœ์ปฌ ๊ด€๋ฆฌ + ๋ฏผ๊ฐ์ •๋ณด ํ•˜๋“œ์ฝ”๋”ฉ (์œ„ํ—˜)

# State - ๋กœ์ปฌ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌ (์œ„ํ—˜!)
terraform {
  # backend ๋ฏธ์„ค์ •
}

# ๋ฏผ๊ฐ ์ •๋ณด ํ•˜๋“œ์ฝ”๋”ฉ (์œ„ํ—˜!)
resource "aws_db_instance" "main" {
  password = "SuperSecret123!"
}

State ํŒŒ์ผ์ด ๋กœ์ปฌ์— ํ‰๋ฌธ ์ €์žฅ โ†’ ๋ฏผ๊ฐ ์ •๋ณด ๋…ธ์ถœ ์œ„ํ—˜

S3 Backend + Secrets Manager (๊ถŒ์žฅ)

# S3 Backend - ์•”ํ˜ธํ™” + ์ž ๊ธˆ
terraform {
  backend "s3" {
    bucket       = "state-bucket"
    encrypt      = true
    use_lockfile = true
  }
}

# Secrets Manager ์ฐธ์กฐ
password = data.aws_secretsmanager_secret_version.db.secret_string

State ํŒŒ์ผ ์•”ํ˜ธํ™” + ๋ฒ„์ „๊ด€๋ฆฌ โ†’ ๊ทœ์ • ์ค€์ˆ˜ ์ถฉ์กฑ

๐Ÿšจ

๋ฐœ๊ฒฌ ์‚ฌ๋ก€: IaC ์ฝ”๋“œ์— ๋ฏผ๊ฐ์ •๋ณด ํ•˜๋“œ์ฝ”๋”ฉ ๋ฐ ๋กœ์ปฌ State ๊ด€๋ฆฌ

AWS ์ž๊ฒฉ์ฆ๋ช…์ด Provider์— ํ•˜๋“œ์ฝ”๋”ฉ๋˜๊ณ , terraform.tfstate๊ฐ€ ๋กœ์ปฌ์— ๋ณด๊ด€๋˜์–ด ํ˜•์ƒ๊ด€๋ฆฌ ๋ฐ ์ ‘๊ทผํ†ต์ œ ๋ฏธํก ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

ISMS-P 2.8.5 ์œ„๋ฐ˜ ์‚ฌํ•ญ

โ—

ํ˜•์ƒ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์—†์ด ๋กœ์ปฌ์—๋งŒ ์†Œ์Šค์ฝ”๋“œ ๋ณด๊ด€

โ—

State ํŒŒ์ผ ์•”ํ˜ธํ™” ๋ฐ ์ž ๊ธˆ ๋ฏธ์ ์šฉ

โ—

๋ฏผ๊ฐ ์ •๋ณด(Credentials)๊ฐ€ ์†Œ์Šค์ฝ”๋“œ์— ํฌํ•จ

โ—

์†Œ์Šค์ฝ”๋“œ ์ ‘๊ทผ๊ถŒํ•œ ๊ด€๋ฆฌ ๋ฏธ์ˆ˜ํ–‰

๐Ÿ”

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

IaC ์ฝ”๋“œ ๋ถ„์„ ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ์ „ ์ ๊ฒ€

์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ ๊ด€๋ฆฌ ํƒ์ง€ ๋กœ์ง

ํŒ๋‹จ ์กฐ๊ฑด ์กฐ๊ฑด ๊ฐ’ ๊ฒฐ๊ณผ
๐Ÿ“ฆ Terraform Backend
์„ค์ • ์—†์Œ (local) Critical - ์ฐจ๋‹จ
S3 + encrypt = true โœ“ ํ†ต๊ณผ
๐Ÿ”‘ ๋ฏผ๊ฐ์ •๋ณด
access_key/secret_key ํ•˜๋“œ์ฝ”๋”ฉ Critical - ์ฐจ๋‹จ
password ๋“ฑ ๋ฏผ๊ฐ๊ฐ’ ํ‰๋ฌธ Critical - ์ฐจ๋‹จ
๐Ÿ”’ State Locking
use_lockfile ๋ฏธ์„ค์ • High - ๊ฒฝ๊ณ 
์ž ๊ธˆ ์„ค์ •๋จ โœ“ ํ†ต๊ณผ
๐Ÿ””

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

๋Ÿฐํƒ€์ž„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์ด์ƒํ–‰์œ„ ํƒ์ง€

์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ ๋Ÿฐํƒ€์ž„ ์ด๋ฒคํŠธ ๋Œ€์‘ ๋กœ์ง

ํŒ๋‹จ ์กฐ๊ฑด ์กฐ๊ฑด ๊ฐ’ ๊ฒฐ๊ณผ
๐Ÿ” GitHub Secret Scanning
๋ฏผ๊ฐ์ •๋ณด ํƒ์ง€๋จ Critical - ์ฆ‰์‹œ ํ‚ค ๊ต์ฒด
๋ฏผ๊ฐ์ •๋ณด ์—†์Œ โœ“ ํ†ต๊ณผ
๐Ÿ“‚ S3 Bucket
Public Access ํ—ˆ์šฉ Critical - ์ฐจ๋‹จ
.tfstate ํŒŒ์ผ Git ์ปค๋ฐ‹ Critical - ์‚ญ์ œ ๊ถŒ๊ณ 
๐Ÿ›ก๏ธ Branch Protection
๋ฏธ์„ค์ • High - ์„ค์ • ๊ถŒ๊ณ 
PR ์Šน์ธ ํ•„์ˆ˜ ์„ค์ •๋จ โœ“ ํ†ต๊ณผ

๋ชจ๋“  ์•Œ๋ฆผ์— ํฌํ•จ๋˜๋Š” ์ •๋ณด

๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ด๋ฆ„ ํƒ์ง€๋œ ๋ฏผ๊ฐ์ •๋ณด ์œ ํ˜• ์ปค๋ฐ‹ ์ž‘์„ฑ์ž ์กฐ์น˜ ๊ฐ€์ด๋“œ ๋งํฌ
โœ“

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

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

โŒ ๋ฌธ์ œ

๋กœ์ปฌ State ๊ด€๋ฆฌ + ๋ฏผ๊ฐ์ •๋ณด ํ•˜๋“œ์ฝ”๋”ฉ

โœ“ ์ ์šฉ

S3 Backend + Secrets Manager + VCS-driven ์›Œํฌํ”Œ๋กœ์šฐ

๊ถŒ์žฅ ์„ค์ • (๋ณต์‚ฌํ•˜์—ฌ ์ ์šฉ)
backend.tf
# S3 Backend - ์•”ํ˜ธํ™” + ์ž ๊ธˆ
terraform {
  backend "s3" {
    bucket       = "my-terraform-state-bucket"
    key          = "production/terraform.tfstate"
    region       = "ap-northeast-2"
    encrypt      = true  # โœ“ SSE-S3 ์•”ํ˜ธํ™”
    kms_key_id   = "alias/terraform-state-key"
    use_lockfile = true  # โœ“ TF 1.10+ Native Locking
  }
}

# ๋ฏผ๊ฐ ์ •๋ณด - Secrets Manager ์ฐธ์กฐ
data "aws_secretsmanager_secret_version" "db_password" {
  secret_id = "production/db/password"
}

resource "aws_db_instance" "main" {
  identifier = "production-db"
  username   = "admin"
  password   = data.aws_secretsmanager_secret_version.db_password.secret_string

  tags = {
    ISMS-P = "2.8.5"
  }
}

๐Ÿ’ก ํ•ต์‹ฌ: S3 Backend์— encrypt = true์™€ use_lockfile = true๋ฅผ ์„ค์ •ํ•˜๋ฉด State ํŒŒ์ผ์ด ์•”ํ˜ธํ™”๋˜๊ณ  ๋™์‹œ ์ ‘๊ทผ์ด ๋ฐฉ์ง€๋ฉ๋‹ˆ๋‹ค. ๋ฏผ๊ฐ์ •๋ณด๋Š” ์ ˆ๋Œ€ ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ  Secrets Manager๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๐Ÿ“ฆ Terraform S3 Backend ๋ฌธ์„œ โ†— ๐Ÿ” GitHub Secret Scanning ๊ฐ€์ด๋“œ โ†— ๐Ÿ”’ ISMS-P ์ธ์ฆ๊ธฐ์ค€ ์•ˆ๋‚ด์„œ โ†—
๐Ÿ“Š

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

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

๐Ÿ“‹ ์ง„๋‹จ ํ•ญ๋ชฉ

  • ํ˜•์ƒ๊ด€๋ฆฌ ์ฒด๊ณ„ (VCS ์—ฐ๋™ ์—ฌ๋ถ€)
  • ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ ‘๊ทผ๊ถŒํ•œ ์„ค์ •
  • ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™ ์ ์šฉ ์—ฌ๋ถ€
  • State ํŒŒ์ผ ์•”ํ˜ธํ™”/์ž ๊ธˆ ์ƒํƒœ
  • ๋ฏผ๊ฐ์ •๋ณด ํƒ์ง€ ํ˜„ํ™ฉ

๐Ÿ“… ๋ฆฌํฌํŠธ ์ฃผ๊ธฐ

์ผ๊ฐ„

๋ฏผ๊ฐ์ •๋ณด ํƒ์ง€ ์•Œ๋ฆผ

์ฃผ๊ฐ„

์†Œ์Šค์ฝ”๋“œ ๋ณด์•ˆ ํ˜„ํ™ฉ ์š”์•ฝ

์›”๊ฐ„

ISMS-P ์ฆ์  ๋ฆฌํฌํŠธ

๐Ÿ“ค ๋ฐœ์†ก ๋ฐ ์ €์žฅ

๋ฐœ์†ก ์ฑ„๋„

Email Slack

์ €์žฅ์†Œ

S3 (5๋…„ ๋ณด๊ด€)
โšก

BSG ์ฐจ๋ณ„์ 

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

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

๋‹จ์ˆœ ํŒจํ„ด ๋งค์นญ

  • ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋น„๋ฐ€์ •๋ณด ํŒจํ„ด ๊ฒ€์ƒ‰
  • password = "..." ์ •๊ทœ์‹ ํƒ์ง€
  • ์ •์  ๋ถ„์„ ๊ฒฐ๊ณผ๋งŒ ์ถœ๋ ฅ

ํ•œ๊ณ„: Backend ์„ค์ • ์ ์ •์„ฑ ๊ฒ€์ฆ ๋ถˆ๊ฐ€, VCS ์—ฐ๋™ ๋ฐ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ์ƒํƒœ ํ™•์ธ ๋ถˆ๊ฐ€

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

IaC ์ „์ฒด ๋ถ„์„ + VCS ์—ฐ๋™ + State ๋ณด์•ˆ ํ†ตํ•ฉ

  • Backend ์„ค์ •, ์•”ํ˜ธํ™”, ์ž ๊ธˆ ๊ฒ€์ฆ
  • GitHub Secret Scanning ์—ฐ๋™
  • VCS ์›Œํฌํ”Œ๋กœ์šฐ + ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ์ผ๊ด„ ๊ฒ€์ฆ

์ฐจ๋ณ„์ : ์†Œ์Šค์ฝ”๋“œ-State-๋ฐฐํฌ ์ „ ๊ณผ์ • ๋ณด์•ˆ ์ฒด๊ณ„ ํƒ์ง€ โ†’ ์กฐ์น˜ โ†’ ์ฆ์  ์ž๋™ํ™”

โ† IaC/Terraform Management๋กœ ๋Œ์•„๊ฐ€๊ธฐ