使用ElastAlert配置ELK堆棧警報

歡迎來到我們的教程,該教程如何使用ElastAlert配置ELK堆棧警報。 ELK Stack使您能夠收集,處理/解析,索引和可視化各種系統數據,它也可以配置為在發生各種事件時發出警報。警報功能使您可以監視數據中的更改或異常,並在滿足某些事件條件的情況下執行必要的響應操作。 ELK堆棧支持警報,但它可以作為付費訂閱使用,您需要許可證才能使用。還提供30天試用版。好吧,在本教程中,我們將使用Elasticsearch X-Pack警報功能ElastAlert的開源替代方案。

ElastAlert 將是 可靠,高度 模塊化的,並且容易 建立配置。它通過將Elasticsearch與兩種類型的組件(規則類型和警報)結合使用。定期查詢Elasticsearch,並將數據傳遞到規則類型,該規則類型確定何時找到匹配項。發生匹配時,將為該警報提供一個或多個警報,這些警報將根據匹配採取行動。這由一組規則配置,每個規則定義一個查詢,一個規則類型和一組警報。

ElastAlert包含幾種具有常見監視範例的規則類型:

  • “匹配Y時間有X個事件的地方”(frequency 類型)
  • “當事件發生率增加或減少時進行匹配”(spike 類型)
  • “在Y時間內少於X個事件時進行匹配”(flatline 類型)
  • “當某個字段與黑名單/白名單匹配時匹配”(blacklistwhitelist 類型)
  • “匹配與給定過濾器匹配的任何事件”(any 類型)
  • “當某個字段在一段時間內具有兩個不同的值時進行匹配”(change 類型)

當前,ElastAlert內置了對以下警報類型的支持:

  • 命令
  • 電子郵件
  • 吉拉
  • OpsGenie
  • 社交網絡
  • 嘻哈
  • 鬆弛
  • 電報
  • GoogleChat
  • 除錯
  • 踐踏
  • 蜂巢

使用ElastAlert配置ELK堆棧警報

在Linux中安裝ElastAlert

如上所述,對ElastAlert的安裝有很多要求。 需求頁面。這些包括;

  • 彈性搜索
  • ISO8601或Unix帶時間戳的數據
  • Python 3.6
  • 點,請參閱requirements.txt
  • Ubuntu 14.x上的軟件包:python-pip python-dev libffi-dev libssl-dev

安裝和設置Elastic / ELK堆棧

根據上述要求,要使用ElastAlert安裝和配置ELK堆棧警報,您需要啟動並運行ELK / Elastic堆棧。請按照下面的鏈接安裝和設置ELK /彈性堆棧。

在Ubuntu 20.04上安裝ELK Stack

在CentOS 8上安裝ELK Stack

在Docker容器上部署單節點彈性堆棧集群

在Fedora 30 / Fedora 29 / CentOS 7上安裝Elastic Stack 7

在Ubuntu 18.04 / Debian 9.8上安裝Elastic Stack 7

當然,收集的日誌數據帶有時間戳。

在Linux上安裝Python 3

在本演示中,我們將在運行於CentOS 8系統上的彈性堆棧服務器上安裝ElastAlert。請注意,您也可以將Elastalert安裝在要從中運送日誌的客戶端上。

根據上述要求,ElastAlert需要Python 3.6。在CentOS 8上,您可以通過執行以下命令安裝Python 3.6(如果尚未安裝);

dnf install python36 python3-devel

有關其他發行版,請參閱有關安裝Python 3.6的相應文檔。

在Linux上安裝PIP

同樣,對於運行Python 3的CentOS 8系統,您可以通過執行以下命令來安裝PIP。

dnf install python3-pip

有關安裝PIP的詳細信息,請參閱您的操作系統發行版。

同樣,您需要安裝GNU Compiler Collection(gcc);

dnf install gcc

您可能需要安裝 開發工具,它提供了全面的構建工具,但安裝GCC就足夠了。

安裝ElastAlert

一旦安裝了ElastAlert的要求到位,您現在可以通過簡單地克隆其Github存儲庫並按以下方式安裝來安裝ElastAlert的最新發行版;

git clone https://github.com/Yelp/elastalert.git /opt/elastalert
cd /opt/elastalert
pip3 install "setuptools>=11.3" -U
python3 setup.py install

您也可以使用PIP安裝Elastalert。

pip3 install elastalert

安裝Elasticsearch ElastAlert模塊

接下來,安裝ElastAlert Elasticsearch模塊(適用於ES版本5及更高版本)。

pip3 install "elasticsearch>=5.0.0"
cd ~

使用ElastAlert配置ELK堆棧警報

現在,您可以配置ElastAlert進行ELK堆棧警報。

首先,ElastAlert(根據我們克隆其Github存儲庫的安裝方法)附帶示例配置文件, /opt/elastalert/config.yml.example

重命名此配置文件,刪除.example後綴。

cp /opt/elastalert/config.yaml{.example,}

配置文件受到高度注釋。默認情況下,它沒有注釋和空行。

rules_folder: example_rules
run_every:
  minutes: 1
buffer_time:
  minutes: 15
es_host: elasticsearch.example.com
es_port: 9200
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
alert_time_limit:
  days: 2
  • rules_folder 是ElastAlert從中加載規則配置文件的位置,在我們的例子中是 /opt/elastalert/example_rules
  • run_every 是ElastAlert多久查詢一次Elasticsearch的時間。
  • buffer_time 是查詢窗口的大小,從每個查詢運行的時間開始向後延伸。
  • es_host 是Elasticsearch集群的地址,ElastAlert將在其中存儲有關其狀態,查詢運行,警報和錯誤的數據。每個規則還可以使用不同的Elasticsearch主機進行查詢。
  • es_port 是對應於的端口 es_host
  • writeback_index 是ElastAlert將在其中存儲數據的索引的名稱。我們稍後將創建此索引。
  • alert_time_limit 是失敗警報的重試窗口。

為Elasticsearch節點定義地址和端口;

打開ElastAlert配置文件進行編輯;

vim /opt/elastalert/config.yaml

我們在默認配置文件中唯一要更改的是ES的IP地址和端口。

ss -altnp | grep :9200
LISTEN   0        128        [::ffff:192.168.57.30]:9200                *:*
...
# The Elasticsearch hostname for metadata writeback
# Note that every rule can have its own Elasticsearch host
es_host: 192.168.57.30

# The Elasticsearch port
es_port: 9200
...

如果您的ES配置了SSL / Authentication,請確保在ElastAlert配置文件上設置各自的詳細信息。

保存並退出配置。

這就是我們的配置文件的樣子;

less /opt/elastalert/config.yaml
rules_folder: /opt/elastalert/example_rules
run_every:
  minutes: 1
buffer_time:
  minutes: 15
es_host: 192.168.57.30
es_port: 9200
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
alert_time_limit:
  days: 2

在Elasticsearch上創建ElastAlert索引

在Elasticsearch上創建一個ElastAlert索引,以使其能夠存儲有關其查詢和警報的信息和元數據。

elastalert-create-index
Elastic Version: 7.8.1
Reading Elastic 6 index mappings:
Reading index mapping 'es_mappings/6/silence.json'
Reading index mapping 'es_mappings/6/elastalert_status.json'
Reading index mapping 'es_mappings/6/elastalert.json'
Reading index mapping 'es_mappings/6/past_elastalert.json'
Reading index mapping 'es_mappings/6/elastalert_error.json'
New index elastalert_status created
Done!

如果遇到錯誤, AttributeError: module 'yaml' has no attribute 'FullLoader',在創建ElastAlert ES索引時,您可以重新安裝PyYAML;

sudo pip3 install --ignore-installed PyYAML

創建索引後,如果您在堆棧管理> Elasticsearch>索引管理下導航至Kibana,則應該能夠看到此類索引;

使用ElastAlert配置ELK堆棧警報
創建ElastAlert規則和警報

根據我們的設置,ElastAlert規則位於 /opt/elastalert/example_rules 目錄。

ls /opt/elastalert/example_rules/ -1
example_cardinality.yaml
example_change.yaml
example_frequency.yaml
example_new_term.yaml
example_opsgenie_frequency.yaml
example_percentage_match.yaml
example_single_metric_agg.yaml
example_spike_single_metric_agg.yaml
example_spike.yaml
jira_acct.txt
ssh-repeat-offender.yaml
ssh.yaml

ElastAlert支持以下類型的規則: 規則類型 頁面以及如上概述的各種警報通道類型 ElastAlert警報 頁。

在此設置中,我們將測試一些規則類型,並使用電子郵件進行提醒。

多個失敗的SSH登錄名的ELK堆棧電子郵件警報

如果您查看示例規則目錄下的內容,則我們有SSH規則文件, /opt/elastalert/example_rules/ssh.yaml

在此設置中,我們使用Filebeat從端點收集日誌。如果在端點上發生5次以上的登錄嘗試失敗,我們將通過郵件提醒您。因此,下面是沒有注釋行的示例SSH配置;

vim /opt/elastalert/example_rules/ssh.yaml
name: Sample SSH Rule
type: frequency
num_events: 3
timeframe:
  minutes: 1
filter:
- query:
    query_string:
      query: "event.type:authentication_failure"
index: filebeat-*
realert:
  minutes: 1
query_key:
  - source.ip
include:
  - host.hostname
  - user.name
  - source.ip
include_match_in_root: true
alert_subject: "SSH Bruteforce Attacks Detected on {}"
alert_subject_args:
  - host.hostname
alert_text: |-
  Multiple SSH failed logins detected on {}.
  Details of the event:
          - User: {}
          - Source IP: {}
alert_text_args:
  - host.hostname
  - user.name
  - source.ip
alert:
  - email:
     from_addr: "[email protected]"
     email: "[email protected]"
alert_text_type: alert_text_only

上面在索引filebeat- *上搜索認證失敗事件類型。然後,如果在一分鐘內發現三個失敗的登錄嘗試,它將發送警報。確保為事件設置正確的索引名稱和正確的搜索字符串。

完成更改後,保存並退出文件。

注意,要使電子郵件警報起作用,您需要配置SMTP進行電子郵件中繼。您可以查看以下指南,在Ubuntu / Fedora上設置Postfix。

將Postfix配置為在Ubuntu 20.04上使用Gmail SMTP

將Postfix配置為在Ubuntu 18.04上使用Gmail SMTP

在Fedora 29上將Postfix配置為僅發送SMTP服務器

測試ElastAlert規則

配置規則後,您需要測試它是否確實有效。 ElastAlert提供了一個名為 elastalert-test-rule 用於驗證配置的規則。

該腳本安裝在/ usr / local / bin下;

which elastalert-test-rule
/usr/local/bin/elastalert-test-rule

例如,要測試上述SSH規則,請導航至

elastalert-test-rule --config /opt/elastalert/config.yaml /opt/elastalert/example_rules/ssh.yaml

該腳本顯示類似於以下內容的輸出;

INFO:elastalert:Note: In debug mode, alerts will be logged to console but NOT actually sent.
            To send them but remain verbose, use --verbose instead.
Didn't get any results.
INFO:elastalert:Note: In debug mode, alerts will be logged to console but NOT actually sent.
                To send them but remain verbose, use --verbose instead.
1 rules loaded
INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts
INFO:elastalert:Queried rule SSH abuse (ElastAlert 3.0.1) - 2 from 2020-12-01 21:13 EAT to 2020-12-01 21:14 EAT: 0 / 0 hits

Would have written the following documents to writeback index (default is elastalert_status):

elastalert_status - {'rule_name': 'SSH abuse (ElastAlert 3.0.1) - 2', 'endtime': datetime.datetime(2020, 12, 1, 18, 14, 56, 92899, tzinfo=tzutc()), 'starttime': datetime.datetime(2020, 12, 1, 18, 13, 55, 492899, tzinfo=tzutc()), 'matches': 0, 'hits': 0, '@timestamp': datetime.datetime(2020, 12, 1, 18, 14, 56, 416136, tzinfo=tzutc()), 'time_taken': 0.08273959159851074}

如您所見,我們的Filebeat索引中當前匹配有SSH失敗事件, INFO:elastalert:Queried rule SSH abuse (ElastAlert 3.0.1) - 2 from 2020-12-01 21:13 EAT to 2020-12-01 21:14 EAT: 0 / 0 hits

我將模擬多個失敗的ssh事件並重新運行腳本。

elastalert-test-rule --config /opt/elastalert/config.yaml /opt/elastalert/example_rules/ssh.yaml
INFO:elastalert:Note: In debug mode, alerts will be logged to console but NOT actually sent.
            To send them but remain verbose, use --verbose instead.
Didn't get any results.
INFO:elastalert:Note: In debug mode, alerts will be logged to console but NOT actually sent.
                To send them but remain verbose, use --verbose instead.
1 rules loaded
INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 22:04 EAT to 2020-12-01 22:05 EAT: 5 / 5 hits
INFO:elastalert:Alert for Sample SSH Rule at 2020-12-01T22:05:06+03:00:
INFO:elastalert:Multiple SSH failed logins detected on solr.
Details of the event:
        - User: gen_t00
        - Source IP: 192.168.57.1



Would have written the following documents to writeback index (default is elastalert_status):

silence - {'exponent': 0, 'rule_name': 'Sample SSH Rule.192.168.57.1', '@timestamp': datetime.datetime(2020, 12, 1, 19, 5, 17, 14585, tzinfo=tzutc()), 'until': datetime.datetime(2020, 12, 1, 19, 6, 17, 14577, tzinfo=tzutc())}

elastalert_status - {'rule_name': 'Sample SSH Rule', 'endtime': datetime.datetime(2020, 12, 1, 19, 5, 16, 979897, tzinfo=tzutc()), 'starttime': datetime.datetime(2020, 12, 1, 19, 4, 16, 379897, tzinfo=tzutc()), 'matches': 1, 'hits': 5, '@timestamp': datetime.datetime(2020, 12, 1, 19, 5, 17, 15185, tzinfo=tzutc()), 'time_taken': 0.012313127517700195}

正如您在上面看到的,在一分鐘之內有5個事件;

INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 21:30 EAT to 2020-12-01 21:31 EAT: 5 / 5 hits

活動詳細信息(電子郵件正文):

Multiple SSH failed logins detected on solr.
Details of the event:
        - User: gen_t00
        - Source IP: 192.168.57.1

使用–help選項查看可以使用的腳本參數。

elastalert-test-rule --help

運行ElastAlert

確認查詢運行正常後,就可以運行ElastAlert。 ElastAlert可以通過監控程序或Python作為守護程序運行。

您還可以使用elastalert二進制文件在標準輸出上運行它, /usr/local/bin/elastalert

例如,您對規則目錄中定義的所有規則運行ElastAlert。

/usr/local/bin/elastalert --verbose --config /opt/elastalert/config.yaml

指定特定的規則文件;

/usr/local/bin/elastalert --verbose --config /opt/elastalert/config.yaml --rule /path/to/rules-file.yaml

例如

/usr/local/bin/elastalert --verbose --config /opt/elastalert/config.yaml --rule /opt/elastalert/example_rules/ssh.yaml
1 rules loaded
INFO:elastalert:Starting up
INFO:elastalert:Disabled rules are: []
INFO:elastalert:Sleeping for 59.99993 seconds
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 22:01 EAT to 2020-12-01 22:16 EAT: 8 / 8 hits
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 22:16 EAT to 2020-12-01 22:31 EAT: 0 / 0 hits
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 22:31 EAT to 2020-12-01 22:46 EAT: 0 / 0 hits
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 22:46 EAT to 2020-12-01 23:01 EAT: 0 / 0 hits
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 23:01 EAT to 2020-12-01 23:12 EAT: 0 / 0 hits
INFO:elastalert:Sent email to ['[email protected]']
INFO:elastalert:Ignoring match for silenced rule Sample SSH Rule.192.168.57.1
INFO:elastalert:Ran Sample SSH Rule from 2020-12-01 22:01 EAT to 2020-12-01 23:12 EAT: 0 query hits (0 already seen), 2 matches, 1 alerts sent

在此設置中,我們將ElastAlert作為服務運行;

cat > /etc/systemd/system/elastalert.service << 'EOL'
[Unit]
Description=ELK Stack ElastAlert Service
After=elasticsearch.service
 
[Service]
Type=simple
WorkingDirectory=/opt/elastalert
ExecStart=/usr/local/bin/elastalert --verbose --config /opt/elastalert/config.yaml
 
[Install]
WantedBy=multi-user.target
EOL

重新加載系統配置;

systemctl daemon-reload

啟動並啟用服務以在啟動時運行;

systemctl enable --now elastalert

檢查狀態;

systemctl status elastalert
● elastalert.service - ELK Stack ElastAlert Service
   Loaded: loaded (/etc/systemd/system/elastalert.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2020-12-01 23:18:47 EAT; 38s ago
 Main PID: 7340 (elastalert)
    Tasks: 12 (limit: 17931)
   Memory: 43.9M
   CGroup: /system.slice/elastalert.service
           └─7340 /bin/python3 /usr/local/bin/elastalert --verbose --config /opt/elastalert/config.yaml

Dec 01 23:18:59 elastic.kifarunix-demo.com elastalert[7340]: INFO:elastalert:Queried rule SSH abuse - reapeat offender from 2020-12-01 22:31 EAT to 2020-12-01 22:46 EAT: 0>
Dec 01 23:18:59 elastic.kifarunix-demo.com elastalert[7340]: INFO:elastalert:Queried rule Event spike from 2020-12-01 23:16 EAT to 2020-12-01 23:18 EAT: 0 / 0 hits
...

要與ElastAlert Python一起運行,請參閱 運行ElastAlert

模擬事件並驗證是否通過郵件發送和接收任何警報;

使用ElastAlert配置ELK堆棧警報

這標誌着我們教程的結尾,該教程介紹了如何通過電子郵件通過ElastAlert配置ELK堆棧警報。隨意探索其他警報渠道。

參考

首次運行ElastAlert

其他教程

使用ELK Stack監視Linux系統指標

在ELK堆棧上可視化WordPress用戶活動日誌

在ELK堆棧上處理和可視化ModSecurity日誌

Sidebar