โ† CI/CD Pipeline Operations

ISMS-P 2.8.3 ์‹œํ—˜๊ณผ ์šด์˜ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ High Risk

์‹œํ—˜๊ณผ ์šด์˜ ํ™˜๊ฒฝ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š”๊ฐ€?

ISMS-P 2.8.3์€ ๊ฐœ๋ฐœ ๋ฐ ์‹œํ—˜ ์‹œ์Šคํ…œ์„ ์šด์˜์‹œ์Šคํ…œ๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋น„์ธ๊ฐ€ ์ ‘๊ทผ ๋ฐ ๋ณ€๊ฒฝ์˜ ์œ„ํ—˜์„ ๊ฐ์†Œ์‹œํ‚ค๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. AWS Multi-Account ์ „๋žต์œผ๋กœ ๊ฐœ๋ฐœ/์šด์˜ ํ™˜๊ฒฝ์„ ๋ถ„๋ฆฌํ•˜๊ณ , SCP๋กœ ๊ฐœ๋ฐœ์ž์˜ ์šด์˜ ํ™˜๊ฒฝ ์ ‘๊ทผ์„ ํ†ต์ œํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹

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

ISMS-P 2.8.3 ์‹œํ—˜๊ณผ ์šด์˜ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ์š”๊ตฌ์‚ฌํ•ญ

2.8.3

์‹œํ—˜๊ณผ ์šด์˜ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ

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

"๊ฐœ๋ฐœ ๋ฐ ์‹œํ—˜ ์‹œ์Šคํ…œ์€ ์šด์˜์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋น„์ธ๊ฐ€ ์ ‘๊ทผ ๋ฐ ๋ณ€๊ฒฝ์˜ ์œ„ํ—˜์„ ๊ฐ์†Œ์‹œํ‚ค๊ธฐ ์œ„ํ•˜์—ฌ ์›์น™์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ์•ผ ํ•œ๋‹ค."

๐Ÿ“Œ AWS Multi-Account ๋ถ„๋ฆฌ ์š”์†Œ

  • AWS Organizations ๊ณ„์ • ๋ถ„๋ฆฌ
  • Control Tower ๊ฑฐ๋ฒ„๋„Œ์Šค
  • SCP (Service Control Policy)
  • VPC ๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ
  • IAM Role ํ™˜๊ฒฝ๋ณ„ ๋ถ„๋ฆฌ

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

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

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

ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ๋ฏธํก์œผ๋กœ ๋ฐœ์ƒํ•œ ์‹ค์ œ ์‚ฌ๊ณ 

2025.03

GitHub Actions ๊ณต๊ธ‰๋ง ๊ณต๊ฒฉ

๊ณต๊ฒฉ์ž๊ฐ€ tj-actions ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์•…์„ฑ์ฝ”๋“œ ์‚ฝ์ž…. CI/CD ํ™˜๊ฒฝ์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜, ํ† ํฐ, ๊ถŒํ•œ ์ •๋ณด ํƒˆ์ทจ. ๊ฐœ๋ฐœ-์šด์˜ ํŒŒ์ดํ”„๋ผ์ธ ๋ฏธ๋ถ„๋ฆฌ๋กœ ์šด์˜ ํ™˜๊ฒฝ๊นŒ์ง€ ํ”ผํ•ด ํ™•์‚ฐ.

๐Ÿ’ก ๊ตํ›ˆ: CI/CD ํ™˜๊ฒฝ๋ณ„ ๋ถ„๋ฆฌ, ๊ฐœ๋ฐœ/์šด์˜ ํŒŒ์ดํ”„๋ผ์ธ ๊ฒฉ๋ฆฌ ํ•„์ˆ˜

2024

DeepSeek ํด๋ผ์šฐ๋“œ ์„ค์ • ์˜ค๋ฅ˜

ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ ์„ค์ • ์˜ค๋ฅ˜๋กœ ClickHouse DB ๋…ธ์ถœ, ๊ฐœ๋ฐœ/์šด์˜ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ๋ฏธํก์œผ๋กœ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์™€ ์šด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ˜ผ์žฌ๋˜์–ด ๋ฏผ๊ฐ ์ •๋ณด ์œ ์ถœ.

๐Ÿ’ก ๊ตํ›ˆ: ํ™˜๊ฒฝ๋ณ„ ๊ณ„์ • ๋ถ„๋ฆฌ, ๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ ํ•„์ˆ˜

โšก

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

AWS์—์„œ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ๊ฐ€ ์œ„๋ฐ˜๋˜๋Š” ์ƒํ™ฉ

๋‹จ์ผ ๊ณ„์ • ํ™˜๊ฒฝ (์œ„ํ—˜)

Dev

โœ“

Staging

โœ“

Prod

โœ“

โ†‘ ๋‹จ์ผ ๊ณ„์ •์— ๋ชจ๋“  ํ™˜๊ฒฝ ํ˜ผ์žฌ

๋‹จ์ผ ๊ณ„์ •์—์„œ ๋ชจ๋“  ํ™˜๊ฒฝ ์šด์˜ โ†’ ๊ฐœ๋ฐœ์ž๊ฐ€ ์šด์˜ ๋ฆฌ์†Œ์Šค ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ

Multi-Account ํ™˜๊ฒฝ (๊ถŒ์žฅ)

Dev

111111

Staging

222222

Prod

333333

โ†‘ ํ™˜๊ฒฝ๋ณ„ ๊ณ„์ • ๋ถ„๋ฆฌ + SCP ์ฐจ๋‹จ

ํ™˜๊ฒฝ๋ณ„ ๋ณ„๋„ ๊ณ„์ • + SCP ์ •์ฑ… โ†’ ๊ฐœ๋ฐœ์ž์˜ ์šด์˜ ํ™˜๊ฒฝ ์ ‘๊ทผ ์›์ฒœ ์ฐจ๋‹จ

๐Ÿšจ

๋ฐœ๊ฒฌ ์‚ฌ๋ก€: ๋‹จ์ผ ๊ณ„์ •์—์„œ Dev/Staging/Prod ๋ชจ๋‘ ์šด์˜

๋‹จ์ผ ๊ณ„์ •, ๋‹จ์ผ VPC์—์„œ ๋ชจ๋“  ํ™˜๊ฒฝ์„ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์—๊ฒŒ * ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์–ด ์šด์˜ ํ™˜๊ฒฝ ๋ฆฌ์†Œ์Šค์— ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํƒœ - ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์„ค์ •
# ๋ฌธ์ œ: ๋‹จ์ผ ๊ณ„์ •, ๋‹จ์ผ VPC
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  # Dev/Staging/Prod ๋ชจ๋‘ ๋™์ผ VPC
}

resource "aws_subnet" "dev" {
  cidr_block = "10.0.1.0/24"
}
resource "aws_subnet" "prod" {
  cidr_block = "10.0.2.0/24"  # ๊ฐ™์€ VPC!
}

# ๊ฐœ๋ฐœ์ž๋„ ์šด์˜ ์ ‘๊ทผ ๊ฐ€๋Šฅ
resource "aws_iam_policy" "developer" {
  policy = jsonencode({
    Statement = [{
      Effect = "Allow"
      Action = ["*"]   # ๋ชจ๋“  ๊ถŒํ•œ!
      Resource = "*"
    }]
  })
}

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

โ—

๊ฐœ๋ฐœ/์šด์˜ ํ™˜๊ฒฝ ๋ฏธ๋ถ„๋ฆฌ

โ—

๊ฐœ๋ฐœ์ž์˜ ์šด์˜ ํ™˜๊ฒฝ ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ

โ—

๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ ์ •์ฑ… ๋ถ€์žฌ

โ—

์นจํ•ด ์‹œ ์ „์ฒด ํ™˜๊ฒฝ ํ”ผํ•ด ํ™•์‚ฐ ์œ„ํ—˜

๐Ÿ”

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

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

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

ํƒ์ง€ ๋Œ€์ƒ ํŒ๋‹จ ์กฐ๊ฑด ๊ฒฐ๊ณผ
๐Ÿข AWS Organizations
๋‹จ์ผ ๊ณ„์ •์—์„œ ๋ชจ๋“  ํ™˜๊ฒฝ ์šด์˜ High - ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ๋ถˆ๊ฐ€
๐ŸŒ VPC
Dev/Prod ๋™์ผ VPC ์‚ฌ์šฉ High - ๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ ๋ฏธํก
๐Ÿ”‘ IAM Role
๊ฐœ๋ฐœ์ž์—๊ฒŒ Prod ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ํ—ˆ์šฉ High - ๊ถŒํ•œ ๋ถ„๋ฆฌ ๋ฏธํก
๐Ÿ›ก๏ธ Security Group
Dev -> Prod ํŠธ๋ž˜ํ”ฝ ํ—ˆ์šฉ High - ๋„คํŠธ์›Œํฌ ํ†ต์ œ ๋ฏธํก
๐Ÿ””

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

๋Ÿฐํƒ€์ž„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ต์ฐจ ์ ‘๊ทผ ํƒ์ง€

ํ™˜๊ฒฝ ๊ฐ„ ๊ต์ฐจ ์ ‘๊ทผ ํƒ์ง€ ๋กœ์ง

ํƒ์ง€ ๋Œ€์ƒ ํŒ๋‹จ ์กฐ๊ฑด ๊ฒฐ๊ณผ
๐Ÿ“‹ CloudTrail ๊ต์ฐจ ์ ‘๊ทผ
๊ฐœ๋ฐœ IAM์ด Prod ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์‹œ๋„ Critical - PagerDuty ํ˜ธ์ถœ Auto
โš™๏ธ AWS Config ์ง์ ‘ ๋ณ€๊ฒฝ
Prod ํ™˜๊ฒฝ์—์„œ ์ฝ˜์†” ์ง์ ‘ ๋ณ€๊ฒฝ ํƒ์ง€ Critical - ์ฆ‰์‹œ ์•Œ๋ฆผ Auto
๐Ÿ›ก๏ธ GuardDuty ์ด์ƒ ํ–‰์œ„
Dev ํ™˜๊ฒฝ์—์„œ Prod ์ ‘๊ทผ ์‹œ๋„ ํƒ์ง€ High - Slack ์ฆ‰์‹œ ์•Œ๋ฆผ Auto

์ž๋™ ๋Œ€์‘ ์กฐ์น˜

SCP๋กœ ๊ฐœ๋ฐœ์ž Prod OU ์ ‘๊ทผ ์ฐจ๋‹จ EventBridge ๋ณด์•ˆํŒ€ ์•Œ๋ฆผ Lambda IAM ์ž๋™ ๋น„ํ™œ์„ฑํ™”
โœ“

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

AWS Organizations + SCP ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ๊ตฌ์„ฑ

๊ถŒ์žฅ ์„ค์ • (Multi-Account ํ™˜๊ฒฝ ๋ถ„๋ฆฌ)
organizations.tf
# AWS Organizations + SCP ๊ตฌ์„ฑ

# 1. OU ๊ตฌ์กฐ ์„ค์ •
resource "aws_organizations_organizational_unit" "workloads" {
  name      = "Workloads"
  parent_id = aws_organizations_organization.main.roots[0].id
}

resource "aws_organizations_organizational_unit" "dev" {
  name      = "Development"
  parent_id = aws_organizations_organizational_unit.workloads.id
}

resource "aws_organizations_organizational_unit" "prod" {
  name      = "Production"
  parent_id = aws_organizations_organizational_unit.workloads.id
}

# 2. ํ™˜๊ฒฝ๋ณ„ ๊ณ„์ • ์ƒ์„ฑ
resource "aws_organizations_account" "dev" {
  name      = "development"
  email     = "aws-dev@example.com"
  parent_id = aws_organizations_organizational_unit.dev.id
}

resource "aws_organizations_account" "prod" {
  name      = "production"
  email     = "aws-prod@example.com"
  parent_id = aws_organizations_organizational_unit.prod.id
}

# 3. SCP - ๊ฐœ๋ฐœ์ž Prod ์ ‘๊ทผ ์ฐจ๋‹จ
resource "aws_organizations_policy" "deny_dev_to_prod" {
  name = "DenyDevToProdAccess"
  type = "SERVICE_CONTROL_POLICY"

  content = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Sid    = "DenyDevUsersToProd"
      Effect = "Deny"
      Action = "*"
      Resource = "*"
      Condition = {
        StringEquals = {
          "aws:PrincipalTag/Team" = "development"
        }
      }
    }]
  })
}

resource "aws_organizations_policy_attachment" "deny_dev_to_prod" {
  policy_id = aws_organizations_policy.deny_dev_to_prod.id
  target_id = aws_organizations_organizational_unit.prod.id
}

๐Ÿ’ก ํ•ต์‹ฌ: AWS Organizations๋กœ ๊ณ„์ •์„ ๋ถ„๋ฆฌํ•˜๊ณ , SCP๋กœ ๊ฐœ๋ฐœ์ž์˜ ์šด์˜ ๊ณ„์ • ์ ‘๊ทผ์„ ์›์ฒœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. Control Tower๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๊ฐ€๋“œ๋ ˆ์ผ์„ ์ž๋™์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AWS Organizations Control Tower SCP VPC ๋ถ„๋ฆฌ IAM Role ๋ถ„๋ฆฌ

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

โ˜๏ธ AWS SCP ๊ณต์‹ ๋ฌธ์„œ โ†— ๐Ÿ—๏ธ AWS Control Tower ๊ฐ€์ด๋“œ โ†— ๐Ÿ”’ AWS Organizations Best Practices โ†—
๐Ÿ“Š

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

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

๐Ÿ“‹ ๊ณ„์ • ๋ถ„๋ฆฌ ํ˜„ํ™ฉ

  • AWS Organizations ๊ตฌ์กฐ
  • OU/๊ณ„์ • ๋ชฉ๋ก ์Šคํฌ๋ฆฐ์ƒท
  • ํ™˜๊ฒฝ๋ณ„ ๊ณ„์ • ๋ถ„๋ฆฌ ํ˜„ํ™ฉ
  • VPC ๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ ๊ตฌ์„ฑ

๐Ÿ“… SCP ์ •์ฑ… ์ฆ์ 

  • ๊ฐœ๋ฐœ์ž Prod ์ ‘๊ทผ ์ฐจ๋‹จ ์ •์ฑ…
  • SCP ์ ์šฉ ํ˜„ํ™ฉ
  • Control Tower ๊ฐ€๋“œ๋ ˆ์ผ
  • ์ •์ฑ… ๋ณ€๊ฒฝ ์ด๋ ฅ

๐Ÿ“ค ์ ‘๊ทผ ๋กœ๊ทธ ์ฆ์ 

  • CloudTrail ๊ต์ฐจ ์ ‘๊ทผ ๋กœ๊ทธ
  • ์ ‘๊ทผ ์ฐจ๋‹จ ์ด๋ ฅ
  • GuardDuty ํƒ์ง€ ์ด๋ ฅ
  • ์›”๊ฐ„ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ์ค€์ˆ˜ ๋ฆฌํฌํŠธ
โšก

BSG ์ฐจ๋ณ„์ 

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

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

์ˆ˜๋™ ๊ฒ€ํ†  ๋ฐฉ์‹

  • ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ํ™•์ธ
  • ์‹ค์ œ ๋ถ„๋ฆฌ ์ƒํƒœ ๊ฒ€์ฆ ๋ถˆ๊ฐ€
  • ๊ต์ฐจ ์ ‘๊ทผ ํƒ์ง€ ๋ถˆ๊ฐ€
  • ISMS-P ๋งคํ•‘ ๋ถˆ๊ฐ€

ํ•œ๊ณ„: ๋ฌธ์„œ์ƒ ๋ถ„๋ฆฌ ์„ ์–ธ๋งŒ์œผ๋กœ๋Š” ์‹ค์ œ ์šด์˜ ์ƒํƒœ ๊ฒ€์ฆ ๋ถˆ๊ฐ€

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

IaC + CloudTrail + Config ํ†ตํ•ฉ ๋ถ„์„

  • ๊ณ„์ •/VPC/IAM ๋ถ„๋ฆฌ ์ƒํƒœ ์ž๋™ ๊ฒ€์ฆ
  • ๊ต์ฐจ ์ ‘๊ทผ ์‹œ๋„ ์‹ค์‹œ๊ฐ„ ํƒ์ง€
  • Multi-Account ์•„ํ‚คํ…์ฒ˜ ์ค€์ˆ˜ ํ‰๊ฐ€
  • ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ์ž๋™ ๊ฒ€์ฆ + ์‹ฌ์‚ฌ ์ฆ์  ์ž๋™ํ™”

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

โ† CI/CD Pipeline Operations๋กœ ๋Œ์•„๊ฐ€๊ธฐ