목차/12. Syslog 수동 파싱

12Syslog 수동 파싱Syslog 수동 파싱

타사 장비의 syslog를 들여올 때, GUI Log Parsing Editor 대신 파싱 파일을 손으로 작성 할 수도 있습니다. 이 장은 그 수동 파싱의 사전 준비, Log Server에서 파싱이 일어나는 절차, 파일을 만들고 검증하는 흐름, 그리고 파싱 언어의 얼개를 개념 위주로 정리합니다. 문법 세부는 워낙 깊으니(p.287~304) 큰 그림을 잡은 뒤 원문을 보세요.

시작 전에 — 준비와 고려사항

좋은 파서를 짜려면 장비가 만드는 로그의 구조를 정확히 알아야 합니다. 그래서 벤더의 로깅 가이드(모든 로그 종류와 구조 파악용)와, 실제 장비에서 뽑은 로그 샘플(가능한 한 많이, 파서 검증·튜닝용) 을 함께 준비합니다. 그다음 Free Text Parsing 언어와 Log Server 위 파싱 파일들의 위치를 익히고, 비슷한 제품의 기존 파싱 파일과 견주어 봅니다. 끝으로 어떤 필드를 뽑을지 고릅니다 — 같은 부류의 장비는 보통 비슷한 필드를 갖습니다(예: 방화벽·라우터는 출발지/목적지 IP·포트·프로토콜·accept/reject, IDS/IPS는 공격 이름/ID).

Log Server에서 파싱이 일어나는 절차

파싱은 Log Server에서 syslog 데몬이 syslog를 받아 파싱을 호출하며 시작됩니다. 파싱 파일들은 $FWDIR/conf/syslog/ 에 있고, 출발점은 syslog_free_text_parser.C 입니다 — 이 파일이 모든 syslog에 공통인 필드(PRI·날짜·시각)와, 그 syslog를 만든 머신·애플리케이션을 먼저 뽑습니다.

그다음 allDevices.C 를 거치는데, 이 파일은 두 갈래를 참조합니다 — 사용자가 정의한 장치 파일 목록(UserDefined/UserDefinedSyslogDevices.C)과, Check Point가 정의한 목록(CPdefined/CPdefinedSyslogDevices.C) 입니다. allDevices.C 는 장치 파싱 파일들을 차례로 훑어, 들어온 syslog와 형식이 맞는 파일을 찾습니다. 한 파일이 예비 파싱에 성공하면(=그 syslog의 출처로 판명되면) 나머지를 그 파일이 마저 파싱하고, 못 맞추면 Check Point 장치 파일들로 계속 넘어가 매칭될 때까지 시도합니다.

파싱 파일 만들고 검증하기

직접 만드는 흐름은 이렇습니다. <제품명>.C 파일을 만들어 $FWDIR/conf/syslog/UserDefined 에 두고, UserDefinedSyslogDevices.C 에 그 파일을 include하는 줄(:cmd_name (include):file_name ("..."))을 더합니다. 필요하면 dictionary 파일(<제품명>_dict.ini)도 만드는데, dictionary는 서로 다른 장비에서 같은 의미를 가진 값들을 공통 값으로 번역해, Event Definition에서 그 공통 값을 쓰게 해 줍니다. 이 역시 UserDefinedSyslogDictionaries.C 에 include 줄을 더합니다.

만든 파서는 실제 syslog 샘플을 Log Server에 보내 검증 합니다 — SmartConsole에서 Logs and Masters > Additional Logging Configuration 의 Accept Syslog messages 를 켜고, Log Server 객체를 편집한 뒤 cpstop & cpstart(또는 fw kill fwd & fwd -n)로 Log Server의 fwd를 재시작합니다. 그다음 장비나 syslog 생성기(예: Kiwi Syslog Message Generator)로 샘플을 보냅니다.

Free Text Parsing 언어의 얼개

이 언어는 입력 문자열을 파싱해 정보를 뽑고 로그 필드를 정의 합니다 — 이 필드가 Check Point 로그의 일부로 나타나고 이벤트 정의에 쓰입니다. 각 파싱 파일은 명령(command)의 트리 로 이뤄지며, 명령마다 입력의 일부를 검사·파싱하고(때로 필드를 더하고) 성공·실패에 따라 다음으로 넘어갈지를 정합니다.

명령은 네 부분으로 이뤄집니다 — cmd_name(명령 이름), command arguments(동작을 정의하는 인자), on_success(성공 시 다음 명령), on_fail(실패 시 다음 명령) 입니다. 예컨대 try 명령은 인자로 무언가를 시도하고, 성공하면 on_success 안의 명령을, 실패하면 on_fail 안의 명령을 실행하는 식으로 가지를 칩니다. 사용 가능한 명령들과 dictionary의 자세한 문법은 원문(p.292~)에 정리돼 있으니, 실제로 파서를 짤 때 참고하세요. GUI로 더 쉽게 파서를 만드는 길은 타사 로그 가져오기의 Log Parsing Editor를 보세요.