ISMS-P 2.9.1์ ์ ๋ณด์์คํ ๋์ ยท๋ณ๊ฒฝ ์ ์ฑ๋ฅ ๋ฐ ๋ณด์์ ๋ฏธ์น๋ ์ํฅ์ ๋ถ์ํ๊ณ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๊ด๋ฆฌํ๋๋ก ์๊ตฌํฉ๋๋ค. ํด๋ผ์ฐ๋ ํ๊ฒฝ์์๋ Drift Detection๊ณผ PR ๊ธฐ๋ฐ ์ํฌํ๋ก์ฐ๋ก ์ฒด๊ณ์ ์ธ ๋ณ๊ฒฝ๊ด๋ฆฌ ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํด์ผ ํฉ๋๋ค.
ISMS-P 2.9.1 ๋ณ๊ฒฝ๊ด๋ฆฌ ์๊ตฌ์ฌํญ
"์ ๋ณด์์คํ ๋์ ๋๋ ๋ณ๊ฒฝ ์ ์ฑ๋ฅ ๋ฐ ๋ณด์์ ๋ฏธ์น๋ ์ํฅ์ ๋ถ์ยทํ์ํ๊ณ ๊ด๋ จ ์ด๋ ฅ์ ๊ด๋ฆฌํ์ฌ์ผ ํ๋ค."
๋ณ๊ฒฝ๊ด๋ฆฌ ๋ฏธํก์ผ๋ก ๋ฐ์ํ ์ค์ ์ฌ๊ณ
ํด๋ผ์ฐ๋ ํ๊ฒฝ ์ค์ ์ค๋ฅ๊ฐ 10๋ ๊ฐ ๋ฐฉ์น๋์ด ์ฝ 26๋ง ๋ช ์ ๊ณ ๊ฐ ๋ฐ์ดํฐ๊ฐ ์ธ๋ถ์ ๋ ธ์ถ๋จ. ๋ณ๊ฒฝ ์ด๋ ฅ ๊ด๋ฆฌ์ ์ ๊ธฐ ์ ๊ฒ์ด ์์ด ์ฅ๊ธฐ๊ฐ ํ์ง๋์ง ์์์ต๋๋ค.
๐ก ๊ตํ: ๋ณ๊ฒฝ ์ด๋ ฅ ๊ด๋ฆฌ ํ์, ์ ๊ธฐ์ drift detection ๋ฐ ๋ณด์ ์ ๊ฒ
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 ๋ถ์ผ์น๋ก ๋ณด์ ์ทจ์ฝ์ ํ์ง ๋ถ๊ฐ
# 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์ผ๋ก ๊ณํ๋์ง ์์ ๋ณ๊ฒฝ ์๋ ํ์ง
๋ณ๊ฒฝ๊ด๋ฆฌ์์คํ ์์ด ์ฝ์์์ ์ง์ ๋ณ๊ฒฝ ๊ฐ๋ฅ
๋๋ฆฌํํธ ํ์ง ์ฒด๊ณ ๋ถ์ฌ
๋ณ๊ฒฝ ์ด๋ ฅ ๊ด๋ฆฌ ๋ฏธ์ํ
๋ณด์ ์ํฅ ๋ถ์ ์์ด ๋ณ๊ฒฝ ์ ์ฉ
IaC ์ ์ ๋ถ์ ๊ธฐ๋ฐ ๋ณ๊ฒฝ ๊ฒ์ฆ
# 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 ํ์ง ๋ฐ ๋๋ฆฌํํธ ๋ชจ๋ํฐ๋ง
# 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 - ๋ฆฌ์์ค ๋ณ๊ฒฝ ์ด๋ ฅ ๊ธฐ๋ก
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"
}
}
๐ก ํต์ฌ ํฌ์ธํธ
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
๊ธฐ์กด ๋๊ตฌ๊ฐ ๋์น๋ ์ ๊ฒ ์์ญ
์๋ terraform plan ์คํ
ํ๊ณ: ๋ณด์ ์ํฅ ๋ถ์ ์๋ํ ๋ถ๊ฐ, ์ฝ์ ์ง์ ๋ณ๊ฒฝ ํ์ง ๋ถ๊ฐ
Drift Detection + AWS Config + CloudTrail ํตํฉ
์ฐจ๋ณ์ : ๋ณ๊ฒฝ ์ํฅ ๋ถ์ + ๋๋ฆฌํํธ ์๋ํ + ์ฌ์ฌ ์ฆ์ ์๋ํ๋ก ํ์ง โ ์กฐ์น โ ์ฆ์ ์ ๊ณผ์ ์๋ํ