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에서 지정한 조건과 매칭되어 해당 정보를 메일로 보낸것을 확인
'클라우드 > ElasticStack' 카테고리의 다른 글
Elastic Stack Filebeat 설치 및 실행 가이드 (Docker 방식) (0) | 2024.11.14 |
---|---|
[ElasticStack] logstash 설치및 실행 (2) | 2021.12.14 |
[ElasticStack] Logstash 에서 Elasticsearch 로 데이터 전송하기 (0) | 2021.04.21 |
댓글