이 섹션에서는 Cloud Custodian을 사용해 AWS 환경의 보안 취약점을 실시간으로 모니터링하고 자동으로 조치하는 방법을 안내합니다. K-ISMS 및 개인정보보호법 같은 국내 컴플라이언스 기준을 준수하도록 설계된 자동화 시스템의 일부로, 설치부터 실행, 정책 작성, 알림 연동까지 실습 중심으로 설명합니다.
1. 개요
- 무엇을 하나요?
- 보안 그룹 규칙 제거
- 암호화 설정 강제
- 스냅샷 생성 등 자동 조치
- Slack·SQS로 실시간 알림
- 을 수행합니다.
- Prowler 스캔 결과를 바탕으로, Cloud Custodian 정책(YAML)을 통해
- 정책 수량: 총 33개 YAML 파일(e.g. iam.yaml, access.yaml, account.yaml)
- 설명: YAML 파일에 조건과 동작을 정의하면, Custodian이 AWS를 점검·수정해 주는 자동 보안 엔진
- 정책 적용 시:
- 운영 영향이 큰 자동조치는 필수 핵심 항목만 활성화하고, 필요 시 주석 처리로 쉽게 비활성화 가능
- 알림은 Slack 중심으로 전송되며, SQS 큐를 통해 재처리 및 오류 복구 지원
프레임워크
[ Prowler Scan ]
│
▼
+-------------------------------------+
| 1) Policy Deploy (Cloud Custodian) |
+-------------------------------------+
│
▼
+-------------+
| EventBridge |
+-------------+
│
▼
+---------------- Remediation Lambda ----------------+
| (invoke-lambda → 자동조치 수행 및 SQS 메시지 발행) |
+----------------------------------------------------+
│ │
▼ ▼
+----------------------+ +----------------------+
| 5) AWS Auto-Actions | | 4) Mailer Lambda |
| (snapshot, tag, ...) | | (SQS → Slack 전송) |
+----------------------+ +----------------------+
- Prowler 스캔 결과 ->
- Cloud Custodian 정책(YAML)을 AWS 환경에 배포 ->
- EventBridge가 조건 위반 이벤트 감지 ->
- Remediation Lambda 트리거
- 실제 자동조치 수행 (스냅샷 생성, 태그 추가, 보안 그룹 수정 등)
- SQS에 알림 메시지 발행 -> Mailer Lambda가 SQS 큐를 폴링해 Slack 알림 전송
2. 설치 및 환경 준비
2.1 필수 환경
- Python: ≥3.8
- pip: 최신 버전
- AWS CLI: aws configure 완료
2.2 가상환경 생성 (Windows 예시)
python -m venv custodian-env
custodian-env\\Scripts\\activate
python -m pip install --upgrade pip
pip install c7n c7n_aws
custodian --version # 설치 확인
3. Terraform으로 실행 인프라 구성
- 코드 클론
git clone <https://github.com/WHS3-CloudGuardians/Cloud-infra.git> cd Cloud-infra/cloud-custodian/custodian-terraform-02 - 환경 변수 설정 (.env 또는 shell export)
export TF_VAR_account_id="311278774159" export TF_VAR_aws_region="ap-northeast-2" export TF_VAR_good_slack="<https://hooks.slack.com/services/AAA/BBB/CCC>" export TF_VAR_warning_slack="<https://hooks.slack.com/services/DDD/EEE/FFF>" export TF_VAR_danger_slack="<https://hooks.slack.com/services/GGG/HHH/III>" - Terraform 실행
terraform init terraform plan terraform apply - 생성된 리소스 확인
terraform output # IAM 역할, SQS URL, Lambda ARN 등
4. Cloud Custodian 실행
- 단일 정책 실행
custodian run -s output policies/access.yaml - 다중 정책 실행
custodian run -s output policies/*.yaml - 특정 정책만
custodian run -s output --policy accessanalyzer_enabled policies/access.yaml - Dry Run (시뮬레이션)
custodian run -s output --dryrun policies/*.yaml
5. YAML 정책 구조
policies:
# CHECKID: accessanalyzer_enabled
# ACTIONPLAN: Access Analyzer가 비활성화 상태일 경우 Lambda로 자동 활성화 조치 후, Slack 알림을 전송하고 담당자가 활성화 상태를 직접 확인하도록 안내 (자동조치 + 알림)
# 자동조치를 완료했으므로 danger에서 good으로 변경
- name: accessanalyzer_enabled
description: |
If AWS Access Analyzer is not active, automatically invoke a Lambda to enable it and send a Slack notification.
This supports ISMS-P 2.3.6 controls for external connection management.
resource: aws.account
mode:
type: periodic
schedule: "rate(1 day)"
role: ${LAMBDA_ROLE}
filters:
- type: access-analyzer
key: status
op: ne
value: ACTIVE
actions:
# - type: invoke-lambda
# function: arn:aws:lambda:${AWS_REGION}:${ACCOUNT_ID}:function:accessanalyzer_enabled
- type: notify
slack_template: slack_default
template_format: slack
slack_msg_color: good
violation_desc: |
*** CHECKID: accessanalyzer_enabled ***
• AWS Access Analyzer가 활성화되어 있지 않아 활성화 조치가 실행되었습니다.
action_desc: |
1. AWS Console에서 Access Analyzer가 활성화 상태로 전환된 것을 반드시 확인해 주세요.
2. 외부 접근 통제 및 ISMS-P(2.3.6) 준수를 위해 항상 활성화 상태를 주기적으로 점검/유지해 주세요.
to:
- ${GOOD_SLACK}
transport:
type: sqs
queue: ${QUEUE_URL}
정책 주요 요소 설명
- mode (탐지 방식)
- cloudtrail: CloudTrail 이벤트 발생 시 실시간 트리거. 신규 리소스 생성/변경 이벤트를 즉시 감지해 자동 조치.
- periodic: 주기적 점검. schedule 표현식(cron 또는 rate)대로 Lambda 함수가 정기 실행.
- batch: 일회성 또는 CI/CD 배치 실행용. 필요 시 스크립트나 파이프라인에서 명시적으로 호출.
- filters (조건)
- type: 필터 유형(예: value, ingress, tag, access-analyzer) 지정
- key/op/value: 비교할 속성과 연산자(eq, ne, contains 등), 대상 값 설정
- 복합 필터 및 and/or 논리 조합도 지원 가능
- actions (동작)
- revoke-security-group-ingress / revoke-security-group-egress: 보안 그룹의 Ingress/Egress 규칙 전면 제거
- auto-tag-user: 조치 완료 리소스에 custodian_remediated=true 태그 추가
- notify: Slack(SQS 경유) 알림 전송
- slack_template: 메시지 레이아웃 템플릿 선택
- slack_msg_color: good/warning/danger로 시각적 구분
- transport: type: sqs로 SQS 큐에 메시지 발행, Mailer Lambda가 Slack 전송 처리
- 기타 액션: invoke-lambda, snapshot, set-permissions, stop, start 등 다양한 리소스 제어 지원
- 내 파트: iam.yaml 및 accessanalyzer.yaml 파일에 총 38개의 세부 정책을 직접 작성
- invoke-lambda 액션으로 Python 스크립트(.py)를 ZIP 패키지로 Lambda에 배포해 자동조치 수행
6. Slack 알림 연동 상세
Cloud Custodian 정책에서 notify 액션을 통해 Slack 알림을 유연하게 구성하는 방법과 전송 흐름을 설명합니다.
6.1 Mailer Lambda 배포 정책
- queue_url: ${QUEUE_URL}
- role : ${MAILER_ROLE}
- region : ${AWS_REGION}
이 정책을 사용해 Mailer Lambda를 배포하고, SQS 큐를 모니터링하여 Slack으로 메시지를 전송합니다.
6.2 notify 액션 설정 예시
actions:
- type: notify
slack_template: slack_default # 메시지 레이아웃 템플릿
slack_msg_color: danger # msg_color: good/warning/danger
to:
- ${DANGER_SLACK} # 환경변수로 Webhook URL 주입
transport:
type: sqs # SQS 경유 전송
queue: ${QUEUE_URL} # 재처리 가능한 큐 정보
- slack_template: 기본 템플릿 외 커스텀 지원
- slack_msg_color: 채널별 구분 (danger: 고위험, warning: 중위험, good: 조치 완료)
- transport: SQS 큐 사용으로 Slack 알림 누락 최소화 및 재처리 보장
6.3 알림 전송 흐름
- EventBridge – 정책 조건 위반 이벤트를 탐지해 Lambda 실행 트리거
- 자동조치 Lambda – 필터에 맞는 조치를 수행하고 SQS에 알림 메시지 발행
- Mailer Lambda – SQS 큐를 모니터링하다가 메시지를 가져와 Slack Webhook으로 전송
6.4 Slack 채널 구성
- 메시지 색상(msg_color)에 따라 서로 다른 Webhook URL을 사용하여 채널별 분리 관리
- danger: 고위험 리소스 알림
- warning: 중위험 경고
- good: 자동 조치 완료 알림
6.5 템플릿 자동화
- .env에 환경변수 정의 (LAMBDA_ROLE, QUEUE_URL, GOOD_SLACK, WARNING_SLACK, DANGER_SLACK)
- .yaml.template 파일에 ${...} 플레이스홀더 사용
- 셸 스크립트 실행 시 환경변수 치환을 통해 반복 수정 없이 정책 생성 가능
'개발 실습' 카테고리의 다른 글
| 6. 프로젝트 회고 및 향후 계획 (4) | 2025.08.11 |
|---|---|
| 4. Prowler 점검 자동화 가이드 (5) | 2025.08.11 |
| 3. 아키텍처 심층 분석 (0) | 2025.08.11 |
| 2. 프로젝트 전체진행흐름 (0) | 2025.08.11 |
| 1. 프로젝트 소개 (1) | 2025.08.11 |