[ElastAlert] Elasticsearch 알람 도구 ElastAlert 설치

Q·2023년 3월 8일
0

ELK

목록 보기
7/10

1. ElastAlert 이란?

ElasticSearch로 서버로그를 분석하는 시스템 중 로그의 특정 키워드값을 읽어서 알람기능을 제공하는 것이 ElastAlert 이다.

1-1. Server 구성

  • OS : Centos7
  • Elasticsearch (5 이상)
  • smtp 설치(안해도 될수있으니 테스트까지 진행해본후 해보길바람)

2. 설치 과정

✅ 2-1. Python 설치

  • ElastAlert를 이용하려면 기본적으로 파이썬이 설치되있어야 합니다.
  • 파이썬의 버전별로 ElastAlert의 버전이 다르다고 하니 참고하시기 바랍니다.
$ yum install python3
  • python3을 설치했다면 python --version 명령으로 버전을 확인합니다.
  • 제 vm에 설치한 버전은 3.6.8인데 3버전이면 elastalert 설치시에 호환성에 큰 문제는 없습니다.

✅ 2-2. pip 설치

  • 파이썬 설치를 마쳤다면 elastalert 설치를 위해 pip을 우선 설치해야 합니다.
$ yum install python-pip
  • pip 설치가 되었는지 확인하기 위해 버전확인 명령을 입력한다.
$ pip -V => pip 21.0.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)
  • pip를 설치가 확인되었다면 필요한 모듈들을 설치하도록 한다.
$ pip install "setuptools>=11.3" python setup.py install

✅ 2-3. elastalert 설치

  • 이제 elastalert를 설치해보도록 해보겠습니다.
$ pip install elastalert
  • VM에 리눅스를 최초설치후 elastalert를 설치하려한다면 에러가 뜰수도 있습니다.
  • gcc 미설치, setuptools 업그레이드, python-devel 미설치 등의 문제는 구글링을 통해 쉽게 해결할수 있습니다.

3. elastalert 설정

config 파일과 rule 파일을 작성해야 기본적인 테스트가 가능합니다.

✅ 3-1. 설정파일 config.yaml

  • elastalert에 대한 기본적인 설정사항을 나타내는 파일이다. 아래 경로에 있습니다.
/usr/local/lib/python3.6/site-packages/elastalert

✅ 3-2. config.yaml 주요 옵션

  • rules_folder : config.yaml 파일의 경로 기준으로 rule 파일들이 위치한 폴더
  • run_every : 알람의 주기를 설정하는 옵션, python 문법으로 timedelta 옵션에 쓸수있는 값들을 넣으면된다. (days, seconds, microseconds, milliseconds, minutes, hours, weeks)
  • buffer_time : 일부 로그소스가 실시간이 아닌 경우 결과를 버퍼링할 최근기간
  • es_host : elasticsearch 호스트
  • es_port : elasticsearch 포트
  • writeback_index : 메타데이터 저장에 사용하는 index, 해당 인덱스는 사용자가 직접 만들어줘야 하는듯하다.
  • alert_time_limit : 알람 실패시 재시도할 주기

✅ 3-3. rule 파일

✅ 3-4. rule 주요옵션

  • name : rule이름, 고유한 이름이므로 중복되어선 안된다.
  • type : 알람의 타입, 예제 파일 내용인 frequency 일때는 timeframe, num_events 옵션을 사용한다.
  • index : 해당 rule이 탐색할 elasticsearch의 인덱스
  • num_events : 정해진 time_frame 시간동안 일정 횟수이상 document 매치시 알람 발생.
  • timeframe : num_events 카운트를측정할 시간 단위
  • filter : 인덱스에서 매칭시킬 조건.

3-4-1. query_string

  • 루씬 쿼리 포맷을 사용하는 방식
filter:
- query:
    query_string:
      query: "username: bob"
- query:
    query_string:
      query: "_type: login_logs"
- query:
    query_string:
      query: "field: value OR otherfield: othervalue"
- query:
    query_string:
       query: "this: that AND these: those"

3-4-2. term

  • 지정한 필드에 매치할 값을 지정하는 방식
filter:
- term:
    name_field: "bob"
- term:
    _type: "login_logs"

3-4-3. terms

  • term과 같은 개념인데 매칭시킬 값을 여러개로 할수있다. (배열식)
filter:
- terms:
    field: ["value1", "value2"] # value1 OR value2

- terms:
    fieldX: ["value1", "value2"]
    fieldY: ["something", "something_else"]
    fieldZ: ["foo", "bar", "baz"]

3-4-4. wildcard

  • * 문자를 사용하여 유사값을 매칭 시킬수있는 방식
filter:
- query:
    wildcard:
      field: "foo*bar"

3-4-5. range

  • 숫자형식 필드에 대해 범위를 지정하는 방식
filter:
- range:
    status_code:
      from: 500
      to: 599

3-4-6. Negation, and, or

  • Elasticsearch 2.x 버전에서 사용되는 방식이었으나 5.x버전 이상부터는 작동되지 않고 query_string 방식을 사용합니다
filter:
 - query:
      query_string:
        query: "somefield: somevalue OR foo: bar"

3-4-7. alert

  • 알람을 발생시킬 방식, 방식이 너무많으므로 email 방식만 설명합니다. email 방식 사용시 부가적으로 들어가는 옵션들이 있습니다.
alert:
- "email"

email:
- "elastalert@example.com"

smtp_host:"smtp.gmail.com"
smtp_port: 465
smtp_ssl: true
from_addr: "user_from@gmail.com"
smtp_auth_file: "/home/user/mailauth.yaml"

4. elastalert 실행

  • 이제 config.yaml, rule.yaml까지 작성하였다면 드디어 elastalert를 실행해볼수 있습니다.
$ python3.6 -m elastalert.elastalert --verbose --config config.yaml --rule rule.yaml
  • 단, 이 명령문을 그대로 복사한다고 되는것은 아닙니다! 위에서 설명했을때 config.yaml, rule.yaml 파일은 /usr/local/lib/python3.6/site-packages/elastalert 밑에 존재하는 파일이므로 위 명령은 해당 파일을 심볼릭링크로 걸어둔 상태에서 한것입니다.

✅ 4-1. [실행 확인]

1 rules loaded
INFO:elastalert:Starting up
INFO:elastalert:Disabled rules are: []
INFO:elastalert:Sleeping for 59.999873 seconds
INFO:elastalert:Queried rule example_frequency.yaml from 2021-02-26 16:05 KST to 2021-02-26 16:06 KST: 35 / 35 hits
INFO:elastalert:Sent email to ['xxxxx@gmail.com']
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ignoring match for silenced rule example_frequency.yaml
INFO:elastalert:Ran example_frequency.yaml from 2021-02-26 16:05 KST to 2021-02-26 16:06 KST: 35 query hits (0 already seen), 35 matches, 1 alerts sent

참고로 테스트를 위해 임의의 값을 logstash로 던지는 파이썬 프로그램을 실행한 상태입니다.

  • 첫째줄에서 지정한 rule이 정상적으로 로딩된것을 확인
  • config.yaml에서 인덱스 탐색주기를 60초로 했기때문에 59.xxxx 와 같은 Sleeping 로그 확인
  • 지정한 시간동안 35개의 document가 filter에서 지정한 조건과 매칭되어 해당 정보를 메일로 보낸것을 확인

profile
Data Engineer

0개의 댓글