이 Python 스크립트는 URL 로그, 방화벽 로그, 이벤트 로그 등 다양한 유형의 로그를 구문 분석하는 기능을 제공합니다. 각 함수는 정규식을 사용하여 로그 항목에서 관련 정보를 추출하고 구문 분석된 데이터가 포함된 사전을 반환합니다.
Syslog 서버는 https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Server_Overview_and_Configuration 가이드에 따라 구성되었습니다.
Meraki Syslog 샘플은 여기에서 찾을 수 있습니다: https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Event_Types_and_Log_Samples
나는 상위 100개 웹사이트를 스크랩하기 위해 이 간단한 스크립트를 만들었습니다. Meraki MX 뒤의 머신에서 실행하면 많은 Syslog가 생성됩니다.
https://github.com/repenno/top_100
Syslog를 JSON 개체로 구문 분석하고 시간 단위 쿼리를 지원하는 VectorDB에 삽입하기 위해 이 스크립트를 개발했습니다.
저는 Langchain과 OpenAI를 사용하여 보안 사고에 대한 주문형 챗봇을 만들고 네트워킹 이벤트에 대한 통찰력을 연구합니다.
parse_url_log(log_entry: str) -> dict
: URL 로그를 구문 분석합니다.parse_firewall_log(log_entry: str) -> dict
: 방화벽 로그를 구문 분석합니다.parse_event_log(log_entry: str) -> dict
: 이벤트 로그를 구문 분석합니다. 스크립트에 사용된 정규식을 분석해 보겠습니다.
parsing_url_log 메소드:
이 방법에 사용되는 정규식 패턴은 URL 로그 항목과 일치하도록 설계되었습니다. 패턴을 분석하면 다음과 같습니다.
(?P<date>w{3}s+d{1,2}s+d{2}:d{2}:d{2})
: 패턴의 이 부분이 날짜와 일치합니다. w{3}
모든 단어 문자([a-zA-Z0-9_]와 동일)와 정확히 3번 일치하며, 이는 요일(월, 화요일 등)에 대한 3글자 약어에 해당합니다. s+
공백 문자(공백, 탭, 줄 바꿈)와 한 번 이상 일치합니다. d{1,2}
해당 월의 일자(1-31)에 해당하는 1~2번 사이의 모든 숫자([0-9]와 동일)와 일치합니다. d{2}:d{2}:d{2}
는 HH:MM:SS 형식의 시간과 일치합니다.
(?P<ip>d{1,3}.d{1,3}.d{1,3}.d{1,3})
: 패턴의 이 부분은 IP와 일치합니다. 주소. d{1,3}
IP 주소(0-255)의 각 옥텟에 해당하는 1~3번 사이의 모든 숫자와 일치합니다. .
문자 그대로의 점과 일치합니다.
(?P<id>d+.d+)
: 패턴의 이 부분은 하나 이상의 숫자, 점 및 하나 이상의 숫자로 구성된 ID와 일치합니다.
(?P<user>w+)
: 패턴의 이 부분은 하나 이상의 단어 문자로 구성된 사용자 이름과 일치합니다.
(?P<type>w+)
: 패턴의 이 부분은 하나 이상의 단어 문자로 구성된 유형과 일치합니다.
src=(?P<src>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
: 이 부분은 패턴은 소스 IP 주소 및 포트와 일치합니다. 구조는 위의 IP 주소 패턴과 유사하지만 포트 번호와 일치하도록 끝에 :d+
있습니다.
dst=(?P<dst>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
: 이 부분은 패턴이 대상 IP 주소 및 포트와 일치합니다. 구조는 위의 소스 IP 주소 및 포트 패턴과 유사합니다.
mac=(?P<mac>[0-9A-Fa-f:]{17})
: 패턴의 이 부분은 MAC 주소와 일치합니다. [0-9A-Fa-f:]
A부터 F(대문자 또는 소문자)까지의 모든 숫자나 문자 또는 콜론과 일치합니다. {17}
MAC 주소 형식과 일치하려면 이 패턴의 길이가 정확히 17자여야 함을 지정합니다.
agent='(?P<agent>.+?)'
: 패턴의 이 부분은 작은따옴표로 묶인 사용자 에이전트 문자열과 일치합니다.
request:s+(?P<request>w+s+w+://.+)
: 패턴의 이 부분은 요청 방법 및 URL과 일치합니다.
parse_firewall_log 메소드:
이 방법에 사용되는 정규식 패턴은 방화벽 로그 항목과 일치하도록 설계되었습니다. 이는 URL 로그 항목 패턴과 유사하지만 프로토콜, 스포츠(소스 포트), dport(대상 포트) 및 패턴과 같은 방화벽 로그와 관련된 추가 필드를 포함합니다.
pars_event_log 메소드:
이 방법에 사용되는 정규식 패턴은 이벤트 로그 항목과 일치하도록 설계되었습니다. 이전 패턴과 유사하지만 event_type, url, 카테고리(선택 사항), 서버 및 client_mac와 같은 이벤트 로그와 관련된 추가 필드를 포함합니다.
이러한 패턴의 각 그룹은 ?P<name>
사용하여 이름이 지정됩니다. 이를 통해 로그 항목에서 특정 정보를 더 쉽게 추출할 수 있습니다.
fw_log_entry = "Oct 2 21:22:43 192.168.128.1 1 1696306963.825147405 satosugu firewall src=fe80::cde:941e:d4ef:3d22 dst=ff02::fb protocol=udp sport=5353 dport=5353 pattern: 1 all"
parsed_log = MerakiMXSyslogParser . parse_firewall_log ( fw_log_entry )
print ( parsed_log )
url_log_entry = "Oct 2 21:18:42 192.168.128.1 1 1696306722.864107379 satosugu urls src=192.168.128.3:58754 dst=192.229.211.108:80 mac=0C:4D:E9:BE:F4:B2 agent='Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0' request: POST http://ocsp.digicert.com/"
parsed_log = MerakiMXSyslogParser . parse_url_log ( url_log_entry )
print ( parsed_log )
event_log_entry = "Oct 2 21:09:28 192.168.128.1 1 1696306168.009553886 satosugu events content_filtering_block url='https://youtube.com/...' category0='User-defined Blacklist' server='192.178.50.78:443' client_mac='0C:4D:E9:BE:F4:B2'"
parsed_log = MerakiMXSyslogParser . parse_event_log ( event_log_entry )
print ( parsed_log )
event_log_entry = "Oct 2 21:12:00 192.168.128.1 1 1696306320.822027826 satosugu events content_filtering_block url='https://xvideos.com/...' server='185.88.181.2:443' client_mac='0C:4D:E9:BE:F4:B2'"
parsed_log = MerakiMXSyslogParser . parse_event_log ( event_log_entry )
print ( parsed_log )
각 함수의 출력은 로그 항목에서 구문 분석된 데이터가 포함된 사전입니다.
{ 'date' : 'Oct 2 21:22:43' , 'ip' : '192.168.128.1' , 'id' : '1696306963.825147405' , 'user' : 'satosugu' , 'type' : 'firewall' , 'src' : 'fe80::cde:941e:d4ef:3d22' , 'dst' : 'ff02::fb' , 'protocol' : 'udp' , 'sport' : '5353' , 'dport' : '5353' , 'pattern' : '1 all' }
{ 'date' : 'Oct 2 21:18:42' , 'ip' : '192.168.128.1' , 'id' : '1696306722.864107379' , 'user' : 'satosugu' , 'type' : 'urls' , 'src' : '192.168.128.3:58754' , 'dst' : '192.229.211.108:80' , 'mac' : '0C:4D:E9:BE:F4:B2' , 'agent' : 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0' , 'request' : 'POST http://ocsp.digicert.com/' }
{ 'date' : 'Oct 2 21:09:28' , 'ip' : '192.168.128.1' , 'id' : '1696306168.009553886' , 'user' : 'satosugu' , 'type' : 'events' , 'event_type' : 'content_filtering_block' , 'url' : 'https://youtube.com/...' , 'category' : 'User-defined Blacklist' , 'server' : '192.178.50.78:443' , 'client_mac' : '0C:4D:E9:BE:F4:B2' }
{ 'date' : 'Oct 2 21:12:00' , 'ip' : '192.168.128.1' , 'id' : '1696306320.822027826' , 'user' : 'satosugu' , 'type' : 'events' , 'event_type' : 'content_filtering_block' , 'url' : 'https://xvideos.com/...' , 'category' : None , 'server' : '185.88.181.2:443' , 'client_mac' : '0C:4D:E9:BE:F4:B2' }
이 스크립트에는 정규식을 위한 Python의 내장 re
모듈이 필요합니다.
풀 요청을 환영합니다! 주요 변경사항의 경우 먼저 이슈를 열어 변경하고 싶은 사항에 대해 논의하세요.