5. CloudCustodian 정책 작성 & 실행 튜토리얼

2025. 8. 11. 21:31·개발 실습

이 섹션에서는 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으로 실행 인프라 구성

  1. 코드 클론
    git clone <https://github.com/WHS3-CloudGuardians/Cloud-infra.git>
    cd Cloud-infra/cloud-custodian/custodian-terraform-02
    
  2. 환경 변수 설정 (.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>"
    ​
  3. Terraform 실행
    terraform init
    terraform plan
    terraform apply
    
  4. 생성된 리소스 확인
    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 알림 전송 흐름

  1. EventBridge – 정책 조건 위반 이벤트를 탐지해 Lambda 실행 트리거
  2. 자동조치 Lambda – 필터에 맞는 조치를 수행하고 SQS에 알림 메시지 발행
  3. 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
'개발 실습' 카테고리의 다른 글
  • 6. 프로젝트 회고 및 향후 계획
  • 4. Prowler 점검 자동화 가이드
  • 3. 아키텍처 심층 분석
  • 2. 프로젝트 전체진행흐름
samsam031
samsam031
samsam031 님의 블로그 입니다.
  • samsam031
    samsam031 님의 블로그
    samsam031
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 디지털포렌식
      • 드림핵 문제풀이
      • 대외활동
      • 개발 실습
      • 컴퓨터 보안
      • 클라우드
      • 자격증
      • 자연어처리
      • 백엔드
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
samsam031
5. CloudCustodian 정책 작성 & 실행 튜토리얼
상단으로

티스토리툴바