Skip to content

Commit a3f2e94

Browse files
committed
phase 1 개발중
1 parent 162fcb8 commit a3f2e94

44 files changed

Lines changed: 1753 additions & 1 deletion

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,19 @@
2626
- 초기에는 **non-agent core**, 이후 조사 보조용 **limited agent**를 제한적으로 추가
2727

2828
상세 설계와 단계별 구현 계획은 `docs/SECURITY_DATA_QUERY_PLATFORM.md`를 참고하세요.
29+
Phase 1 입력 소스/스키마/질의 초안은 `docs/PHASE1_INPUT_SOURCES_AND_SCHEMA.md`에 정리합니다.
30+
Phase 1 논리 테이블 설계 초안은 `docs/PHASE1_LOGICAL_SCHEMA.md`에 정리합니다.
31+
Postgres 기준 초기 DDL 초안은 `schema/001_phase1_initial.sql`에 정리합니다.
2932

3033
## 참고 문서
3134

3235
- `docs/FUNCTIONAL_SPEC.md`: 기능 정의서 원문
3336
- `docs/SECURITY_CONTROL_MAPPING.md`: 보안 통제(Security Controls) 매핑 문서
3437
- `docs/IMPLEMENTATION_ROADMAP.md`: 기능 정의서 기준 구현 로드맵
3538
- `docs/SECURITY_DATA_QUERY_PLATFORM.md`: 데이터 중심 보안 질의 플랫폼 설계 및 단계별 구현 계획
39+
- `docs/PHASE1_INPUT_SOURCES_AND_SCHEMA.md`: Phase 1 입력 소스 명세, 공통 스키마 초안, 1차 질의 카탈로그
40+
- `docs/PHASE1_LOGICAL_SCHEMA.md`: Phase 1 논리 스키마, 테이블 관계, 인덱스 초안
41+
- `schema/001_phase1_initial.sql`: Phase 1 Postgres 초기 DDL 초안
3642
- `docs/ZABBIX_AGENT_ACTIVE_SETUP.md`: PC/단말 Zabbix Agent Active 등록 가이드
3743
- `docs/TRIVY_USAGE.md`: Trivy 파일시스템/이미지 스캔 가이드
3844
- `docs/DEPLOYMENT.md`: 서버 배포/운영/트러블슈팅 가이드
@@ -90,6 +96,11 @@
9096
- `generate-indexer-certs.yml`: Wazuh 인증서 생성용 compose 파일
9197
- `docs/SECURITY_CONTROL_MAPPING.md`: 보안 통제 매핑 문서
9298
- `docs/SECURITY_DATA_QUERY_PLATFORM.md`: 데이터 중심 보안 질의 플랫폼 설계 문서
99+
- `docs/PHASE1_INPUT_SOURCES_AND_SCHEMA.md`: Phase 1 입력 소스/스키마/질의 명세 문서
100+
- `docs/PHASE1_LOGICAL_SCHEMA.md`: Phase 1 논리 테이블/관계 설계 문서
101+
- `schema/001_phase1_initial.sql`: Phase 1 초기 SQL 스키마 파일
102+
- `src/mori_soc/*`: Phase 1 Python 구현 골격(모델, collector 계약, API 계약, 질의 카탈로그)
103+
- `tests/*`: Phase 1 collector / query service / ingestion 단위 테스트
93104
- `docs/ZABBIX_AGENT_ACTIVE_SETUP.md`: Zabbix Agent 온보딩 문서
94105
- `docs/TRIVY_USAGE.md`: Trivy 활용 가이드
95106
- `docs/FLEET_MACBOOK_ENROLLMENT_AND_TEST.md`: Fleet macOS 등록/검증/대시보드 확인 문서
@@ -250,6 +261,36 @@ Grafana Explore에서 Loki로 아래 쿼리를 확인합니다.
250261
- Fleet status 로그: `{job="fleetdm", log_type="status"}`
251262
- Fleet result 로그: `{job="fleetdm", log_type="result"}`
252263

264+
## 12. 집에서 이어서 작업할 때 사용할 프롬프트
265+
266+
다른 장소에서 이 저장소 작업을 다시 이어갈 때는,
267+
현재 목표와 읽어야 할 파일, 그리고 바로 다음 작업 범위를 한 번에 적어주면 가장 빠르게 이어집니다.
268+
269+
### 짧은 버전
270+
271+
- `이 저장소는 MORI SOC-lite이고 지금은 Security Data Query Platform Phase 1 구현 중이야.`
272+
- `README, docs/SECURITY_DATA_QUERY_PLATFORM.md, docs/PHASE1_INPUT_SOURCES_AND_SCHEMA.md, docs/PHASE1_LOGICAL_SCHEMA.md를 먼저 읽고 현재 상태를 요약해줘.`
273+
- `그 다음 src/mori_soc와 tests를 보고 마지막 구현 다음 단계부터 코드와 테스트까지 이어서 진행해줘.`
274+
275+
### 추천 시작 프롬프트
276+
277+
- `이 저장소는 MORI SOC-lite이며, 현재 목표는 FleetDM/Wazuh/Zabbix/host log를 수집·정규화해서 자연어로 조회할 수 있는 Security Data Query Platform을 만드는 것이다. 지금은 Phase 1(Data Collection/Normalization Core) 구현 중이다. 먼저 README, docs/SECURITY_DATA_QUERY_PLATFORM.md, docs/PHASE1_INPUT_SOURCES_AND_SCHEMA.md, docs/PHASE1_LOGICAL_SCHEMA.md, schema/001_phase1_initial.sql, src/mori_soc, tests를 읽고 현재 구현 상태를 요약해줘. 그 다음 아직 구현되지 않은 다음 단계 하나를 제안하고 바로 구현과 테스트까지 진행해줘.`
278+
279+
### 같이 적으면 좋은 추가 정보
280+
281+
- 이번에 하고 싶은 범위
282+
- 예: `Fleet collector 고도화`, `repository 추가`, `Wazuh collector 시작`
283+
- 이번 턴 목표
284+
- 예: `코드 작성 + unit test 통과까지`
285+
- 실행 허용 범위
286+
- 예: `safe한 unit test는 바로 실행해도 됨`
287+
288+
### 예시
289+
290+
- `Phase 1 계속하자. 이번에는 src/mori_soc 기준으로 Wazuh alert collector stub와 테스트를 추가해줘. 변경 후 unit test까지 실행해줘.`
291+
292+
이렇게 시작하면 이전 대화가 길더라도 저장소 상태 기준으로 맥락을 빠르게 복원할 수 있습니다.
293+
253294
Starter dashboard에도 아래 패널이 표시됩니다.
254295

255296
- `Fleet Status Logs`
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
# MORI Phase 1 입력 소스 및 공통 스키마 초안
2+
3+
## 1. 목적
4+
5+
이 문서는 Phase 1인 **데이터 수집/정규화 코어**를 실제 구현하기 위한 세부 명세 초안입니다.
6+
7+
정리 범위는 아래 3가지입니다.
8+
9+
- 현재 저장소 기준으로 수집 가능한 입력 소스
10+
- 공통 엔터티 및 필수 필드 초안
11+
- 운영자 질문 기준 1차 질의 카탈로그
12+
13+
## 2. Phase 1 범위 원칙
14+
15+
- 먼저 **이미 저장소에 있는 수집 경로**를 기준으로 설계한다.
16+
- 초기 답변은 자유 생성보다 **템플릿 질의 + 근거 반환**에 집중한다.
17+
- 원본 데이터의 식별자와 링크를 반드시 유지한다.
18+
- 공통 식별자는 `host_id`를 중심으로 설계한다.
19+
20+
## 3. 입력 소스 명세
21+
22+
| 소스 | 수집 대상 | 현재 저장소 기준 접근 경로 | 현재 상태 | 정규화 대상 |
23+
| --- | --- | --- | --- | --- |
24+
| FleetDM | 호스트 인벤토리 | Fleet 서비스 (`:1337`) 기반 API/내부 DB 연계 예정 | 추가 구현 필요 | `host` |
25+
| FleetDM | osquery status 로그 | `/logs/osqueryd.status.log` → Fluent Bit → Loki (`job=fleetdm`, `log_type=status`) | 이미 수집 중 | `query_result`, `host_observation` |
26+
| FleetDM | osquery results 로그 | `/logs/osqueryd.results.log` → Fluent Bit → Loki (`job=fleetdm`, `log_type=result`) | 이미 수집 중 | `query_result` |
27+
| FleetDM | 취약점 정보 | Fleet 서비스/API 기반 수집 예정, 취약점 DB 볼륨 사용 중 | 추가 구현 필요 | `vulnerability` |
28+
| Wazuh | alert/rule 이벤트 | Wazuh Manager/API (`:55000`) 및 내부 indexer 연계 예정 | 추가 구현 필요 | `alert` |
29+
| Wazuh | agent inventory/status | Wazuh API 기반 수집 예정 | 추가 구현 필요 | `host`, `alert` |
30+
| Zabbix | host inventory | Zabbix Web/API (`:18081`) 연계 예정 | 추가 구현 필요 | `host` |
31+
| Zabbix | trigger/event | Zabbix API 기반 수집 예정 | 추가 구현 필요 | `alert`, `host_observation` |
32+
| Zabbix | metric snapshot | Zabbix API 기반 수집 예정 | 추가 구현 필요 | `host_observation` |
33+
| Host logs | 시스템/애플리케이션 로그 | `/var/log/*.log`, `/var/log/*/*.log` → Fluent Bit → Loki (`job=fluent-bit`, `source=host`) | 이미 수집 중 | `login_event`, `process`, `alert` |
34+
35+
## 4. Source별 우선 구현 순서
36+
37+
### 4-1. 즉시 활용 가능
38+
39+
- Fleet status/result 로그
40+
- Host logs
41+
42+
이 둘은 이미 Fluent Bit에서 Loki로 들어오고 있으므로,
43+
초기 Phase 1에서는 **정규화 규칙 정의 + 조회 템플릿화**부터 시작할 수 있습니다.
44+
45+
### 4-2. 다음 연결 대상
46+
47+
- Fleet 인벤토리/취약점
48+
- Wazuh alert/agent inventory
49+
- Zabbix host/trigger/metric
50+
51+
이 구간은 별도 collector 또는 API pull 작업이 필요합니다.
52+
53+
## 5. 공통 식별자 전략
54+
55+
### 5-1. Canonical host_id
56+
57+
`host_id`는 소스별 ID를 그대로 재사용하지 않고,
58+
하나의 정규화 레코드에 연결되는 **표준 자산 키**로 둡니다.
59+
60+
추천 우선순위는 아래와 같습니다.
61+
62+
1. 하드웨어/플랫폼 고유 식별자
63+
2. Fleet host 식별자
64+
3. Wazuh agent 식별자
65+
4. Zabbix host 식별자
66+
5. 정규화된 hostname 기반 fallback
67+
68+
### 5-2. Source reference 보존
69+
70+
각 엔터티는 원본 시스템의 식별자를 별도 필드로 남깁니다.
71+
72+
- `fleet_host_id`
73+
- `fleet_query_id`
74+
- `wazuh_agent_id`
75+
- `wazuh_alert_id`
76+
- `zabbix_host_id`
77+
- `zabbix_event_id`
78+
79+
## 6. 공통 엔터티 초안
80+
81+
### 6-1. host
82+
83+
| 필드 | 설명 |
84+
| --- | --- |
85+
| `host_id` | 정규화된 표준 호스트 ID |
86+
| `hostname` | 대표 호스트명 |
87+
| `platform` | macOS / Linux / Windows 등 |
88+
| `primary_ip` | 대표 IP |
89+
| `status` | online / offline / unknown |
90+
| `first_seen_at` | 최초 관측 시각 |
91+
| `last_seen_at` | 마지막 관측 시각 |
92+
| `fleet_host_id` | Fleet 원본 식별자 |
93+
| `wazuh_agent_id` | Wazuh 원본 식별자 |
94+
| `zabbix_host_id` | Zabbix 원본 식별자 |
95+
96+
### 6-2. alert
97+
98+
| 필드 | 설명 |
99+
| --- | --- |
100+
| `alert_id` | 정규화된 경보 ID |
101+
| `source` | `wazuh` / `zabbix` / `host_log`|
102+
| `source_event_id` | 원본 이벤트 ID |
103+
| `host_id` | 연결된 호스트 |
104+
| `severity` | 표준 심각도 |
105+
| `rule_name` | 룰/트리거명 |
106+
| `message` | 요약 메시지 |
107+
| `observed_at` | 발생 시각 |
108+
| `raw_ref` | 원본 로그/이벤트 위치 |
109+
110+
### 6-3. vulnerability
111+
112+
| 필드 | 설명 |
113+
| --- | --- |
114+
| `vuln_id` | 정규화된 취약점 ID |
115+
| `host_id` | 연결된 호스트 |
116+
| `cve` | CVE 식별자 |
117+
| `severity` | 표준 심각도 |
118+
| `package_name` | 영향 패키지 |
119+
| `installed_version` | 현재 버전 |
120+
| `fixed_version` | 수정 버전 |
121+
| `detected_at` | 탐지 시각 |
122+
| `raw_ref` | 원본 취약점 레코드 참조 |
123+
124+
### 6-4. query_result
125+
126+
| 필드 | 설명 |
127+
| --- | --- |
128+
| `query_result_id` | 정규화된 결과 ID |
129+
| `source` | 기본값 `fleet` |
130+
| `host_id` | 연결된 호스트 |
131+
| `query_name` | 쿼리명 또는 pack 이름 |
132+
| `query_text` | 원본 쿼리 또는 식별자 |
133+
| `result_json` | 결과 원문 |
134+
| `observed_at` | 수집 시각 |
135+
| `raw_ref` | Loki 로그 또는 원본 경로 |
136+
137+
### 6-5. host_observation
138+
139+
| 필드 | 설명 |
140+
| --- | --- |
141+
| `observation_id` | 정규화된 관측 ID |
142+
| `source` | `fleet`, `zabbix`, `host_log`|
143+
| `host_id` | 연결된 호스트 |
144+
| `observation_type` | status / metric / availability 등 |
145+
| `metric_name` | cpu, memory, disk, checkin 등 |
146+
| `metric_value` ||
147+
| `unit` | %, bytes, state 등 |
148+
| `observed_at` | 관측 시각 |
149+
| `raw_ref` | 원본 이벤트 참조 |
150+
151+
## 7. 공통 필드 규칙
152+
153+
모든 이벤트성 엔터티는 가능하면 아래 필드를 공통으로 갖습니다.
154+
155+
- `source`
156+
- `event_type`
157+
- `host_id`
158+
- `severity`
159+
- `message`
160+
- `observed_at`
161+
- `raw_ref`
162+
- `raw_payload`
163+
164+
정규화 규칙:
165+
166+
- 시간은 UTC 기준 ISO 8601로 저장
167+
- 심각도는 원본 값과 표준 값을 함께 보존
168+
- 원본 payload 삭제 금지
169+
- 사람이 읽는 요약과 원본 증거를 함께 저장
170+
171+
## 8. 1차 질의 카탈로그
172+
173+
Phase 1에서 먼저 템플릿화할 질문 후보는 아래와 같습니다.
174+
175+
1. 지난 24시간 `high/critical` alert 수는 얼마인가?
176+
2. 현재 오프라인 또는 unavailable 상태인 호스트는 무엇인가?
177+
3. Fleet에 등록됐지만 최근 체크인이 없는 호스트는 무엇인가?
178+
4. 취약점이 가장 많은 호스트 Top 10은 무엇인가?
179+
5. 특정 호스트의 최근 24시간 타임라인을 보여줘.
180+
6. 특정 호스트에서 최근 발생한 Wazuh alert만 보여줘.
181+
7. 특정 호스트의 최근 Fleet query 결과를 보여줘.
182+
8. 최근 새로 탐지된 high 이상 취약점은 무엇인가?
183+
9. 경보가 많으면서 동시에 상태가 불안정한 호스트는 무엇인가?
184+
10. Fleet/Wazuh/Zabbix 중 하나라도 매핑되지 않은 자산은 무엇인가?
185+
11. 최근 로그인 실패가 많은 사용자 또는 호스트는 무엇인가?
186+
12. 최근 수집 오류 또는 상태 오류가 반복된 호스트는 무엇인가?
187+
188+
## 9. 구현 순서 제안
189+
190+
1. `host` 매핑 규칙과 source reference 필드를 먼저 확정
191+
2. Fleet/host log용 정규화 규칙부터 적용
192+
3. Wazuh/Zabbix collector 입력 스펙 추가
193+
4. 1차 질의 카탈로그를 API 템플릿으로 변환
194+
5. 이후 자연어 → intent/filter 매핑 추가
195+
196+
## 10. 다음 바로 할 일
197+
198+
이 문서 다음 단계는 아래 둘 중 하나입니다.
199+
200+
1. **공통 스키마를 테이블 설계 수준으로 내리기**
201+
2. **collector / API / schema 디렉터리 구조를 저장소에 실제로 만들기**
202+
203+
권장 순서는 **스키마 상세화 → 구현 골격 추가**입니다.
204+
세부 테이블 설계는 `docs/PHASE1_LOGICAL_SCHEMA.md`에서 이어집니다.

0 commit comments

Comments
 (0)