이번 글에서는 Detection as Code(DaC)를 활용해 Sigma 규칙을 Git CI/CD 파이프라인으로 자동화하는 방법을 실전적으로 정리해드리겠습니다.

Splunk와 PantherLabs 자료에 따르면, DaC는 탐지 규칙을 코드처럼 작성하고, Git 저장소에 버전 관리하며, CI/CD로 테스트·배포하는 방식으로, 기존 GUI 룰 관리의 한계를 넘어섭니다.

즉, "룰 하나 추가에 3시간"에서 "PR 승인 후 3분 자동 배포"로 바뀌는 구조입니다.

 

◎ DaC가 필요한 이유

 - 전통 SOC는 SIEM GUI에서 룰을 손으로 작성·테스트·배포합니다. 

 - 문제는 버전 관리 불가, 오탐 테스트 누락, 환경별 중복 작업입니다. 

 - DaC는 이를 해결하기 위해 코드처럼 취급합니다.

  • Git: 버전 관리, PR 리뷰.
  • CI/CD: 자동 테스트, 변환, 배포.
  • Sigma: 플랫폼 독립 규칙.

 - 결과: 탐지 개발 속도 5배↑, 오탐 80%↓.

 

◎ DaC 파이프라인 아키텍처

GitHub Repo (Sigma YAML)
     ↓ PR
GitHub Actions CI
  - sigma validate
  - sigma convert (Splunk/Elastic)
  - FP 테스트 (BOTSv3 EVTX)
  - 문서 생성
     ↓ 승인
CD 배포 (SIEM API/파일)

 

 - 핵심 컴포넌트

  • 저장소: GitHub/GitLab.
  • 변환기: sigma-cli.
  • 테스트 데이터: BOTSv3, evtx-baseline.
  • 배포: SIEM API 또는 파일 배포.

 

1단계: Git 저장소 준비

 - 디렉토리 구조:

dac-sigma/
├── rules/
│   ├── windows/
│   └── linux/
├── tests/
│   ├── botsv3/
│   └── fp-baseline/
├── pipelines/
│   ├── splunk_windows.yml
│   └── elastic_ecs.yml
└── .github/workflows/dac.yml



 - 샘플 규칙 (rules/windows/process_creation/win_ps_brute.yml)

title: PowerShell Brute Force
id: dac-ps-brute-001
logsource:
  category: process_creation
  product: windows
detection:
  selection:
    Image|endswith: '\powershell.exe'
    CommandLine|contains: 'net user'
  condition: selection
tags:
  - attack.credential_access
  - attack.t1078

 

 

2단계: CI 파이프라인 구축 (GitHub Actions)

 - .github/workflows/dac.yml

name: DaC Pipeline
on: [push, pull_request]
jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      - run: pip install sigma-cli
      - name: Sigma Validate
        run: sigma validate rules/
      - name: Sigma Convert
        run: |
          sigma convert rules/windows/*.yml --target splunk --pipeline splunk_windows > splunk_rules/
          sigma convert rules/linux/*.yml --target elasticsearch --pipeline ecs_linux > elastic_rules/
  test:
    needs: validate
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: |
          # BOTSv3 테스트 (다운로드 필요)
          sigma test rules/ tests/botsv3/
      - name: FP Test
        run: sigma test --fail-on-fp rules/ tests/fp-baseline/
  deploy:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy to Splunk
        run: |
          # Splunk API 또는 scp 배포
          scp splunk_rules/ splunk-server:/opt/splunk/etc/apps/dac_rules/
      - name: Notify Slack
        uses: 8398a7/action-slack@v3
        with:
          status: success

 

3단계: 테스트 데이터셋 준비

 - BOTSv3 Dataset:

# 다운로드 (GitHub 또는 S3)
wget https://github.com/sbousseaden/BOT-Some9/releases/download/2024-RC1/BOTSv3-2024-RC1.zip
unzip BOTSv3-*.zip -d tests/botsv3/

 

 - FP Baseline

# 정상 환경 EVTX (오탐 테스트용)
tests/fp-baseline/
├── dc01-security.evtx
└── workstation.evtx

 

 - 테스트 명령

sigma test rules/windows/*.yml tests/botsv3/ --fail-on-fp igma/

 

4단계: SIEM별 변환 파이프라인

 - Splunk

sigma convert --target splunk --pipeline splunk_windows rules/windows/*.yml
# 출력: index=* sourcetype="WinEventLog:Security" EventCode="4688" ...

 

 - Elastic

sigma convert --target elasticsearch --pipeline ecs_windows rules/windows/*.yml
# 출력: event.code: "4688" and process.name: "powershell.exe" ...

 

 - Sentinel (KQL)

sigma plugin install sentinel
sigma convert --target sentinel rules/windows/*.yml

 

5단계: 배포 자동화

 - Splunk API 배포

# savedsearches.conf 형식 생성
sigma convert --format savedsearches rules/ -o splunk_savedsearches.conf

# Splunk REST API
curl -k -u admin:pass https://splunk:8089/servicesNS/nobody/search/saved/searches \
  -d name="dac_ps_brute" \
  -d search="index=* EventCode=4688 ..."

 

 - 파일 배포

rsync -av splunk_rules/ splunk-server:/opt/splunk/etc/apps/dac_rules/local/
ssh splunk-server "/opt/splunk/bin/splunk reload saved-searches"

 

6단계: 모니터링과 피드백

 - DaC 대시보드 (Grafana)

- 규칙 수: 1,247개
- 커버리지: ATT&CK 78%
- FP Rate: 2.3%
- 배포 성공률: 99.8%

 

 - 자동 리뷰

# GitHub Issue 생성 (오래된 규칙)
- name: Mark Stale Rules
  run: |
    sigma check --stale rules/ > stale_rules.md
    gh issue create --title "Stale Sigma Rules" --body-file stale_rules.md

 

7단계: 고급 기능

 - Meta Rules

correlation:
  type: event_count
  rules:
    - failed_logon
    - privilege_escalation
  timespan: 30m

 

 - 다중 SIEM 동시 배포:

parallel:
  splunk: sigma convert --target splunk
  elastic: sigma convert --target elasticsearch  
  sentinel: sigma convert --target sentinel

 

 - ATT&CK 커버리지:

S2AN -d rules/ -w > attck_layer.json




 

 

 운영 팁

 - PR Template

## Rule Details
- **Logsource**: windows/process_creation
- **Test EVTX**: 첨부
- **ATT&CK**: T1078.002

## Changes
- 오탐 필터 추가

 

 - Branch Protection:

- Require PR reviews (2명)
- Status checks (validate, test)
- Dismiss stale approvals

 

 - Rollback:

git revert HEAD
# 자동 재배포

 

 마무리

Detection as Code는 Git + Sigma + CI/CD로 SOC를 코드처럼 운영하는 미래입니다. 

수동 GUI 작업에서 벗어나 PR 승인 후 3분 자동 배포, 오탐 자동 테스트, 다중 SIEM 동시 관리로 효율 5배 향상됩니다.

 

 

반응형

+ Recent posts