detflow: pip install로 설치 가능한 탐지 엔지니어링 (Detection-Engineering) 코파일럿
요약
탐지 엔지니어링(Detection Engineering) 워크플로우를 자동화하는 오픈 소스 코파일럿 'detflow'가 출시되었습니다. Sigma 및 Cortex XQL 형식의 규칙 초안 작성, 린트, 중복 확인, 품질 검토 기능을 제공합니다.
핵심 포인트
- Sigma 및 Cortex XQL 형식의 탐지 규칙 초안 작성 지원
- 오프라인 린트 및 기존 규칙과의 중복 확인 기능 제공
- LLM을 보조 도구로 활용하여 결정론적 워크플로우 유지
- OpenAI 호환 엔드포인트 및 LangChain 지원
요약 (TL;DR) 🚀
저는 오픈 소스인 벤더 중립적 탐지 엔지니어링 (detection-engineering) 코파일럿인 detflow를 PyPI에 출시했습니다. 이 도구는 제가 모든 탐지 코드화 (detection-as-code) 워크플로우에서 매번 다시 구현해야 했던 네 가지 작업을 수행합니다: 일반적인 영어 문장으로부터 탐지 규칙을 초안 작성 (draft) ( Sigma 또는 Cortex XSIAM XQL 형식으로), 오프라인에서 린트 (lint) 수행, 이미 실행 중인 규칙들과의 중복 확인 (find overlaps), 그리고 시니어 탐지 엔지니어처럼 검토 (review) 수행. 🛡️
<table><tbody><tr><td width="33%"><h2>2가지 형식</h2><strong>Sigma</strong> 또는 <strong>Cortex XQL</strong>로 초안 작성 및 검토 — 하나는 이식 가능하고, 하나는 네이티브 방식입니다</td><td width="33%"><h2>1가지 프로토콜</h2>모든 모델 도입 가능: OpenAI 호환 엔드포인트 또는 LangChain 페일오버 (failover) 체인</td><td width="33%"><h2>0번의 충돌 (crashes)</h2>린트 및 중복 확인에는 모델이 필요하지 않으며, 검토 기능은 결정론적 (deterministic) 하한선으로 저하될 뿐 도구가 멈추지 않습니다</td></tr></tbody></table>이것은 iocflow의 탐지 측 형제 도구입니다. iocflow가 지표 (indicator) 라이프사이클을 처리한다면, detflow는 규칙 (rule) 라이프사이클을 처리합니다. 설계 DNA는 동일합니다: 결정론적 기본 요소 (deterministic primitives)를 우선시하며, LLM은 도구 자체를 중단시키지 않으면서 보조 역할을 수행하는 강화 요소로 사용합니다. 🧱
갈증 (The itch)
규칙을 검토 및 테스트를 거친 머지 리퀘스트 (merge request)로 변환하는 탐지 코드화 (detection-as-code) 파이프라인에는 SIEM 벤더와는 무관한 몇 가지 단계가 있습니다:
- 이 규칙이 과연 *유효 (valid)*한가? (린트 / 스키마 체크)
- 분석가가 동작을 설명할 수는 있지만 Sigma를 능숙하게 작성하지 못한다면 — 우리가 첫 번째 버전을 초안 작성 (draft) 할 수 있을까?
- 우리가 이미 보유하고 있는 탐지 범위를 중복해서 배포하려는 것은 아닌가? (카탈로그 대상 중복 제거)
- 시니어 엔지니어가 이것을 승인 (approve) 할 것인가, 그리고 그들은 무엇을 지적할 것인가? (품질, 오탐 (false-positive) 위험, ATT&CK 매핑, 공백)
저는 이 네 가지 단계를 여러 번 작성해 보았습니다. 이 단계들은 범용적입니다. 실제 파이프라인에서 특정 벤더(vendor)에 종속되는 유일한 부분은 여러분의 쿼리 언어(query language)로 '컴파일(compiling)'하는 것과 여러분의 테넌트(tenant)를 대상으로 '드라이 런(dry-running)'을 수행하는 것뿐입니다. 그래서 저는 제가 구축했던 탐지 코드형 워크벤치(detection-as-code workbench)에서 이 범용적인 네 단계를 추출하여 깔끔한 공개 라이브러리로 만들었습니다. 🧰
작동 방식
문장으로부터 탐지 규칙을 초안 작성합니다 — 두 언어 중 어느 것이든 가능합니다:
import detflow
sigma = detflow.draft("powershell with an encoded command spawned from a Word macro")
...
오프라인에서 린트(Lint)를 수행합니다 — 모델, 네트워크, 키가 필요 없습니다:
report = detflow.lint(sigma.rule) # 또는 lint_sigma / lint_xql
print(report.status, report.summary) # "pass" / "warn" / "fail"
for f in report.findings:
...
시니어 엔지니어처럼 검토하고, 여러분의 인벤토리(inventory)와 비교하여 중복을 제거합니다:
catalog = [
{"name": "Encoded PowerShell", "source": "crowdstrike", "techniques": ["T1059.001"]},
{"name": "WMI Process Create", "source": "sigma", "techniques": ["T1047"]},
...
전체 흐름, 엔드 투 엔드(end to end):
flowchart LR
NL([plain English]) -->|draft| RULE[Sigma / XQL rule]
RULE -->|lint| LINT[schema + best-practice findings]
...
터미널과 CI를 선호하는 사용자들을 위한 CLI도 있습니다:
detflow draft "credential dumping via comsvcs MiniDump" -f cortex-xql
detflow lint rule.yml
detflow review rule.yml --catalog catalog.json --json
의도적인 모델 불가지론 (Model-agnostic) 🔌
detflow는 SDK를 임포트하거나 특정 제공자(provider)를 하드코딩하지 않습니다. "모델(model)"은 다음의 단일 메서드를 가진 것이라면 무엇이든 될 수 있습니다:
def complete(self, system: str, user: str, *, json: bool = False) -> str: ...
이를 통해 세 가지 진입 방법을 제공합니다. 내장된 OpenAIChatModel은 OpenAI, Azure, 로컬 vLLM/Ollama 서버, 게이트웨이 등 OpenAI와 호환되는 모든 엔드포인트(endpoint)와 통신합니다. default_model()은 DETFLOW_LLM_* 환경 변수로부터 모델을 생성합니다. 또는 어떠한 LangChain 채팅 모델이라도 래핑(wrap)할 수 있습니다:
from langchain_failover import FailoverChatModel
from detflow.llm import LangChainModel
...
해당 FailoverChatModel은 제가 별도로 추출하여 배포한 또 다른 패키지인 langchain-failover를 사용합니다. 따라서 리뷰 도중 기본 모델(primary-model)에 장애가 발생하더라도 투명하게 보조 모델(secondary)로 전환(fallback)됩니다. 제가 만든 세 개의 오픈 소스(OSS) 패키지가 서로의 기능을 활용하며(dog fooding) 조용히 시너지를 내고 있는 셈입니다. 🐕
예외를 발생시키지 않는 결정론적 하한선 (Deterministic floor)
제가 가장 중요하게 생각하는 계약(contract)은 다음과 같습니다: detflow는 성능이 저하될 뿐, 중단되지 않는다. 🎯
- 린트(Lint) 및 중복 확인(overlap)은 모델이 전혀 필요하지 않습니다 — 이 기능들은 순수하게 표준 라이브러리와 PyYAML만 사용하며, 보안 비밀(secrets) 없이 CI(지속적 통합) 환경에서 실행됩니다.
- **초안 작성(Drafting)**은 모델이 필요하지만(작성을 요청하는 것이므로), 모델 오류가 발생하더라도 예외(exception)를 던지는 대신
error필드가 포함된 결과값으로 반환됩니다. - **리뷰(Review)**는 모델이 있을 때는 모델을 사용하고, 없을 때는 **결정론적 하한선(deterministic floor)**으로 전환됩니다. 즉, 모델이 없더라도 린트 결과, 카탈로그 중복 확인, 파싱된 ATT&CK 기법(techniques)은 여전히 얻을 수 있습니다.
review()는 절대 예외를 발생시키지 않습니다.
따라서 detflow는 LLM을 사용할 수 있을 때도 있고 그렇지 않을 때도 있는 파이프라인에 안심하고 도입할 수 있습니다. 지루하지만 테스트 가능한 부분들은 상황에 관계없이 계속 작동하며, AI는 가능할 때 판단력을 더해줍니다.
두 가지 형식을 사용하는 이유
Sigma는 이식 가능하고 검토 가능하며 벤더 중립적인 표준입니다. 깔끔하게 린트(lint)가 가능하며 다양한 SIEM 간에 이식할 수 있습니다. 반면 Cortex XSIAM의 XQL은 해당 플랫폼에서 실제로 실행되는 언어입니다. 두 형식을 모두 지원한다는 것은, 이식성을 위해 Sigma로 한 번만 작성하거나, 플랫폼의 완전한 표현력을 활용하고 싶을 때 바로 XQL로 작성할 수 있음을 의미하며, detflow는 두 형식 모두에 대해 린트와 리뷰를 수행합니다. 초안 작성 프롬프트는 언어를 인식합니다(XQL 프롬프트는 XQL에 startswith/endswith가 없고 SQL의 where 대신 | filter를 사용한다는 점을 알고 있습니다). 따라서 SQL 형태의 환각(hallucination) 결과가 반환되지 않습니다. 🧠
더 큰 패턴
이는 IOC 작업에서 얻은 교훈과 동일합니다. 엔지니어링 과정에서 AI를 보여주고 싶을 때, 초보적인 방식은 모든 것을 LLM 호출로 만드는 것입니다. 더 강력하고 배포 가능한 방식은 결정론적 프리미티브 (deterministic primitives)에 선택적 AI를 결합하는 것입니다. 스키마 체크(schema checks)와 중복 제거(dedup)는 지루하지만 검증된 작업이며, 모델은 판단이 도움이 되는 곳에서 작성 및 검토를 수행하고, 모델이 느려지거나 부재하더라도 시스템은 무너지지 않습니다.
detflow는 Python 3.9+에서 실행되며, import detflow 시 의존성을 가볍게 유지합니다 (LLM 클라이언트는 추가 사항임). 또한 다운스트림 타입 체크 (type-checking)를 위해 py.typed를 제공하며, 모든 구성 요소는 독립적으로 유용하게 사용할 수 있습니다.
- 📦 PyPI:
pip install detflow - 🛠️ 소스: github.com/vinayvobbili/detflow
- 🧩 인디케이터(indicator) 측 형제 프로젝트: iocflow
만약 Detection-as-code 파이프라인을 운영 중이시라면, 다음에 어떤 쿼리 언어(query language)를 지원하길 원하는지 꼭 알려주세요. 👋
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기