detflow: pip로 설치할 수 있는 탐지 엔지니어링 코파일럿

발행: (2026년 6월 7일 AM 10:55 GMT+9)
10 분 소요
원문: Dev.to

Source: Dev.to

Cover image for detflow: A Detection-Engineering Copilot You Can pip install

Vinay

TL;DR 🚀

저는 detflow(https://pypi.org/project/detflow/)를 PyPI에 배포했습니다 — 오픈소스이며 벤더에 구애받지 않는 탐지 엔지니어링 코파일럿입니다. 매번 탐지‑as‑code 워크플로우에서 제가 직접 다시 구현하던 네 가지 작업을 수행합니다: 자연어(Sigma 혹은 Cortex XSIAM XQL)로 탐지를 초안 만들기, 오프라인으로 lint 하기, 이미 실행 중인 규칙과 중복 확인하기, 그리고 시니어 탐지 엔지니어처럼 리뷰하기. 🛡️

2가지 포맷

Sigma 혹은 Cortex XQL 로 초안 및 리뷰 — 하나는 포터블, 하나는 네이티브

1가지 프로토콜

모든 모델을 사용할 수 있음: OpenAI 호환 엔드포인트 혹은 LangChain 장애조치 체인

0번 충돌

lint와 overlap는 모델이 필요 없으며, 리뷰는 결정론적 기본값으로 낮아집니다

이는 iocflow의 탐지 측면 형제 프로젝트입니다. iocflow는 인디케이터 라이프사이클을 다루고, detflow는 라이프사이클을 다룹니다. 동일한 설계 DNA: 먼저 결정론적 기본 기능을 제공하고, LLM은 선택적 보강 수단이며, 실패해도 도구 전체가 중단되지 않도록 설계되었습니다. 🧱


문제점

탐지‑as‑code 파이프라인(룰을 리뷰·테스트된 머지 리퀘스트로 만드는 과정)에는 벤더와 무관한 단계가 몇 가지 있습니다:

  • 이 룰이 유효한가? (lint / 스키마 검사)
  • 분석가는 행동을 설명할 수 있지만 Sigma를 능숙하게 쓰지는 못한다 — 첫 버전을 초안 만들 수 있을까?
  • 이미 보유하고 있는 커버리지를 또 배포하려는 건가? (카탈로그와 중복 검사)
  • 시니어 엔지니어가 승인할까, 어떤 점을 지적할까? (품질, 오탐 위험, ATT&CK 매핑, 빈틈)

이 네 단계를 저는 여러 번 구현해봤습니다. 이들은 일반적인 것이며, 실제 파이프라인에서 벤더‑특정 부분은 쿼리 언어로 컴파일하고 테넌트에서 드라이런하는 것뿐입니다. 그래서 저는 탐지‑as‑code 워크벤치에서 이 네 가지를 추출해 깔끔한 공개 라이브러리로 만들었습니다. 🧰


사용 예시

문장 하나로 탐지를 초안 만들기 — 두 언어 중 선택:

import detflow

sigma = detflow.draft("powershell with an encoded command spawned from a Word macro")
print(sigma.rule)                       # 완전한 Sigma 룰, lint 준비 완료

xql = detflow.draft("same thing, but for Cortex XSIAM", fmt="cortex-xql")
print(xql.rule)                         # dataset = ... | filter ... | limit 100

오프라인 lint — 모델, 네트워크, 키가 필요 없습니다:

report = detflow.lint(sigma.rule)       # 또는 lint_sigma / lint_xql
print(report.status, report.summary)    # "pass" / "warn" / "fail"
for f in report.findings:
    print(f.level, f.message)

시니어 엔지니어처럼 리뷰하고, 자체 인벤토리와 중복 제거:

catalog = [
    {"name": "Encoded PowerShell", "source": "crowdstrike", "techniques": ["T1059.001"]},
    {"name": "WMI Process Create",  "source": "sigma",       "techniques": ["T1047"]},
]
result = detflow.review(sigma.rule, catalog=catalog)
print(result.quality_score, result.false_positive_risk, result.verdict)
for o in result.overlaps:               # "you may already cover this"
    print(" •", o.source, o.name, "—", o.reason)

전체 흐름, 엔드‑투‑엔드:

flowchart LR
    NL([plain English]) -->|draft| RULE[Sigma / XQL rule]
    RULE -->|lint| LINT[schema + best-practice findings]
    RULE -->|find_overlaps| OV[catalog dedup]
    LINT --> REV{{review}}
    OV --> REV
    REV --> V([quality · FP risk · ATT&CK · verdict])

터미널·CI 사용자용 CLI도 제공됩니다:

detflow draft "credential dumping via comsvcs MiniDump" -f cortex-xql
detflow lint rule.yml
detflow review rule.yml --catalog catalog.json --json

의도적으로 모델 비종속 설계 🔌

detflow는 SDK를 임포트하거나 특정 공급자를 하드코딩하지 않습니다. “모델”이란 다음 메서드만 있으면 됩니다:

def complete(self, system: str, user: str, *, json: bool = False) -> str: ...

이를 통해 세 가지 접근 방식을 제공합니다. 내장 OpenAIChatModel은 OpenAI‑호환 엔드포인트(예: OpenAI, Azure, 로컬 vLLM/Ollama 서버, 게이트웨이)와 연결됩니다. default_model()DETFLOW_LLM_* 환경 변수로 모델을 구성합니다. 혹은 어떤 LangChain 채팅 모델이든 래핑할 수 있습니다:

from langchain_failover import FailoverChatModel
from detflow.llm import LangChainModel

chain = FailoverChatModel(models=[primary, local_fallback])
model = LangChainModel(chain)
detflow.review(rule, catalog=catalog, model=model)   # 장애조치 체인 사용

FailoverChatModel은 제가 별도 패키지로 공개한 langchain-failover이며, 기본 모델에 장애가 발생하면 자동으로 보조 모델로 전환됩니다. 제 OSS 패키지 세 개가 서로의 도그푸드를 조용히 먹고 있습니다. 🐕


절대 예외를 발생시키지 않는 결정론적 기본값

제가 가장 중요하게 생각하는 계약: detflow는 다운되지 않고, 성능이 낮아질 뿐입니다. 🎯

  • Lint와 overlap는 모델이 전혀 필요 없으며, 순수 파이썬 표준 라이브러리와 PyYAML만 사용해 CI에서 비밀 없이 실행됩니다.
  • Drafting은 모델이 필요하지만, 모델 오류는 error 필드가 있는 결과 객체로 반환될 뿐 예외가 발생하지 않습니다.
  • Review는 모델이 있으면 사용하고, 없을 경우 결정론적 기본값으로 대체됩니다. lint 결과, 카탈로그 중복, 파싱된 ATT&CK 기술은 여전히 제공되며 review()는 절대 예외를 던지지 않습니다.

따라서 detflow는 LLM이 가끔 제공되고 가끔은 제공되지 않는 파이프라인에 안전하게 삽입할 수 있습니다. 지루하고 테스트 가능한 부분은 언제나 동작하고, AI는 가능할 때만 판단을 보태는 구조입니다.


왜 두 가지 포맷인가

Sigma는 포터블하고 벤더에 구애받지 않는 표준으로, 깔끔하게 lint가 가능하고 다양한 SIEM에 이식됩니다. Cortex XSIAM XQL은 실제 해당 플랫폼에서 실행되는 언어입니다. 두 포맷을 모두 지원하면 포터블성을 위해 Sigma로 작성하거나, 플랫폼 고유의 표현력을 원할 때 XQL로 바로 작성할 수 있습니다. detflow는 어느 쪽이든 lint와 리뷰를 수행합니다. 초안 프롬프트는 언어별 특성을 인식하도록 설계돼 있어, XQL 프롬프트는 startswith/endswith가 없고 | filter를 사용한다는 점을 반영해 SQL 형태의 환각을 방지합니다. 🧠


더 큰 패턴

IOC 작업과 동일한 교훈입니다: AI를 엔지니어링에 보여주고 싶을 때는 모든 것을 LLM 호출로 만들기 쉽지만, 더 견고하고 배포 가능한 접근법은 결정론적 기본 기능 + 선택적 AI입니다. 스키마 검사와 중복 제거는 지루하고 테스트 가능하며, 모델은 판단이 필요한 부분(작성·리뷰)에서만 사용됩니다. 모델이 느리거나 없을 때도 시스템은 정상 작동합니다.

detflow는 Python 3.9+에서 동작하고, import detflow만으로 가벼운 의존성을 유지합니다(LLM 클라이언트는 별도). py.typed를 제공해 다운스트림 타입 체크를 지원하며, 각 구성 요소가 독립적으로도

0 조회
Back to Blog

관련 글

더 보기 »