โ† IaC/Terraform Management

ISMS-P 2.8.6 ์šด์˜ํ™˜๊ฒฝ ์ด๊ด€ High Risk

์šด์˜ํ™˜๊ฒฝ ์ด๊ด€์ด ์ ์ ˆํžˆ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋Š”๊ฐ€?

ISMS-P 2.8.6์€ ์‹ ๊ทœ ๋„์ž…ยท๊ฐœ๋ฐœ ๋ฐ ๋ณ€๊ฒฝ๋œ ์‹œ์Šคํ…œ์„ ์šด์˜ํ™˜๊ฒฝ์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ด๊ด€ํ•˜๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” Workspace ๋ถ„๋ฆฌ์™€ CI/CD ์Šน์ธ ๊ฒŒ์ดํŠธ๋ฅผ ํ†ตํ•ด ์•ˆ์ „ํ•œ ์ด๊ด€ ์ฒด๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹

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

ISMS-P 2.8.6 ์šด์˜ํ™˜๊ฒฝ ์ด๊ด€ ์š”๊ตฌ์‚ฌํ•ญ

2.8.6

์šด์˜ํ™˜๊ฒฝ ์ด๊ด€

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

"์‹ ๊ทœ ๋„์ž…ยท๊ฐœ๋ฐœ ๋ฐ ๋ณ€๊ฒฝ๋œ ์‹œ์Šคํ…œ์„ ์šด์˜ํ™˜๊ฒฝ์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ด๊ด€ํ•˜๊ธฐ ์œ„ํ•œ ํ†ต์ œ ์ ˆ์ฐจ๋ฅผ ์ˆ˜๋ฆฝยท์ดํ–‰ํ•˜์—ฌ์•ผ ํ•œ๋‹ค."

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

  • Terraform Cloud Workspace๋กœ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ (dev/staging/prod)
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์Šน์ธ ์ ˆ์ฐจ ํ•„์ˆ˜ (DevSecOps)
  • ์šด์˜ํ™˜๊ฒฝ ์ด๊ด€ ์‹คํŒจ ์‹œ Rollback ๋ฐฉ์•ˆ ๋งˆ๋ จ
  • ์šด์˜ ์„œ๋ฒ„์— ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ๋ฏธ์กด์žฌ ๊ด€๋ฆฌ
  • ์ด๊ด€ ์ „ ๊ฒ€ํ† ยท์Šน์ธ ์ ˆ์ฐจ ๋ฌธ์„œํ™”

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

  • ๊ฒฐํ•จ: ์šด์˜ํ™˜๊ฒฝ ์ด๊ด€ ์‹œ ๊ฒ€ํ† ยท์Šน์ธ ์ ˆ์ฐจ ๋ฏธ์ˆ˜๋ฆฝ
  • ๊ฒฐํ•จ: ์šด์˜์„œ๋ฒ„์— ์†Œ์Šค์ฝ”๋“œ, ๋ฐฑ์—…๋ณธ ๋“ฑ ๋ถˆํ•„์š” ํŒŒ์ผ ์กด์žฌ
  • ๊ฒฐํ•จ: ์ด๊ด€ ์‹คํŒจ ์‹œ ๋ณต๊ตฌ(Rollback) ์ ˆ์ฐจ ๋ฏธ๋งˆ๋ จ
  • ๊ถŒ๊ณ : ๋ณ€๊ฒฝ์ž‘์—… ์š”์ฒญ์„œ ๋ฐ ๊ฒฐ๊ณผ์„œ ๋ฏธ์ž‘์„ฑ
๐Ÿ“„ KISA ISMS-P ์ธ์ฆ๊ธฐ์ค€ ์•ˆ๋‚ด์„œ โ†—
๐Ÿ“ฐ

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

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

2022๋…„

๋ž™์ŠคํŽ˜์ด์Šค ํŒจ์น˜ ๋ฏธ์ ์šฉ ์‚ฌ๊ณ 

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

๐Ÿ’ก ๊ตํ›ˆ: ๋ณด์•ˆ ํŒจ์น˜ ์‹ ์† ์ด๊ด€ ํ•„์ˆ˜, ์ž๋™ํ™”๋œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

2024.01

TalentHook ์„ค์ • ์˜ค๋ฅ˜๋กœ 2,600๋งŒ๊ฑด ์œ ์ถœ

ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ์ด๊ด€ ์‹œ ์ ‘๊ทผ ๊ถŒํ•œ ์„ค์ • ์˜ค๋ฅ˜๋กœ 'Public Read' ์ƒํƒœ๋กœ ๋ฐฐํฌ๋˜์–ด 2,600๋งŒ ๊ฑด์˜ ์ด๋ ฅ์„œ๊ฐ€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ด€ ์ „ ๋ณด์•ˆ ์„ค์ • ๊ฒ€์ฆ์ด ์—†์—ˆ๋˜ ๊ฒƒ์ด ์›์ธ์ž…๋‹ˆ๋‹ค.

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

โšก

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

ํ™˜๊ฒฝ ๋ฏธ๋ถ„๋ฆฌ ๋ฐ ์Šน์ธ ์—†๋Š” ๋ฐฐํฌ์˜ ์œ„ํ—˜์„ฑ

โŒ ์œ„ํ—˜: ํ™˜๊ฒฝ ๋ฏธ๋ถ„๋ฆฌ + ์Šน์ธ ์—†๋Š” ๋ฐฐํฌ

# ๋‹จ์ผ Workspace์—์„œ ๋ชจ๋“  ํ™˜๊ฒฝ ๊ด€๋ฆฌ (์œ„ํ—˜!)
terraform {
  cloud {
    organization = "my-company"
    workspaces {
      name = "all-environments"  # ๊ตฌ๋ถ„ ์—†์Œ!
    }
  }
}

# ํ™˜๊ฒฝ ๊ตฌ๋ถ„ ์—†์ด ํ•˜๋“œ์ฝ”๋”ฉ (์œ„ํ—˜!)
resource "aws_instance" "web" {
  instance_type = "t3.large"  # prod๊ฐ€ dev์—๋„ ์ ์šฉ
}

# ์Šน์ธ ์—†์ด ์ง์ ‘ ๋ฐฐํฌ (์œ„ํ—˜!)
# terraform apply -auto-approve

๋‹จ์ผ Workspace์—์„œ ๋ชจ๋“  ํ™˜๊ฒฝ ๊ด€๋ฆฌ ์‹œ ์‹ค์ˆ˜๋กœ ์šด์˜ํ™˜๊ฒฝ ๋ณ€๊ฒฝ ์œ„ํ—˜

โœ“ ๊ถŒ์žฅ: ํ™˜๊ฒฝ๋ณ„ Workspace + ์Šน์ธ ๊ฒŒ์ดํŠธ

# ํ™˜๊ฒฝ๋ณ„ Workspace ๋ถ„๋ฆฌ
terraform {
  cloud {
    organization = "my-company"
    workspaces {
      tags = ["app:web-service"]
      # web-service-dev
      # web-service-staging
      # web-service-prod
    }
  }
}

# ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋ถ„๊ธฐ
resource "aws_instance" "web" {
  instance_type = var.instance_type
  tags = { Environment = var.environment }
}

ํ™˜๊ฒฝ๋ณ„ Workspace ๋ถ„๋ฆฌ๋กœ ์•ˆ์ „ํ•œ ์ด๊ด€ ์ฒด๊ณ„ ๊ตฌ์ถ•

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

โ—

๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ/์šด์˜ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ๋ฏธํก

โ—

์šด์˜ํ™˜๊ฒฝ ์ด๊ด€ ์Šน์ธ ์ ˆ์ฐจ ์—†์Œ

โ—

์ด๊ด€ ์‹คํŒจ ์‹œ Rollback ์ฒด๊ณ„ ๋ถ€์žฌ

โ—

ํ™˜๊ฒฝ๋ณ„ ์„ค์ • ๊ด€๋ฆฌ ๋ฏธํก

๐Ÿ”

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

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

ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ํƒ์ง€ ๋กœ์ง

ํŒ๋‹จ ์กฐ๊ฑด ์กฐ๊ฑด ๊ฐ’ ๊ฒฐ๊ณผ
๐Ÿ“ฆ Workspace
ํ™˜๊ฒฝ๋ณ„ ๋ถ„๋ฆฌ ์—†์Œ (๋‹จ์ผ Workspace) High - ๊ฒฝ๊ณ 
dev/staging/prod ๋ถ„๋ฆฌ โœ“ ํ†ต๊ณผ
๐Ÿ“ Variables
ํ™˜๊ฒฝ๋ณ„ tfvars ๋ฏธ๋ถ„๋ฆฌ Medium - ๊ถŒ๊ณ 
ํ™˜๊ฒฝ๋ณ„ ์„ค์ • ํŒŒ์ผ ์กด์žฌ โœ“ ํ†ต๊ณผ
๐Ÿ’พ Backend
S3 ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฏธํ™œ์„ฑํ™” High - Rollback ๋ถˆ๊ฐ€
S3 ๋ฒ„์ „ ๊ด€๋ฆฌ ํ™œ์„ฑํ™” โœ“ ํ†ต๊ณผ

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

# OPA/Rego Policy - ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ๊ฒ€์ฆ
package terraform.environment_migration

deny[msg] {
  workspace := input.workspace.name
  not contains(workspace, "-dev")
  not contains(workspace, "-staging")
  not contains(workspace, "-prod")
  msg := "Workspace ์ด๋ฆ„์— ํ™˜๊ฒฝ ๊ตฌ๋ถ„ ํ•„์ˆ˜ (-dev/-staging/-prod)"
}

deny[msg] {
  resource := input.resource_changes[_]
  resource.change.actions[_] == "create"
  not resource.change.after.tags.Environment
  msg := sprintf("๋ฆฌ์†Œ์Šค %s์— Environment ํƒœ๊ทธ ํ•„์ˆ˜ - ISMS-P 2.8.6", [resource.address])
}

# prod ํ™˜๊ฒฝ ์ง์ ‘ ๋ฐฐํฌ ๋ฐฉ์ง€
deny[msg] {
  workspace := input.workspace.name
  contains(workspace, "-prod")
  input.run.auto_apply == true
  msg := "Production ํ™˜๊ฒฝ auto-apply ๊ธˆ์ง€ - ์ˆ˜๋™ ์Šน์ธ ํ•„์ˆ˜"
}
๐Ÿ””

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

Runtime ํƒ์ง€ ๋ฐ ์ด๊ด€ ์ ˆ์ฐจ ๋ชจ๋‹ˆํ„ฐ๋ง

์šด์˜ํ™˜๊ฒฝ ์ด๊ด€ ์ด๋ฒคํŠธ ๋Œ€์‘ ๋กœ์ง

ํŒ๋‹จ ์กฐ๊ฑด ์กฐ๊ฑด ๊ฐ’ ๊ฒฐ๊ณผ ์ž๋™ ๋Œ€์‘
โ˜๏ธ Terraform Cloud
Manual Approve ๋ฏธ์„ค์ • High - ๊ฒฝ๊ณ  Auto Notify
Manual Approve ํ™œ์„ฑํ™” โœ“ ํ†ต๊ณผ -
๐Ÿ”„ CI/CD
prod ์ง์ ‘ ๋ฐฐํฌ ๊ฐ€๋Šฅ Critical - ์ฐจ๋‹จ Auto Block
์Šน์ธ ๊ฒŒ์ดํŠธ ์กด์žฌ โœ“ ํ†ต๊ณผ -
๐Ÿ’พ State/Run
์ด์ „ ๋ฒ„์ „ ์—†์Œ (Rollback ๋ถˆ๊ฐ€) High - ๊ฒฝ๊ณ  Auto Alert
๋ณ€๊ฒฝ ์ด๋ ฅ ๋ฏธ๊ธฐ๋ก High - ๊ฒฝ๊ณ  Auto Log

๐Ÿ”„ CI/CD ์Šน์ธ ๊ฒŒ์ดํŠธ ์„ค์ • (GitHub Actions)

# GitHub Actions - ํ™˜๊ฒฝ๋ณ„ ์Šน์ธ ๊ฒŒ์ดํŠธ
name: Terraform Deployment

jobs:
  deploy-dev:
    runs-on: ubuntu-latest
    environment: development  # ์ž๋™ ์Šน์ธ
    steps:
      - name: Deploy to Dev
        run: terraform apply -auto-approve

  deploy-staging:
    needs: deploy-dev
    runs-on: ubuntu-latest
    environment: staging  # ์ˆ˜๋™ ์Šน์ธ ํ•„์š”
    steps:
      - name: Deploy to Staging
        run: terraform apply staging.tfplan

  deploy-prod:
    needs: deploy-staging
    runs-on: ubuntu-latest
    environment: production  # ์ˆ˜๋™ ์Šน์ธ + ์ถ”๊ฐ€ ๊ฒ€ํ† ์ž
    steps:
      - name: Deploy to Production
        run: terraform apply prod.tfplan
โœ“

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

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

โœ“ ๊ถŒ์žฅ ๊ตฌ์„ฑ: Workspace ๋ถ„๋ฆฌ + ํ™˜๊ฒฝ๋ณ„ Variables

# Terraform Cloud - ํ™˜๊ฒฝ๋ณ„ Workspace ๋ถ„๋ฆฌ
terraform {
  cloud {
    organization = "my-company"

    workspaces {
      tags = ["app:web-service"]
      # dev, staging, prod ๋ณ„๋„ Workspace ์ƒ์„ฑ
      # web-service-dev, web-service-staging, web-service-prod
    }
  }
}

# ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ •์˜
variable "environment" {
  description = "Deployment environment"
  type        = string
  validation {
    condition     = contains(["dev", "staging", "prod"], var.environment)
    error_message = "Environment must be dev, staging, or prod."
  }
}

# ํ™˜๊ฒฝ๋ณ„ ๋ฆฌ์†Œ์Šค ์„ค์ •
resource "aws_instance" "web" {
  ami           = data.aws_ami.amazon_linux.id
  instance_type = var.instance_type  # ํ™˜๊ฒฝ๋ณ„ tfvars์—์„œ ์ •์˜

  tags = {
    Name        = "web-${var.environment}"
    Environment = var.environment
    ISMS-P      = "2.8.6"
  }
}
dev.tfvars
environment   = "dev"
instance_type = "t3.micro"
min_instances = 1
staging.tfvars
environment   = "staging"
instance_type = "t3.small"
min_instances = 2
prod.tfvars
environment   = "prod"
instance_type = "t3.large"
min_instances = 3

๐Ÿ’ก ํ•ต์‹ฌ: Terraform Cloud Workspace๋ฅผ ํ™˜๊ฒฝ๋ณ„(dev/staging/prod)๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ฐ ํ™˜๊ฒฝ์€ ๋ณ„๋„์˜ tfvars ํŒŒ์ผ๋กœ ์„ค์ • ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. staging๊ณผ production ๋ฐฐํฌ ์‹œ Manual Approve ํ•„์ˆ˜.

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

๐Ÿ“˜ Terraform Cloud Workspaces ๋ฌธ์„œ โ†— ๐Ÿ”„ GitHub Environments ๊ฐ€์ด๋“œ โ†—
๐Ÿ“Š

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

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

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

์ ๊ฒ€ ํ•ญ๋ชฉ ์ฆ์  ์ž๋ฃŒ
ํ™˜๊ฒฝ ๋ถ„๋ฆฌ Terraform Cloud Workspace ๋ชฉ๋ก
์Šน์ธ ์ ˆ์ฐจ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ •, ์Šน์ธ ๋กœ๊ทธ
Rollback ์ฒด๊ณ„ S3 State ๋ฒ„์ „ ์ด๋ ฅ, ๋ณต๊ตฌ ํ…Œ์ŠคํŠธ
๋ณ€๊ฒฝ ์ด๋ ฅ Terraform Cloud Run History
์ด๊ด€ ๋ฌธ์„œํ™” ๋ณ€๊ฒฝ์ž‘์—… ์š”์ฒญ์„œ, ๊ฒฐ๊ณผ์„œ

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

# Terraform Cloud API๋กœ Workspace ๋ชฉ๋ก
curl -H "Authorization: Bearer $TFE_TOKEN" \
  "https://app.terraform.io/api/v2/\
organizations/my-org/workspaces"

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

# State ๋ฒ„์ „ ์ด๋ ฅ ํ™•์ธ
aws s3api list-object-versions \
  --bucket terraform-state \
  --prefix production/

# GitHub Environment ์Šน์ธ ์„ค์ •
gh api repos/{owner}/{repo}/environments
โšก

BSG ์ฐจ๋ณ„์ 

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

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

๋ฆฌ์†Œ์Šค ํƒœ๊ทธ ํ™•์ธ ์ˆ˜์ค€

  • Environment ํƒœ๊ทธ ์กด์žฌ ์—ฌ๋ถ€
  • ๊ธฐ๋ณธ์ ์ธ ๋ฆฌ์†Œ์Šค ๊ตฌ์„ฑ ๊ฒ€์‚ฌ

ํ•œ๊ณ„: Workspace ๋ถ„๋ฆฌ ์ƒํƒœ ๊ฒ€์ฆ ๋ถˆ๊ฐ€, CI/CD ์Šน์ธ ์ ˆ์ฐจ ํ™•์ธ ๋ถˆ๊ฐ€, Rollback ์ฒด๊ณ„ ์œ ๋ฌด ํ™•์ธ ๋ถˆ๊ฐ€

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

Terraform Cloud API + CI/CD ์—ฐ๋™ + State ๋ถ„์„

  • ์‚ฌ์ „ ํƒ์ง€: ํ™˜๊ฒฝ ๋ถ„๋ฆฌ, tfvars ๊ตฌ์กฐ, State ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ฒ€์ฆ
  • ์‚ฌํ›„ ๋Œ€์‘: Run History ๋ชจ๋‹ˆํ„ฐ๋ง, ์Šน์ธ ์ ˆ์ฐจ ๊ฐ์‚ฌ
  • ํ†ตํ•ฉ ์ ๊ฒ€: Workspace + CI/CD + ๋ณ€๊ฒฝ ์ด๋ ฅ ์ผ๊ด„ ๊ฒ€์ฆ

์ฐจ๋ณ„์ : ์ด๊ด€ ์ ˆ์ฐจ ์ „์ฒด ์ž๋™ํ™” + Rollback ์ฒด๊ณ„ ๊ฒ€์ฆ์œผ๋กœ ํƒ์ง€ โ†’ ์กฐ์น˜ โ†’ ์ฆ์  ์ „ ๊ณผ์ • ์ž๋™ํ™”

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