Syslog系統日誌配置
Linux儲存了系統中所發生事件的詳細記錄,這些記錄稱作日誌檔案或訊息檔案。可以查閱日誌檔案來確定系統當前狀態,觀察入侵者蹤跡,尋找某特定程式(或事件)相關的資料。syslogd與klogd(監控linux核心提交的訊息)守護程序負責記錄,傳送系統或工具產生的資訊,二者的配置檔案都是/etc/syslog.conf。當系統核心或工具產生資訊時,通過呼叫相關函式將資訊傳送到syslogd或klogd守護程序。syslogd與klogd守護程序會根據/etc/syslog.conf中的配置資訊,對訊息的去向作出處理。syslog協議的詳細描述在RFC3164中。
logrotate工具用來定期重新命名、壓縮、郵遞系統日誌檔案,它可以保證日誌檔案不會佔用太大的磁碟空間。
1、配置檔案/etc/syslog.conf:
facility.level action
選擇符(seletor)由facility和level兩部分組成,之間用一個句點(.)連線。
(1)facility:指定了產生日誌的裝置,可以是下面的關鍵字之一:
關鍵字 值 解釋
kern 0 核心資訊,首先通過klogd傳遞
user 1 由使用者程式生成的資訊
mail 2 與電子郵件有關的資訊
daemon 3 與inetd守護程序有關的資訊
auth 4 由pam_pwdb報告的認證活動
syslog 5 由syslog生成的資訊
lpr 6 與列印服務有關的資訊
news 7 來自新聞伺服器的資訊
uucp 8 由uucp生成的資訊(uucp = unix to unix copy)
cron 9 與cron和at有關的資訊
authpriv 10 包括私有資訊(如使用者名稱)在內的認證活動
ftp 11 與FTP有關的資訊
12-15 系統保留
local0 ~ local7 16-23 由自定義程式使用,例如使用local5做為ssh功能
mark syslog內部功能,用於生成時間戳
* 萬用字元代表除了mark以外的所有功能
在大多數情況下,任何程式都可以通過任何facility傳送日誌訊息,但是一般都遵守約定俗成的規則。比如,只有核心才能使用"kern"facility。注意syslog保留從“local0”到“local7”這幾個裝置號來接受從遠端伺服器和網路裝置上傳送過來的日誌資訊。路由器,交換機,防火牆和負載均衡器都很容易給它們各自配置一個獨立的日誌檔案。
(2)level:指定了訊息的優先順序,可以是下面的關鍵字之一(降序排列,嚴重性越來越低):
關鍵字 值 解釋
emerg 0 系統不可用
alert 1 需要立即被修改的條件
crit 2 (臨界)阻止某些工具或子系統功能實現的錯誤條件
err 3 阻止工具或某些子系統部分功能實現的錯誤條件
warning 4 預警資訊
notice 5 具有重要性的普通條件
info 6 提供資訊的訊息
debug 7 不包含函式條件或問題的其他資訊
none (遮蔽所有來自指定裝置的訊息)沒有優先順序,通常用於排錯
* 除了none之外的所有級別
facility部分可以是用逗號(,)分隔的多個裝置,而多個seletor之間也可以通過分號(;)組合在一起。注意多個組合在一起的選擇符,後面的會覆蓋前面的,這樣就允許從模式中排除一些優先順序。預設將對指定級別以及更嚴重級別的訊息進行操作,但是可以通過2個操作符進行修改。等於操作符(=)表示僅對這個級別的訊息進行操作,不等操作符(!)表示忽略這個級別以及更嚴重級別的訊息。這兩個操作符可以同時使用,不過"!"必須出現在"="的前面。
(3)動作action:動作確定了syslogd與klogd守護程序將日誌訊息傳送到什麼地方去。有以下幾種選擇:
普通檔案:使用檔案的絕對路徑來指明日誌檔案所在的位置,例如:/var/log/cron。
終端裝置:終端可以是/dev/tty0~/dev/tty6,也可以為/dev/console。
使用者列表:例如動作為“root hackbutter”,將訊息寫入到使用者root與hackbutter的計算機螢幕上。
遠端主機:將資訊發往網路中的其他主機的syslogd守護程序,格式為“@hostname”。
(4)配置檔案的語法說明:
*用作裝置或優先順序時,可以匹配所有的裝置或優先順序。
*用作動作時,將訊息傳送給所有的登入使用者。
多個選擇器可在同一行中,並使用分號分隔開,且後面的會覆蓋前面的。如uucp,news.crit。
關鍵字none用作優先順序時,會遮蔽所有來自指定裝置的訊息。
通過使用相同的選擇器和不同的動作,同一訊息可以記錄到多個位置。
syslog.conf檔案中後面的配置行不會覆蓋前面的配置行,每一行指定的動作都獨立的運作。
(5)我的Ubuntu中預設的/etc/syslog.conf內容:
[python] view plaincopy
- # /etc/syslog.conf syslogd的配置檔案
- # 更多資訊參考syslog.conf(5)
- #
- # 首先是一些標準的日誌檔案,訊息由相應裝置傳送
- #
- # 認證活動auth,authpriv的日誌訊息傳送到auth.log中
- auth,authpriv.* /var/log/auth.log
- # 除auth和authpriv之外的所有裝置的所有訊息都要傳送到syslog中
- *.*;auth,authpriv.none -/var/log/syslog
- # cron及at的訊息傳送到cron.log
- #cron.* /var/log/cron.log
- # inetd的所有訊息傳送到daemon.log
- daemon.* -/var/log/daemon.log
- # 核心的所有訊息(如klogd的訊息)傳送到kernlog
- kern.* -/var/log/kern.log
- # 列印服務的所有訊息傳送到lpr.log
- lpr.* -/var/log/lpr.log
- # 郵件的所有訊息傳送到mail.log
- mail.* -/var/log/mail.log
- # 使用者程式的所有訊息傳送到user.log
- user.* -/var/log/user.log
- #
- # 郵件系統的日誌記錄。分割成不同的檔案,以便能夠比較容易地寫指令碼來
- # 解析這些檔案
- #
- # 郵件的info或更高級別的訊息傳送到mail.info,warn更高級別的訊息傳送到mail.warn,
- # err或更高級別的訊息傳送到mail.err
- mail.info -/var/log/mail.info
- mail.warn -/var/log/mail.warn
- mail.err /var/log/mail.err
- # INN新聞系統的日誌記錄:來自新聞伺服器的訊息
- #
- news.crit /var/log/news/news.crit
- news.err /var/log/news/news.err
- news.notice -/var/log/news/news.notice
- #
- # 一些捕捉用的日誌檔案
- #
- # 除auth,authpriv,news,mail之外的所有裝置的debug級別訊息都要傳送到debug中
- *.=debug;/
- auth,authpriv.none;/
- news.none;mail.none -/var/log/debug
- # 除auth,authpriv,cron,daemon,mail,news之外的所有裝置的info,notice,
- # warn級別訊息都要傳送到messages中
- *.=info;*.=notice;*.=warn;/
- auth,authpriv.none;/
- cron,daemon.none;/
- mail,news.none -/var/log/messages
- #
- # 所有裝置的emerg級別訊息(系統無法使用)會發送給所有登入的使用者
- #
- *.emerg *
- #
- # 希望一些訊息顯示在控制檯,但只在虛擬控制檯上:daemon,mail的任何訊息;news的危險、
- # 錯誤、通知訊息;任何裝置的除錯、資訊、通知、預警訊息
- #
- #daemon,mail.*;/
- # news.=crit;news.=err;news.=notice;/
- # *.=debug;*.=info;/
- # *.=notice;*.=warn /dev/tty8
- # 命名管道/dev/xconsole用於xconsloe工具。為了使用它,你必須帶-file選項來呼叫xconsole
- # $ xconsole -file /dev/xconsole [...]
- # 注意:調整下面的列表,否則如果你有一個相當繁忙的站點,你將變得發狂
- daemon.*;mail.*;/
- news.err;/
- *.=debug;*.=info;/
- *.=notice;*.=warn |/dev/xconsole
某些應用軟體也會將自己的執行狀況記錄到特定的日誌檔案上,它不受syslog.conf檔案的控制。如檔案/var/log/apache2/access.log,目錄/var/log/apache2, /var/log/cups, /var/log/gdm, /var/log/mysql,/var/log/samba等。
修改完/etc/syslog.conf後,可用service syslog restart重啟syslog服務,Debian/Ubuntu中則用sudo /etc/init.d/sysklogd restart。檢視日誌檔案裡最新的記錄可用tail -f /var/log/messages。
2、將日誌資訊記錄到遠端Linux伺服器上: 將你的系統資訊記錄到遠端伺服器上將是一個很好的安全措施。如果把公司所有的伺服器的日誌資訊都記錄到一個集中的syslog伺服器上,這將會方便你管理各個伺服器中發生的相關事件。這也會使得掩蓋錯誤和惡意攻擊變得更困難,因為對各個日誌檔案的惡意刪除在日誌伺服器上不能同時發生,特別是當你限制使用者訪問日誌伺服器時。
配置Syslog伺服器:在預設情況下,syslog並不會接受遠端客戶端的資訊,要啟用它,RedHat/Fedora中需要修改/etc/sysconfig/syslog檔案,在SYSLOGD_OPTIONS引數中增加-r選項,以允許記錄遠端機器的資訊。Debian/Ubuntu中則是修改/etc/default/syslogd檔案中的SYSLOGD引數,也可直接編輯syslog啟動指令碼/etc/init.d/sysklogd,將SYSLOGD的引數定義為“-r”。修改完後要重啟syslog服務。
配置客戶端:syslog伺服器現在可以接受syslog資訊了。你還要設定好遠端linux客戶端以向伺服器傳送資訊。假設客戶端主機名為smallfry,可通過編輯/etc/hosts檔案來實現。
(1)確定遠端伺服器的IP地址和有效的域名。
(2)在客戶端班機的/etc/hosts檔案中加入遠端伺服器的描述:IP地址 完整域名 伺服器名 “別名”,例如192.168.1.100 bigboy.my-site.com bigboy loghost,這樣為伺服器主機bigboy設定了一個別名loghost。
(3)編輯客戶端的/etc/syslog.conf檔案,使得syslog資訊能傳送到你新設定的日誌伺服器loghost上。
*.debug @loghost
*.debug /var/log/messages
重啟syslog服務,現在你的機器將會將所有“除錯”級別及以上級別的資訊同時傳送到伺服器bigboy和本地檔案/var/log/messeges上。你可以做個簡單測試看看syslog伺服器是否在接受你的資訊了。比如重啟一下lpd印表機守護程序,看看能否在伺服器上看到相關日誌訊息。
3、配置檔案/etc/logrotate.conf: 它是logrotate的一般性配置檔案。你可以通過它設定哪個日誌檔案被迴圈重用以及多久重用一次。可以設定的迴圈引數有每週(weekly)或每天(daily)。rotate引數定義保留多少份日誌檔案備份,create引數指定在每輪迴圈後就新建空的日誌檔案。我的Ubuntu中預設的/etc/logrotate.conf內容為:
[python] view plaincopy
- # 更多細節參考"man logrotate"
- # 每週迴圈更新日誌檔案
- weekly
- # 保留4份日誌檔案的備份,若日誌檔案為logfile,則其備份
- # 分別為logfile.0~logfile3
- rotate 4
- # 在每輪迴圈後建立新的空白日誌檔案
- create
- # 如果你想壓縮日誌檔案,則取消下面註釋
- #compress
- # 一些使用syslog的軟體包會把日誌輪轉資訊放在這個目錄下,因此要包含進來
- include /etc/logrotate.d
- # 沒有軟體包擁有wtmp或btmp,我們將在這裡輪轉
- /var/log/wtmp {
- missingok # 如果日誌檔案丟失,使用下一個並且不傳送任何錯誤訊息
- monthly # 輪轉週期為每月
- create 0664 root utmp # 建立新日誌檔案時,許可權為0664,屬主為root,組為utmp
- rotate 1
- }
- /var/log/btmp {
- missingok
- monthly
- create 0664 root utmp
- rotate 1
- }
- # 特定於系統的日誌可以在這裡配置
注意在Debian/Ubuntu系統中,/etc/cron.daily.sysklogd指令碼將讀取/etc/syslog.conf檔案,並根據它輪轉所有設定的日誌檔案。所以,對於一般的系統日誌,你不必再在/etc/logrotate.d資料夾中重複設定了。因為在 /etc/cron.daily資料夾中它沒24小時便執行一次。在Fedora/Redhat系統中,這個指令碼被/etc/cron.daily/logrotate取代,而且它不讀取syslog配置檔案。所以,你必須在/etc/logrotate.d設定好。
對logrotate的設定只有在你使用logrotate -f命令時才會生效。如果你想讓logrotate只讀取特定的配置檔案而不是所有,把配置檔名作為logrotate的引數執行即可,如logrotate -f /etc/logrotate.d/syslog。如果你的網頁訪問量比較高,那麼日誌檔案將變得異常大。你可以通過編輯logrotate.conf檔案加入壓縮選項compress來實現對日誌檔案的壓縮。這些日誌檔案將用gzip來壓縮,所有的檔案將會有一個.gz的副檔名。檢視這些檔案的內容依然很容易,因為你可以用zcat命令快速的將它們的內容顯示在螢幕上。
Syslog伺服器的一個缺點是沒有把不良來源的訊息過濾掉。因此,當你的的伺服器位於一個不安全的網路時,使用TCP wrappers軟體或防火牆來限制可以接受的訊息來源是一個明智的舉措。這將有助於限制拒絕服務攻擊的成效,這種拒絕服務攻擊的目的是填塞你的伺服器的硬碟或加重其他系統資源負擔,它有可能最終導致伺服器崩潰。
現在使用越來越廣泛的syslog-ng程式結合了logrotate和syslog的特性,它能給使用者提供更多的自定義功能,從功能上也更加豐富了。如果你想使用它,可到www.balabit.com上去下載安裝,其配置檔案為/etc/syslog-ng/syslog-ng.conf。