본문 바로가기

Monitoring Tools/ELK Stack

7. Elastalert

반응형

1. 설치하기 전에

 - ELK에서 제공하는 x_pack을 이용한 경보 알람 기능은 유료이며 UI로 구현은 되지 않지만 무료로 여러 필터기능을 사용할 수 있는 elastalert를 이용

 

 

 

2. 설치

# 필수 패키지 설치
[root@localhost]# yum install python3 python3-pip gcc gcc-c++ gcc-cpp python3-devel

# pip upgrade
[root@localhost]# pip3 install --upgrade pip

# 설치 진행
[root@localhost]# pip3 install "setuptools>=11.3" python setup.py install
[root@localhost]# pip3 install elastalert

or 

git clone https://github.com/Yelp/elastalert.git
python setup.py install

 

 

 

3. 설정

# 홈디렉토리 생성
[root@localhost]# mkdir /etc/elastalert

# 설정 파일 작성
[root@localhost elastalert]# vim config.yaml
# 룰이 있는 디렉토리를 지정하고 elastalert가 실행되면 룰 디렉토리 아래에 있는 *.yaml 룰들이 모두 실행됨
rules_folder: /etc/elastalert/rules
# 룰에 대한 체크는 주기로 30초 마다 체크
# days, seconds, microseconds, milliseconds, minutes, hours, weeks 등을 사용 할 수 있음.
run_every:
  seconds: 30
# 룰 체크에 대한 결과를 한번에 완료 할 수 없는 경우 버퍼에 담아 놓게 되는데 이때 버퍼 유지 시간
buffer_time:
  minutes: 15
# elasticsearch 정보
es_host: localhost
es_port: 9200
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
# 알람 실패 시 재 시도할 주기
alert_time_limit:
  days: 2

 

 

 

 

4. 룰 생성

 - 룰에 대한 참조 https://elastalert.readthedocs.io/en/latest/ruletypes.html#rule-types

 

Rule Types and Configuration Options — ElastAlert 0.0.1 documentation

Each rule may have any number of alerts attached to it. Alerts are subclasses of Alerter and are passed a dictionary, or list of dictionaries, from ElastAlert which contain relevant information. They are configured in the rule configuration file similarly

elastalert.readthedocs.io

 

 - 아래 룰은 CF Spectrum 로그를 파싱하여 생성 된 것으로 Status=0 일때 5분 동안 같은 clientip가 10회 매칭 될때 알람.

vim /etc/elastalert/rules/gcp.yaml
# 룰 이름으로 알람시 slack의 경우 subject로 잡히게 됨
name: test
# frequency는 timeframe내에 filter 조건으로 query_key가 num_events 수 만큼 매칭되면 알람
type: frequency 
# elasticsearch index
index: demo-json*
# 매칭 이벤트 횟수
num_events: 10
# 탐지 할 시간 프레임
timeframe:
  minutes: 5
# 매칭에 필요한 조건
filter:
- query:
    query_string:
      query: "Status:0"
# 카운트할 필드
query_key: "ClientIP"
# 알람을 발생시킬 대상
alert:
- "slack"
- "command"
command: "echo %(ClientIP)s > /etc/elastalert/test.log"

slack:
slack_webhook_url: "https://hooks.slack.com/services/*******"
slack_username_override: "ElastAlert-Bot"
slack_channel_override: "#{channel name}"
slack_emoji_override: ":robot_face:"
slack_msg_color: "danger"
# 알람 문구 시정
alert_text: "Match Count: {0} \n TIME: {1} \n ClientIP: {2} \n ClientCountry: {3} \n Status: {4}"
alert_text_type: "alert_text_only"
alert_text_args: ["num_matches", "@timestamp", "ClientIP", "ClientCountry", "Status"]

 

 

 

5. 룰 테스트

[root@localhost elastalert]# elastalert-test-rule --config config.yaml rules/gcp.yaml

 

 

 

6. index 생성

[root@localhost]# elastalert-create-index

[root@localhost]# curl -XGET 'localhost:9200/_cat/indices?v'
health status index                           uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   elastalert_status_status        oJ8kGsyUQxe21iQ-yD9WTQ   1   1         29            0     30.8kb         30.8kb
yellow open   elastalert_status               _KktdPJMRkS3smFeiI2AtQ   1   1         46            0    481.2kb        481.2kb
yellow open   elastalert_status_past          MqpiRxRqSEGgwgXF6l1yBg   1   1          0            0       208b           208b
green  open   .apm-agent-configuration        _LmbW6f9SdqH6kl-CB4CDg   1   0          0            0       208b           208b
green  open   .kibana-event-log-7.15.1-000001 gYQW6Ab5TeCHzEu_1bARFw   1   0          1            0        6kb            6kb
yellow open   elastalert_status_silence       KpYxhi2MQCaW8XFTnSqHSg   1   1         51            0     32.3kb         32.3kb
green  open   .geoip_databases                4kd-c46tQEiyzvADtcf_7A   1   0         41            0     39.9mb         39.9mb
green  open   .kibana_7.15.1_001              vbPyjrn4SteMsZ8Pneiisg   1   0        145           12      2.4mb          2.4mb
green  open   .apm-custom-link                pit1H0QYSYGO44QG2ayxZg   1   0          0            0       208b           208b
green  open   .async-search                   gtRB9siCSwuUIjc7ndHBWA   1   0          0            0       234b           234b
yellow open   elastalert_status_error         opfS1ig0SgyibzSSu5plcA   1   1          2            0      9.6kb          9.6kb
yellow open   demo-json                       FKhJqvDNRfKDMYDb8AIr9g   1   1     283496            0    153.8mb        153.8mb
green  open   .kibana_task_manager_7.15.1_001 Umk-DIueRN6okyB7fMcVBw   1   0         15        54260      4.9mb          4.9mb

 

 

 

7. 룰 실행

elastalert --verbose --start NOW --config config.yaml

 

 

 

 

8. systemd 등록

# vim /usr/lib/systemd/system/elastalert.service 
[Unit]
Description=Elastaler
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/elastalert --verbose --start NOW --config /etc/elastalert/config.yaml
User=root

[Install]
WantedBy=multi-user.target

# systemctl daemon-reload

 

반응형