
자체 호스팅 위협 인텔리전스 플랫폼 — 피드 집계, AI 트리아지, MITRE ATT&CK 커버리지, Sentinel 통합 탐지 엔지니어링. 독립 실행형 또는 완전한 Azure 통합으로 실행됩니다.
60개 이상의 보안 벤더로부터 RSS 피드를 수집하고, AI 트리아지를 실행하며, 발견된 항목을 RunZero 자산 인벤토리와 상관 분석하고, 다크 모드 웹 대시보드를 통해 실행 가능한 경보를 표시하는 자체 호스팅 위협 인텔리전스 플랫폼입니다.
클라우드 의존성 없이 독립적으로 실행되도록 설계되었으며, 또는 Azure/Entra/Sentinel 환경에 완전히 통합할 수도 있습니다 — 보유한 환경에 맞는 티어를 선택하세요.
세 가지 모두 완전히 동일한 애플리케이션 코드를 실행합니다 — 달라지는 것은 어떤 환경 변수가 설정되는지뿐입니다. 전체 참조는 환경 변수를 참조하세요.```bash
./scripts/setup-basic.sh
./scripts/setup-basic-api.sh
./scripts/setup-azure.ps1
두 개의 bash 스크립트는 로컬 Postgres 컨테이너를 띄우고, 스키마를 적용하고, `backend/.env` / `frontend/.env.local`을 생성해 줍니다 — 그런 다음 실제로 앱을 시작하는 두 명령(`pip install` + 백엔드 실행, `npm install` + 프론트엔드 개발 서버 실행)을 출력합니다. `setup-azure.ps1`은 실제 Azure Container Apps 배포 런북인 `infra/provision.ps1`을 감싼 얇은 래퍼입니다.
---
## Features
- **Feed aggregation** — 60개 이상의 Tier 1/2/3 보안 RSS 피드를 일정에 따라 폴링하며, 중복을 제거하고 홍보성 콘텐츠를 자동으로 필터링합니다
- **AI triage** — 각 항목을 심각도(Critical/High/Medium/Low/Informational), MITRE ATT&CK TTP, 그리고 쉬운 영어 요약으로 분류합니다. 프로바이더 모듈식: Anthropic API 직접 사용 또는 Azure AI Foundry, 환경 변수 하나로 전환 가능하며 어느 쪽이든 기능 손실이 없습니다
- **IOC extraction** — 각 항목에서 IP, 도메인, URL, 파일 해시, CVE를 자동으로 추출합니다
- **RunZero integration** — 자산 인벤토리를 동기화하고 위협 인텔을 실제 자산과 상관 분석합니다; CVE, 소프트웨어 이름, OS 버전, IP 주소로 매칭합니다. `RUNZERO` 아래 세 개의 하위 탭: **Matches**(인벤토리와 상관 분석된 항목, 심각도/날짜/신뢰도/KEV로 필터링 가능), **Exposure**(조직 수준의 확인됨/가능성 있는 상태와 완화 추적), **Metrics**(시간 경과에 따른 유입 대비 완화 추세)
- **Your Stack** — 환경에 있는 소프트웨어/OS를 정의하면 모든 항목을 관련성 기준으로 재점수화합니다
- **IOC ledger** — 추출된 모든 지표의 검색 가능한 원장으로, 항목 상호 참조와 STIX/CSV 내보내기를 지원합니다
- **MITRE ATT&CK matrix** — 수집된 위협 인텔 전반의 TTP 커버리지 히트맵
- **Feed health dashboard** — 피드별 폴링 상태, 연속 실패 추적, 7일간 기사 볼륨
- **Detections** — 탐지로 등록된 모든 것(AI 생성, 자체 파일에서 가져온 것, 라이브 Sentinel 워크스페이스에서 동기화된 것)을 아우르는 9개 탭 검토 화면(아래 참조)
- **Modular auth** — 역할 기반 접근이 가능한 Microsoft Entra ID SSO, 또는 Azure 의존성이 전혀 없는 단일 공유 로컬 API 키. 프론트엔드에서 자동 감지됩니다; [Auth modes](#auth-modes) 참조
### 탐지 관련 두 가지 기능
이 저장소는 실제로 "detections"라는 우산 아래 관련 있지만 독립적으로 사용 가능한 두 가지를 제공합니다:
1. **`DETECTIONS` 탭** — 아홉 개의 하위 탭으로 나뉜 자체 완결형 검토 화면:
- **All Detections** — 등록된 모든 분석의 전체 카탈로그로, 기법/처분/검토 상태로 필터링 가능하며, 각 항목은 설명과 전체 KQL로 펼칠 수 있습니다.
- **Defender Custom Detections** — 동일한 카탈로그이지만, Sentinel 분석 규칙이 아닌 Microsoft Defender for Endpoint의 사용자 지정 탐지 규칙으로 향하는 탐지에 한정됩니다.
- **Alignment Reviews** — 탐지 분석이 MITRE 기법에 대해 등록될 때마다, AI 검사가 실제 커버리지를 MITRE 자체의 해당 기법 설명과 비교합니다. 그것이 어긋나거나 기법을 부분적으로만 커버할 경우, AI의 추론, 제안된 KQL 수정, 그리고 그 수정 자체의 검증 결과(정적 게이트 + 백테스트)와 함께 사람이 검토할 항목으로 여기에 나타납니다 — 결코 맹목적인 제안이 아닙니다.
- **Disposition Alerts** — 부패 탐지 큐: 승인된 분석의 텔레메트리가 쇠퇴하거나 기반 규칙이 오류를 내기 시작하면 여기에 재검토용으로 플래그되며, 공유된 MITRE 기법만이 아니라 자체 탐지 이름으로 명명됩니다.
- **Generated Hunts** — 탐지는 헌트로 그룹화됩니다(현재는 가져온 파일당 하나; 해당 통합이 출시되면 원본 TI 기사/detections.ai 프로젝트당 하나), Microsoft Sentinel 자체의 Hunts 기능과 일치합니다. 헌트는 `Microsoft.SecurityInsights/hunts` 객체와 그 구성 저장 검색 쿼리로 실제 Sentinel 워크스페이스에 동기화될 수 있습니다(`SENTINEL_HUNTING_SYNC_ENABLED`와 `mode` — off/manual/auto — 로 게이트되며, Settings > API Settings에서 팀별로 구성 가능; 옵트인하지 않는 한 결코 조용한 자동 푸시는 없습니다).
- **Sentinel Hunts** — Sentinel 워크스페이스의 Hunting 기능에 실제로 배포된 것의 라이브 인벤토리로, 이 앱 자체의 동기화 이력이 아니라 ARM에서 직접 가져옵니다; 제자리에서 적용하거나 무시할 수 있는 쿼리별 테스트/튜닝 제안을 포함합니다.
- **Sentinel Analytics Rules** — Microsoft Sentinel의 Analytics Rules(`Microsoft.SecurityInsights/alertRules`)에 대한 동일한 개념 — 이들은 일정에 따라 실제로 인시던트/경보를 발생시키는 것이므로 Hunting과는 구별되는 Sentinel 리소스 유형입니다 — 동일한 튜닝 제안 적용/무시 워크플로를 갖습니다.
- **Local Detections** — 아래의 [Running without Sentinel or an AI provider](#running-without-sentinel-or-an-ai-provider-local-detections-import) 참조.
- **Audit Log** (관리자 전용) — 이 앱이 실제로 실행한 모든 검사의 교차 파이프라인 기록: AI 생성 탐지 게이트/제어 프로브 결과, Sentinel 헌트 동기화 시도, Sentinel 헌트 쿼리/분석 규칙 테스트 실행이 하나의 페이지네이션되고 필터링 가능한 목록으로 결합됩니다 — 의도적으로 어떤 단일 검토 탭도 단독으로 다루지 않는 것을 포괄합니다.
검토 화면 자체를 위해 추가 배포가 필요 없이 메인 백엔드 내부에서 전적으로 실행됩니다. 자체 API 설계는 완전히 자체 완결형임에도 불구하고 의도적으로 아래의 detections.ai 관례를 따릅니다.
2. **detections.ai 파이프라인 오케스트레이터 — 출시 예정.** detections.ai는 AI 지원 탐지 생성을 위한 공개 API를 개발 중이며, 이 저장소에는 이를 위한 실제 통합(`backend/detection_pipeline/orchestrator.py`)이 있습니다. 이는 트리아지된 위협 인텔을 받아 기존 탐지 커버리지와 대조하고, 예약 작업으로 Sentinel 워크스페이스용 KQL 초안을 생성합니다. 이 통합은 해당 API가 제공되면 이를 지원할 예정이며, 아직 이 공개 릴리스에는 포함되지 않았습니다. 그동안 **Detections 탭을 사용하는 데 전혀 필요하지 않습니다** — 아래의 [Local Detections Import](#running-without-sentinel-or-an-ai-provider-local-detections-import)가 오늘날 AI 생성 없이, Sentinel 없이 설정에서도 동일한 "실제 탐지를 이 앱에 가져오기" 목표를 다룹니다.
### Sentinel이나 AI 프로바이더 없이 실행하기: Local Detections Import
앱의 이름과 주요 피치를 고려할 때, **Basic** 티어의 셀프 호스터가 가장 흔히 할 질문은 아마도 *"Sentinel이나 AI 프로바이더가 구성되어 있지 않은데, 그래도 Detections/Hunts 탭에서 뭔가 얻을 수 있나요?"*일 것입니다. 답은 예입니다: 앱을 자신의 탐지 규칙 파일 폴더(직접 작성한 것, 실제 Sentinel/Defender 테넌트에서 내보낸 것, 또는 공개 Sigma/Sentinel 규칙 저장소에서 가져온 것)로 지정하면 카탈로그화하고, MITRE 태그를 달고, 정적으로 검증합니다 — 이 모든 것에 Sentinel 연결도, `DETECTIONS_AI_API_KEY`/Anthropic 키도 필요하지 않습니다.
- **첫날부터 지원되는 형식:** 원시 `.kql`/`.txt`/`.yar`/`.spl` 또는 임의 확장자 파일, 각각 선택적으로 `.json`/`.yaml` 사이드카(`{"file": "myrule.kql", "title": "...", "description": "...", "technique_id": "T1059.001"}`)와 짝지어져 Microsoft 자체 내보내기에서는 별도로 선언할 필요가 없는 메타데이터를 제공; YARA; Suricata; Sigma YAML(단일 또는 다중 문서); Splunk SPL; 그리고 Microsoft 자체의 네이티브 내보내기 Analytics Rule/Hunting Query JSON(`Scheduled` 종류 규칙만 이 앱이 평가할 수 있는 원시 KQL 쿼리를 담고 있습니다 — 다른 모든 종류는 인식되고 보고되며, 조용히 건너뛰지 않습니다).
- **가져온 파일에서 실제로 실행되는 것:** KQL 콘텐츠에 대한 정적 검증(AI 생성 경로가 사용하는 것과 동일한 내구성/발견 엔진); AI 프로바이더가 구성되어 *있다면* MITRE 정렬 검사도 수행(Sentinel과는 독립적인 축 — 하나만, 둘 다, 또는 둘 다 없을 수 있습니다); Sentinel에 의존하는 모든 것(백테스팅, 텔레메트리 프로브, 처분 추적)은 범위 밖으로 남아 있으며 오해의 소지가 있는 빈 셀이 아니라 "no Sentinel connection configured"로 표시됩니다.
- **어디에 나타나는가:** 가져온 콘텐츠는 일반 헌트/탐지 행이 됩니다 — 동일한 테이블, 동일한 검토 워크플로, AI 파이프라인이 생성하는 모든 것과 동일한 MITRE 기법 표시 — 따라서 자체 탭뿐만 아니라 일반 `ALL DETECTIONS`/`GENERATED HUNTS` 뷰에도 나타납니다. 전용 **Local Detections** 하위 탭(`DETECTIONS` 아래, 가져오기 트리거는 관리자 전용)에서 폴더를 지정하고 파일별 진행 상황/결과를 지켜볼 수 있습니다.
- **설정:** `LOCAL_IMPORT_DIR`을 백엔드 파일시스템의 절대 경로로 설정합니다(컨테이너 배포에서는 마운트된 볼륨) — 가져오는 모든 것은 해당 루트 아래에 있어야 합니다; UI에서는 그 아래의 하위 경로를 선택할 수 있으며, 임의의 파일시스템 위치는 결코 허용되지 않습니다. [Environment Variables](#environment-variables) 참조.
- **즉시 사용해 보기:** `examples/local-detections-samples/`에는 바로 가져올 수 있는 작은 폴더가 포함되어 있습니다 — 두 개의 유효한 KQL 규칙(하나는 해당 메커니즘을 보여주기 위해 `.json` 사이드카와 짝지어짐), 하나의 의도적으로 유효하지 않은 규칙(플래그된 무효 배너를 보기 위함), 그리고 하나의 인식되지 않는 파일(가져오기 실패 배너를 보기 위함). `LOCAL_IMPORT_DIR`을 이 폴더로 지정하면 규칙을 작성할 필요 없이 첫 가져오기에서 세 가지 결과 상태를 모두 볼 수 있습니다.
**Local Detections** — 완료된 가져오기 실행: 요약 배너는 정적 분석에 의해 무효로 플래그된 파일(여기서는 단일 하드코딩된 해시에 대해 경보하는 규칙)을 깔끔하게 가져온 파일들과 나란히 표시하며, 모든 파일은 아래의 일반 헌트/탐지 행이 됩니다

---
## Screenshots
아래의 모든 스크린샷은 문서화를 위해 생성된 합성 데이터(가짜 조직 이름, RFC 5737 예시 IP, `.example` 도메인)를 사용합니다 — 실제 위협 인텔이나 고객 데이터는 없습니다.
**Feed** — 심각도, 태그, IOC, TTP로 트리아지된 위협 인텔 항목을 탐색하고 필터링합니다

<br>
**Dashboard** — 한눈에 보는 심각도 분석과 상위 MITRE ATT&CK 기법

<br>
**MITRE ATT&CK** — 수집된 인텔 전반의 기법 커버리지 전체 매트릭스 히트맵

<br>
**Your Stack** — 환경을 정의하면 피드 항목이 관련성 기준으로 재점수화됩니다

<br>
**IOCs** — 추출된 모든 지표의 검색 가능한 원장과 STIX/CSV 내보내기

<br>
**Integrations** — Sentinel, Defender, RunZero용 커넥터 개요: 구성됨/활성화됨 상태와 각자의 탭으로 가는 바로가기

<br>
**RunZero** — 자산 상관 분석, 조직 수준 노출 추적, 완화 지표, 모두 RunZero 인벤토리에서 가져옵니다

<br>
**Exposure** — 위협 매치 수로 순위가 매겨진 조직; 카드를 클릭하면 매치된 항목을 볼 수 있습니다

<br>
**Detections** — 등록된 모든 분석(AI 생성 및 로컬 가져오기 모두)의 전체 카탈로그로, 각각 정적 게이트/백테스트/검토 상태와 MITRE 기법을 포함합니다

<br>
**Settings** — AI 트리아지 제어, 피드 상태 모니터링, 소스 신뢰 점수, 사용자 관리

---
## Architecture```
┌─────────────────────────────────────────┐
│ Next.js 16 frontend (port 3000) │
│ Tailwind CSS · dark theme │
└──────────────┬──────────────────────────┘
│ REST API (Bearer token)
┌──────────────▼──────────────────────────┐
│ FastAPI backend (port 8000) │
│ APScheduler · slowapi rate limiting │
└──┬──────────┬──────────┬────────────┬───┘
│ │ │ │
Postgres AI provider RunZero API detections.ai
(modular: (asset sync) (coming soon --
Anthropic or see Features below)
Azure AI Foundry)
백엔드 (backend/) — Python 3.12 + FastAPI. 모든 저장소로 Postgres 사용 (SQLite와 Azure Blob Storage는 완전히 폐기됨). AI 제공자와 인증 방식은 모두 하드코딩이 아닌 환경 변수로 선택됨 — 아래 참조.
프론트엔드 (frontend/) — Next.js 16, 순수 JavaScript, Tailwind CSS. 로드 시 백엔드로부터 인증 모드를 자동 감지.
인프라 (infra/) — Container Apps, Key Vault, Container Registry용 Azure Bicep 템플릿 (apps.bicep + platform.bicep + app-stack.bicep, provision.ps1을 통해 배포됨). Azure + API 티어에만 해당.
AZURE_AD_TENANT_ID 설정됨 → Entra 모드: Microsoft Entra ID SSO, 사용자별 역할 (첫 로그인 사용자가 관리자가 되고, 나머지는 기본적으로 뷰어).
AZURE_AD_TENANT_ID 설정되지 않음 → 로컬 모드: 단일 공유 LOCAL_API_KEY가 이를 보유한 누구에게나 관리자 접근 권한을 부여. 사용자 관리 없음, Azure 의존성 없음. 프론트엔드는 로드 시 GET /api/auth/mode를 호출하고 일치하는 로그인 화면을 자동으로 렌더링 — 프론트엔드 측에서 구성할 것은 없음.
두 모드 모두 이후 동일한 종류의 앱 서명 JWT를 발급하므로, 다른 모든 라우트 (require_auth/require_admin)는 어떤 모드가 토큰을 발급했든 관계없이 동일하게 작동.
scripts/setup-basic.sh 또는 scripts/setup-basic-api.sh 실행 (배포 티어 참조) — Postgres와 .env 생성을 대신 처리해 줌. 그런 다음:```bash
cd backend && pip install -r requirements.txt && uvicorn main:app --reload --port 8000
cd frontend && npm install && npm run dev
### 수동 설정```bash
cd backend
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp env.example .env # fill in required values — see Environment Variables below
uvicorn main:app --reload --port 8000
--log-format 옵션--log-format 옵션은 로그 출력 형식을 지정합니다. 기본값은 text입니다.
python3 CVE-2025-55182.py --log-format json
--log-file 옵션--log-file 옵션은 로그를 지정된 파일에 기록합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-file scan.log
--log-level 옵션--log-level 옵션은 로깅 수준을 설정합니다. 기본값은 INFO입니다.
python3 CVE-2025-55182.py --log-level DEBUG
--log-max-size 옵션--log-max-size 옵션은 로그 파일의 최대 크기(바이트)를 설정합니다. 기본값은 10485760(10MB)입니다.
python3 CVE-2025-55182.py --log-max-size 5242880
--log-backup-count 옵션--log-backup-count 옵션은 보관할 로그 백업 파일의 수를 설정합니다. 기본값은 5입니다.
python3 CVE-2025-55182.py --log-backup-count 10
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-2025-55182.py --log-format json --log-json-separators ', ' ': '
--log-json-default 옵션--log-json-default 옵션은 JSON 로그 출력의 기본 직렬화 함수를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-default str
--log-json-encoder 옵션--log-json-encoder 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-encoder MyEncoder
--log-json-cls 옵션--log-json-cls 옵션은 JSON 로그 출력에 사용할 JSON 인코더 클래스를 설정합니다. 기본값은 None입니다.
python3 CVE-2025-55182.py --log-format json --log-json-cls MyEncoder
--log-json-indent 옵션--log-json-indent 옵션은 JSON 로그 출력의 들여쓰기 수준을 설정합니다. 기본값은 2입니다.
python3 CVE-2025-55182.py --log-format json --log-json-indent 4
--log-json-ensure-ascii 옵션--log-json-ensure-ascii 옵션은 JSON 로그 출력에서 ASCII가 아닌 문자를 이스케이프할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-ensure-ascii
--log-json-sort-keys 옵션--log-json-sort-keys 옵션은 JSON 로그 출력에서 키를 정렬할지 여부를 설정합니다. 기본값은 False입니다.
python3 CVE-2025-55182.py --log-format json --log-json-sort-keys
--log-json-separators 옵션--log-json-separators 옵션은 JSON 로그 출력의 구분자를 설정합니다. 기본값은 (',', ':')입니다.
python3 CVE-```bash
cd frontend
npm install
cp env.local.example .env.local # set NEXT_PUBLIC_API_URL=http://localhost:8000
npm run dev
cp backend/env.example backend/.env # fill in required values docker compose up --build
Frontend → http://localhost:3000
Backend API docs → http://localhost:8000/docs
---
## 환경 변수
`backend/env.example`을 `backend/.env`로 복사한 뒤 값을 채우세요. 어떤 티어에서 필요한지에 따라 그룹으로 묶여 있습니다:
**항상 필요:**
| 변수 | 설명 |
|----------|-------------|
| `PG_DSN` | Postgres 연결 문자열 |
| `JWT_SECRET_KEY` | 앱 세션 토큰 서명용 시크릿 (`python -c "import secrets; print(secrets.token_hex(32))"`) |
**인증 — 하나의 모드 선택:**
| 변수 | 설명 |
|----------|-------------|
| `LOCAL_API_KEY` | 로컬 모드: 관리자 접근을 부여하는 공유 키. `AZURE_AD_TENANT_ID`를 설정하지 않으면 이 모드가 활성화됩니다 |
| `AZURE_AD_TENANT_ID` | Entra 모드: SSO용 테넌트 ID. 이 값을 설정하면 Entra 모드가 활성화됩니다 |
| `AZURE_AD_CLIENT_ID` | Entra 모드: 앱 등록 클라이언트 ID |
| `AZURE_AD_CLIENT_SECRET` | Entra 모드: 앱 등록 시크릿 (프론트엔드 전용) |
| `NEXTAUTH_SECRET` | Entra 모드: NextAuth 세션 암호화 시크릿 (프론트엔드 전용) |
**AI 트리아지 — 선택 사항, 하나의 제공자 선택 (둘 다 생략하면 트리아지가 비활성화된 상태로 실행):**
| 변수 | 설명 |
|----------|-------------|
| `AI_PROVIDER` | `anthropic` (기본값) 또는 `azure` |
| `ANTHROPIC_API_KEY` | 직접 Anthropic API 키 |
| `AZURE_FOUNDRY_ENDPOINT` | Azure AI Foundry 엔드포인트, 예: `https://<resource>.services.ai.azure.com/anthropic` |
| `AZURE_FOUNDRY_API_KEY` | Azure AI Foundry API 키 |
| `AZURE_FOUNDRY_DEPLOYMENT` | Foundry 배포 이름 (기본값 `claude-haiku-4-5`) |
| `AZURE_FOUNDRY_API_VERSION` | Foundry API 버전 (기본값 `2025-05-01`) |
**선택 사항:**
| 변수 | 설명 |
|----------|-------------|
| `RUNZERO_API_TOKEN` | RunZero 자산 동기화 및 상관 분석을 활성화합니다 |
| `ALLOWED_ORIGINS` | 쉼표로 구분된 CORS 허용 목록 (기본값 `http://localhost:3000`) |
| `ENABLE_SCHEDULER` | 백그라운드 피드 폴러를 비활성화하려면 `false`로 설정 (기본값 `true`) |
| `ARCHIVE_AFTER_DAYS` | 자동 아카이브 임계값(일) (기본값 `90`) |
| `PG_POOL_MIN` / `PG_POOL_MAX` / `PG_POOL_TIMEOUT` | Postgres 연결 풀 튜닝 (기본값 `1` / `10` / `30`) |
| `LOCAL_IMPORT_DIR` | [로컬 탐지 가져오기](#running-without-sentinel-or-an-ai-provider-local-detections-import)를 활성화합니다 — 모든 가져오기가 제한되는 백엔드 파일시스템의 절대 경로입니다. 설정하지 않으면 이 기능이 완전히 비활성화됩니다 (해당 탭에 "not configured" 메시지가 표시됨) |
**프론트엔드** (`frontend/.env.local` 또는 `frontend/env.local.example`):
| 변수 | 설명 |
|----------|-------------|
| `NEXT_PUBLIC_API_URL` | 브라우저에서 보이는 백엔드 URL. 빌드 시 JS 번들에 포함됩니다. **설정하지 않으면** 내장된 동일 출처 프록시(`frontend/pages/api/[...proxy].js`)를 통해 API 호출이 라우팅됩니다 — 백엔드에 공용 인그레스가 없을 때마다 필요합니다 (예: Azure + API 티어의 내부 전용 Container App) |
| `BACKEND_URL` | Next.js 서버 자체에서 보이는 백엔드 URL. NextAuth의 로그인 교환에서 사용되며, `NEXT_PUBLIC_API_URL`이 설정되지 않은 경우 모든 `/api/*` 브라우저 요청을 서버 측에서 전달하는 동일 출처 프록시에서도 사용됩니다 |
**detections.ai 오케스트레이터 — 출시 예정** (아직 이 공개 릴리스의 일부가 아니며, 출시 시점을 위해 여기에 문서화되어 있습니다. Azure + API 티어, 별도 배포 가능 — `backend/detection_pipeline/orchestrator.py` 참조):
| 변수 | 설명 |
|----------|-------------|
| `DETECTIONS_AI_API_KEY` | 오케스트레이터를 실행하려면 필수 |
| `SENTINEL_WORKSPACE_ID` | 백테스팅용 Log Analytics 작업 영역 고객 ID (GUID). 선택 사항 |
| `PIPELINE_BATCH_SIZE` | 실행당 항목 수 (기본값 `5`) |
| `PIPELINE_DRY_RUN` | API를 호출하지 않고 클레임 및 로그만 남기려면 `true` |
| `PIPELINE_LANGUAGE` | 탐지 쿼리 언어 (기본값 `kql`) |
**Sentinel Hunts 동기화** (선택 사항, 기본적으로 꺼짐 — on/off/manual/auto 모드는 Settings > API Settings 참조):
| 변수 | 설명 |
|----------|-------------|
| `SENTINEL_HUNTING_SYNC_ENABLED` | 헌트 동기화 시도를 전혀 허용하지 않으려면 `true`. 설정하지 않거나 false이면 완전한 no-op — ARM 호출이 전혀 없음 |
| `AZURE_SUBSCRIPTION_ID` | Sentinel 작업 영역이 포함된 구독 |
| `AZURE_RESOURCE_GROUP` | Sentinel 작업 영역이 포함된 리소스 그룹 |
| `SENTINEL_WORKSPACE_NAME` | 작업 영역의 **이름**이며 고객 ID가 아닙니다 — 위의 `SENTINEL_WORKSPACE_ID`와는 다른 값으로, 백테스팅 데이터 플레인 클라이언트가 대신 사용합니다 |
---
## Azure 배포
실제 현재 IaC는 `infra/apps.bicep` + `infra/platform.bicep` + `infra/app-stack.bicep`이며, `infra/provision.ps1` (또는 얇은 래퍼인 `scripts/setup-azure.ps1`)을 통해 배포됩니다. Container Apps, Key Vault 기반 시크릿, 관리 ID를 프로비저닝합니다 — Postgres 자체는 이 저장소에서 프로비저닝하지 않습니다. `PG_DSN` (`pg-dsn` Key Vault 시크릿으로 저장됨)을 접근 가능한 모든 Postgres 서버로 지정하세요.```powershell
./scripts/setup-azure.ps1
# or directly:
cd infra
cp migration.psd1.example migration.psd1 # fill in your resource group, apps, etc.
./provision.ps1
provision.ps1은 멱등성을 가지므로 매니페스트를 수정한 후 다시 실행해도 안전합니다. 전체 단계별 절차(플랫폼 → 앱 스택 → 시크릿 → Easy Auth → 이미지 가져오기 → 앱 → 사후 검사)는 해당 파일의 헤더 주석을 참조하세요.
detections.ai 오케스트레이터(migration.psd1의 Orchestrator 블록으로 구동되는 예약된 Container Apps Job — 형태는 migration.psd1.example을 참조하고, 키는 DETECTIONSAIAPIKEY Key Vault 시크릿으로 저장하세요)는 아직 이 공개 릴리스에 포함되지 않았습니다 — 위의 Two detections-related features를 참조하세요.
├── backend/ │ ├── main.py # FastAPI app, all endpoints │ ├── db.py # Postgres queries │ ├── pgcompat.py # connection pool + SQLite-style placeholder translation │ ├── feed_manager.py # RSS polling, AI triage (provider-modular), scheduler │ ├── enrichment.py # IOC extraction, KEV cache, stack rematch │ ├── runzero_sync.py # RunZero asset sync and correlation engine │ ├── dedup.py # CVE deduplication logic │ ├── auth.py # Entra ID SSO + local API-key auth, app JWT sign/verify │ ├── ioc_export.py # STIX 2.1 and CSV export │ ├── stack_presets.py # Pre-built tech stack templates │ ├── detection_pipeline/ # detections.ai orchestrator, MITRE alignment-check, │ │ # Sentinel hunts/analytics-rules sync + tuning, │ │ # audit log, local_import.py (Local Detections Import) │ └── tests/ # pytest test suite, incl. fixtures/local_import/ ├── frontend/ │ ├── pages/ │ │ ├── index.js # Main app shell + tab routing │ │ └── login.js # Entra ID or local API-key login, auto-detected │ ├── lib/ │ │ ├── authMode.js # GET /api/auth/mode, cached per page load │ │ ├── authFetch.js # Bearer auth + 401-retry wrapper │ │ └── authSession.js # token storage, JWT decode/expiry helpers │ └── components/ │ ├── layout/ # TopBar, Sidebar, TabBar, TopFilterBar, TimeRangeToggle │ ├── feed/ # FeedList, FeedCard │ ├── integrations/ # IntegrationsPanel, ExposurePanel, RunZeroPanel, │ │ # RunZeroMatchesPanel, RunZeroMetricsPanel │ ├── detections/ # DetectionsPanel (tab shell) + one component per │ │ # sub-tab: DetectionsCatalogPanel, AlignmentReviewPanel, │ │ # DispositionAlertsPanel, HuntsPanel, SentinelHuntsPanel, │ │ # SentinelAnalyticsRulesPanel, LocalDetectionsPanel, │ │ # AuditPanel, plus shared TuningSuggestionBadge │ ├── settings/ # SettingsPanel, CadencePicker, SeverityCards │ └── mitre/ # MitreMatrix ├── infra/ # Azure Bicep templates + provision.ps1 ├── scripts/ # Tiered setup scripts (see Deployment tiers) └── docker-compose.yml
---
## 피드 소스
세 개의 계층에 걸쳐 63개의 피드:
- **Tier 1** — CISA, Cisco Talos, Fortinet Threat Signal, ESET WeLiveSecurity, Microsoft Security Blog, SentinelOne Labs, Google Project Zero, Zero Day Initiative, Check Point Research, Talos Intelligence Blog, The DFIR Report, Oracle
- **Tier 2** — Recorded Future, Malpedia, SANS ISC, Securelist, Unit42, Proofpoint TI, Malwarebytes TI, Wiz Blog, Datadog Security Labs, ReversingLabs, Sekoia, Cyble, ANY.RUN Blog 등
- **Tier 3** — BleepingComputer, Krebs on Security, Schneier on Security, The Hacker News, Dark Reading, CrowdStrike Blog, Snyk, Semgrep 등
---
## 보안
- 모든 API 엔드포인트는 `Authorization: Bearer <token>`을 요구합니다
- 로컬 인증 키에 대해 타이밍 안전 토큰 비교(`secrets.compare_digest`)를 사용합니다
- 전체적으로 매개변수화된 SQL을 사용합니다 — 쿼리에 문자열 보간을 사용하지 않습니다
- CORS는 명시적인 오리진 허용 목록으로 제한됩니다
- LLM 입력은 AI 제공자 호출 전에 정제되며, 출력은 저장 전에 검증됩니다
- 컨테이너는 모든 Linux 기능이 제거된 비루트 권한으로 실행됩니다
- 이미지에 시크릿이 포함되지 않습니다 — 런타임에 `.env` / Azure Key Vault에서 로드됩니다
---
## 라이선스
MIT — [LICENSE](https://github.com/ethan-andrews/threatintel-aggregator/blob/main/LICENSE)를 참조하세요.
| 티어 | 스크립트 | AI 트리아지 | 인증 | 스토리지 | 제공 기능 |
|---|
| Basic | scripts/setup-basic.sh | 꺼짐 | 로컬 API 키 | 로컬 Postgres (Docker) | 피드 집계, IOC 추출, MITRE 매트릭스, 대시보드 — AI 없음, 클라우드 없음, 가입할 것도 없음 |
| Basic + API | scripts/setup-basic-api.sh | Anthropic (직접) | 로컬 API 키 | 로컬 Postgres (Docker) | 위의 모든 기능에 더해 AI 심각도/TTP/요약 트리아지 |
| Azure + API | scripts/setup-azure.ps1 | Azure AI Foundry | Microsoft Entra ID SSO | 자체 Postgres (Azure DB for PostgreSQL 등) | Azure Container Apps에 전체 배포, 사용자별 역할이 적용된 SSO. (detections.ai 파이프라인 통합은 향후 릴리스에서 제공됩니다 — 아래 참조.) |