跳到主要內容
節省工具箱Jason Tools
經驗分享

Graylog 告警主旨加入訊息欄位

Jason Cheng 發布
Graylog 告警主旨加入訊息欄位
本文目錄
  1. 模板語法
  2. 可用的變數
  3. 用 backlog 取原始訊息的欄位
  4. 另一種做法:事件定義的自訂欄位
  5. 測試
  6. 結論
  7. 參考資料

Graylog 的告警通知預設的主旨長這樣:Graylog event notification: Proxmox VE 登入失敗。收件者看到只知道「有事」,要點開信才知道是哪台主機、哪個帳號。告警一多,光看主旨根本分不出輕重。

其實通知的主旨與內容都可以用變數,把事件來源的訊息欄位(主機、帳號、來源 IP)直接放進去。這篇整理可用的變數、backlog 的用法,以及另一個更穩定的做法:事件定義的自訂欄位。

模板語法

Graylog 的通知模板使用 JMTE(Java Minimal Template Engine)語法,變數寫成 ${...}:

語法用途
${變數}輸出變數
${if 變數}...${end}變數有值才輸出
${foreach 清單 項目}...${end}逐一輸出清單裡的每一項

可用的變數

變數內容
${event_definition_title}事件定義的標題
${event_definition_description}事件定義的說明
${event_definition_type}事件定義的類型
${event.message}事件訊息
${event.source}事件來源(產生事件的 Graylog 節點)
${event.timestamp}事件時間
${event.timerange_start}、${event.timerange_end}搜尋的時間範圍
${event.priority}優先等級
${event.key}事件的 key(有設定 group by 時)
${event.fields.欄位}事件定義的自訂欄位
${backlog}觸發事件的原始訊息清單

注意 ${event.source} 是產生事件的 Graylog 節點,不是原始記錄的來源主機。要拿到原始記錄的內容,要從 backlog 取。

用 backlog 取原始訊息的欄位

先開啟 Message Backlog

在通知設定裡,或事件定義的「Notifications」步驟中,把 Message Backlog 設成大於 0(例如 1)。設成 0 的話 backlog 是空的,後面的變數都不會有內容。

取欄位的寫法

backlog 裡每一筆訊息可以用:

寫法內容
${message.source}訊息的 source 欄位
${message.message}訊息內容
${message.timestamp}訊息時間
${message.fields.欄位}任意欄位,例如 ${message.fields.src_ip}

要用 foreach 包起來:

${event_definition_title} - ${foreach backlog message}${message.source}${end}

實例:Wazuh 轉進來的登入失敗告警

以 Wazuh 送進 Graylog 的 Proxmox VE 登入失敗記錄為例,訊息裡有這些欄位:

source=wazuh-manager
agent_name=pve1
data_dstuser=root
data_srcip=192.168.1.200
rule_description=Proxmox VE authentication failed.

想在主旨顯示「哪台主機、哪個帳號、從哪裡來」:

${event_definition_title}${foreach backlog message} - 主機: ${message.fields.agent_name} - 帳號: ${message.fields.data_dstuser} - 來源: ${message.fields.data_srcip}${end}

收到的主旨會變成:

PVE 登入失敗 - 主機: pve1 - 帳號: root - 來源: 192.168.1.200

欄位可能不存在時,用 if 包起來,沒有值就不輸出那一段:

${event_definition_title}${foreach backlog message}${if message.fields.user} - User: ${message.fields.user}${end} - Source: ${message.source}${end}

backlog 筆數的影響

設定結果
0backlog 是空的,主旨不會有任何欄位內容
1只有一筆,主旨最乾淨
大於 1foreach 會把每一筆都輸出,主旨會變得很長

用在主旨時建議設 1;信件內容可以設多一點,列出觸發這個事件的多筆記錄。

另一種做法:事件定義的自訂欄位

backlog 的寫法有個缺點:每個通知都要寫一長串 foreach。如果某個欄位每次都要用,可以在事件定義裡先把它變成事件的欄位。

在事件定義的「Fields」步驟新增自訂欄位,例如:

項目設定
Namesource_module
Set Value FromTemplate
Template${source.SourceModuleName}

${source.欄位} 會取觸發事件的訊息裡的欄位值(以 NXLog 送來的 SourceModuleName 為例)。之後在通知裡直接用:

nxlog - ${event.fields.source_module}

注意:自訂欄位只會取觸發事件的第一筆訊息的值。一個事件包含多筆訊息時,其他訊息的值不會出現,這是設計上的行為;需要列出全部,還是要用 backlog。

自訂欄位的好處是:值會存在事件本身,在 Graylog 的告警頁面也看得到、可以搜尋,不只用在通知裡。

測試

通知設定頁有「Execute Test Notification」,但測試通知用的是範例資料,不會有真正的 backlog 訊息,欄位多半是空的。比較準的測試方式是:

  1. 把事件定義的搜尋時間範圍與條件放寬,讓它很快被觸發
  2. 確認收到的通知主旨與內容正確
  3. 再把條件改回來

結論

告警主旨放進主機、帳號、來源 IP 這些資訊,收件者一眼就能判斷要不要馬上處理。做法有兩種:通知裡用 ${foreach backlog message}...${end} 取原始訊息欄位(記得 Message Backlog 要大於 0),或是在事件定義先建自訂欄位,通知裡直接用 ${event.fields.欄位}。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀