문제
Wazuh XML 룰을 손으로 쓰면 오류가 잦았다. 룰 ID가 충돌하고, 정규식 엔진 문법을 틀리고, 디코더의 order와 캡처 그룹 수가 어긋났다.
새로 도입한 NGIPS 장비는 syslog 디코더를 처음부터 만들어야 했다.
해결
LLM이 룰을 생성하면 검증기가 검사하고, 실패하면 오류를 다시 LLM에 넣어 재생성하는 자가검증 루프를 만들었다.
결과는 Wazuh logtest와 실제 장비 로그로 한 번 더 확인한다.
주요 기능
- 룰 생성 3가지 모드
new: 신규 탐지 룰tune:if_sid/overwrite로 기존 룰을 억제하거나 승격correlate:frequency/if_matched_sid로 묶는 상관 룰
- 디코더 생성·검증:
order필드와 캡처 그룹 개수가 맞는지 확인한다. - 일괄 생성: 장비 로그 정의서의 필드맵으로 디코더와 룰 여러 개를 결정적으로 만들고,
logtest결과와 대조한다. - diff 미리보기: 기존 룰 파일과 생성 결과를 줄 단위로 비교한다.
- Suricata 운영: 원격 센서의 SID 사용/사용안함 전환, ET Open 업데이트, 예외 IP 처리, NVD CVE 기반 룰 생성, 스케줄링
설계 포인트
- 자가검증 루프: XML 형식, ID 대역, 충돌, 정규식 엔진 규칙, 모드별 필수 구조를 검사하고 실패 사유를 피드백해 다시 생성한다.
temperature=0과 고정 시드로 결과를 재현할 수 있다. - ID는 코드가 정한다: 사용 중인 수천 개 ID를 프롬프트에 나열하지 않고 다음 빈 ID를 계산해 준다. 토큰과 재시도가 함께 줄었다.
- 최소 권한 root 래퍼: sudo로는 고정된 서브커맨드만 실행할 수 있다. 쓰기는 백업 → 쓰기 →
suricata -T검증 → 실패 시 복구 순서로 진행한다. 파싱은 권한 없는 쪽에 둬서, 로직을 바꿔도 래퍼를 다시 설치할 필요가 없다. - 쓰기 안전 스위치: 운영 룰 파일 쓰기는 기본적으로 막혀 있고, 명시적으로 켜야만 동작한다.
- 실제 로그로 검증: 랩에서 저강도 공격 세트로 NGIPS 로그를 실제로 발생시켜, 미확정이던 필드 값을 확정했다.
- 관측성: 모든 응답에 소요시간, LLM 시간, 시도 횟수, 모델이 포함된다.
스택
Python · FastAPI · pydantic v2 · httpx · APScheduler · Wazuh Manager API (logtest) · Suricata · NVD API 2.0 · 로컬 LLM (LM Studio) · systemd