현재 재직 중인 회사에서는 수많은 보안장비와 보안 솔루션의 전체 로그를 Elastic Stack 으로 저장하여 보관중입니다. Elastic을 SIEM 으로 활용하고있습니다. 다양한 여러 이기종 벤더이 보안 로그를 Elasticsearch 플랫폼으로 통합 저장 시 전처리 부분 Logstash 서버에서 Parsing이 정상적으로 되야 보안로그가 최종적으로 엘라스틱 스택에 저장 보관되는것입니다.
벤더별 수많은 보안 장비 Syslog 형태는 모두 다르며, logstash 서버에서 filter 설정을 통해 파싱을 각각 해줘야합니다. 실제 실무 사례를 통해 어떻게 처리되는지 본문 내용을 읽어보시면 도움을 얻을수있을것입니다.
Logstash Filter 설정
아래 내용은 특정 벤더의 백신 중앙관리 서버의 syslog를 엘라스틱으로 색인시 logstash filter 설정하는 예시입니다.
가장 처음으로 진행해야할 사항은 중앙 백신 관리 서버 (OS 리눅스)의 사내 PC나 기타 Device에서 발생되는 안티멀웨어 보안 이벤트에 대해 rsyslog 데몬에 의해 /var/log/syslog 파일에 저장 중인데요 이 로그를 최종적으로 엘라스틱에 저장해야하는것입니다.
중앙백신서버 탐지 이벤트 로그 -> Logstash 서버(VM) -> Elasticsearch Data Node(VM)
중앙 백신 관리서버의 syslog 파일에 탐지 이벤트 로그가 기록되면 엘라스틱으로 전송하는데 먼저 logstash 서버를 거치게 됩니다. 이때, logstash에서 단순 syslog 형태로 input 하면 CEF 포맷으로 저장되는 로그가 모두 깨져서 들어오게 되는데요. filter 설정 부분에서 하기와 같이 다양한 설정을 진행해야지만 Elasticsearch 서버에 정상적으로 필드가 구분되어 색인(저장)되게 됩니다.
filter {
date {
match => [ “deviceReceiptTime”, “MMM dd yyyy HH:mm:ss”, “MMM d yyyy HH:mm:ss”, “UNIX_MS” ]
}
# To map the attacker Geo IP if plausible
geoip {
source => “sourceAddress”
target => “source”
}
# To map the target Geo IP if plausible
geoip {
source => “destinationAddress”
target => “destination”
}
if [host] =~ “10.100.xx.xx” {
kv {
source => “message”
field_split => ” ”
value_split => “=”
remove_char_value => ” \ \=”
}
mutate {
gsub => [ “filePath”, “=”, “-” ]
gsub => [ “filePath”, “\t”, “__” ]
gsub => [ “filePath”, ” “, “” ]
gsub => [ “filePath”, “\s”, “-” ]
}
mutate {
strip => [ “filePath” ]
}
mutate {
rename => { “host” => “deviceHostName” }
rename => { “act” => “deviceAction” }
rename => { “dvc” => “sourceAddress” }
rename => { “dvchost” => “computerName” }
rename => { “suser” => “userName” }
rename => { “BitdefenderGZComputerFQDN” => “computerFQDN” }
rename => { “BitdefenderGZMalwareName” => “malwareName” }
rename => { “BitdefenderGZMalwareType” => “malwareType” }
rename => { “BitdefenderGZMalwareHash” => “malwareHash” }
}
mutate {
remove_field => [ “CEF:0|Bitdefender|GravityZone|6.29.1-2|10|AntiMalware|9|BitdefenderGZModule”, “deviceExternalId”, “suid”, “tags”, “BitdefenderGZDetectionTime”, “BitdefenderGZSignaturesNumber”, “@version” ]
}
}
Logstash Filter 설정 요약
- 특정 host 10.100.xx.xx 에서 들어오는 것에 대해서 특정 조건대로 처리
- 10.100.xx.xx 에서 input 되는 message에 대해 kv 필터를 사용하여 필드는 “공백”으로 구분하고 필드 내 값(value)은 = 으로 구분하여 엘라스틱에 저장
- 이때 remove_char_value 로 값(value) 내용 중 공백이나 =은 제거 (이 설정은 제대로 동작하지 않을 수도 있습니다)
- gsub로 filePath 필드내 값에 대해 =은 -으로 대체(치환)
- strip 로 filePath내 값에 대해 좌우 공백을 제거 (이 설정도 제대로 동작하지 않음)
- rename 사용으로 특정 필드에 대해서 필드명을 다시 재정의해줍니다 (엘라스틱서치에서 필드명을 구분하기 쉽게 하기 위함)
remove_field 사용으로 불필요한 필드는 모두 제거
위와 같이 logstash에서 몇 가지 특정 filter 적용으로 엘라스틱 색인 전에 전처리 과정을 통해 로그를 파싱 했습니다.
이렇게 되면 엘라스틱서치에 다음과 같은 형태로 로그가 필드가 정상적으로 구분되어 원하는 대로 색인되게 됩니다.
실제 경험으로 얻은 사례를 통해 logstash filter 설정에 대해서 알아보았습니다. 이번 로그 파싱 과정 중 가장 힘들었던 부분은 백신이 malware 탐지 시 백신 에이전트가 설치된 PC의 파일명을 표기하는데 filePath 내용 중 공백이나 =와 같은 문자열이 포함되어 있을 때 Elasticsearch 색인이 제대로 되지 않는 현상이었습니다. 다시말하자면, Elasticsearch 저장 시 필드 구분이 제대로 되지 않아 filepath 내 공백을 포함하고 있으면 값(vlaue)이 잘려서 나오는 현상이었습니다.
본문 내용처럼 Logstash Filter 설정을 원하는대로 수정하면 다양한 디바이스들의 중요 보안 로그를 Elasticsearch로 색인(저장) 할때 목적에 맞게 Parsing이 가능합니다.
답글 남기기