Elastalert 이란 무엇인가? 사용 사례

이번 포스팅에서는 좀 특별한 주제로 글을 써보려고 합니다. 바로 ‘Elastalert’ 오픈소스에 대한 내용입니다. 이게 뭔가 하시는 분들도 계실 테지만 IT 분야에서는 꽤 알려진 오픈소스 도구로 간단히 말하자면, 데이터 모니터링과 알람을 설정할 수 있는 정말 유용한 Python 기반의 Tool 입니다. 오늘은 이 elastalert이 무엇인지 어떻게 실무에서 사용되는지 실제 사례를 통하여 자세하게 설명 드리도록 하겠습니다.

 

ElastAlert란?

 

ElastAlert는 Elasticsearch 데이터를 실시간으로 모니터링하고 이상 징후를 탐지하는 리눅스 기반 도구입니다. 이것은 머신 러닝 알고리즘을 사용하여 로그 데이터나 보안 이벤트와 같은 시계열 데이터에서 패턴을 식별하고, 잠재적인 이상 징후나 위협을 감지하고 탐지하여 외부 alert을 이용하여 알람을 보내줄수 있는 오픈소스 도구입니다.

다양한 규칙 엔진과 알림 메커니즘을 지원하며 사용자가 쉽게 규칙을 설정하고 원하는 알림을 받을 수 있게 해줍니다. 정규 표현식, 머신 러닝 모델, 통계 테스트 등 다양한 기법을 사용하여 이상 현상을 정의할 수 있습니다. 오픈 소스 프로젝트로서 무료로 사용할 수 있으며, 유연성과 확장성이 뛰어나 대규모 데이터셋에서도 원활하게 작동합니다. 또한, 풍부한 기술지원 문서를 제공하여 초보자부터 전문가까지 쉽게 사용할 수 있습니다.

 

실제 제가 근무중인 회사에서도 Elastalert를 이용하여 Elasticsearch 데이터와 연동하여 실시간 이상징후나 보안 위협등에 대해 탐지하고 수시로 알람을 받고 있습니다. 지금부터 실제 사용하고 있는 Elastalert Rule 예시를 통해 어떻게 사용되고 어떻게 보안 위협을 탐지하는지 자세하게 설명드리겠습니다.

 

악성코드 다운로드 탐지

 

상단 특정 보안장비의 실시간 이벤트 로그를 Elasticsearch로 받아 저장하고 있습니다. 즉, Elasticsearch에 저장된 데이터를 Elastalert 도구가 실시간 모니터링을 하고 있다가 지정된 Rule에 매칭되면 정해진 액션을 취하는 방식입니다. 여기서 액션이란 Alert 형태를 말하는데요. Mail이나 Slack 등 다양한 형태로 알람을 보내준다는 뜻입니다. 다음은 악성코드 다운로드가 의심되면 알려주는 Elastalert Rule 설정 예시 입니다.

 

name: “보안 위협 탐지 악성코드 다운로드 발생”

type: frequency

use_local_time: false
use_strftime_index: true
index: ELKSTACK001-%Y.%m.%d

num_events: 1

timeframe:
minutes: 5

filter:
– query:
query_string:
query: deviceHostName:DDI AND name:(“Executable file download from root directory – HTTP (Response)” OR “Executable Image Download – HTTP (Response)” OR “Powershell script requested from root directory – HTTP (Request)” OR “BADPOTATO – HTTP (Response)” OR “XMRIG – HTTP (Response)” OR “ZEGOST – HTTP (Response)” OR “TOOLPOW – HTTP (Response)” OR “TROJ_GEN.R002C0PAF21 – HTTP (Response)” OR “MALXMR – HTTP (Response)” OR COBALT* OR “ELF File requested from root directory – HTTP (Response)”)

alert_text: “Match Count: {0} \n{1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11}”
alert_text_type: “alert_text_only”
alert_text_args: [“num_matches”, “@timestamp”, “deviceHostName”, “source.country_code2”, “sourceAddress”, “sourcePort”, “destination.country_code2”, “destinationAddress”, “destinationPort”, “applicationProtocol”, “name”, “requestUrl”]

 

간단히 설명 드리자면, 보안장비 DDI의 name 필드명이 위와 같을때 악성코드다운로드나 실행이 의심되어 알람을 보낸다는것입니다. 이와 같은 탐지 Rule는 지속적으로 업데이트 하고 있으며 예외 처리 또한 수시로 진행하고 있습니다.

이후 내용부터는 query_string에 대해서만 설명 드리도록 하겠습니다. Elastalert의 가장 중요한 핵심은 바로 query_string입니다. 즉, Elasticsearch 검색 Query를 의미합니다. 이 쿼리를 어떻게 잘 설정하느냐에 따라 정탐과 오탐의 확률을 높일수 있는것입니다.

 

웹쉘 통신 및 설치 탐지

 

하기 내용은 실제 Elastalert를 이용하여 Webshell이 설치됬는지? 혹은 감염된 호스트가 통신할때 보안 위협을 탐지할수 있도록 제작된 Rule입니다. 실제 하기 Rule 덕분에 수많은 웹쉘 통신을 탐지하여 처리한 경험이 있습니다. 다만, 아래 Rule은 특정 보안 벤더 장비의 Field 명임을 인지하시고 내용을 읽어보시기 바랍니다. 즉, 운영중인 벤더의 보안장비별 특성이나 Elasticsearch에 저장되는 필드명은 모두 다를수 있다는 것입니다.

 

query: deviceHostName:DDI AND name:(*CHOPPER* OR *WEBSHELL* OR *ANTSWORD*) AND detectName:*WEBSHELL* AND NOT requestUrl:(*.php* OR *asp.jpg* OR *md5.aspx* OR *poc.jsp* OR *wp-admin* OR *wp-content*)

 

name 필드 기준 위와 같은 문자열(키워드)을 포함하고 있을때 Webshell 통신으로 의심되어 지정된 알람으로 통보를 해준다는 것입니다. 현재 저희는 slack과 E-mail 두가지 형태로 알람을 수시로 받고 있습니다.

Trojan 통신 탐지

 

악성코드 종류에도 여러가지가 있습니다. 하기 Elastalert Rule은 Trojan 통신에 대한 탐지 룰입니다. 예외처리 기준은 Mail 서비스는 제외하고 탐지하겠다는 의미입니다. 또한 특정 소스 포트와 요청 URL도 예외 처리하고 탐지 하겠다는 뜻입니다.

 

query: deviceHostName:DDI AND (detectName:TROJ* || name:TROJ*) AND NOT applicationProtocol:(POP3 OR SMTP OR IMAP4) AND threatType:Malware AND NOT sourcePort:7780 AND NOT requestUrl:(*mail* or *system*)

 

몇가지 Elastalert을 Elasticsearch와 연동하여 어떻게 사용하는지 사례를 보여 드렸습니다. 이와 같이 보안 위협에 대한 탐지 Rule은 셀수 없을만큼 많이 만들수 있습니다. 여기서 가장 중요한 핵심 포인트는 오탐을 얼마나 최소화하느냐 입니다. 즉, Query를 얼마나 잘 작성하느냐에 따라 오탐 확률을 줄이고 정탐 확률을 높일수 있다는 뜻입니다.

 

만약, Elastalert Rule을 잘못 설정하여 예를들어 SQL Injection 스캔성 공격이 유입되는데 1분에 수십~수백차례 알람 통보가 발생한다면 관리자로서는 정말 난감한 상황을 맞이할수 있다는것입니다. 실제 서비스에 적용전에 Elastalert Rule 설정 테스트를 충분히 해보시길 권유드립니다.

 

Leave a Comment