241. Zeek (구 Bro) — 네트워크 트래픽 메타데이터 분석 엔진
⚠️ 이 문서는 날아다니는 패킷을 까보고 수배 전단지(시그니처)에 있는 해커 지문과 일치하면 삐용삐용 알람만 울리고 끝내버리는 멍청한 Snort(스노트)의 한계를 넘어, **수천만 개의 패킷이 지나간 자리에 어떤 IP가 언제, 누구와, 무슨 프로토콜로 대화했고, 어떤 파일을 다운로드 받았는지 그 방대한 '대화의 맥락(메타데이터, 통계 기록)'을 엑셀 장부처럼 낱낱이 다 기록해 두어 해커의 숨겨진 과거 궤적을 셜록 홈즈처럼 역추적해 내는 네트워크 분석(NDR)의 최강자, '직(Zeek)'**을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 스노트(Snort)가 총을 든 '경비원(IDS)'이라면, 직(Zeek)은 지나가는 모든 사람의 이름, 시간, 가방 크기, 목적지를 엑셀에 묵묵히 적는 '기록의 달인(사관, NTA/NDR)'이다. 알람을 울리는 게 주 목적이 아니라 기록(Log)을 남기는 게 목적이다.
- 가치: 해커가 제로데이 공격을 써서 경비원(Snort)의 눈을 피해 몰래 들어왔다 치자. 한 달 뒤에 해킹당한 걸 알았다. 스노트에는 기록이 1도 없지만, Zeek 장부에는 "한 달 전 새벽 3시에 사장님 PC가 짱깨 IP랑 2기가바이트 통신(파일 털림)을 했고, 그 파일 해시값이 어쩌구저쩌구..." 하는 완벽한 블랙박스 증거가 남아있어 추적을 가능케 한다.
- 기술 체계: 단순히 패킷(PCAP) 덩어리를 무식하게 하드에 덤프 뜨는 게 아니라, 똑똑한 프로토콜 파서가 알아서
conn.log(접속 기록),http.log(웹 기록),files.log(파일 추출 해시) 같은 예쁘고 읽기 쉬운 정형화된 메타데이터 파일(TSV/JSON)로 압축 변환시켜 저장해 준다.
Ⅰ. 스노트(Snort)의 장님 현상과 메타데이터의 힘
도둑이 잡히지 않고 지나갔다면, 경비원 장부에는 아무것도 남지 않는다.
- 시그니처 IDS(Snort)의 치명적 한계:
- 스노트는 룰(Rule)에 매칭되는 패킷이 들어올 때만 알람을 울린다.
- 만약 해커가 룰에 없는 신종 공격(제로데이)으로 스윽 지나갔다? 스노트는 조용히 통과시켰고, 화면엔 아무 경고도 뜨지 않는다.
- 3일 뒤 사장님 PC가 랜섬웨어에 걸렸다. 관제 요원이 스노트 장비를 까본다. 기록이 백지다. 해커가 어떻게 들어왔는지(HTTP? FTP? 어느 IP?), 무슨 짓을 했는지 영원히 알 길이 없다.
- Zeek의 등판 (Network Traffic Analysis, NTA):
- "해킹인지 아닌지 내가 판단하지 않겠다. 그냥 지나가는 모든 놈의 '행동 요약본(메타데이터)'을 적어둘 테니, 나중에 니들이 엘라스틱서치(Elasticsearch)로 엑셀 뒤지듯 검색해 봐!"
- Zeek은 본선을 지나는 10Gbps의 트래픽을 가로채서(Mirroring), 원본 패킷(PCAP) 전체를 하드에 붓지 않는다(용량 터지니까).
- 대신 대화의 요약본을 뽑는다. "A가 B한테 아침 9시에
GET /admin.php요청을 보냈고, B는404 Not Found를 줬네. 총 대화 용량은 2MB야." 이 텍스트 1줄로 압축해서 엑셀(로그 파일)에 적는다.
📢 섹션 요약 비유: 스노트(Snort)는 건물 입구의 금속 탐지기입니다. 삐- 소리(알람)가 안 나면 사람을 그냥 보내고 기억에서 지웁니다. 며칠 뒤 다이아몬드가 털려도 누가 가져갔는지 모릅니다. 직(Zeek)은 방명록을 든 안내데스크 직원입니다. 탐지기가 울리든 안 울리든, 모든 방문객에게 "들어온 시간, 이름, 타고 온 차 번호, 가방 무게"를 방명록에 무조건 적게 합니다(메타데이터 기록). 나중에 다이아몬드가 털리면 이 방명록(Zeek 로그)을 쫙 뒤져서 "아, 그날 가방 무게가 5kg 늘어서 나간 놈이 있네!" 라며 셜록 홈즈처럼 역추적(Threat Hunting)을 해낼 수 있는 궁극의 블랙박스입니다.
Ⅱ. 지독하게 예쁜 로그 생태계 (Zeek Logs)
와이어샤크로 10만 줄 패킷 까보느라 눈 빠지던 시대는 끝났다.
- 프로토콜별 전용 로그 파일 분리:
- Zeek의 가장 위대한 점은, 잡다한 패킷 덩어리를 씹어먹고 알아서 용도에 맞는 수십 개의 로그 파일로 기가 막히게 분리해 준다는 것이다.
conn.log: 네트워크의 시작과 끝. 누가 누구랑 TCP/UDP 연결을 맺고 얼마나 오래(duration), 몇 바이트(bytes)를 주고받았는지 적힌다.http.log: "어떤 브라우저(User-Agent)로, 어떤 URL을 쳤는지" 웹 해킹 추적의 1번지.dns.log: 사내 PC가 해커의 좀비 C&C 서버 주소(이상한 도메인)를 질의했는지 다 찍힌다. 랜섬웨어 잡아내는 1등 공신.
files.log와 엑스레이 (File Extraction) $\star$:- 대박 기능이다. Zeek은 날아가는 패킷 속에서 조각난 파일(.exe, .pdf) 껍데기를 발견하면, 자기가 알아서 그 조각들을 테이프로 이어 붙인다.
- 그리고 그 파일의 겉면에서 MD5, SHA-256 지문(Hash)을 촥 떠서
files.log에 적어버린다. - 보안팀은 그 해시값만 복사해서 바이러스토탈(VirusTotal) 사이트에 검색하면 "앗! 이거 북한 해커 랜섬웨어 파일이네!"라고 0.1초 만에 색출해 낼 수 있다.
📢 섹션 요약 비유: 와이어샤크(Wireshark) 원본 패킷은 그냥 CCTV 원본 비디오테이프 1,000시간어치입니다. 해킹을 찾으려면 1,000시간을 사람이 눈 빠지게 다 돌려봐야 합니다. Zeek 로그는 AI가 그 1,000시간 비디오를 보고 쓴 '엑셀 요약본'입니다. "1시: 수상한 차 들어옴, 2시: 박스 3개 들고 나감, 3시: 도주". 관제 요원은 원본 비디오를 볼 필요도 없이 이 깔끔한 엑셀 파일(Zeek Logs)에 Ctrl+F 검색만 때리면 모든 해커의 흔적을 10초 만에 완벽하게 꿰뚫어 볼 수 있는 경이로운 요약 압축 기술입니다.
Ⅲ. 독자적 언어와 생태계: Zeek Script와 ELK 연동
자체 스크립트로 마음대로 룰을 짜고, 빅데이터 화면에 쏴버린다.
- Zeek Scripting Language (강력한 튜닝성):
- 스노트(Snort)는 룰(Rule)을 한 줄씩 적는 정적인 텍스트 기반이었다면, Zeek은 아예 **'이벤트 기반 프로그래밍 언어(Zeek Script)'**라는 자기만의 파이썬 같은 코딩 언어를 쓴다.
- 보안 개발자는 이렇게 짤 수 있다.
event http_request(c: connection) { if (c$http$uri == "/admin") { print "해커 침입!"; } } - 즉, 패킷이 지나가는 순간(Event) 내가 짠 if-else 로직 코드(Script)를 동적으로 미친 듯이 굴려서, 세상에 없는 나만의 변태적인 탐지/추적 엔진을 마음대로 커스텀 제작할 수 있는 무한의 자유도를 준다.
- ELK Stack (Elasticsearch)과의 환상적인 혼인:
- Zeek이 뽑아낸 저 예쁜 요약본(JSON 로그)들을 서버 하드디스크에 그냥 썩혀두면 바보다.
- 전 세계 보안팀의 99%는 이 Zeek 로그들을 쉴 새 없이 ELK (Elasticsearch, Logstash, Kibana) 빅데이터 대시보드로 쏴버린다.
- 키바나(Kibana) 화면에 100만 건의 Zeek 로그가 화려한 원형 그래프와 지도 좌표로 펑펑 뿌려지며, "오늘 사내에서 가장 많이 10GB 이상 다운로드 한 이상한 직원 PC Top 10" 같은 걸 마우스 드래그 한 번으로 색출해 내는 최첨단 관제 센터(SIEM/NDR)가 뚝딱 완성된다.
📢 섹션 요약 비유: Zeek은 단순히 메모하는 비서에 그치지 않습니다. 자기가 쓴 이 깔끔한 엑셀 장부(JSON 로그)를 실시간으로 100인치짜리 초대형 전광판(Kibana 대시보드)으로 쏴줍니다. 보안팀장(사장)은 답답한 해킹 코드를 볼 필요 없이, 전광판에 뜬 예쁜 빨간색, 파란색 그래프만 보고 "저기 중국으로 뻗어나가는 시뻘건 화살표 통신(conn.log) 당장 방화벽으로 끊어버려!"라고 우아하고 직관적으로 군대를 지휘할 수 있게 만들어주는, 빅데이터 관제의 최고 꿀 조합 파트너입니다.