로컬 LLM으로 인프라 로그를 자동 분석하는 시스템을 만든 이야기 #
방화벽, 인증 인프라, 스위치, 로드밸런서, 웹 서버의 로그를 15분마다 AI가 자동으로 분석하여 이상 탐지·중요도 판정·대처 방안을 Slack으로 알립니다. 로그 데이터는 절대 외부로 전송되지 않습니다.
왜 만들었는가 #
계기는 단순했습니다. 로그를 볼 시간이 없다는 문제였습니다.
BESTNET-CLOUD에서는 여러 대의 방화벽, L2/L3 스위치, Windows AD, 로드밸런서, 웹 서버가 가동되고 있습니다. 각각이 syslog를 출력하지만, 일상적으로 모든 로그를 사람이 육안으로 확인하는 것은 현실적이지 않습니다. Zabbix로 리소스 모니터링은 하고 있지만, syslog의 내용을 읽고 “이 공격 패턴은 방치해도 되는지, 대처해야 하는지”를 판단하는 부분은 여전히 사람의 몫이었습니다.
AWS DevOps Agent(2026년 3월 GA)나 Azure Security Copilot 등 퍼블릭 클라우드 측에도 AI를 활용한 로그 분석 서비스가 나오고 있습니다. 그러나 이들은 클라우드상의 리소스가 주요 대상이며, 온프레미스 물리 장비의 syslog를 직접 파싱해서 분석하는 기능은 없습니다. 게다가 로그 데이터가 클라우드 벤더의 AI 인프라로 전송되기 때문에 폐쇄망 요구 사항이 있는 환경에서는 사용할 수 없습니다.
그렇다면 직접 만들 수밖에 없습니다. 다행히 로컬에서 작동하는 LLM의 성능은 실용 수준에 도달했고, 필요한 컴포넌트는 모두 오픈소스로 구비됩니다.
전체 구성 #
시스템의 이름은 BASTION(배스천)입니다. 성채·최후의 보루라는 의미로, 폐쇄망 환경에서 인프라를 지킨다는 세계관을 담았습니다.
구성은 간단합니다.
사용하고 있는 컴포넌트는 다음과 같습니다. 모두 오픈소스 또는 무료 플랜으로 작동합니다.
| 컴포넌트 | 역할 | 라이선스 |
|---|---|---|
| rsyslog | 전 장비의 syslog를 일원 수신·호스트별 저장 | OSS(GPL) |
| 셸 스크립트군 | 장비별 로그 요약·파싱·전처리 | 자사 개발 |
| OpenClaw | AI 에이전트 기반(LLM 연동·Slack 연동·명령 실행) | OSS |
| Qwen2.5-14B | 로컬 LLM(일본어 로그 분석·이상 판정) | OSS(Apache 2.0) |
| GPUStack | GPU 추론 서버(OpenAI 호환 API 제공) | OSS |
| Slack(Socket Mode) | 알림·양방향 대화 | 무료 플랜 |
데이터 흐름의 상세 #
1. 로그 수집(rsyslog) #
각 장비에서 syslog를 UDP/TCP 514로 수신하고, 호스트명·연도·월·프로그램명으로 디렉터리를 나누어 저장합니다.
/var/log/remote/ fw-primary/2026/04/filterlog.log ad-server/2026/04/Security-Auditing.log lb-server/2026/04/loadbalancer.log ...
2. 로그 요약(summarize.sh) #
15분마다 cron이 summarize.sh를 실행하여, 각 장비의 로그에서 최근 30분간의 이벤트를 추출하고 구조화된 텍스트 요약을 생성합니다.
각 장비의 로그는 형식이 완전히 다르기 때문에, 파싱 처리는 장비마다 따로 작성합니다. 예를 들어 방화벽의 filterlog는 쉼표로 구분되어 있고, 송신원 IP는 19번째, 목적지 포트는 22번째 필드입니다. Windows AD의 로그는 바이너리 데이터가 혼입되므로 grep -a가 필수입니다. 이러한 장비 고유의 지식을 스크립트에 반영하는 부분이 이 시스템의 핵심 작업입니다.
3. AI 분석(analyze.sh) #
요약 텍스트를 OpenClaw를 통해 로컬 LLM(Qwen2.5-14B)에 투입합니다. 프롬프트로 “중요도를 판정하고, 탐지한 이상과 권장 대처를 JSON 형식으로 반환하라”고 지시합니다.
여기서 중요한 설계 판단이 2가지 있습니다.
세션 분리: 분석할 때마다 세션 ID를 동적으로 생성하여, 과거 대화 이력이 컨텍스트에 혼입되는 것을 방지합니다. LLM은 이전 분석 결과에 끌려서 판단이 흔들릴 수 있으므로, 매번 깨끗한 컨텍스트로 분석시킵니다.
오탐 제어: 정상 동작 패턴(Nextcloud의 LDAP 정기 인증, Kerberos 자동 인증, 방화벽의 외부 스캔 차단 등)을 시스템 프롬프트에 정의하고, 노이즈로 제외하는 판정 기준을 LLM에 제공합니다. 운영하면서 패턴을 추가하는 방식입니다.
4. 알림(notify.sh) #
LLM의 분석 결과를 Slack에 전송합니다. 중요도에 따라 색상을 구분합니다(critical=빨강, high=주황, medium=노랑, low=초록).
medium 이상인 경우, 자동으로 2번째 상세 분석을 추가 전송합니다. 이 2번째 메시지에는 원시 로그의 상위 50행이 첨부되므로, 운영자는 알림을 보는 것만으로 “무슨 일이 일어났는지”와 “원시 데이터” 둘 다를 확인할 수 있습니다.
5. 대화형 분석(Slack 양방향) #
정기 분석과는 별도로, Slack에서 @OpenClaw-Monitor 방화벽 분석과 같이 멘션하면 지정한 장비의 상세 분석을 즉시 실행할 수 있습니다. “VPN 인증에 징후가 있는가” “동일 IP가 여러 공격 기법을 시도하고 있지 않은지 조사해달라”와 같은 자연어 질문에도 대응합니다.
OpenClaw가 bash 명령을 실행할 수 있으므로, 향후에는 방화벽 규칙의 동적 추가나 서비스 격리 같은 자동 대처로도 확장 가능합니다.
GPU 요구사항 #
의외로 적은 리소스로 작동합니다.
| 항목 | 소비량 |
|---|---|
| 모델 본체(Qwen2.5-14B Q4 양자화) | 약 9GB |
| KV 캐시(16K 토큰 시) | 약 1~2GB |
| 합계 | 약 10~11GB |
대응하는 기기 #
| 기기 종류 | 분석 내용 |
|---|---|
| 방화벽 | 공격 차단 수·공격원 IP·포트 분포·VPN 오류 |
| 인증 기반(AD) | 로그인 성공/실패/잠금·실패원 IP·실패 계정 |
| 로드밸런서 | 백엔드별 5xx 오류율 |
| L2/L3 스위치 | 링크 다운·루프·스톰 감지 |
| 웹 서버 | HTTP 상태 분포·민감 URL·4xx/5xx원 IP |
syslog 출력에 대응하는 기기라면, 파싱 스크립트를 추가하는 것만으로 모니터링 대상에 포함시킬 수 있습니다. FortiGate, Cisco, Palo Alto 등도 같은 방식으로 대응 가능합니다.
운용하면서 알게 된 것 #
LLM은 “판단”에 사용하고, “데이터 처리”는 스크립트로 한다 #
처음에는 LLM에 원시 로그를 직접 전달해서 전부 맡기려 했지만, syslog의 필드 위치를 잘못 인식하거나 카운트 계산이 어긋나곤 합니다. LLM은 수치의 정확한 집계가 약합니다. 현재는 로그 파싱·집계·요약은 셸 스크립트가 수행하고, LLM은 요약 텍스트를 읽고 “이상인가 정상인가” “어떻게 대처해야 하는가”를 판단하는 역할만 담당하고 있습니다.
오탐 제어는 운용하면서 키운다 #
첫 1주일은 오탐 투성이였습니다. Kerberos 컴퓨터 계정이 AD에 정기 인증할 때마다 로그인 성공으로 1,000건 이상 보고되고, Nextcloud의 LDAP 연동이 “의심스러운 로그인 시도”로 감지되었습니다. 하나씩 시스템 프롬프트에 정상 패턴으로 추가해 나가니, 2주 정도 지나자 노이즈가 거의 제로가 되었습니다.
세션 분리는 필수 #
세션 기능을 그대로 사용하면, 이전 분석 결과가 컨텍스트에 남아 LLM이 “이전 보고와 비교해서…”라고 불필요한 문맥을 가져옵니다. 보안 분석에서는 매번 신선한 눈으로 보는 것이 중요하므로, 분석마다 세션 ID를 동적 생성하는 방식으로 변경했습니다.
“아무 일도 일어나지 않았다”는 보고에도 가치가 있다 #
LOW 알림이 15분마다 오면, 처음에는 “시끄럽네”라고 느낍니다. 하지만 운용을 계속하다 보면, 이 알림이 “시스템이 정상적으로 작동하고 있다”는 안심 재료가 되고 있음을 깨닫게 됩니다. 알림이 오지 않을 때 “모니터링 자체가 멈춘 것”을 알아챌 수 있는 것은 이 정기 알림 덕분입니다.
향후 계획 #
현재는 “감지→알림”까지이지만, 앞으로는 “감지→AI가 판단→자동 대처”까지 확장할 계획입니다.
구체적으로는 공격원 IP 자동 차단(FW API 직접 호출), 브루트포스 감지 시 자동 차단, 이상 리소스 감지 시 자동 쓰로틀링 등을 구현해 나갈 예정입니다. 또한 Zabbix나 AWS CloudWatch, Azure Monitor 등 기존 모니터링 인프라로부터의 알림을 Webhook 경유로 수신하고, BASTION이 LLM으로 크로스 분석→자동 대처하는 하이브리드 구성도 검토 중입니다.
정리 #
로컬 LLM(Qwen2.5-14B)+GPUStack+OpenClaw+rsyslog+셸 스크립트라는 구성으로, 인프라 로그의 자동 분석을 실현했습니다. V100 16GB 1장으로 작동하며, 로그 데이터는 외부로 나가지 않고, 월 러닝 비용은 GPU 전기료만 듭니다.
모든 컴포넌트가 오픈소스이므로, 구조적으로는 누구나 재현 가능합니다. 다만 기기별 로그 파싱, 오탐 패턴 축적, 시스템 프롬프트 튜닝 등 “완전히 동작시키는” 부분에는 그만큼의 공수와 운용 노하우가 필요합니다.
BASTION은 현재 베스트넷 합동회사의 자사 인프라(BESTNET-CLOUD)에서 24시간 본격 가동되고 있습니다.