參考連結

前言

我們在上一篇說明完如何透過 slack 來發送告警通知,本篇的目的這次著重在。

  • [x] 怎麼透過 email 發送訊息
  • [x] 成功觸發發送 email 功能
  • [x] 把 Labeling Service 部署到 機器上
  • [x] 成功觸發發送 發api進行 labeling 功能

透過 post 來發送訊息

如果你想要設定 Rule 是可以發送 HTTP POST 的,可以參考以下的設定方式。

HTTP POST的設定Key意思:

  • http_post_url:設定要發送請求的URL地址。
  • http_post_payload(可選):以键值對形式配置的POST请求的内容。
    • 例如,ip: clientip 會將Elasticsearch中clientip索引的值映射到名为ip的JSON键。
    • 如果未定義,則會發送所有Elasticsearch的键值對。
  • http_post_static_payload(可選):靜態参数的键值對(value不是參考elasticSearch是自己填寫),會跟http_post_payloadElasticsearch的结果一起發送。可以在這裡放是其他純文字的內容。
  • http_post_headers(可選):要作為請求的一部分發送header的键值對。
  • http_post_proxy(可選):代理的URL,如果需要的话。(前提是,http_post_url有proxy,可以方面查看風包內的訊息)
  • http_post_timeout(可選):POST請求的超時值,單位為秒,默認為10秒。如果超時發生將在下次ElastAlert訓環時重試警報。
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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:
- "post" # 指定事件發生時要進行 Post

# post 的相關設定
## 我有開一個 api 專門可以提供貼標籤使用
http_post_url: "http://140.118.9.194:8087/api/risk/label"

## post payload 會從 elastic field 去抓
http_post_payload:
targetId: agent.id

## post static payload 會直接成為字串進行傳送
http_post_static_payload:
targetType: "User"
riskType: "HostRisk"
value: "0.7"
generator: "DeviceRisk"

# Basic Authorization
http_post_headers:
authorization: Basic YWRtaW46MTIz #帳號:密碼 admin:123

上面發出的訊息類似下面的效果

1
2
3
4
5
6
7
8
9
10
11
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Basic YWRtaW46MTIz" \
-d '{
"generator": "DeviceRisk",
"targetId": "001",
"targetType": "User",
"riskType": "HostRisk",
"value": "0.7"
}' \
http://140.118.9.195:8087/api/risk/label

透過 Email 來發送訊息

MailTrap 申請

  1. 一開始預設會有 Inboxes 那是收訊息的地方,還有關於我們要用的是 SMTP 的設定。
  2. 可以看到以下訊息:
  • (1): SMTP HOST
  • (2): SMTP 帳號
  • (3): SMTP 密碼
  • (4): 可以切換不同的語言或是工具查看使用這個服務的方式
  • (5): 直接看到如何使用的範例程式碼
  • (6): 可以直接重新產生帳號和密碼

ElastAlert 設定

ElastAlert 使用 email 通知時,如果需要帳號密碼,需要另外用 yaml 檔案格式紀錄帳號與密碼,再將檔案位置指定給 rule 使用,以下延續之前筆記的路徑規則設定

  1. 建立 /opt/elastalert/config/emailauth.yaml把剛剛在MailTrap產生的帳號密碼放入。
1
2
user: "username"
password: "password"
  1. 調整 docker compoe,把剛剛的 yaml 檔案掛載到 container 裡面/opt/elastalert/config/emailauth.yaml的位置。
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
version: '3.4'
services:
elastalert:
container_name: elastalert2
image: jertel/elastalert2
volumes:
- /opt/elastalert/config/config.yaml:/opt/elastalert/config.yaml
- /opt/elastalert/rules:/opt/elastalert/rules
- /opt/elastalert/certs:/opt/elastalert/certs
# 差異在這裡
- /opt/elastalert/config/emailauth.yaml:/opt/elastalert/config/emailauth.yaml
command: --verbose
restart: always
networks:
- es_default
ports:
- "3030:3030"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3030"]
interval: 30s
timeout: 15s
retries: 3
start_period: 40s

networks:
es_default:
external: true
  1. 可以查看一下 logs 確認是否有正常運行
1
docker-compose logs -f elastalert
  1. 更正 rule 的 email 通知方式,/opt/elastalert/rules/a.yaml,設定以下內容。更正完不用重新啟動,就會自動套用囉,因為我們有掛載 volume。Host的檔案更改時,container裡面的檔案也會跟著更改。
1
2
3
4
5
6
7
8
... 
alert: # 警示通知類型 (詳細內容可以參考 [Alerts](https://elastalert.readthedocs.io/en/latest/ruletypes.html#alerts))
- "email"
email: # email 發送目標
- "b10709036@gapps.ntust.edu.tw"
smtp_host: sandbox.smtp.mailtrap.io
smtp_port: 2525
smtp_auth_file: /opt/elastalert/config/emailauth.yaml # email 帳號密碼設定檔位置

補充:想要透過標籤Label來得知裝置使用者

在wazuh註冊的話只能透過device id來知道裝置身份,但是我們根本不知道使用者身份呀?,所以可以透過wazuh的Agent Label設定於ossec.conf,每次發送Alert的時候,添加Label的訊息進去。

設定wazuh的Agent Label

如果你是Windows可以直接在 C://Program Files (x86)/ossec-agent/ossec.conf 裡面設定,如果是Linux的話,可以在 /var/ossec/etc/ossec.conf 裡面設定。

  1. 打開 ossec.conf
  2. 在 ossec.conf 設定以下內容:
1
2
3
<labels>
<label key="user.account">{user.account.id}</label>
</labels>

怎麼在rules抓取label內容

  1. 先知道 label 會位於 fields 的哪一個位置,可以從 kiabana 的 Discover 看到,他在agent.labels.user.account

  2. 所以可以在 rule 做以下設定,使得在 alert 的發送訊息中包含使用者資訊,設定如下:

1
2
3
4
5
6
7
8
9
10
# 警告訊息
alert_subject: "Alert! {0} ! User: {3}, AgentID: {1} in time ({2})"
alert_subject_args:
- "rule.groups"
- "agent.id"
- "@timestamp"
- "agent.labels.user.account" # 也就是這裡可以抓取labels的訊息
alert_text: "主要原因: {0}"
alert_text_args:
- "rule.description"

結論

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

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