自行撰寫syslog server建立資訊安全控管中心#4 -- 過濾條件設定

URL Link //n.sfs.tw/11446

2017-07-17 00:55:50 By 張○○

此文分為四個部分

自行撰寫syslog server建立資訊安全控管中心 #1 -- 前言及syslog介紹
自行撰寫syslog server建立資訊安全控管中心 #2 -- 架構和作法
自行撰寫syslog server建立資訊安全控管中心 #3 -- 程式下載和安裝
自行撰寫syslog server建立資訊安全控管中心 #4 -- 過濾條件設定

4. 程式功能及設定

4.1  過濾掉不重要的syslog

syslog 很多,但並不是每個一都值得記錄到資料庫分析,所以必須有過濾的機制把不要的syslog濾掉,判斷方法有二種:單一條件及多重條件。

(1) 單一條件判斷

在程式上可以直接進行過濾的設定,每組設定由雙引號分隔,內有三個欄位:主機名、鍵值、限制由分號 ';' 分隔。

"HOST; KEY; RESTRICT"

HOST(主機名)為 syslog 送過來的主機名,除了syslog-ng送出的syslog會自帶主機名外,未帶主機名的syslog則由函式 gethostbyaddr() 由dns取得主機名稱,若該函式查找不到名稱則會用IP或IP6來顯示。
KEY(鍵值)可以為 program、facility、level、piority、message等五種。
RESTRICT(限制)可以使用 '!' 作為 NOT 運算,多個限制以逗號 ',' 分格,以下是設定的範例:

假設想限制主機ldap的程式不收錄 ldapd及 sendmail ,寫成這樣是不正確的,因為RESTRICT遇到任何一個條件符合就回傳為真,所以程式 sendmail 符合 !ldapd:
"ldap; program; !ldapd, !sendmail"

所以,正確的寫法應該是寫成兩筆:
"ldap; program; !ldapd", "ldap; program; !webmail"

(2) 多重條件的判斷

假如我們希望只記錄程式為 named 且等級為 info到warning之間,則寫為:"dns; level, info..warning", "dns, program, named" 並不是我們要的結果,他的意思是等級 info到warning "或" 程式為 named 都接受。所以當我們需要用多個條件的組合時,可以用關鍵字 'and' 或 '&&' 去組合,所以下面的寫法才是正確的:
"dns; (level; info..warning) and (program; named)"

他的語法是:

"HOST; (KEY1; RESTRICT1) and (KEY2; RESTRICT2) and (KEY3; RESTRICT3)..."

同時,過濾也可以接受NOT 運算,但這裡判斷可能要傷一點腦筋才會寫出正確的結果,例如我們要濾掉程式named等級為info..warning的記錄。就得要這樣寫:
"dns; (level; !info..warning) and (program; !named)" <== CORRECT

而下面的寫法語意上是錯誤:
"dns; (level; info..warning) and (program; !named)" <== INCORRECT 1
"dns; (level; !info..warning) and (program; named)" <== INCORRECT 2

慢下來思考,(level; !info..warning) 意思是不要等級 info..warning,而 (program; !named) 則意為不要記錄程式 named,換句話說,要過濾為TRUE,不過濾為FALSE,兩者使用AND運算,因此(TRUE) and (TRUE)= TRUE=FILTERED;而後面兩者的意思分別為:
INCORRECT 1  (FALSE) and (TRUE) = FALSE=ACCEPTED
INCORRECT 2  (TRUE) and (FALSE)= FALSE= ACCEPTED

4.2 寄發值得注意的log給管理員

接下來要將異常的 log 寄給管理員,為了不打擾管理者也避免被郵件過量被判斷為垃圾信,所以系統可以設定寄通知信的週期:
my $enable_email ="YES";    # Set to YES if you want the administrator to catch abnormal email notification.
my $email_interval=600;        # interval to send notification email in second.

因此每個週期,系統將會把符合設定的記錄匯整後寄信給管理者,其設定除了HOST 可以使用 '*' 代表全部的記錄外,其他和上一節過濾是相同的,語法為:

SYNTAX "HOST; KEY; RESTRICT"

以下是範例:

將所有等級為 emerg..err 或 facility 為 (auth 或 authpriv) 的記錄寄給管理者
"*; level; emerg..err", "*; facility; auth, authpriv";

同上,但主機的指定為 http://www.tcc.edu.tw,因此只有主機 http://www.tcc.edu.tw 的管理人會收到信,管理人的 email 另建立資料表 manager,表格結構如表2。
"www.tcc.edu.tw; level; emerg..err", "www.tcc.edu.tw; facility; auth, authpriv";

多重條件亦可。將所有等級為 emerg..err 且 facility 為 (auth 或 authpriv) 的記錄寄給管理者
"*; (level; emerg..err) and (facility; auth, authpriv)";

4.3 進到資料庫的記錄查詢

未過濾的資料會存放在資料庫,資料庫的欄位設計有參照syslog-ng 的建議格式,所以可以使用網路上已有的 php-syslog-ng 之類的管理工具以管理在資料庫中的記錄。此外,我們另有開發一個輕量級的網頁管理介面,其畫面如圖:

但這個程式目前已廢棄不用,因為資料量大的時候,處理的速度很慢

4.4 syslog 的流量統計

針對過濾及現有的syslog,系統將每分鐘的流量記錄下來,並另外撰寫一隻取出流量的程式以結合 MRTG 繪製流量圖,實機網址為http://log.tcc.edu.tw,如下圖。

(a) 繪製總量及各伺服器分析

(b) 依等級分類繪製

經過實際測繪發現,單位中的 syslog在每五分鐘的統計中曾高達 1608 筆記錄;週平均量每五分鐘約230筆記錄,其中過濾掉的低重要性 syslog 平均約170 筆,占約 75%,剩餘的寫入資料庫,發現一週的量達17萬筆,上線一個月餘資料庫的記錄筆數已突破百萬筆。下圖是下達SQL 語法 SELECT `host`, count(`host`) FROM `perllogs` where `date`>TIMESTAMPADD(day,-30, now()) group by `host` 取出近30日的筆數統計,可以看出PIX防火牆的 syslog 高達14萬筆,這麼多的 syslog 並不是管理人有能力去看的,要提醒的是總 syslog 數包括被濾掉的部分,因此約為存入的4倍,相當可觀。

5. 利用MRTG測繪

這只是一個雞肋的程式 syslog2mrtg.pl

修改 MRTG log檔放置的位置,行尾的'/'請保留 vi syslog2mrtg.pl

my $mrtg_workdir = '/usr/local/www/apache22/data/diagrams/';

執行範例

/path/to/syslog2mrtg.pl 哪個伺服器來的log,cfg檔設定範例

WorkDir:/usr/local/www/apache22/data/diagrams
Options[_]:growright, nopercent, gauge
Logdir: /usr/local/www/apache22/data/diagrams
WithPeak[_]:wmy
EnableIPv6:yes

Target[total]:`/root/syslog2mrtg.pl total`
MaxBytes[total]: 2000
Title[total]: Total Syslog Traffic count
PageTop[total]: <h1>Filtered Syslog count
hortLegend[total]: row(s)
YLegend[total]: Syslog count of total
Legend1[total]: Incoming Syslog Count
Legend2[total]: Filtered Incoming Syslog Count
Legend3[total]: Maximal 5 Minute Incoming Syslog Count
Legend4[total]: Maximal 5 Minute Filtered Incoming Syslog Count
LegendO[total]:  Incoming Syslogs:
LegendI[total]:  Filtered Syslogs:

Target[ldap]:`/root/syslog2mrtg.pl ldap`
MaxBytes[ldap]: 1000
Title[ldap]: Syslog Traffic count of ldap
PageTop[ldap]: <h1>Filtered Syslog count
ShortLegend[ldap]: row(s)
YLegend[ldap]: Syslog count of ldap
Legend1[ldap]: Incoming Syslog Count
Legend2[ldap]: Filtered Incoming Syslog Count
Legend3[ldap]: Maximal 5 Minute Incoming Syslog Count
Legend4[ldap]: Maximal 5 Minute Filtered Incoming Syslog Count
LegendO[ldap]:  Incoming Syslogs:
LegendI[ldap]:  Filtered Syslogs:

(4) crontab 的設定檔

# 定時繪製 syslog MRTG---如此方可正確產生 utf-8 的網頁
*/5 * * * * env LANG=C /usr/local/bin/mrtg /path/to/your/filter.utf8.cfg

6. 通知信範例

本系統只要符合通知的規則就會寄出通知信,以下為通知信的範例