參考連結

前言

根據前一篇的內容,我們接下來打算做的事情如下

  • [x] 了解 elastAlert 的 Rule types 撰寫方式
  • [x] 成功觸發 slack ,並發送訊息

關於 Filters

參考:https://elastalert2.readthedocs.io/en/latest/recipes/writing_filters.html

Filters 是什麼?

可以想像是 elasticsearch 的查詢條件,如果滿足的話,就觸發 rule 並執行告警動作。

在建立 rule 時可以設定 filters,filters 是作為 elasticsearch query DSL(Domain Specific Language) 的部分,DSL 提供基於 json 來定義查詢,

DSL 大概就長這樣(可以透過點擊Filter/Edit Filter/Edit as Query DSL來查看)



測試 Filter + Slack 發送通知功能

我們這邊採用 frequency 來進行測試,並使用 wazuh 告警來當作範例。你可能不懂 frequency 可以參考官網進行了解,或是這篇寫了蠻多範例撰寫Rule

而這裡的前提是你已經透過Wazuh的告警系統實作 - Docker 安裝 elastAlert

撰寫 yaml

情境:如果使用者登入windows時,只要在64小時內輸入錯1次密碼,導致觸發Authentication_fail的相關alert,就發送訊息到Slack。

我們想要滿足上述情境,因此撰寫以下 yaml 我們的內容,你可以直接把 a.yaml 的內容做置換。webhook取得連結的方式請參考 slack 官方說明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
name: "Shannon-Alert-Test"
type: "frequency"
index: "wazuh-*"
is_enabled: true
buffer_time: # 查詢 elasticsearch 的時間區間
minutes: 5

# 5分鐘內相同的報警不會重複發送
realert:
minutes: 1
terms_size: 50 # 每個查詢返回的最大數量 default 50

# 頻率觸發設定
# 當 48 小時內,滿足 authorization
num_events: 1 # 將觸發警報的事件數量(含)
timeframe: # 在 timeframe 時間內內必須發生 num_events 次數
hours: 64
timestamp_field: "@timestamp"
timestamp_type: "iso"
use_strftime_index: false #

# 警告訊息
alert_subject: "Alert! {0} ! AgentID: {1} in time ({2})"
alert_subject_args:
- "rule.groups"
- "agent.id"
- "@timestamp"
alert_text: "主要原因: {0}"
alert_text_args:
- "rule.description"

# 用於查找事件的 Elasticsearch 過濾器列表
filter:
- query:
query_string:
query: "@timestamp:*"
- query:
wildcard:
rule.groups: "*authentication_fail*"

# 透過什麼方式進行通知
alert:
- "slack"
slack_webhook_url: 'https://hooks.slack.com/services/xxxxx' # 請使用你自己的 webhook url
slack_msg_color: "warning"
slack_parse_override: "none"

這邊值得一提的是, alert_subject_args 可以直接填寫 elasticsearch 看得到的 fields 內容。(如圖1)

觸發 windows 登入失敗

  1. 接下來,你需要一台裝好 wazuh agent 的電腦,這邊我使用 windows10 來進行。你可以透過 kibana 的 agent 註冊功能來快速註冊。

  2. 然後按照指示進行註冊即可

  3. 接下來故意登入時,輸入錯誤的密碼

  4. 然後前往 wazuh,進入 agent 的 security events,確認的確有觸發Authentication failure的事件增加了

  5. 最後,你也可以透過docker logs -f elastalert查看logs是否有觸發,或是建立 index: elastalert_* 選取 hit field,來確認的確有觸發alert。

Slack 收到通知

透過以上設置,他會發送出以下訊息:

結論

這樣這篇至少你知道該如何撰寫 frequent 的 Rule,並且透過 Slack 來發送警報通知
目前的進度,完成前面兩者,明天會繼續完成email的警報教學:

  • [x] 了解 elastAlert 的 Rule types 撰寫方式
  • [x] 成功觸發 slack ,並發送訊息
  • [ ] 怎麼透過 email 發送訊息
  • [ ] 成功觸發發送 email 功能
  • [ ] 把 Labeling Service 部署到 機器上
  • [ ] 成功觸發發送 發api進行 labeling 功能