猝然临之而不惊,无故加之而不怒。
分类:
2005-01-31 10:15:44
今天查看日志procmail.log,发现竟是从开始使用procmailrc开始一直到现在的日志,有200M bytes,而没有生成像squid.log.1,vsftp.log.2,messages.5都程序一样的分周将日志保存的记录,奇怪!
解决:
logrotate.conf
#cp /etc/logrotate.d/vsftp.log /etc/logrotata.d/procmail
#vi /etc/logrotate.d/procmail
将其设置vsftp.log的日志路径改为你的procmail的日志路径
下周就见效果了
什麼是登錄檔、幹嘛要分析登錄檔
這部分是最容易被新手所忽略的,那就是詳細而確實的紀錄或者是備份系統的登錄檔。什麼是登錄檔呢?簡單的說,就是記錄系統活動記錄的幾個檔案,例如:何時、何地(來源 IP )、何人( login name )、做了什麼動作,另外就是系統在什麼時候做了什麼樣的行為時,發生了什麼樣的事件等等,這些都是登錄檔所進行的紀錄工作的內容了。而由於這些記錄的工作內容對於系統的資訊太詳細了,若被取得將可能影響到系統的安全性,因此,通常這些登錄檔只有 root 可以進行視察的功能!
那麼為何要記錄與解析登錄檔呢?這是由於記錄檔有幾個重要的功能:
解決系統的錯誤:這個對於系統管理員來說是很重要的資訊,例如:開機的過程當中偵測到的硬體訊息資料會記錄到記憶體當中,由於這些偵測的資訊可以提供我們瞭解硬體資訊,所以如果你的系統發生問題時,可以下達 dmesg 看看硬體的偵測有沒有發生錯誤呢?!另外,如果系統資源被耗盡、核心活動發生錯誤等等事件發生的時候,則系統登錄檔亦會將錯誤的訊息記錄在登錄檔中(通常是 /var/log/messages ),這些都可以藉以取得錯誤發生時的資訊,並加以克服問題!!
解決網路服務的問題:在安裝新服務的套件時,最常使用到這個功能了!例如在安裝啟動 sendmail 時,如果 sendmail 無法提供服務的時候,那麼無法提供服務的問題則會被紀錄到登錄檔當中去,則只要分析登錄檔就可以瞭解問題點,並藉以解決問題啦!
記錄登錄資訊:這個東西相當的重要!例如:有天您的 apache 這個 WWW 服務掛了,你怎麼知道何時掛掉的?而最後登入者是誰?!這都可以藉由分析 apache 的登錄檔來取得資訊;此外,萬一有一天您的系統被入侵,並且被利用來攻擊他人的主機,這個時候對方的主機查出是您的 Linux 在進行攻擊的行為,這個時候你要如何告知對方您的主機是由於被入侵所導致的問題,並且協助對方繼續往來源追查呢?!呵呵!此時登錄檔可是相當重要的呢!
常見的幾個登錄檔有下面幾個:
/var/log/secure:記錄登入系統存取資料的檔案,例如 pop3, ssh, telnet, ftp 等都會記錄在此檔案中;
/var/log/wtmp:記錄登入者的訊息資料,由於本檔案已經被編碼過,所以必須使用 last 來取出檔案的內容;
/var/log/messages:這個檔案相當的重要,幾乎系統發生的錯誤訊息(或者是重要的資訊)都會記錄在這個檔案中;
/var/log/boot.log:記錄開機或者是一些服務啟動的時候,所顯示的啟動或關閉訊息;
/var/log/maillog:紀錄郵件存取( sendmail 與 pop3 )的使用者記錄;
/var/log/cron:這個是用來記錄 crontab 這個例行性服務的內容的!
/var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log:分別是幾個不同的網路服務的記錄檔啦!
好了,那麼記錄了這些登錄檔之後,我要做什麼分析呀!?基本上,一個好的系統管理員大概都知道『一部主機負責的服務最好能少盡量少』,這是什麼意思呢?也就是說,這部主機為郵件主機那麼就專門負責郵件工作,不要還搞 WWW 服務!這樣有幾個好處,除了系統的安全性較佳之外(因為開的 port 變少了!),記錄檔的解析也會比較簡單!因為我們的 /var/log/secure 記錄的登入者資訊就會比較有一致性!那麼我們就可以查詢一下每日登入的使用者帳號啦與錯誤訊息啦等等的!(當然囉,如果你的頻寬夠、經驗豐富的話,那麼一部主機上面安裝所有的網路服務也是可以的啦!)基本上,檢查 /var/log/messages 這個檔案也就相當夠了!因為系統發生的錯誤或者是警告訊息通常都會寫入這個檔案中!
--------------------------------------------------------------------------------
Red Hat 登錄檔的規劃: syslogd, logrotate,
在系統的登錄檔案系統當中,大多以一支常駐程式來進行寫入這些訊息的這個工作,那就是 syslogd 這支程式啦!另外,由於登錄檔如果一直長大的話,那麼將很沒有效率,這是因為檔案太大時,ASCII 格式碼的資料檔案寫入比較麻煩的緣故!那麼怎麼進行登錄檔資料的備份工作呢?呵呵!那就使用 logrotate 吧!將資料進行輪轉?!什麼是輪轉?!(我ㄌㄟ台語不輪轉呦!?)基本上,就是將舊的 log 檔案更改名稱,然後建立一個空的 log 檔案,如此一來,新的 log 檔案將從零開始記錄,然後只要將舊的 log 檔案留下一陣子,嗯!那就可以達到將登錄檔『輪轉』的目的啦!此外,如果舊的紀錄(大概要保存幾個月吧!)保存了一段時間沒有問題,那麼就可以讓系統自動的將他砍掉,免得佔掉很多寶貴的硬碟空間說!(舉個例子來說,我的 WWW 網站一個月的登錄檔,所佔掉的硬碟空間大小,大概就有 1GB 這麼多....而且都是存文字檔....很可怕吧!)
所以說,基本上,針對 log 檔案來設計的服務有這兩支:
syslogd:進行系統或者是網路服務的登錄檔記錄工作;
logrotate:將舊的資料更名,並且建立新的登錄檔,以保持登錄檔的『新鮮』,並視設定將最舊的登錄檔刪除。
所以,接著下來我們來談一談怎麼樣規劃這兩支程式呢?!就由 syslogd 這支程式先談起吧!畢竟得先有登錄檔,才可以進行 logrotate 呀!您說是吧!?
syslogd:
我們在 Red Hat 裡面預設就已經使用了 syslogd 這支程式來記錄系統的登入資料,不相信的話,你可以輸入『ntsysv』,然後去查看一下 syslog 這一支服務是否已經被設定成『*』啦! syslog 這支程式可以提供『系統登入資訊記錄』及『Kernel 錯誤或警示資訊記錄』等功能,此外,他還提供了『本地端與遠端電腦的登錄資訊記錄』功能,所以,可以將遠端的主機登入資訊同時記錄在本地端呢!很不錯的功能吧!!此外,目前正規使用的系統服務中,大都預設支援以 syslog 這一個服務來記錄他的登錄檔案資料,例如 apache, samba, sendmail 等等。而通常 syslog 提供的紀錄參數主要有:
事件發生時間;
主機名稱;
啟動此事件的服務名稱(例如 httpd, samba...)
訊息資料內容
等等這些資訊,當然,這些資訊的詳細度是可以修改的,此外,這些資訊可以作為系統除錯之用呢!
好了,再來看到我們要如何來設定 syslogd 呢?!剛剛說到 syslog 可以記錄我們系統中的幾乎所有的預設的系統工作,那麼萬一我的網路服務是自行設定的呢?!例如以 Tarball 安裝好的服務套件。OK!我們可以藉由修改 syslog 的參數檔來達到這個目的。那麼預設的 syslog 參數檔放在哪裡呢?!
/etc/syslog.conf
其實預設的 syslogd 程式的參數檔案就是 /etc/syslog.conf 這個檔案內容啦!這個檔案的內容可以規定『什麼服務需要被記錄、該服務被紀錄的訊息等級如何?』。基本上,可以使用底下的句子語法來說明:
服務名稱.訊息等級 存放或顯示地點
服務名稱:例如 mail, http, news, cron, at 等等的服務名稱;
訊息等級:總共分成下列幾種等級:
info : 提示一些訊息資料;
notice : 注意!需要比較留意的訊息;
waring 或 warn : 警示的訊息,以上三個訊息都還是沒有錯誤的情況,雖然是需要留意,但是還沒有到錯誤的情況;
err 或 error : 呀!錯誤訊息出現了!該要檢驗錯誤的問題發生原因了;
crit : 臨界點了!再不處理可就傷腦筋了!
alert : 錯誤訊息一再地警告警告!你將要完蛋了!
emerg 或 panic : 阿!系統已經進入混亂的階段!真的是完蛋了~~
特殊等級:例如 debug (顯示較多的資訊!)及 none (不要記錄該服務的內容!)等!
存放或顯示地點:通常我們使用的都是記錄的檔案啦!但是也可以輸出到裝置呦!例如印表機之類的!
檔案的絕對路徑:通常就是放在 /var/log 裡頭的檔案啦!
印表機或其他:例如 /dev/lp0 這個印表機裝置
使用者名稱:顯示給使用者囉!
遠端主機:例如 @test.adsldns.org
瞭解語法之後,我們來看一看在尚未開啟網路服務的情況下,我們的 syslog 有哪些系統服務已經在紀錄了呢?!那就是瞧一瞧 /etc/syslog.conf 這個檔案的預設內容囉!(注意!如果需要將該行做為註解時,那麼就加上 # 符號就可以啦!)
#kern.* /dev/console
# 只要是 kernel 產生的訊息,全部都送到 console 去!
# 這個項目預設是關閉的!不過,只要您願意,可以開啟就是了!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 在已知各服務的訊息中,不要記錄到這個檔案當中啦!
# 例如 mail 我們已經預設要記錄在 /var/log/maillog (底下),
# 所以自然不要在記錄到這個 /var/log/messages 檔案中啦!
# 然後其他的訊息全部都記錄到 /var/log/messages 當中!
# 所以這個檔案相當的重要!沒有被規定到的訊息都可以在這裡找到!
authpriv.* /var/log/secure
# 這個就是經過一些身份確認的行為之後,需要記錄身份的檔案啦!
# 什麼是身份確認呢?例如 pop3 收信要輸入帳號與密碼、 ssh 與 telnet, ftp
# 等等的服務需要輸入帳號與密碼,這些都會在 /var/log/secure 裡面記錄!
# 他可也是相當重要的一個檔案呢!
mail.* /var/log/maillog
# 只要跟 mail 有關的(不論是 pop3 還是 sendmail )都會被紀錄到這個檔案中!
cron.* /var/log/cron
# 還記得例行性命令那一章節嗎?!對啦!就是那個 crontab 的東西,
# 那東西的服務程式名稱就是 cron 啦!執行 cron 的結果都記錄於此!
*.emerg *
任何時候發生的警告訊息都會顯示給線上的所有人!那個* 就是目前線上的所有人啦!
uucp,news.crit /var/log/spooler
# 記錄新聞錯誤高於 crit 的等級的資訊,寫入 spooler 當中!
local7.* /var/log/boot.log
# 將開機的當中的訊息給他寫入 /var/log/boot.log 這個檔案當中呦!
大致上就是有這些功能啦!這樣一來,我們的一些不同的資訊就可以存在不同的檔案當中,可以方便我們來進行登入資料的解析呢!另外,這些檔案都相當的重要(例如什麼時候被誰登入進來主機啦!?),所以他們的權限大多是屬於 root 的可讀寫而已!這點非常需要小心而留意!(請注意,在系統的預設狀況中,所有的未知狀態的訊息幾乎都是寫入 /var/log/messages 這個檔案中,所以,如果系統有問題,請詳細的檢查一下這個 /var/log/messages 檔案吧!!)
logrotate:
好了!那麼我們已經將登錄資料寫入了記錄檔中了,那麼該如何進行 log rotate 的工作呢!?這裡請特別留意的是, syslog 乃是利用 demand 的方式來啟動的,當有需求的時候立刻就會被執行的,但是 log rotate 卻是在規定的時間到了之後才來進行 log files 的 rotate 行為,所以這個 logrotate 程序都是掛在 cron 底下進行的呦!這一點請特別留意呦!好了,那麼 logrotate 這個程式的參數設定檔在哪裡呢?!呵呵!考慮兩個地方呦:
/etc/logrotate.conf
/etc/logrotate.d
注意囉!那個 logrotate.conf 才是主要的參數檔案,至於 logrotate.d 是一個目錄,裡面的所有檔案都會被主動的讀入 /etc/logrotate.conf 當中來進行!好了,剛剛我們提到 log rotate 的主要功能就是將舊的登錄檔案移動成舊檔,並且重新建立一個新的空的檔案來記錄,那麼多久進行一次 logrotate 的工作呢?!這些都記錄在 logrotate.conf 裡面,我們來看一下預設的 logrotate 的內容吧!
weekly
# 每個禮拜進行登錄檔的 rotate 工作;
rotate 4
# 最多保存四個 log 備份檔案,這些備份檔案如果沒有壓縮,則其名稱為 *.log.1 ,
# 例如 cron.log 被 rotate 之後,將會把舊資料移動到 cron.log.1 這個檔案中,
# 然後建立一個新的空的 cron.log 來繼續記錄的工作!
create
# 是否在 log rotate 之後建立一個新的空的檔案來記錄?預設是『要的』
compress
# 移動到舊資料的 log 備份檔案是否需要壓縮?!
# 通常預設是沒有壓縮,但是您可以自訂為壓縮!會比較節省空間!
include /etc/logrotate.d
# 這是給其他獨立套件也要使用這種 logrotate 來進行資料的替換時,只要將 logrotate
# 的設定寫到這個目錄中來,就可以正確的被啟用了!例如 /etc/logrotate.d/rpm !
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
# 還記得我們使用 last 的時候會顯示出『每個月的登入狀況』嗎?!沒錯!就是在這裡!
# 由於 last 預設是每個月 rotate 一次,所以當然就是只有紀錄每個月的登錄狀態囉!
# 仔細看一下上面的設定,說的是:
# 1. 每個月進行一次 log rotate 的工作;
# 2. 將檔案的權限設定為 664 囉!
# 3. 僅保存前一個月的 rotate 備份!這個可以改大一點,例如 5 !保存五個月,以利追蹤
以上是屬於系統原本就有的設定啦!您可以自行的修改為自己喜歡的樣式,例如,如果您的系統的空間夠大,並且擔心除錯以及駭客的問題,那麼可以:
將 rotate 4 改成 rotate 9 左右,以保存較多的備份檔案;
不需要 compress 囉!但是空間太小就需要 compress !尤其是 httpd 更需要 compress 的!
好了!我們來看一下 /etc/logrotate.d 裡面的 syslog 這個檔案,看一下系統預設的登錄檔的設定為何?!
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
請記得,正確的 logrotate 的寫法中:
將 log file 名稱(包含絕對路徑)寫在前面,可以使用空白字元分隔多個 log files ;
用 { } 包括所有的設定;
設定的項目與前面提到的相同,並且可加入 rotate 前 (pre) 與後 (post) 的一些特殊執行的指令!
prerotate:在啟動 logrotate 之前進行的指令,例如修改 log file 的屬性!!
postrotate:在做完 logrotate 之後啟動的指令,例如重新啟動( kill -1 或 kill -HUP )某個服務!
大致上就是這樣!以上面的例子為例, syslog 的所有紀錄檔共有上面那些個,然後這些記錄檔在進行完了 logrotate (如果沒有設定,那麼就以 /etc/logrotate.conf 裡面的設定為準!)之後,再執行:
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
請注意,這一行的目的在於將系統的 syslogd 重新以其參數檔( syslog.conf )的資料讀入一次!也可以想成是 reload 的意思啦!!由於我們建立了一個新的空的紀錄檔,如果不執行此一行來重新啟動服務的話,那麼記錄的時候將會發生錯誤呦!!
例題:將 procmail 的 logfile (/var/log/procmail.log)加入 logrotate 當中!
這裡出個題目來玩一玩,假設我們已經將 procmail 加入到 sendmail 的程式當中了,並且已經啟動他,這個時候,如果我想要每個月份執行一次 logrotate ,並且保留五個月份的登錄資料備份,應該怎麼作呢?
使用 vi 建立一個檔案,檔名為 /etc/logrotate.d/procmail,這個檔案的內容為:
# This file is creating by VBird 2002/06/18
/var/log/procmail.log {
monthly
size=10M
rotate 5
nocompress
}
上面說的是:
1. 若該登錄檔工作超過一個月;
2. 或該登錄檔大小超過 10 MB;
3. 保存五個備份檔案;
4. 備份檔案不要壓縮!!
然後儲存後離開,這樣一來,每個月就會自動的將登錄資料備份下來囉!不需要執行的啦!比較有趣的是那個 size 的參數!如果您的登錄檔老是很大的時候,可以考慮加入 size 這個餐述說!他基本上有兩種單位,分別是『 k 與 M 』,請使用 man logrotate 來詳細查看一下用法囉!
好了!那麼什麼時候啟動 logrotate 呢?!呵呵!不用擔心,系統已經幫我們設定好了!放在哪裡呢?
/etc/cron.daily/logrotate
注意看一下裡面的內容:
/usr/sbin/logrotate /etc/logrotate.conf
就是使用 logrotate 加上 logrotate.conf 即可!如果需要『立刻進行而且不論時間到了沒,強制執行 rotate 功能!』那麼就可以下達:
logrotate -f /etc/logrotate.conf
OK!由於加入 crontab 裡頭了!所以現在每天系統都會自動的給他查看 logrotate 囉!不用擔心的啦!!只是要注意一下那個 /var/log/messages 裡頭是否常常有:『Jun 23 04:02:00 test syslogd 1.4.1: restart.』這樣的字樣!?這說明的是 syslogd 重新啟動的時間啦(就是因為 /etc/logrotate.d/syslog 的設定之緣故!)
--------------------------------------------------------------------------------
登錄檔分析
登錄檔的分析是很重要的!例如那個 last 可以讓你知道到底誰登錄進主機啦!但是並沒有 pop3 這個收信協定的登錄訊息!這個時候就需要考慮到 /var/log/secure 的紀錄啦!無論如何,系統最常使用的查閱登錄檔的指令分別有底下幾個:
dmesg [root @test /root]# dmesg
由於系統在開機的過程當中尚未將硬碟 mount 上來,所以無法直接將資料直接給他讀到 log file 當中去,但是為了除錯上面的方便,所以在開機的過程當中的訊息還是要記錄下來,這個時候系統就將 ram 開了一個小區塊來儲存這個資料囉!這個開機記錄的檔案就是:『/proc/kmsg』啦!同時,預設的 RAM 的區塊容量在不同的版本中並不相同,目前的預設版本是 16KB 的大小呦!
last [root @test /root]# last
參數說明:
-number :number 為數字,如果您的登入訊息太多了,可以使用這個指令!
範例:
[test @test /root]# last -5
test pts/0 192.168.1.2 Tue Apr 9 20:34 - 20:35 (00:01)
test pts/0 192.168.1.2 Tue Apr 9 20:14 - 20:30 (00:15)
test ftpd21546 192.168.1.2 Tue Apr 9 02:55 - 03:06 (00:10)
test ftpd15813 192.168.1.2 Tue Apr 9 01:20 - 01:21 (00:00)
test pts/0 192.168.1.2 Mon Apr 8 20:14 - 00:27 (04:13)
wtmp begins Tue Apr 2 01:12:26 2002
[root @test /root]# last -f /var/log/wtmp.1 <==叫出上個月的登入資料!
那麼如果要叫出來上個月的登入資料呢?!可以使用上面的第二個範例!