此文分為四個部分
自行撰寫syslog server建立資訊安全控管中心 #1 -- 前言及syslog介紹
自行撰寫syslog server建立資訊安全控管中心 #2 -- 架構和作法
自行撰寫syslog server建立資訊安全控管中心 #3 -- 程式下載和安裝
自行撰寫syslog server建立資訊安全控管中心 #4 -- 過濾條件設定
原文撰於2009-11。為研討會論文,該程式運作良好,從安裝後置之不理運作了六年,收錄資料庫約4億筆紀錄,2016年底又重裝在Centos7作業系統上,持續運作中。這個簡易版的程式適合不花錢作記錄檔的收攏,現重新整理並刪減其中的內容。
前言
現在企業及學校單位都開始注意到資訊安全的重要,也了解建立一個資訊安全監控中心(Security Operation Center, SOC)的重要性,假設單位內部有數量眾多的伺服器和網路設備,沒有一個資訊安全控管中心來統籌管理,就算伺服器或網路設備發生異常,也沒有辦法即時發現及即時處理。
要建立資訊安全控管中心第一步,就要能將網路設備、伺服器上的log收錄進來,因為系統的錯誤發生前,常常會先有錯誤的log出現,可是一般人不會也不可能隨時進去觀察異常的log。這些 log 的名稱,非常早就出現在 unix 系統的稱之為 syslog,之後的 linux, bsd, solaris等 unix-like 的系統也沿用此一名稱,但格式上有小小的差異;而網路設備大廠思科也在IOS中支援了 syslog,包括他的6000列和CISCO PIX,但是CISCO 送出的 syslog 有其自己的格式,和 unix-like 伺服器的syslog有諸多的差異。
log在Windows系統下有另一個名稱,叫作 eventlog,他的格式和syslog完全不同也不相容,因此要將 eventlog 轉成syslog就必需針對他的格式進行調整,另一個麻煩的地方,對非英語系的語系使用者而言,eventlog的內容轉存到syslog會有編碼的轉換問題,目前已知的轉換程式都是針對英語Windows而撰寫,其中eventlog 的中文轉換後全會變成亂碼,這也是待解決的地方。
市面上已有許多 logs server 的軟體,搭配管理介面販售,除了預算考量外,尚有無法客製化進行編修、無法整合 Windows server、無法辨視部分網路設備等等問題存在,而網路上諸多免費的解決方案首推就是syslog- ng,但syslog-ng 經我們單位實測長達一年半發現以下的問題:
(1) syslog-ng只是單純將資料收錄到資料庫,並無報警的功能
(2) 收錄CISCO 6509 router的syslog時也會發生無法辨視格式的問題,但 CISCO PIX 可以正常收錄。
(3) Freebsd + syslog-ng+ mysql 的組合似乎有存在一些問題但沒找出原因,主要是syslog-ng會在收錄一段時間後「自動停止」將資料放到資料庫。觀察系統的 process 有在執行中,資料庫也運作正確,udp 的log 封包也有正常的進來,除了寫不進資料庫以外,一切正常,(而Linux+ syslog-ng + mysql的組合顯然比較穩,但是還是有自動停止餵入的問題)。
(4) syslog-ng server 收錄的syslog 針對資料的過濾相當的詳細,很難寫得比他還完善,但是 server 端僅能只能做全域的設定,無法在server端對個別伺服器做調整,如要調整就必須在syslog-ng client 端做調整,並不是理想的做法。例如不希望收錄 A 伺服器 sendmail 的log 但是又希望收錄 B 伺服器 sendmail 的log,syslog-ng 就無能為力;此外,syslog-ng 也無法針對「訊息內容」作過濾。
(5) syslog-ng + mysql 是使用一個 "pipe" 當作中間人,讓資料庫和 syslog-ng 進行溝通,例如在 syslog-ng.conf
pipe("/tmp/mysql.pipe"
template("INSERT INTO logs (host, facility, priority, level, tag, date, time, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY', '$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n") template-escape(yes));
}
並在 shell 下執行一個 pipe 導入的方法:
# mysql -uaxer -p123456 --database=logdb < /tmp/mysql.pipe & 這個方法的缺點就是不夠直接,不直接的方法直覺上就容易出問題,我猜測也許是產生第一個問題的原因。
(6) 第(5)點的方法會在 process 中產生一個執行緒,這個執行緒會很清楚的把密碼寫出來,會有安全性的問題。例如:
root 21909 0.0 0.0 4300 748 pts/0 R+ 22:44 0:00 mysql -uaxer -p123456 --database=logdb &
(7) syslog-ng server 可將收錄到的 logs 放入資料庫,但無法對進入的 log 作即時的處理分析,log 分析的網管程式也只能針對已存入資料庫的內容進行事後的分析。例如假說發生大量的 FTP 猜測密碼的掃描式攻擊,同時系統也會伴隨產生大量的ftp 登入失敗的log記錄。但若能即時得知這個訊息會比事後分析這些log記錄來得有意義。
(8) syslog-ng 的安裝雖不麻煩,但可能對普通的管理者造成怯步,而且網路設備應該都無法另外安裝syslog-ng。假如能用 unix 系統中本身就有的 syslogd 而不另外安裝 syslog-ng 就達到整合 log 的效果,會是最理想的方法。
Syslog 探討
2.1 Syslog 的歷史
Syslog 最早約在1980年代由 Sendmail project 的 Eric Allman 所發展,最初單純只為了 Sendmail。由於 syslog 顯示出了他的價值,所以後來慢慢的成為 unix 及 unix-like 系統的標準記錄方式,直到演進成為大部分網路設備廠所支援的情況。可是奇妙的是,syslog 和大部分的網路協定標準不同,他一直沒有任何標準去規定他的記錄格式,造成許多的syslog判讀及分析困難。直到2001年由 Internet Engineering Task Force (IETF) 才制定了 RFC3164 - The BSD Syslog Protocol 作為 syslog 第一個標準,這個標準一直到 2009年的 RFC 5424 - The Syslog Protocol 出現後才被廢止,而 RFC 5424 也成為今日 syslog 的標準,但是此標準非常的新,只有非常少的系統會去支援RFC 5424,現存設備仍以RFC 3164為基準。
2.2 Syslog 的結構概述
從上一節 syslog 的歷史得知,syslog 沒有一個大家共同的標準規範,也造成各式各樣的 syslog 格式出現。但是只要目的是514埠的udp封包,我們就要當他是syslog 的封包,且受限於udp,一個syslog的封包最大是1024個bytes。其內容可分為三個部分:PRI, HEADER, MSG,以下作簡單扼要的說明:
PRI 是由'<','>'所包覆的數字組成,數字值是由以下公式所計算出來
數字值 = Facility *8 + Severity
Facility 是預先定義的機構名,系統的服務會使用固定的 Facility ,而使用者的程式或服務則使用最後local0~local7 作為Facility 的名稱。
Severity (別名Level)是訊息的重要等級,共有八個等級,以Emergency最高,Debug最低,列於表1。
所以我們可以由PRI值得知訊息的Facility 及 Severity。
HEADER 是有關訊息的相關資訊,例如日期、時間、伺服器名稱、伺服器IP或IP6位址等。
MSG 是有關訊息的本身內容,可分兩部份,TAG和CONTENT,TAG是執行的程式名稱,限定32字元且只能使用字母A-Za-z,而Content是訊息的內容。
2.3 Syslog 的實際內容範例
既然想把syslog分析並存放到資料庫,就不得不對單位內各種想收錄的設備的 syslog 進行搜集及分析,以下是CISCO的網路設備及其他伺服器所搜集到的syslog封包內容。
(1) CISCO WS-C6509-E Router (Version 12.2(33)SXH4)
(2) CISCO FWSM Firewall Version 3.2(7) PIX
<187>Nov 20 2009 22:05:08: %FWSM-3-106014: Deny inbound icmp src outside:2001:288:5400:2:201:a8ff:fe06:667c dst outside:ff02::1:ff00:17 (type 135, code 0)
(3) Freebsd 6.2 syslogd
(4) Linux syslogd
<22>sendmail[30024]: nAKE3LQp030024: from=, size=1267, class=0, nrcpts=2, msgid=<200911201403.nAKE3LQp030024@localhost.localdomain>, bodytype=8BITMIME, proto=SMTP, daemon=MTA, relay=newnetflow [127.0.0.1]
(5) DLINK 3000 Switch
(6) Syslog-ng 1.6
(7) Syslog-ng 2.0
<78>Nov 10 13:10:01 dns2 crond[1336]: (root) CMD (env LANG=C /usr/bin/mrtg /home/mrtg/mrtg.schools.cfg.utf8 /home/mrtg/schools/)
2.4 Windows Eventlog
Windows 的 eventlog 和 syslog 有極大的差異,如果把windows 的log用現有的 [1] Eventlog to Syslog Utility 或 [2] winlogd - Windows EventLog to Syslog Service 儲存過來,就能管理所有的 syslog 了,不過這兩套程式目前還存在編碼轉換的問題,餵過來的資料變成亂碼,也許是因為程式是外國人寫的,系統丟出來時並沒有考慮到中文的問題,收到的內容中只要有中文字全變成亂碼,以下是收錄到兩者的轉換成syslog資料內容:
[1]
[2]
了解了各種系統不同的syslog格式後,我們想要收錄這些資料的內容,就得要分析及這些不同的syslog 格式,下一章我們會來探討[log server的架構和作法]。
參考資料
[1] BalaBit IT Security, Syslog-ng logging system, http://www.balabit.com/network-security/syslog-ng/
[2] C. Lonvick, RFC 3164 - The BSD syslog Protocol , August 2001
[3] R. Gerhards, Adiscon GmbH, RFC 5424 - The Syslog Protocol, March 2009
[4] Purdue University, West Lafayette, evtsys- Eventlog to Syslog Utility, https://engineering.purdue.edu/ECN/Resources/Documents/UNIX/evtsys
[5] Edoceo, Inc., winlogd - Windows EventLog to Syslog Service, http://edoceo.com/creo/winlogd
[6] ASDM-Cisco Adaptive Security Device Manager http://www.cisco.com/en/US/products/ps6121/index.html
[7] Larry Wall, Tom Christiansen, Jon Orwant, Programming Perl, Third Edition, O'Reilly, July 2000
[8] awstats- Free real-time logfile analyzer to get advanced statistics http://awstats.sourceforge.net/