syslog詳解及配置遠程發送日志和遠程日志分類
1、日志協議syslog
1.1、syslog簡介
完善的日志分析系統應該能夠通過多種協議(包括syslog等)進行日志采集並對日志分析,因此日志分析系統首先需要實現對多種日志協議的解析。其次,需要對收集到的海量日志信息進行分析,再利用數據挖掘技術,發現隱藏再日志里面的安全問題。
Syslog再UNIX系統中應用非常廣泛,它是一種標准協議,負責記錄系統事件的一個后台程序,記錄內容包括核心、系統程序的運行情況及所發生的事件。Syslog協議使用UDP作為傳輸協議,通過514端口通信,Syslog使用syslogd后台進程,syslogd啟動時讀取配置文件/etc/syslog.conf,它將網絡設備的日志發送到安裝了syslog軟件系統的日志服務器,Syslog日志服務器自動接收日志數據並寫到指定的日志文件中。
1.2、syslog日志格式
syslog標准協議如下圖:
Syslog消息並沒有對最小長度有所定義,但報文的總長度必須在1024字節之內。其中PRI部分必須有3個字符,以‘<’為起始符,然后緊跟一個數字,最后以‘>’結尾。在括號內的數字被稱為Priority(優先級),priority值由Facility和severity兩個值計算得出,這兩個值的級別和含義見表1-1和表1-2。下面是一個例子:
<30>Oct 10 20:30:10 fedora auditd [1780]: The audit daemon is exiting
▶“<30>”是PRI部分,即Priority(優先級),取值范圍0~191。
▶“Oct 10 20:30:10 fedora”是HEADER(報頭部分)。
▶“auditd [1780]: The audit daemon is exiting”是MSG(信息)部分。
在PRI部分,該數值和Facility和Level有關,Facility是創建日志的實體,比如由Kernel產生,還是由User產生,或者是Mail產生.....而level可以看成是日志級別。他們的關系可以利用公式推導:
Priority=Facility * 8 + Level
后台監控程序會被分配一個facility值,而沒有分配到facility值的進程則會使用“local user”的facility值,比如很多網絡設備都會默認使用facility值“local user 7”來發送信息。
表1-1 Facility級別
從分類能看出來Syslog的Facility有一部分(序號16~23)是為其他程序預留的,例如Cisco設備使用local4發送PIX防火牆的syslog日志。
表1-2 日志級別描述
1.3、rsyslog介紹
針對syslog協議的不足,rsyslog日志協議應運而生,它提供了豐富的內容過濾和靈活的配置選項,多線程的syslogd功能,同一台機器上支持多子rsyslog進程,可以監聽不同端口。除了繼續支持udp外,還添加了tcp進行傳輸的功能。在日志傳輸安全方面,以前通過Stunnel解決了rsyslog傳輸數據加密的問題,目前最新的rsyslog版本自身就支持ssl加密技術保證安全,在近幾年發布的所有Linux發行版中都切換成了rsyslog。在實際的使用過程中,我們可以通過查看配置文件和相應的日志文件來使用Rsyslog。在數據庫支持方面,它廣泛支持各種數據庫,尤其對Mysql和Postgres數據庫支持的比較好。
rsyslog配置文件詳解:

#### MODULES #### #定義日志的模塊。 $ModLoad imuxsock #imuxsock為模塊名,支持本地系統日志的模塊。 $ModLoad imjournal #imjournal為模塊名,支持對系統日志的訪問。 #$ModLoad imklog #imklog為模塊名,支持內核日志的模塊。 #$ModLoad immark #immark為模塊名,支持日志標記。 # Provides UDP syslog reception #提供udp syslog的接收。 #$ModLoad imudp #imudp為模塊名,支持udp協議。 #$UDPServerRun 514 #允許514端口接收使用udp和tcp轉發來的日志。 # Provides TCP syslog reception #提供tcp syslog的接收。 #$ModLoad imtcp #imtcp為模塊名,支持tcp協議。 #$InputTCPServerRun 514 #### GLOBAL DIRECTIVES #### #定義全局日志格式的指令。 # Where to place auxiliary files $WorkDirectory /var/lib/rsyslog #工作目錄。 # Use default timestamp format $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat #定義日志格式默認模板。 $IncludeConfig /etc/rsyslog.d/*.conf #所有配置文件路徑。 $OmitLocalLogging on #省略本地登錄。 # File to store the position in the journal $IMJournalStateFile imjournal.state #### RULES #### #kern.* /dev/console #記錄所有日志類型的info級別以及大於info級別的信息到messages文件,但是mail郵件信息,authpriv驗證方面的信息和corn時間和任務相關信息除外。 *.info;mail.none;authpriv.none;cron.none /var/log/messages # authpriv驗證相關的所有信息存放在/var/log/secure。 authpriv.* /var/log/secure #郵件的所有信息存在/var/log/maillog;這里有一個“-”符號表示是使用異步的方式記錄 mail.* -/var/log/maillog #任務計划有關的信息存放在/var/log/cron。 cron.* /var/log/cron #記錄所有的≥emerg級別信息,發送給每個登錄到系統的日志。 *.emerg :omusrmsg:* #記錄uucp,news.crit等存放在/var/log/spooler uucp,news.crit /var/log/spooler #本地服務器的啟動的所有日志存放在/var/log/boot.log local7.* /var/log/boot.log #發送日志,@表示傳輸協議(@表示udp,@@表示tcp),后面是ip和端口。 #*.* @@remote-host:514
2、 日志采集和分析
再此環境中,我們利用rsyslog的客戶端分別把ssh、iptables等以及h3c交換機和路由器的日志發送到rsysog的服務端,並在服務端配置存儲策略,把不同的日志存放在不同的文件當中,本環境中以ssh日志為例。架構圖如下:
環境說明:
H3C交換機IP:192.168.0.249;
H3C路由器IP:192.168.1.1
業務服務器IP:192.168.1.218;
Syslog服務器IP:192.168.1.221;
信息級別高於等於info的日志信息將會發送到syslog服務器上;
▶ 業務服務器配置
打開rsyslog的配置文件;
vim /etc/rsyslog.conf
在配置文件中我們可以看到默認有以下配置,這條配置就是把用戶認證所有級別的日志都存到后面的路徑文件下;
authpriv.* /var/log/secure
將記錄下來的日志發送到rsyslog服務端,打開rsyslog配置文件看配置文件的最底部有以下內容;
# *.* @@remote-host:514
此處用於指定接收日志的rsyslog服務器的協議、IP地址和端口號,此處用的tcp;
*.*@@192.168.1.221:514
注意:使用@代表走UDP協議,使用@@代表走TCP協議。
重啟rsyslog服務
systemctl restart rsyslog
▶ Rsyslog服務器配置
打開rsyslog的配置文件;
vim /etc/rsyslog.conf
把以下配置的注釋打開,下面分別有tcp和udp的配置,和客戶端保持一致,下面都開啟因為路由器和交換機默認走的是udp協議;
Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514
重啟rsyslog服務
Systemctl restart rsyslog
配置完后,業務服務器的的日志就可以發生到rsyslog服務端了。可以利用以下命令查看連接狀態。
lsof -i :514
命令輸出:
上圖用紅框圈起來的就是rsyslog和業務服務器建立的連接。
現在只是屬於把日志接收過來並存放在默認路徑,如下圖:
服務端會根據產生日志的設施和級別把日志存放到不同的文件里,我們發過來的是ssh日志,默認就存在服務端的/var/log/secure文件里。當然發過來的其他設施產生的日志也會存到指定的文件里面。
如果我們要想把發過來的ssh日志存放到自己的指定的文件里面,可以在/etc/rsyslog.d/目錄里面新建一個文件,這個目錄是rsyslog的工作目錄。文件內容如下:
if $programname contains 'sshd' then -/var/log/remote_log/ssh.log & ~
語法解釋:
如果發過來的日志“程序名”包含sshd,就輸入到ssh.log日志里面。
什么是程序名:程序名就是你這一類日志是哪個服務產生的。
&~表示不做后續的操作,日志只輸入到ssh.log中。
▶ 結果
1) 驗證方法:
在業務服務器上產生一條ssh日志,可以利用ssh連接工具連接業務服務器,這樣就好產生一條ssh日志,產生新的日志就會讓rsyslog發送到服務端。
2) 測試結果:
業務服務器已經把日志發送過來,根據rsyslog的上述配置把sshd的日志已經保存在了/var/log/remote_log/ssh.log的文件里面,使用如下命令查看文件是否已經有了內容。
tail –f /var/remote_log/ssh.log
輸出結果如下:
文件里面已經保存了業務服務器發過來的日志。