
IT, AI 및 OT를 위한 오픈소스 셀프 호스팅 보안 파이프라인. 로그인. 증거 출력.: OCSF 정규화, 46개 탐지 규칙(MITRE/ATLAS/ICS 태그 지정), 상관 분석, 증거 패키지, NIS2 초안, 재구축된 React 콘솔 + GitHub Pages 데모. Apache-2.0.
로그인은 들어오고, 증거는 나간다.
IT, AI, OT를 위한 오픈소스 보안 파이프라인: 원시 로그에서 검증된 인시던트와 NIS2 신고 초안까지.
프로젝트 페이지 및 라이브 데모 · 빠른 시작 · 콘솔 · 아키텍처 · 상태 (SSOT)
배지는 약속이 아니라
main에서의 최신 실제 실행 결과를 반영합니다. Scorecard의 나머지 발견 사항은 수용되고 문서화된 트레이드오프이며, 미비점이 아닙니다. SSOT.md §1을 참고하세요.
FENGARDE는 IT, AI, OT 전반의 보안 텔레메트리를 연결하여 무슨 일이 일어났는지, 누가 또는 무엇이 행동했는지, 무엇이 영향을 받았는지, 이벤트들이 어떻게 연관되는지, 그리고 결론을 뒷받침하는 증거가 무엇인지를 보여줍니다.
유럽 산업 중견기업을 위해 만들어졌습니다: 오픈소스, 자체 호스팅, Apache-2.0, NIS2 인시던트 신고 초안 경로, 결정론적 독일어/영어 보고서 생성기, MSP 스타일 배포를 위한 선택적 RBAC/MFA/감사 로그/멀티테넌시, 선택적 HA 프로필(단순 연결이 아닌 실제 킬 테스트 검증 완료), 그리고 네트워크를 벗어나지 않는 AI 트리아지를 갖추고 있습니다.
로그는 수집되어 하나의 스키마(OCSF)로 정규화되고, 슬라이딩 윈도우에 걸친 상관 규칙을 통과하며, 인과 그래프와 해시 체인 증거 패키지를 갖춘 인시던트로 그룹화되어 OpenSearch에 인덱싱됩니다. 모든 서비스는 독립적이며 메시지 버스로만 서로 통신하므로, 다른 부분을 다시 작성하지 않고도 어느 구성 요소든 확장하거나 교체할 수 있습니다.
OLLAMA_URL이 설정되면 로컬 Ollama를,
그렇지 않으면 레이블이 지정된 결정론적 스텁을 사용합니다. 경보 데이터는 절대
제3자 LLM API를 통해 전송되지 않으며, 콘솔은 실제로 어떤 엔진이 실행되었는지
표시합니다. 측정된 두 모델에서 판정 품질은 낮습니다(qwen2.5:3b는 레이블이
지정된 경보 54건 중 1건 정답, qwen2.5:7b는 54건 중 7건 정답, 대부분
suspicious 응답). eval/llm_triage/RESULTS.md를
참고하세요.Elastic이 아닌 OpenSearch: 스토리지 엔진에 라이선스 별표가 없습니다 (ADR 003). 알아둘 만하지만, Wazuh에 대한 차별점은 아닙니다(그 인덱서도 OpenSearch 포크이기 때문입니다).
| 방법 | 필요한 것 | 얻는 것 |
|---|---|---|
| 프로젝트 페이지 | 브라우저 | 랩 실행을 녹화한 실제 콘솔로, 재생 가능한 공격, 아키텍처, 46개 규칙 전체, 그리고 네 개의 녹화된 둘러보기가 포함되어 있습니다. 정적이며, 쓰기는 브라우저에만 남습니다(docs/console-demo.md에 무엇이 실제인지 정확히 나와 있습니다). |
make e2e | Python 3 | 실제 경보까지 이어지는 SSH 무차별 대입 공격으로, 재생 시 멱등성을 가집니다. Docker, Redis, OpenSearch가 필요 없습니다. |
make demo | Docker | 전체 라이브 스택으로, 약 1분 이내에 실제 무차별 대입 경보가 콘솔에 나타납니다. |
git clone https://github.com/supermhel/fengarde.git && cd fengarde
make preflight # doctor: checks vm.max_map_count, Docker RAM, free ports
make demo # docker compose up -- a real SSH brute-force alert appears
# in the dashboard within ~30-60s, no manual step
# open http://localhost:8080
Docker가 없으신가요? 전체 탐지 파이프라인은 별도 인프라 없이 실행됩니다:
make e2e # SSH brute-force -> real alert -> idempotent replay, no Docker/Redis/OpenSearch
bash tools/demo.sh # same test, narrated (Windows: powershell -File tools\demo.ps1)
확인 중인 내용: 60초 이내에 한 IP에서 발생한 10회의 로그인 실패(SSH Failed password 또는 Windows EventID 4625 — 둘 다 동일한 OCSF Authentication 이벤트로 정규화됨)가 common_bruteforce.yml(threshold: 10, window_seconds: 60, 소스 IP 기준 그룹화)을 트리거하며, 알림은 대시보드의 알림 목록에 표시되고 재전송 시에도 멱등성을 유지합니다.
사전 요구 사항: Docker Desktop 또는 Docker Engine + Compose v2, Docker에 할당된 RAM ≥4 GB; Linux, macOS, 또는 WSL2를 통한 Windows(Linux 컨테이너, POSIX sh 스크립트). Python 3는 파서를 기여하는 경우에만 필요하며, 그 경우 Docker는 필요하지 않습니다(Contributing 참조).
vm.max_map_count를 높여야 합니다sudo sysctl -w vm.max_map_count=262144
# persist across reboots:
echo 'vm.max_map_count=262144' | sudo tee /etc/sysctl.d/99-fengarde.conf
이것이 없으면 OpenSearch는 유용한 오류 대신 JVM 크래시와 함께 실패합니다. macOS Docker Desktop에서는 필요하지 않습니다(해당 VM 내부에서 처리됨). make preflight가 이를 확인해 주며, 누락된 항목이 있으면 정확한 해결 방법을 출력합니다.
기타 대상:
make test # full zero-infra contract test suite, no Docker needed
make up # start the stack detached
make down # stop the stack, remove volumes
make ha-up # opt-in: Redis Sentinel + 3-node OpenSearch HA (needs REDIS_PASSWORD)
make ha-down # stop the HA profile, remove its volumes
| 포트 | 서비스 | 설명 |
|---|---|---|
| 6379 | redis (siem-bus) | 서비스 간 메시지 버스 |
| 9200 | opensearch (siem-store) | 이벤트/알림 저장 + 쿼리 API |
| 5601 | dashboards (siem-dashboards) | OpenSearch Dashboards |
| 8000 | ws6-inventory | 인벤토리 API (IP/MAC 이력) |
| 8080 | ws7-dashboard | FENGARDE 알림 콘솔 |
| 5514/udp | ws1-collectors | 실시간 syslog 수집 (인증 없음 — 신뢰할 수 있는 세그먼트 전용) |
| 8013 | ws3-indexer | 트리아지 API — 내부 전용, 호스트에 게시되지 않음 |
| 9090 | prometheus | 메트릭 — 선택 사항, observability compose 프로필 |
| 3000 | grafana | Prometheus 기반 대시보드 — 선택 사항, 동일 프로필; 기본 admin/admin, SECURITY.md §1 참조 |
| 8081 | goatcounter | 프로젝트 페이지의 자체 호스팅 사본을 위한 자체 호스팅 방문 카운터 — 선택 사항, 동일 프로필; 쿠키 없음, 네트워크 외부로 아무것도 나가지 않음 (docker exec로 한 번 설정, docs/deployment.md 참조) |
make preflight는 시작하기 전에 게시된 포트가 비어 있는지 확인합니다.
make up 후 콘솔은 http://localhost:8080에 있습니다 (React 18 및 Vite; /legacy/에 있던 이전
단일 파일 UI는 2026-10-20에 폐기됨). 세 그룹에 걸친 열한 개의 뷰 (사이드바의 열 개와 Account):
| 그룹 | 뷰 |
|---|---|
| Detect | Overview, Alarms (트리아지, AI 판정, "왜 발생했는가", NIS2 초안), Incidents (인과 그래프, 증거 패키지, 사고 보고서) |
| Investigate | Events (쿼리 바, 패싯, 히스토그램, raw/OCSF), Coverage (MITRE 히트맵, 모든 규칙, 관리자용 테넌트별 스위치) |
| Operate | Sources (장치 연결, 첫 이벤트 대기), Inventory (실시간 자산 기록, 관리자로 장치 추가), Operations (서비스 상태, 데드 레터, Prometheus 패널), Audit, Settings (사용자 및 알림 채널, 관리자 전용) |
| Account | MFA 등록 |
독일어와 영어, 라이트 및 다크, 휴대폰 너비. 로그인은 MFA 코드를 받고 어느 호스트와 통신하는지, 로그인 서비스가 응답하는지 여부를 알려주며, 일반 HTTP에서는 경고합니다. 각 역할이 무엇을 할 수 있는지는 로그인 페이지에 나열되어 있습니다.