본문 바로가기
클라우드/ElasticStack

Elasticsearch 알람 도구 ElastAlert 설치부터 테스트까지

by 정권이 내 2021. 12. 14.

Elasticsearch 알람 기능을 위한 ElastAlert

 

ElasticSearch로 서버로그를 분석하는 시스템을 만들던 중 로그의 특정 키워드값을 읽어서 알람기능을

제공하면 좋을것 같아서 ElastAlert를 학습 해보기로 했습니다.

 

설치 환경

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

 

설치 과정

 

Python 설치

ElastAlert를 이용하려면 기본적으로 파이썬이 설치되있어야 합니다. 파이썬의 버전별로 ElastAlert의 버전이

다르다고 하니 참고하시기 바랍니다.

$ yum install python3

 

python3을 설치했다면 python --version 명령으로 버전을 확인합니다. 제 vm에 설치한 버전은 3.6.8인데

3버전이면 elastalert 설치시에 호환성에 큰 문제는 없습니다.

 

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

 

elastalert 설치

이제 elastalert를 설치해보도록 해보겠습니다.

$ pip install elastalert

 

VM에 리눅스를 최초설치후 elastalert를 설치하려한다면 에러가 뜰수도 있습니다. gcc 미설치, setuptools

업그레이드, python-devel 미설치 등의 문제는 구글링을 통해 쉽게 해결할수 있습니다.

 

elastalert 설정

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

 

설정파일 config.yaml

elastalert에 대한 기본적인 설정사항을 나타내는 파일이다. 아래 경로에 있습니다.

/usr/local/lib/python3.6/site-packages/elastalert

 

예제파일은 https://github.com/Yelp/elastalert/blob/master/config.yaml.example 사이트에 있는 내용을

복사하여 본인이 지정한 경로에 config.yaml라는 이름으로 저장하도록 합니다.

 

각 설정에 대한 자세한 설명은 https://elastalert.readthedocs.io/en/latest/elastalert.html#configuration

사이트를 참조하면 됩니다.

 

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 : 알람 실패시 재시도할 주기

 

rule 파일

config.yaml에서 설정한 rules_folder 내부에 작성할 rule 파일입니다.

예제파일은 https://github.com/Yelp/elastalert/blob/master/example_rules/example_frequency.yaml

사이트에서 복사하여 config.yaml에서 지정한 rules_folder 경로에 저장하면 됩니다.

각 설정에 대한 자세한 설명은 https://elastalert.readthedocs.io/en/latest/ruletypes.html# 사이트를

참조하면 됩니다.

 

rule 주요옵션

  • name : rule이름, 고유한 이름이므로 중복되어선 안된다.

  • type : 알람의 타입, 예제 파일 내용인 frequency 일때는 timeframe, num_events 옵션을 사용한다.

  • index : 해당 rule이 탐색할 elasticsearch의 인덱스

  • num_events : 정해진 time_frame 시간동안 일정 횟수이상 document 매치시 알람 발생.

  • timeframe : num_events 카운트를측정할 시간 단위

  • filter : 인덱스에서 매칭시킬 조건.

  • 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"
    

 

  • term

    지정한 필드에 매치할 값을 지정하는 방식

    filter:
    - term:
        name_field: "bob"
    - term:
        _type: "login_logs"
    

 

  • terms

    term과 같은 개념인데 매칭시킬 값을 여러개로 할수있다. (배열식)

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

 

  • wildcard

    * 문자를 사용하여 유사값을 매칭 시킬수있는 방식

    filter:
    - query:
        wildcard:
          field: "foo*bar"
    

 

  • range

    숫자형식 필드에 대해 범위를 지정하는 방식

    filter:
    - range:
        status_code:
          from: 500
          to: 599
    

 

  • Negation, and, or

    Elasticsearch 2.x 버전에서 사용되는 방식이었으나 5.x버전 이상부터는 작동되지 않고 query_string

    방식을 사용합니다

    filter:
     - query:
          query_string:
            query: "somefield: somevalue OR foo: bar"
    

 

  • 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"
    

     

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 밑에 존재하는 파일이므로 위 명령은 해당 파일을

심볼릭링크로 걸어둔 상태에서 한것입니다.

 

[실행 확인]

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에서 지정한 조건과 매칭되어 해당 정보를 메일로 보낸것을 확인

이메일로 받은 알람내용

 

반응형

댓글