摘要: 本文利用zabbix的日志監控功能監控Linux的secure日志,當有用戶登錄失敗或者用戶在非常規時間登錄成功時發出告警。 這里我們使用zabbix提供的'log[file,<regexp>,<encoding><maxlines>,<mode>,<output>]'來監控Linux的/var/log/secure文件。
本文利用zabbix的日志監控功能監控Linux的secure日志,當有用戶登錄失敗或者用戶在非常規時間登錄成功時發出告警。
這里我們使用zabbix提供的'log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>]'來監控Linux的/var/log/secure文件。先介紹下這個log監控項:
1)監控項類型是Zabbix agent (active),返回數據類型是Log。
2)Zabbix agent要對監控的日志文件有可讀權限,否則會返回unsupported。
3)參數介紹:
file - 日志文件的全路徑。
regexp - 過濾日志的正則表達式。
encoding - 字符編碼,默認為英文單字節SBCS(Single-Byte Character Set)。
maxlines - agent每秒發送給server(或proxy)的數據的最大行數,這個參數會覆蓋掉zabbix_agentd.conf配置文件里的'MaxLinesPerSecond'參數。
mode - 可填參數:all(默認),skip(跳過舊數據)。
output - 自定義格式化輸出,默認輸出regexp匹配的整行數據。轉義字符'\0'表示regexp
匹配的數據,轉義字符'\N'(N=1..9)表示regexp里第N個分組匹配到的數據。如果填其他字符串就會覆蓋掉regexp匹配的數據。
下面先展示下成果,然后介紹操作步驟:
歷史數據展示:
告警郵件展示:
一、創建日志監控item
選擇“Template OS Linux”模板,創建監控項item,配置如下:
Name - 填"Login attempt"
Type - 選擇Zabbix agent (active)
Type of information - 數據類型選擇Log
Update interval (in sec) - 監控間隔60秒
Key - 填寫如下:
1
|
log[/var/log/secure,"(Accepted|Failed) password",,,skip,]
|
正則表達式為"(Accepted|Failed) password",過濾/var/log/secure中的正確或失敗的用戶登錄請求(這里只過濾密碼驗證方式的登錄)。
二、創建觸發器trigger
我們繼續選擇“Template OS Linux”模板,為上面的監控項創建觸發器。
1、用戶登錄失敗的觸發器配置
Name - 填"Login attempt has failed"
Expression - 填寫如下:
1
|
{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].str(Failed)}=1&{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].nodata(60)}=0
|
表達式的含義為:如果用戶登錄失敗了,item返回數據中會包含"Failed",則觸發器被觸發,60秒內沒有新數據的話,觸發器恢復。這樣就保證了觸發器不會一直在觸發狀態。
下面把表達式拆解分析:
A:{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].str(Failed)}=1,表示如果字符串中包含"Failed"則表達式為真。
B:{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].nodata(60)}=0,表示60秒內有數據產生則表達式為真,即60秒內如果沒有新數據了,則表達式為假。
邏輯為A & B,表示同時符合A、B兩個條件(同時為真),觸發器才會觸發。
2、用戶在非常規的時間登錄成功的觸發器配置
Name - 填"Login attempt has accepted"
Expression - 填寫如下:
1
|
{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].str(Accepted)}=1&{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].nodata(60)}=0&({Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].time(0)}<080000|{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].time(0)}>200000)
|
表達式的含義為:晚上20點到早上8點之間如果有用戶登錄成功了,item返回數據中會包含"Accepted",則觸發器被觸發,60秒內沒有新數據的話,觸發器恢復。
下面把表達式拆解分析:
A:{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].str(Accepted)}=1,表示如果字符串中包含"Accepted"則表達式為真。
B:{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].nodata(60)}=0,表示60秒內有數據產生則表達式為真,即60秒內如果沒有新數據了,則表達式為假。
C:{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].time(0)}<080000,表示當前時間小於8點(08:00:00)則表達式為真。
D:{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].time(0)}>200000,表示當前時間大於晚上8點(20:00:00)則表達式為真。
邏輯為A & B & (C | D),表示A和B要同時為真且C和D只要一個為真,則整個表達式為真,觸發器才會觸發。
這樣“Template OS Linux”模板我們就配置好了,下面配置Linux agent客戶端。
三、Linux客戶端配置
1、保證兩個Hostname一致
第一個Hostname是指zabbix_agentd.conf配置文件中的"Hostname"參數;第二個Hostname是指主機配置里的"Host name"。
這兩個配置要相同,因為agent是以"Hostname"為參數向server發送"active checks"請求,server收到請求,到數據庫里找到相同的名稱的主機后,向agent返回active類型的監控項列表。agent根據這個item list進行監控,收集數據,並主動把數據推送給server。
具體請看官方文檔:https://www.zabbix.com/documentation/2.2/manual/appendix/items/activepassive#active_checks
2、設置ServerActive參數
agent向哪個server發送"active checks"請求是由配置文件中的"ServerActive"參數決定的。"ServerActive"定義了zabbix server的ip和端口。
3、設置日志文件的權限
/var/log/secure的權限一般是600,zabbix agent對此文件沒有權限。zabbix用戶是agent的啟動用戶,所以我們要設置zabbix用戶對/var/log/secure有可讀權限,這樣agent才能監控。
執行下面的命令,追加zabbix的可讀權限:
1
|
setfacl -m u:zabbix:r--
/var/log/secure
|
4、修改logrotate配置
1
|
sed
-i
'/kill/a\/usr\/bin\/setfacl -m u:zabbix:r-- \/var\/log\/secure'
/etc/logrotate
.d
/syslog
|
agent上要注意的配置就是這些了。修改完配置文件后要重啟agent。
最后,我們還要在zabbix web上設置"Actions",定義告警操作,設置告警收件人。這樣發生告警后,相關的收件人會收到告警郵件。