Elastic Security를 사용하여 Zeek 데이터 수집 및 분석
이 블로그에서는 Filebeat와 Zeek(이전 명칭: Bro)를 모두 구성하는 과정을 안내해 드립니다. 이를 통해 Elastic Security를 사용하여 Zeek 데이터에 대한 분석을 수행할 수 있습니다. Filebeat와 해당 모듈의 기본 구성은 많은 환경에서 작동하지만, 환경에 따라 설정을 사용자 지정해야 할 수도 있습니다. 이 블로그에 자세히 설명된 단계들을 통해 Elastic Security 내에서 Zeek 데이터를 확인하는 것을 목표로 구성을 사용자 지정하는 데 필요한 단계를 더 쉽게 이해하실 수 있을 것입니다.
Beats 는 네트워크 에지 또는 그 근처에서 데이터를 수집하고 Elasticsearch 클러스터로 전송하는 데 탁월한 경량 데이터 수집기입니다. Beats는 Elastic Common Schema(ECS)를 준수하는 데이터를 전송합니다. Beat 제품군의 일원인 Filebeat에는 일반적인 로그 형식의 수집, 구문 분석 및 시각화를 간소화하는 내부 모듈이 포함되어 있습니다. 이 모듈은 운영 체제를 기반으로 자동 기본 경로를 결합하여 이를 수행합니다. 여기서는 Filebeat를 사용하여 Zeek 데이터를 구문 분석할 것입니다.
또한 Elastic Security 지도에 이벤트를 표시하기 위한 GeoIP 보강 프로세스에 대한 세부 정보를 다룰 것입니다. 추가로, Filebeat에 필요한 JSON 형식으로 데이터를 출력하도록 Zeek를 구성하는 방법을 자세히 설명하겠습니다. 이 블로그는 구성만 다룹니다. 이미 Filebeat와 Zeek가 모두 설치되고 구성된 Elasticsearch 클러스터가 있다고 가정합니다.
환경 세부 정보
제 Elastic 클러스터는 Elasticsearch Service를 사용하여 생성되었으며, Elastic Cloud에 호스팅되어 있습니다. 신용카드 없이 14일 무료 체험판으로 쉽게 클러스터를 시작할 수 있습니다. Elastic Stack을 빠르고 쉽게 시작할 수 있으므로 직접 사용해 보시기 바랍니다.
저는 Zeek 3.0.0을 사용하고 있습니다. Zeek 웹사이트에서 Zeek을 다운로드할 수 있습니다.
Filebeat 개요
Filebeat는 즉시 사용 가능한 수십 개의 통합 기능을 전송하므로 몇 분 만에 데이터에서 대시보드까지 구현할 수 있습니다. 전체 통합 목록에서 필요한 항목을 쉽게 찾을 수 있습니다. 모듈은 소스 데이터의 구문을 분석하는 방법을 이해할 뿐만 아니라, 데이터를 ECS 형식으로 변환하기 위한 인제스트 파이프라인도 설정합니다.
Elastic은 Elastic Agent 및 Ingest Manager를 통해 데이터 온보딩 및 데이터 수집 경험을 개선하기 위해 노력하고 있습니다. 하지만 현재는 실험적 릴리스이므로, 프로덕션 환경에서 사용할 수 있는 Filebeat 모듈을 사용하는 데 중점을 둘 것입니다. 또한, 많은 모듈이 즉시 사용 가능한 하나 이상의 Kibana 대시보드를 제공합니다.

Filebeat Zeek 모듈 활성화
가장 먼저 해야 할 일은 Filebeat에서 Zeek 모듈을 활성화하는 것입니다. Filebeat에서 제공하는 모든 모듈은 기본적으로 비활성화되어 있습니다.
1단계: Filebeat에서 Zeek 모듈 활성화
Filebeat에서 Zeek 모듈을 활성화하는 방법은 다음 명령어를 실행하는 것만큼 간단합니다:
sudo filebeat modules enable zeek이 명령은 Filebeat의
modules.d 디렉터리에있는 zeek.yml구성 파일을 통해 Zeek를 활성화합니다. Filebeat는 경로에서 액세스할 수 있어야 합니다. 그렇지 않은 경우,Elastic GitHub 저장소 를 사용하여 Filebeat를 설치했다면 Filebeat의 기본위치는 /usr/bin/filebeat입니다.
2단계: zeek.yml에 Zeek 로그 경로 추가
Zeek 로그 경로는 Filebeat 자체가 아닌 Zeek Filebeat 모듈에서 구성됩니다. Filebeat Zeek 모듈 구성 파일인 zeek.yml을 편집해야 합니다. 제 Filebeat 설치의 경우 /etc/filebeat/modules.d/zeek.yml에 위치합니다. 관심 있는 각 Zeek 로그에 대한 항목을 추가해야 합니다. 제 Zeek 설치가 로그를 기록하는 기본 디렉터리는 /usr/local/zeek/logs/current입니다.
다음은 전체 Zeek 로그 경로 목록입니다. 사용자의 환경에 맞게 이러한 경로를 편집해야 합니다.
# 모듈: zeek
# 설명서: /guide/en/beats/Filebeat/7.6/Filebeat 모듈-Zeek.html
- module: zeek
데이터 손실 방지:
enabled: true
var.paths: ["/usr/local/Zeek/로그/current/capture_loss.로그"]
연결:
enabled: true
var.paths: ["/usr/local/Zeek/로그/current/conn.로그"]
dce_rpc:
enabled: true
var.paths: ["/usr/local/Zeek/로그/current/dce_rpc.log"]
dhcp:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dhcp.log"]
dnp3:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/dnp3.로그"]
DNS:
enabled: true
var.paths: ["/usr/local/Zeek/로그/current/DNS.로그"]
dpd:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/dpd.로그"]
파일:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/files.로그"]
ftp:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/ftp.로그"]
http:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/http.로그"]
인텔리전스:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/intel.log"]
irc:
enabled: true
var.paths: ["/usr/local/Zeek/로그/current/irc.로그"]
kerberos:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/kerberos.log"]
modbus:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/modbus.로그"]
MySQL:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/MySQL.로그"]
고지:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/notice.로그"]
ntlm:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ntlm.log"]
ocsp:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/ocsp.로그"]
pe:
enabled: true
var.paths: ["/usr/local/Zeek/로그/current/pe.log"]
반경:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/radius.로그"]
rdp:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/rdp.로그"]
rfb:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/rfb.로그"]
# 시그니처:
# enabled: true
# var.paths: ["/usr/local/Zeek/로그/current/signatures.로그"]
음미:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/sip.로그"]
smb_cmd:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/smb_cmd.로그"]
smb_files:
enabled: true
var.paths: ["/usr/local/Zeek/로그/current/smb_files.log"]
smb_mapping:
enabled: true
var.paths: ["/usr/local/Zeek/로그/smb_mapping.로그"]
smtp:
enabled: true
var.paths: ["/usr/local/Zeek/로그/current/smtp.log"]
snmp:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/snmp.로그"]
socks:
enabled: true
var.paths: ["/usr/local/Zeek/로그/current/socks.로그"]
ssh:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/ssh.로그"]
ssl:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/ssl.로그"]
통계:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/stats.로그"]
syslog:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/syslog.로그"]
traceroute:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/traceroute.로그"]
터널:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/tunnel.로그"]
이상함:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/weird.로그"]
x509:
enabled: true
var.paths: ["/usr/local/Zeek/로그/current/x509.로그"]
참고: 이 블로그 게시 시점을 기준으로 Filebeat 파서가 signature log에 대한 지원을 포함하지 않기 때문에 signature log는 주석 처리되었습니다.
3단계: Filebeat 재시작
zeek.yml 구성 파일 편집 및 저장을 완료했으면 Filebeat를 재시작해야 합니다. 사용 중인 Linux 버전에 따라 약간의 차이가 있을 수 있지만, 일반적으로 다음 명령을 통해 수행됩니다:
sudo systemctl restart filebeat
이 시점에서 일반적으로 Elastic Security와 Filebeat 인덱스에서 Zeek 데이터를 볼 수 있을 것으로 예상할 것입니다. Discover나 대시보드에서 Zeek 데이터가 보이지 않더라도 당황하지 마십시오. 몇 가지 추가 단계를 수행해야 합니다.
Zeek을 구성하여 JSON 출력
기본적으로 Zeek은 JSON 형식으로 로그를 출력하지 않습니다. 이것이 Filebeat 인덱스에서 Zeek 데이터가 누락되는 원인입니다. Filebeat Zeek 모듈은 Zeek 로그가 JSON 형식이라고 가정합니다. 기본 Zeek 로그의 구문을 분석하려고 하면 로그 구문 분석 오류가 발생할 가능성이 높습니다.
- JSON 로깅 출력을 구성하려면
local.zeek구성 파일을 편집해야 합니다. 이 구성 파일의 위치는 Zeek 설치 방식에 따라 다릅니다. 제 Zeek 설치 경로는/usr/local/zeek입니다. 제 구성 파일은/usr/local/zeek/share/zeek/site/local.zeek에 위치합니다. - 구성 파일 끝에 다음 줄을 추가합니다:
@load policy/tuning/JSON-로그.Zeek
-
local.zeek구성 파일 편집을 마친 후, 다음 명령을 사용하여 Zeek를 다시 시작해야 합니다:sudo zeekctl 배포하다
이렇게 하면 업데이트된 구성 파일 설정을 사용하여 Zeek가 다시 시작됩니다. - 편집을 완료했으면 Filebeat를 다시 시작해야 합니다. 이제 Filebeat 인덱스에서 Zeek 데이터를 확인할 수 있습니다.
다음은 데이터로 채워진 geo 필드의 값을 보여주는 Discover 화면입니다:

GeoIP 보강
Zeek 데이터가 Filebeat 인덱스에 들어갔음에도 Elastic Security의 네트워크 탭에서 “pew pew” 라인이 전혀 보이지 않아 놀랐습니다. 저는 SIEM Config 맵핑 UI 설명서 에 문서화된 대로 geoip-info 인제스트 파이프라인을 생성했습니다. 또한 문서화된 대로 Filebeat 구성의 출력 섹션에서 해당 파이프라인을 참조하고 있는지 확인했습니다.
다음은 filebeat.yml 구성 파일에서 파이프라인을 정의하는 예제입니다:
출력.Elasticsearch: # 연결할 호스트의 어레이입니다. hosts: ["localhost:9200"] 파이프라인: geoip-info
제가 Zeek를 실행 중인 노드는 라우팅이 불가능한 IP 주소를 사용하고 있으므로, IP 주소를 기반으로 지리 정보를 맵핑하기 위해 Filebeat add_field 프로세서를 사용해야 했습니다. 해당 정보는 위 링크에 문서화되어 있지만, 필드 이름에 문제가 있었습니다.
GeoIP 파이프라인은 IP 정보가 source.ip 및 destination.ip에 있다고 가정합니다. 이는 대부분의 소스에 해당합니다. 그러나 Zeek의 경우 해당 정보가 source.address 및 destination.address에 포함되어 있습니다. 왜 이런 현상이 발생할까요? 이는 데이터의 흐름과 인제스트 파이프라인이 시작되는 시점에 달려 있습니다.
Filebeat용 Zeek 모듈은 데이터를 ECS로 변환하기 위한 인제스트 파이프라인을 생성합니다. 이 파이프라인은 source.address 의 값을 source.ip 로, destination.address 의 값을 destination.ip로 복사합니다. 그러나 Filebeat에서 필드를 추가하는 add_fields 프로세서는 인제스트 파이프라인이 데이터를 처리하기 전에 실행됩니다. 따라서 add_field 프로세서가 활성화될 때는 source.ip 및 destination.ip 값이 아직 채워지지 않은 상태입니다.
저는 add_field 프로세서를 사용하고 ip 대신 address를 사용하도록 Filebeat 구성을 수정했습니다. 수정된 내용은 다음과 같습니다:
processors:
- add_host_metadata:
- add_cloud_metadata:
- add_fields:
when.network.source.address: 10.128.0.0/24
필드:
source.geo.location:
lat: 41.619549
lon: -93.598022
source.geo.continent_name: 북미
source.geo.country_iso_code: 미국
source.geo.region_iso_code: US-IA
source.geo.region_name: 아이오와
target: ''
- add_fields:
when.network.destination.address: 10.128.0.0/24
필드:
destination.geo.location:
lat: 41.619549
lon: -93.598022
destination.geo.continent_name: 북미
destination.geo.country_iso_code: 미국
문서에 명시된 when.network.source.ip 대신 when.network.source.address 라인에서 address 필드를 사용하고 있다는 점에 유의하십시오. 이는 destination 라인에도 동일하게 적용됩니다. 이는 앞서 언급한 데이터 흐름 타이밍 문제를 해결합니다. 데이터 흐름의 이 단계에서 필요한 정보는 source.address 필드에 있습니다.
Elastic Security에서 Zeek 데이터 확인
filebeat.yml 구성 파일에 대한 모든 변경을 완료한 후, 다음을 사용하여 Filebeat를 다시 시작해야 합니다:
sudo systemctl restart filebeat
이제 Elastic Security를 실행하고 Network 탭으로 이동합니다. 지도에 우리가 기대했던 “pew pew” 라인이 제대로 표시되어야 합니다.

네트워크 맵 외에도 Elastic Security 개요 탭에서 Zeek 데이터를 확인할 수 있습니다. 이 예시에서는 Filebeat가 지난 24시간 동안 500,000개 이상의 Zeek 이벤트를 수집했음을 확인할 수 있습니다.

또한 Elastic Security 내에서 외부 알림으로 표시되는 Zeek 이벤트를 확인할 수 있습니다.

이 구성을 완료하는 데 필요한 단계 수는 비교적 적었습니다. 일반적으로 이 구성을 완료하는 데 몇 분밖에 걸리지 않으며, 데이터에서 대시보드까지 몇 분 만에 얼마나 쉽게 이동할 수 있는지 다시 한번 확인할 수 있습니다!
다음 단계는 무엇입니까?
그렇다면 다음 단계는 무엇일까요? Suricata 및 호스트 데이터 스트림과 같이 통합하려는 다른 데이터 피드를 고려해 보십시오. Elastic Security에서 사용할 새로운 보안 데이터 소스를 추가하는 방법을 안내하는 Elastic SIEM에서 새로운 보안 데이터 소스 추가 시작하기 블로그를 확인해 보시기 바랍니다.
Elastic Security를 통한 포괄적인 데이터 보호를 시작할 준비가 되셨습니까? 지금 Elastic Cloud의 Elasticsearch 서비스 에서 무료로 사용해 보십시오.