Linux 基礎學習篇 - Fedora Core 4

第二十二章、認識與分析登錄檔 - for Fedora Core 4

登錄檔的分析啦!

最近更新時間: 2006/07/23

本文資料主要針對 Fedora Core 4 的系統進行說明, Fedora Core 1 主要是由 Red Hat Linux 9 改版而來, 這個 Red Hat Linux 9 並不是當前大家聽到的 RHEL 喔!那是在 RHEL 出現之前的產品,基本上是在 2003 年以前的作品了!Fedora Core 4 則是在 2005 年 6 月份釋出,使用的核心是 2.6.11 版,當時是很紅的一個作品!只是生命週期太短,所以用這個 Fedora 系列來介紹 Server, 當時的決定確實有點莫名其妙了...

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 Fedora Core 4 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!

『登錄檔』似乎是常常聽到的名詞,網路上的老手們也常常告知新手們要多察看登錄檔, 那麼這些登錄檔是幹嘛用的?嗯!似乎是當你啟發一個事件的時候,或者是有人登入你的 Linux 主機的時候,主機會有一些認證的程序或者是一些重要的訊息,由於這些訊息有被追蹤的重要性, 所以自然就有需要將他保留下來,以備未來的不時之需囉,這些訊息會被紀錄在某些檔案上, 這些檔案就被稱為登錄檔了!那麼您曉得該登入者的資訊被紀錄在哪裡嗎?這些資訊的量有多大呢? 您可以每天自行觀看嗎?哇!如果能用 Shell Scripts 來分析的話,不是就更快速了嗎?呵呵! 這裡鳥哥寫了一個小小的分析檔案 ( logfile.sh ),讓大家可以更快樂的管理你的 Linux 主機呦! ^_^

什麼是登錄檔?

這部分是最容易被新手所忽略的,那就是『 詳細而確實的紀錄或者是備份系統的登錄檔 』。那麼什麼是登錄檔呢?簡單的說,就是記錄系統活動記錄的幾個檔案, 例如:何時、何地 (來源 IP)、何人( login name )、做了什麼動作, 另外就是系統在什麼時候做了什麼樣的行為時,發生了什麼樣的事件等等,要知道的是,我們的 Linux 主機在背景之下,有相當多的 daemons 在工作著,那麼這些工作中的程序總是會有一些訊息顯示, 這些顯示的訊息就是給記錄在登錄檔當中啦,也就是說,記錄這些系統的重要訊息, 就是登錄檔所進行的紀錄工作的內容了。

由於這些記錄的工作內容對於系統的資訊太詳細了, 若被取得將可能影響到系統的安全性,因此,通常這些登錄檔只有 root 可以進行視察的功能! 那麼為何要記錄與解析登錄檔呢?這是由於登錄檔有幾個重要的功能:
  • 解決系統的錯誤
    這個對於系統管理員來說是很重要的資訊,例如:開機的過程當中偵測到的硬體訊息資料會記錄到記憶體當中, 由於這些偵測的資訊可以提供我們瞭解硬體資訊,所以如果你的系統發生問題時,可以下達 dmesg 看看硬體的偵測有沒有發生錯誤呢!另外,如果系統資源被耗盡、 核心活動發生錯誤等等事件發生的時候,則系統登錄檔亦會將錯誤的訊息記錄在登錄檔中 (通常是 /var/log/messages ),這些都可以藉以取得錯誤發生時的資訊,並加以克服問題!!

  • 解決網路服務的問題
    在安裝或設定新服務的套件時,最常使用到這個功能了!例如在安裝啟動 sendmail 時,如果 sendmail 無法提供服務的時候,那麼無法提供服務的問題則會被紀錄到登錄檔當中去, 則只要分析登錄檔就可以瞭解問題點,並藉以解決問題啦!( 所以我們常說『天助自助者』是真的啦!察看(1)螢幕上面的錯誤訊息與(2)登錄檔的錯誤資訊,幾乎可以解決大部分的 Linux 問題! )

  • 記錄登錄資訊
    這個東西相當的重要!例如:有天您的 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 或 /var/log/mail/*
    紀錄郵件存取或往來( sendmail 與 pop3 )的使用者記錄;

  • /var/log/cron
    這個是用來記錄 crontab 這個例行性服務的內容的!

  • /var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log
    分別是幾個不同的網路服務的記錄檔啦!
常見的登錄檔就是這幾個,但是,不同的 Linux distributions ,通常登錄檔的檔名不會相同 ( 除了 /var/log/messages 之外 ),所以說,您還是得要查閱您 Linux 主機上面的登錄檔設定資料, 才能知道你的登錄檔主要檔名喔!

好了,那麼記錄了這些登錄檔之後,我要做什麼分析呀!?基本上,一個好的系統管理員大概都知道 『一部主機負責的服務最好能少盡量少』,這是什麼意思呢? 也就是說,這部主機為郵件主機那麼就專門負責郵件工作,不要還搞 WWW 服務!這樣有幾個好處,除了系統的安全性較佳之外 ( 因為開的 port 變少了! ) , 登錄檔的解析也會比較簡單!因為我們的 /var/log/secure 記錄的登入者資訊就會比較有一致性! 那麼我們就可以查詢一下每日登入的使用者帳號啦與錯誤訊息啦等等的!( 當然囉,如果你的頻寬夠、經驗豐富的話,那麼一部主機上面安裝所有的網路服務也是可以的啦!) 基本上,檢查 /var/log/messages、/var/log/secure 這些個檔案也就相當夠了! 因為系統發生的錯誤或者是警告訊息通常都會寫入這些檔案中。

但是,如果我手邊有數十部主機怎麼辦?我要不要一部一部去察看 log file 呢?呵呵!那樣察看會死人ㄋㄟ~因此,我們底下也使用一個簡易的登錄檔來分析 Red Hat (含 Fedora 啦!) 系列的登錄檔吧!

在 Linux 的登錄檔系統當中,大多以一支特定的 daemon 來進行寫入這些訊息的工作,那就是 syslogd 這支程式啦!所以說,只要軟體套件有支援 syslogd 的登錄檔寫入模式, 那麼該軟體套件的資訊就會被寫入到 syslogd 管理的登錄檔當中。

另外,由於登錄檔如果一直長大的話,那麼這些登錄檔的寫入動作將會很沒有效率, 這是因為檔案太大時,ASCII 格式碼的資料檔案寫入比較麻煩的緣故! 那麼怎麼進行登錄檔資料的備份工作呢?呵呵!那就使用 logrotate 吧!將資料進行輪轉( rotate )?什麼是輪轉?!(我ㄌㄟ台語不輪轉呦!?) 其實也可以稱為輪替啦!

所謂的 logrotate 基本上,就是將舊的 log 檔案更改名稱,然後建立一個空的 log 檔案,如此一來,新的 log 檔案將從零開始記錄,然後只要將舊的 log 檔案留下一陣子,嗯!那就可以達到將登錄檔『輪轉』的目的啦! 此外,如果舊的紀錄 (大概要保存幾個月吧!保存了一段時間沒有問題,那麼就可以讓系統自動的將他砍掉, 免得佔掉很多寶貴的硬碟空間說!(舉個例子來說,鳥哥的 WWW 網站一個月的登錄檔,所佔掉的硬碟空間大小,大概就有 3GB 這麼多....而且都是純文字檔....很可怕吧!)

所以說,基本上,針對 log 檔案來設計的服務有這兩支:
  • syslogd
    進行系統或者是網路服務的登錄檔記錄工作;

  • logrotate
    將舊的資料更名,並且建立新的登錄檔, 以保持登錄檔的『新鮮』,並視設定將最舊的登錄檔刪除。
所以,接著下來我們來談一談怎麼樣規劃這兩支程式呢?!就由 syslogd 這支程式先談起吧!畢竟得先有登錄檔,才可以進行 logrotate 呀!您說是吧!?

登錄檔的紀錄: syslogd

剛剛上面提到說,Linux 的登錄檔主要是由 syslogd 這個 daemon 在負責,那麼您的 Linux 是否有啟動 syslogd 呢?而且是否有設定開機時啟動呢?呵呵!檢查一下先:
[root@linux ~]# ps aux | grep syslog
USER    PID %CPU %MEM   VSZ   RSS TTY  STAT START  TIME COMMAND
root  11129  0.0  0.0  1616   204 ?    Ss   Oct03  0:01 syslogd -m 0
# 瞧!對吧!確實有啟動的!

[root@linux ~]# chkconfig --list | grep syslog
syslog   0:off   1:off   2:on   3:on   4:on   5:on   6:off
# 因為鳥哥的系統用 run level 3 ,所以,也是有啟動的!
看到 syslog 這個服務名稱了吧?!呵呵!所以知道他已經在背景底下工作囉!如前所述, syslog 這支程式提供了『系統登入資訊記錄』及『 Kernel 錯誤或警示資訊記錄』等功能,此外, 他還提供了『本地端與遠端電腦的登錄資訊記錄』功能,所以,可以將遠端的主機登入資訊同時記錄在本地端呢! 很不錯的功能吧!!此外,目前正規使用的系統服務中,大都預設支援以 syslog 這一個服務來記錄他的登錄檔案資料,例如 apache, samba, sendmail 等等。

登錄檔內容的一般格式

一般來說,通常經過 syslog 而記錄下來的資料主要有:
  • 事件發生的日期與時間;
  • 發生此事件的主機名稱;
  • 啟動此事件的服務名稱 (如 samba, xinetd 等) 或函式名稱 (如 libpam ..);
  • 該訊息資料內容。
當然,這些資訊的『詳細度』是可以修改的,而且,這些資訊可以作為系統除錯之用呢! 我們先來看一下 /var/log/secure 的內容顯示些什麼呢?
[root@linux ~]# cat /var/log/secure
Oct 16 10:16:13 linux sshd[3494]: Accepted password for dmtsai from 
192.168.1.11 port 1037 ssh2
Oct 16 10:20:15 linux xinetd[21592]: START: shell pid=4176 from=192.168.1.31
Oct 16 14:50:25 linux sshd[26665]: Accepted password for dmtsai from 
192.168.1.11 port 1078 ssh2
Oct 16 19:56:06 linux xinetd[20576]: START: shell pid=21013 from=192.168.1.31
以第一筆資料為例,該資料說明的內容為:『時間在 Oct 16 10:16:13 (10/16, 10:16)時;由主機名稱為 linux 的那部主機當中;由 sshd (且其 PID 為 3494) 那項服務所產生的一個訊息;訊息內容說明是:接受來自 192.168.1.11 連接至本機,使用 ssh2 連線機制,接受的使用者為 dmtsai』。有夠清楚的吧! ^_^。就是因為太清楚了, 包括那個 192.168.1.11 的 IP 來源,以及使用者帳號為 dmtsai , 這些資訊如果讓比較高竿的 cracker 知道後,是有可能猜測密碼的, 所以囉,這些資訊當然不能夠外流啦!好好保存吧!

其實還有很多的資訊值得查閱的呢!尤其是 /var/log/messages 的內容。記得一個好的系統管理員, 要常常去『巡視』登錄檔的內容喔!尤其是:
  • 當你覺得系統似乎不太正常時;
  • 某個 daemon 老是無法正常啟動時;
  • 某個使用者老是無法登入時;
  • 某個 demon 執行過程老是不順暢時;
還有很多啦!反正覺得系統不太正常,就得要查詢查詢登錄檔就是了。

登錄檔的設定檔:/etc/syslog.conf

什麼?登錄檔還有設定檔??喔!不是啦~是 syslogd 這個 daemon 的設定檔啦! 我們現在知道 syslogd 可以負責主機產生的各個資訊的登錄,而這些資訊本身是有『嚴重等級』之分的, 而且,這些資料要傳送到什麼檔名的檔案裡去?這都是可以修訂的呢,所以我們才會在一開頭的地方講說, 每個 Linux distributions 放置的登錄檔檔名可能會有所差異啊!

基本上, syslog 針對各種服務與訊息記錄在某些檔案的設定檔就是:
    /etc/syslog.conf
這個檔案規定了『哪些服務需要被紀錄, 該服務產生的什麼等級的訊息要被紀錄?』這個 /etc/syslog.conf 的內容語法是這樣的:
服務名稱[.=!]訊息等級		訊息記錄的檔名或裝置或主機
# 例如底下:
mail.info			/var/log/maillog_info
簡單的說明如下:

  • 服務名稱:
  • 什麼服務產生的訊息要被紀錄的意思。syslog 認識的服務主要有底下這些:
    • auth, authpriv:主要與認證有關的機制,例如 telnet, login, ssh 等需要認證的服務都是使用此一機制;
    • cron:就是例行性命令 cron/at 等產生訊息記錄的地方;
    • daemon:與各個 daemon 有關的訊息;
    • kern:就是核心 (kernel) 產生訊息的地方;
    • lpr:亦即是列印相關的訊息啊!
    • mail:只要與郵件收發有關的訊息紀錄都屬於這個;
    • news:與新聞群組伺服器有關的東西;
    • syslog:就是 syslogd 這支程式本身產生的資訊啊!
    • user, uucp, local0 ~ local7:與 Unix like 機器本身有關的一些訊息。
    基本上,syslog 所認識的資訊服務與一般我們常說的服務不太一樣。舉例來說, 關於郵件伺服器,我們可以選擇 sendmail, qmail 或者是當紅的 postfix 這些軟體來達成, 但這些伺服器使用的都是同一個通訊協定,亦即是 smtp 這個玩意兒 (參閱一下 /etc/services 的內容, 找到 smtp 觀察一下 port number 啦!)。所以,這些同性質的伺服器,產生的訊息都屬於 syslog 當中的 mail 所管轄的範圍喔!

    另外,每種服務所產生的資料量其實是差異很大的,舉例來說, mail 的登錄檔訊息多的要命, 每一封信件進入後, mail 至少需要記錄『寄信人的資訊;與收信者的訊息』等等, 而如果是用來做為工作站主機的,那麼登入者 (利用 login 登錄主機處理事情) 的數量一定不少,那個 authpriv 所管轄的內容可就多的要命了。

    為了讓不同的資訊放置到不同的檔案當中,好讓我們分門別類的進行登錄檔的管理, 所以囉,將各種類別的服務之登錄檔,記錄在不同的檔案裡面,就是我們 /etc/syslog.conf 所要作的規範了!

  • 訊息等級
  • 每種服務所產生的訊息是有差異的,有啟動時告知系統的資訊訊息 (information), 有被入侵時發出的警告訊息 (warn) ,還有系統硬體發生錯誤時,所產生的重大問題訊息 (error 等等); 基本上,系統將訊息分為七個主要的等級,依序是這樣的(由不重要排列到重要訊息等級):
    1. info:僅是一些基本的訊息說明而已;
    2. notice:比 info 還需要被注意到的一些資訊內容;
    3. warning 或 warn:警示的訊息,可能有問題, 但是還不至於影響到某個 daemon 運作的資訊;基本上, info, notice, warn 這三個訊息都是在告知一些基本資訊而已,應該還不至於造成一些系統運作困擾;
    4. err 或 error :一些重大的錯誤訊息, 例如設定檔的某些設定值造成該服務服法啟動的資訊說明, 通常藉由 err 的錯誤告知,應該可以瞭解到該服務無法啟動的問題呢!
    5. crit:比 error 還要嚴重的錯誤資訊,這個 crit 是臨界點 (critical) 的縮寫,這個錯誤已經很嚴重了喔!
    6. alert:警告警告,已經很有問題的等級,比 crit 還要嚴重!
    7. emerg 或 panic:疼痛等級,意指系統已經幾乎要當機的狀態! 很嚴重的錯誤資訊了。 通常大概只有硬體出問題,導致整個核心無法順利運作,就會出現這樣的等級的訊息吧!
    除了這些有等級的訊息外,還有兩個特殊的等級,那就是 debug(錯誤偵測等級) 與 none (不需登錄等級) 兩個,當我們想要作一些錯誤偵測,或者是忽略掉某些服務的資訊時,就用這兩個咚咚吧!

    特別留意一下在訊息等級之前還有 [.=!] 的連結符號喔!他代表的意思是這樣的:
    • . :代表『比後面還要高的等級(含該等級)都被記錄下來』的意思, 例如: mail.info 代表只要是 mail 的資訊,而且該資訊等級高於 info (含 info 本身)時,就會被記錄下來的意思。
    • .=:代表所需要的等級就是後面接的等級而已,其他的不要!
    • .!:代表不等於,亦即是除了該等級外的其他等級都記錄。
    一般來說,我們比較常使用的是『.』這個連結符號啦!^_^

  • 訊息記錄的檔名或裝置或主機
  • 再來則是這個訊息要放置在哪裡的紀錄了。通常我們使用的都是記錄的檔案啦!但是也可以輸出到裝置呦! 例如印表機之類的!也可以記錄到不同的主機上頭去呢!底下就是一些常見的放置處:
    • 檔案的絕對路徑:通常就是放在 /var/log 裡頭的檔案啦!
    • 印表機或其他:例如 /dev/lp0 這個印表機裝置
    • 使用者名稱:顯示給使用者囉!
    • 遠端主機:例如 @test.adsldns.org當然啦,要對方主機也能支援才行!
    • *:代表『目前在線上的所有人』,類似 wall 這個指令的意義!
    基本上,整個 syslog 的設定檔就只是這樣而已,底下我們來思考一些例題, 好讓你可以更清楚的知道如何設定 syslogd 啊!

    例題:如果我要將我的 mail 相關的資料給他寫入 /var/log/maillog 當中,那麼在 /etc/syslog.conf 應該如何寫?
    答:
      基本的寫法是這樣的:

        mail.info     /var/log/maillog

      注意到上面喔,當我們的等級使用 info 時,那麼『任何大於 info 等級(含 info 這個等級)之上的訊息, 都會被寫入到後面接的檔案之中!』這樣可以瞭解嗎?也就是說,我們可以將所有 mail 的登錄資訊都紀錄在 /var/log/maillog 裡面的意思啦!

    例題:我要將新聞群組資料 (news) 及例行性命令的資訊 (cron) 都寫入到一個稱為 /var/log/cronnews 的檔案中,但是這兩個程序的警告訊息記錄在 /var/log/cronnews.warn 該如何設定我的檔案呢?
    答:
      很簡單啦!既然是兩個程序,那麼只好以分號來隔開了,此外,由於第二個指定檔案中,我只要記錄警告訊息, 因此設定上需要指定『=』這個符號,所以就成為了:

        news.*;cron.*     /var/log/cronnews
        news.=warn;cron.=warn /var/log/cronnews.warn

      上面那個『.=』就是在指定等級的意思啦!由於指定了等級,因此,只有這個等級的訊息才會被紀錄在這個檔案裡面呢!

    例題:我的 messages 這個檔案需要記錄所有的資訊,但是就是不想要記錄 cron, mail 及 news 的資訊,那麼應該怎麼寫才好?
    答:
      可以有兩種寫法,分別是:

        *.*;news,cron,mail.none      /var/log/messages
        *.*;news.none;cron.none;mail.none /var/log/messages

      使用『,』分隔時,那麼等級只要接在最後一個即可,如果是以『;』來分的話, 那麼就需要將服務與等級都寫上去囉!這樣會設定了吧!

    瞭解語法之後,我們來看一看在尚未開啟網路服務的情況下,我們的 syslog 有哪些系統服務已經在紀錄了呢?!那就是瞧一瞧 /etc/syslog.conf 這個檔案的預設內容囉! ( 注意!如果需要將該行做為註解時,那麼就加上 # 符號就可以啦!)
    # 來自 Fedora Core Release 4 的相關資料
    [root@linux ~]# vi /etc/syslog.conf
    #kern.*                                    /dev/console
    # 只要是 kernel 產生的訊息,全部都送到 console 去!
    # 這個項目預設是關閉的!不過,只要您願意,可以開啟就是了!
    
    *.info;mail.none;authpriv.none;cron.none   /var/log/messages
    # 在已知各服務的訊息中,不要記錄到這個檔案當中啦!
    # 例如 mail 我們已經預設要記錄在 /var/log/maillog (底下),
    # 所以自然不要在記錄 mail 到這個 /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                                    *
    # 任何時候發生的警告訊息都會顯示給線上的所有人!那個 * 就是目前線上的所有人啦!
    # 這個就是利用 wall 之類的方式傳輸訊息的啊!
    
    uucp,news.crit                             /var/log/spooler
    # 記錄新聞錯誤高於 crit 的等級的資訊,寫入 spooler 當中!
    
    local7.*                                   /var/log/boot.log
    # 將開機的當中的訊息給他寫入 /var/log/boot.log 這個檔案當中呦! 
    
    基本上,每個版本的 syslog.conf 差異是頗大的,所以,每個登錄檔記錄的資料其實不很固定。 舉例來說,如果您曾經使用過 Mandriva 的話,他的 syslogd 設定資訊有點像這樣:
    # 來自 Mandrake 9.0 的 syslog.conf 內容
    [root@linux ~]# vi /etc/syslog.conf
    auth,authpriv.*                                /var/log/auth.log
    *.*;auth,authpriv.none                        -/var/log/syslog
    user.*                                        -/var/log/user.log
    *.info;mail.none;;news.none;authpriv.none     -/var/log/messages
    Authpriv.*                                     /var/log/secure
    mail.=debug;mail.=info;mail.=notice           -/var/log/mail/info
    mail.=warn                                    -/var/log/mail/warnings
    mail.err                                      -/var/log/mail/errors
    cron.=debug;cron.=info;cron.=notice           -/var/log/cron/info
    cron.=warn                                    -/var/log/cron/warnings
    cron.err                                      -/var/log/cron/errors
    kern.=debug;kern.=info;kern.=notice           -/var/log/kernel/info
    kern.=warn                                    -/var/log/kernel/warnings
    kern.err                                       /var/log/kernel/errors
    lpr.=debug;lpr.=info;lpr.=notice              -/var/log/lpr/info
    lpr.=warn                                     -/var/log/lpr/warnings
    lpr.err                                       -/var/log/lpr/errors
    news.=debug;news.=info;news.=notice           -/var/log/news/news.notice
    news.=crit                                    -/var/log/news/news.crit
    news.=err                                     -/var/log/news/news.err
    Daemon.=debug;daemon.=info;daemon.=notice     -/var/log/daemons/info
    Daemon.=debug;daemon.=info;daemon.=notice     -/var/log/daemons/info
    Daemon.=warn                                  -/var/log/daemons/warnings
    Daemon.err                                    -/var/log/daemons/errors
    *.emerg                                       *
    Local1.*                                      -/var/log/explanations
    
    基本上,他將每個服務的登錄檔都分成三個內容,那麼我們就可以簡單的依據比較嚴重的登錄檔來解析, 有助於系統的快速整理。但是每個人的喜好不同,因此,並不見得這樣的設定大家都喜歡。 而像鳥哥自己,我自己寫了一支分析 logfile 的程式,該程式主要針對 Red Hat 系統的登錄檔來作處理的,則 Mandriva 的版本是否適用呢?當然適用啊! 只要手動修訂一下 /etc/syslog.conf 內容即可啊!這樣說,瞭了吧?! ^_^

    另外,這些檔案都相當的重要 (例如什麼時候被誰登入進來主機啦!?) ,所以他們的權限大多是屬於 root 的可讀寫而已!這點非常需要小心而留意! ( 請注意,在系統的預設狀況中,所有的未知狀態的訊息幾乎都是寫入 /var/log/messages 這個檔案中,所以,如果系統有問題,請詳細的檢查一下這個 /var/log/messages 檔案吧!!)

    如果您有其他的需求,所以需要特殊的檔案來幫你記錄時,呵呵!別客氣,千萬給他記錄在 /etc/syslog.conf 當中,如此一來,您就可以重複的將許多的資訊記錄在不同的檔案當中,以方便您的管理呢!

    讓我們來作個練習題吧!如果你想要讓『所有的資訊』都額外寫入到 /var/log/admin.log 這個檔案時, 你可以怎麼作呢?先自己想一想,並且作一下,再來看看底下的作法啦!
    # 1. 先設定好所要建立的檔案設置!
    [root@linux ~]# vi /etc/syslog.conf
    *.info          /var/log/admin.log
    
    # 2. 重新啟動 syslog 呢!
    [root@linux ~]# /etc/init.d/syslog restart
    [root@linux ~]# ll /var/log/admin.log
    -rw-------  1 root root 122 Oct 23 22:21 /var/log/admin.log
    # 瞧吧!建立了這個檔案出現囉!
    
    很簡單吧!如此一來,所有的資訊都會寫入 /var/log/admin.log 裡面了!

    登錄檔的安全性設置

    好了,由上一個小節裡面我們知道了 syslog.conf 的設定,也知道了登錄檔內容的重要性了, 所以,如果幻想你是一個很厲害的駭客,想利用他人的電腦幹壞事,然後又不想留下證據, 你會怎麼作?對啦!就是離開的時候將屁股擦乾淨,將所有可能的訊息都給他抹煞掉, 所以第一個動腦筋的地方就是登錄檔的清除工作啦~

    哇!鳥哥教人家幹壞事……喂!不要亂講話~俺的意思是,如果改天你發現你的登錄檔不翼而飛了, 或者是發現你的登錄檔似乎不太對勁的時候,最常發現的就是網友常常會回報說,他的 /var/log 這個目錄『不見了!』不要笑!這是真的事情?請記得,『趕快清查你的系統!』

    傷腦筋呢!那麼有沒有辦法防止這樣的事情呢?有呀!拔掉網路線……呵呵!別擔心,基本上, 我們可以透過一個隱藏的屬性來設定你的登錄檔,成為『 只可以增加資料,但是不能被刪除 』的狀態,那麼或許可以達到些許的保護!不過,如果你的 root 帳號被破解了,那麼底下的設定還是無法保護的,因為你要記得『 root 是可以在系統上面進行任何事情的 』,因此,請將你的 root 這個帳號的密碼設定的安全一些!千萬不要輕忽這個問題呢!

    好了,開始來設定一下基本的隱藏屬性吧!那就是在 Linux 檔案屬性 提過的 lsattrchattr 這兩個東西啦!如果將一個檔案以 chattr 設定 i 這個屬性時,那麼該檔案連 root 都不能殺掉!而且也不能新增資料,嗯!真安全!但是,如此一來登錄檔的功能豈不是也就消失了? 因為沒有辦法寫入呀!所以囉,我們要使用的是 a 這個屬性!你的登錄檔如果設定了這個屬性的話,那麼 他將只能被增加,而不能被刪除!嗯! 這個項目就非常的符合我們登錄檔的需求啦!因此,您可以這樣的增加你的登錄檔的隱藏屬性。
    Tips 鳥哥 請注意,底下的這個 chattr 的設定狀態:『僅適合已經對 Linux 系統很有概念的朋友』來設定, 對於新手來說,建議您直接使用系統的預設值就好了,免得到最後登錄檔無法寫入~ 那就比較糗一點! @_@
    [root@linux ~]# chattr +a /var/log/messages
    [root@linux ~]# lsattr /var/log/messages
    -----a------- /var/log/messages
    
    加入了這個屬性之後,你的 /var/log/messages 登錄檔從此就僅能被增加,而不能被刪除,直到 root 以『 chattr -a /var/log/messages 』取消這個 a 的參數之後,才能被刪除或移動喔!

    雖然,為了您登錄檔的資訊安全,這個 chattr 的 +a 旗標可以幫助您維護好這個檔案, 不過,如果您的系統已經被取得 root 的權限,而既然 root 可以下達 chattr -a 來取消這個旗標, 所以囉,還是有風險的啦!此外,前面也稍微提到,新手最好還是先不要增加這個旗標, 很容易由於自己的忘記,導致系統的重要訊息無法記錄呢。

    基本上,鳥哥認為,這個旗標最大的用處除了在保護您登錄檔的資料外, 他還可以幫助您避免掉不小心寫入登錄檔的狀況喔。要注意的是,當『 你不小心 "手動" 更動過登錄檔後,例如那個 /var/log/messages , 你不小心用 vi 開啟他,離開卻下達 :wq 的參數,呵呵!那麼該檔案未來將不會再繼續進行登錄動作! 』這個問題真的很常發生!由於你以 vi 儲存了登錄檔,則 syslogd 會誤判為該檔案已被更動過, 將導致 syslogd 不再寫入該檔案新的內容~很傷腦筋的!

    要讓該登錄檔可以繼續寫入,你只要重新啟動 syslog (/etc/init.d/syslog restart) 即可。 不過,總是比較麻煩。所以啊,如果你針對登錄檔下達 chattr +a 的參數,嘿嘿! 未來你就不需要害怕不小心更動到該檔案了!因為無法寫入嘛!除了可以新增之外~ ^_^

    不過,也因為這個 +a 的屬性讓該檔案無法被刪除與修改,所以囉,當我們進行登錄檔案輪替時 (logrotate) ,將會無法移動該登錄檔的檔名呢!所以會造成很大的困擾。這個困擾雖然可以使用 logrotate 的設定檔來解決,但是,還是先將登錄檔的 +a 旗標拿掉吧!
    [root@linux ~]# chattr -a /var/log/messages
    

    登錄檔主機的簡單設定

    我們在之前稍微提到的,在 syslog.conf 檔案當中,可以將登錄資料傳送到印表機, 或者是遠端主機上面去。這樣做有什麼意義呢? 如果你將登錄資訊直接傳送到印表機上面的話,那麼萬一不小心你的系統被 cracker 所入侵, 他也將您的 /var/log/ 砍掉了,怎麼辦?沒關係啊!反正你已經將重要資料直接以印表機記錄起來了, 嘿嘿!他是無法逃開的啦!^_^

    再想像一個環境,你的辦公室內有十部 Linux 主機,每一部負責一個網路服務, 你為了要瞭解每部主機的狀態,因此,你常常需要登入這十部主機去查閱你的登錄檔~ 哇!光用想的,每天要進入十部主機去查資料,想到就煩~沒關係~這個時候我們可以讓某一部主機當成 『登錄檔主機』 ,用他來記錄所有的十部 linux 主機的資訊,嘿嘿!這樣我就直接進入一部主機就可以了! 省時又省事,真方便~

    那要怎麼達到這樣的功能呢?首先,你必須要連上網路嘛!不然怎麼接受資訊? 再來,由於 syslog 用的是 udp 封包的 514 埠號,因此,你的登錄檔主機就得要啟用這個 port 才行~ 如何啟用呢?很簡單啊!這樣做就可以了!
    # 1. 先取得 port number 的資訊!
    [root@linux ~]# grep 514 /etc/services
    syslog          514/udp
    # 特別特別注意,你的 /etc/services 裡面必須要存在這一行才行~
    # 如果不存在這一行,你可以手動自行增加的!
    
    # 2. 修改 syslogd 的啟動設定檔,通常在 /etc/sysconfig 內!
    [root@linux ~]# vi /etc/sysconfig/syslog
    # 找到底下這一行:
    SYSLOGD_OPTIONS="-m 0"
    # 改成底下這樣子!
    SYSLOGD_OPTIONS="-m 0 -r"
    
    # 3. 重新啟動與觀察 syslogd 喔!
    [root@linux ~]# /etc/init.d/syslog restart
    [root@linux ~]# netstat -tlunp
    Proto Recv-Q Send-Q Local Address Foreign Address State  PID/Program name
    udp   0      0      0.0.0.0:514   0.0.0.0:*              24314/syslogd
    # 嘿嘿!你的登錄檔主機已經設定妥當囉!很簡單吧!
    
    透過這個簡單的動作,你的 Linux 主機已經可以接收來自其他主機的登錄資訊了! 當然啦,你必須要知道網路方面的相關基礎,這裡鳥哥只是先介紹, 未來瞭解了網路相關資訊後,再回頭來這裡瞧一瞧先! ^_^,此外, 更多的相關資訊可以 man syslogd 查閱看看喔! ^_^

    至於 client 端的設定就簡單多了!只要指定某個資訊傳送到這部主機即可! 舉例來說,我們的登錄檔主機 IP 為 192.168.1.100 ,而 client 端希望所有的資料都送給主機, 所以,可以在 /etc/syslog.conf 裡面新增這樣的一行:
    [root@linux ~]# vi /etc/syslog.conf
    *.*       @192.168.1.100
    
    立刻就搞定了!而未來主機上面的登錄檔當中,每一行的『主機名稱』就會顯示來自不同主機的資訊了。 很簡單吧! ^_^。接下來,讓我們來談一談,那麼如何針對登錄檔來進行輪轉 (rotate) 呢?

    登錄檔的輪替(logrotate):

    好了!假設我們已經將登錄資料寫入了記錄檔中了,也已經利用 chattr 設定了 +a 這個屬性了,那麼該如何進行 logrotate 的工作呢!?這裡請特別留意的是:『syslog 利用的是 demand 的方式來啟動的, 當有需求的時候立刻就會被執行的,但是 logrotate 卻是在規定的時間到了之後才來進行登錄檔的輪替, 所以這個 logrotate 程序當然就是掛在 cron 底下進行的呦!』 仔細看一下 /etc/cron.daily/ 裡面的檔案,嘿嘿~看到了吧! /etc/cron.daily/logrotate 就是記錄了每天要進行的登錄檔輪替的行為啦! ^_^!底下我們就來談一談怎麼樣設計這個 logrotate 吧!

    logrotate 的設定檔

    既然 logrotate 主要是針對登錄檔來進行輪替的動作,所以囉,他當然必須要記載『 在什麼狀態下才將登錄檔進行輪替』的設定啊!那麼 logrotate 這個程式的參數設定檔在哪裡呢?!呵呵!那就是:
    • /etc/logrotate.conf
    • /etc/logrotate.d/
    注意囉!那個 logrotate.conf 才是主要的參數檔案,至於 logrotate.d 是一個目錄, 該目錄裡面的所有檔案都會被主動的讀入 /etc/logrotate.conf 當中來進行!另外,在 /etc/logrotate.d/ 裡面的檔案中,如果沒有規定到的一些細部設定,則以 /etc/logrotate.conf 這個檔案的規定來指定為預設值!

    好了,剛剛我們提到 logrotate 的主要功能就是將舊的登錄檔案移動成舊檔, 並且重新建立一個新的空的檔案來記錄,他的執行結果有點類似底下的圖示:

    登錄檔進行 logrotate 的結果
    圖一、登錄檔進行 logrotate 的結果

    由上面的圖示我們可以清楚的知道,當第一次執行完 rotate 之後,原本的 messages 會變成 messages.1 而且會製造一個空的 messages 給系統來儲存登錄檔。而第二次執行之後,則 messages.1 會變成 messages.2 而 messages 會變成 messages.1 ,又造成一個空的 messages 來儲存登錄檔!那麼如果我們僅設定保留三個登錄檔而已的話,那麼執行第四次時,則 messages.3 這個檔案就會被刪除,並由後面的較新的保存登錄檔所取代!基本的工作就是這樣啦!

    那麼多久進行一次 logrotate 的工作呢?嗯!這些都記錄在 logrotate.conf 裡面,我們來看一下預設的 logrotate 的內容吧!
    [root@linux ~]# vi /etc/logrotate.conf
    # 底下的設定是 "logrotate 的預設設定值" ,如果個別的檔案設定了其他的參數,
    # 那麼將以個別的檔案設定為主,若該檔案沒有設定到的參數,
    # 則以這個檔案的內容為預設值!
    
    weekly
    # 預設每個禮拜對登錄檔進行一次 rotate 的工作
    
    rotate 4
    # 保留幾個登錄檔呢?預設是保留四個!
    
    create
    # 是否建立新的登錄檔來記錄呢?因為我們要繼續記錄,所以當然是建立囉!
    
    #compress
    # rotate 之後的登錄檔,要不要壓縮,通常是不要壓縮啦,但是如果你的系統很忙碌,
    # 表示你的登錄檔很龐大的時候,那麼最好就是給他壓縮一下比較不會佔空間!
    # 如果要壓縮,將 # 拿掉即可!不過,登錄檔副檔名會變成 messages.1.gz 喔!
    
    include /etc/logrotate.d
    # 將底下這個目錄中的所有檔案都讀進來執行 rotate 的工作!
    
    /var/log/wtmp {
        monthly
        create 0664 root utmp
        rotate 1
    }
    # 基本上,在 logrotate.conf 檔案當中,只有這個資料是在記載如何對登錄檔進行輪替的!
    # 這個登錄檔記載的就是使用 login 登入系統時的使用者狀態,還記得那個 last 指令吧?
    # 就是讀自 /var/log/wtmp 當中記錄的資料啦!整個段落的意義是:
    # 1. 每個月進行一次 log rotate 的工作; 
    # 2. 將檔案的權限設定為 664 ,且擁有者為 root ,群組為 utmp; 
    # 3. 僅保存前一個月的 rotate 備份!
    # 這也是為什麼我們說 last 只會秀出這個月的資料而已的原因~因為一個月輪替一次嘛!
    # 這個 rotate 可以改大一點,例如 5 以保存五個月,以利追蹤 
    
    /var/log/btmp {
        missingok
        monthly
        create 0600 root utmp
        rotate 1
    }
    # 這個跟 wtmp 類似!
    
    由這個檔案的設定我們可以知道 /etc/logrotate.d 其實就是由 /etc/logrotate.conf 所規劃出來的目錄,所以,其實我們可以將所有的資料都給他寫入 /etc/logrotate.conf 即可,但是這樣一來這個檔案就實在是太複雜了,尤其是當我們使用很多的服務在系統上面時, 每個服務都要去修改 /etc/logrotate.conf 的設定也似乎不太合理~ 所以,如果獨立出來一個目錄,那麼每個以 RPM 打包方式所建立的服務的登錄檔輪替設定, 就可以獨自成為一個檔案,並且放置到 /etc/logrotate.d/ 當中即可, 真是方便又合理的做法啊! ^_^

    一般來說,這個 /etc/logrotate.conf 是『預設的輪替狀態』而已, 我們的各個服務都可以擁有自己的登錄檔輪替設定,您也可以自行修改成自己喜歡的樣式啊! 例如,如果您的系統的空間夠大,並且擔心除錯以及駭客的問題,那麼可以:
    • 將 rotate 4 改成 rotate 9 左右,以保存較多的備份檔案;
    • 大部分的登錄檔不需要 compress 囉!但是空間太小就需要 compress !尤其是很佔硬碟空間的 httpd 更需要 compress 的!
    好了,上面我們大致介紹了 /var/log/wtmp 這個檔案的設定,但是還是不很詳細啦,所以底下我們以 /etc/logrotate.d/syslog 這個輪替 syslog 服務的檔案,來看看該如何設定他的 rotate 呢:
    [root@linux ~]# vi /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 的寫法為:
    • 將要被處理的登錄檔檔名 (包含絕對路徑) 寫在前面,可以使用空白字元分隔多個登錄檔;
    • 用 { } 包括所有的設定;
    • 設定的項目與前面提到的相同,並且可加入輪替前 (pre) 與後 (post) 的一些特殊執行的指令! 這個設定需與 sharedscripts .... endscript 設定合用才行;
      • prerotate:在啟動 logrotate 之前進行的指令,例如修改登錄檔的屬性等動作;
      • postrotate:在做完 logrotate 之後啟動的指令,例如重新啟動 (kill -1 或 kill -HUP) 某個服務!
      • Prerotate 與 postrotate 對於已經加上了特殊屬性的檔案處理上面,是相當重要的執行程序!
    也就是說,這一段設定值說明的是:『 /var/log 目錄內的 messages, secure, mailog, spooler, boot.log 及 cron 這六個檔案,每個禮拜進行一次輪替,且保留四個登錄檔,此外, 在輪替進行完畢之後,執行 syslog 的重新啟動』為什麼會知道每個禮拜進行一次呢? 呵呵!因為沒有提到該設定項目,所以就用 /etc/logrotate.conf 內的預設值來作用啊!

    好!若假設我們有針對 /var/log/messages 這個檔案增加 chattr +a 的屬性存在時, 依據 logrotate 的工作原理,我們知道,這個 /var/log/messages 將會被更名成為 /var/log/messages.1 才是。但是由於加上這個 +a 的參數啊,所以,更名是不可能成功的! 那怎麼辦呢?呵呵!就利用 prerotate 與 postrotate 來進行登錄檔輪替前、後所需要作的動作啊! 果真如此時,那麼你可以這樣修改一下這個檔案喔!
    [root@linux ~]# vi /etc/logrotate.d/syslog
    /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler 
    /var/log/boot.log /var/log/cron {
        sharedscripts
        prerotate
    	/usr/bin/chattr -a /var/log/messages
        endscript
        sharedscripts
        postrotate
            /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    	/usr/bin/chattr +a /var/log/messages
        endscript
    }
    
    看到否?就是先給他去掉 a 這個屬性,讓登錄檔 /var/log/messages 可以進行輪替的動作, 然後執行了輪替之後,再給他加入這個屬性!請特別留意的是,那個 /bin/kill -HUP ... 的意義,這一行的目的在於將系統的 syslogd 重新以其參數檔( syslog.conf )的資料讀入一次!也可以想成是 reload 的意思啦! 由於我們建立了一個新的空的紀錄檔,如果不執行此一行來重新啟動服務的話, 那麼記錄的時候將會發生錯誤呦!! (請回到資源管理的章節讀一下 kill 後面的 signal 的內容說明)!

    實際測試 logrotate 的動作

    好了,設定完成之後,我們來測試看看這樣的設定是否可行呢?給他執行底下的指令:
    [root@linux ~]# logrotate [-vf] logfile
    參數:
    -v  :啟動顯示模式,會顯示 logrotate 運作的過程喔!
    -f  :不論是否符合設定檔的資料,強制每個登錄檔都進行 rotate 的動作!
    範例:
    
    範例一:執行一次 logrotate 看看整個流程為何?
    [root@linux ~]# logrotate -v /etc/logrotate.conf
    reading config file /etc/logrotate.conf
    including /etc/logrotate.d
    reading config file acpid
    reading config info for /var/log/acpid
    .....(中間省略).....
    rotating pattern: /var/log/btmp  monthly (1 rotations)
    empty log files are rotated, old logs are removed
    considering log /var/log/btmp
      log does not need rotating
    
    範例二:強制進行 logrotate 的動作
    [root@linux ~]# logrotate -vf /etc/logrotate.conf
    .....(前面省略).....
    rotating pattern: /var/log/wtmp  forced from command line (1 rotations)
    empty log files are rotated, old logs are removed
    considering log /var/log/wtmp
      log needs rotating
    rotating log /var/log/wtmp, log->rotateCount is 1
    renaming /var/log/wtmp.1 to /var/log/wtmp.2 (rotatecount 1, logstart 1, i 1),
    renaming /var/log/wtmp.0 to /var/log/wtmp.1 (rotatecount 1, logstart 1, i 0),
    old log /var/log/wtmp.0 does not exist
    renaming /var/log/wtmp to /var/log/wtmp.1
    creating new log mode = 0664 uid = 0 gid = 22
    removing old log /var/log/wtmp.2
    # 看到否?整個 rotate 的動作就是這樣一步一步進行的~
    
    上面那個 -f 具有『強制執行』的意思,如果一切的設定都沒有問題的話,那麼理論上,您的 /var/log 這個目錄就會起變化囉!而且應該不會出現錯誤訊息才對!嘿嘿!這樣就 OK 了!很棒不是嗎?!

    好了,那麼預設的 logrotate 什麼時候執行呢?呵呵!不用擔心,系統已經幫我們設定好了!放在哪裡呢? 剛剛不是提過嗎?就是放在 /etc/cron.daily/logrotate 裡面啊!如果您的版本不是 FC4 , 那麼可以利用 rpm 的相關功能找到這個設定資料喔! ^_^

    由於 logrotate 的工作已經加入 crontab 裡頭了!所以現在每天系統都會自動的給他查看 logrotate 囉!不用擔心的啦!!只是要注意一下那個 /var/log/messages 裡頭是否常常有類似底下的字眼:
      Oct 24 15:15:35 localhost syslogd 1.4.1: restart.
    這說明的是 syslogd 重新啟動的時間啦 (就是因為 /etc/logrotate.d/syslog 的設定之緣故!) 底下我們來進行一些例題的練習,讓您更詳細的瞭解 logrotate 的功用啊!

    假設前提是這樣的,前一小節當中,假設您已經建立了 /var/log/admin.log 這個檔案, 現在,您想要將該檔案加上 +a 這個隱藏標籤,而且設定底下的相關資訊:
    • 登錄檔輪替一個月進行一次;
    • 該登錄檔若大於 10MB 時,則主動進行輪替,不需要考慮一個月的期限;
    • 保存五個備份檔案;
    • 備份檔案不要壓縮
    那你可以怎麼樣設定呢?呵呵~很簡單啊!看看底下的動作吧!
    # 1. 先建立 +a 這個屬性啊!
    [root@linux ~]# chattr +a /var/log/admin.log
    [root@linux ~]# lsattr /var/log/admin.log
    -----a------- /var/log/admin.log
    [root@linux ~]# mv /var/log/admin.log /var/log/admin.log.1
    mv: cannot move '/var/log/admin.log' to '/var/log/admin.log.1':permission deny
    
    # 2. 開始建立 logrotate 的設定檔,增加一個檔案在 /etc/logrotate.d 內就對了!
    [root@linux ~]# vi /etc/logrotate.d/admin
    # This configuration is from VBird 2005/10/24
    /var/log/admin.log {
            monthly
            size=10M
            rotate 5
            nocompress
            sharedscripts
            prerotate
                    /usr/bin/chattr -a /var/log/admin.log
            endscript
            sharedscripts
            postrotate
                    /usr/bin/killall -HUP syslogd
                    /usr/bin/chattr +a /var/log/admin.log
            endscript
    }
    
    # 3. 測試一下 logrotate 相關功能的資訊顯示:
    [root@linux ~]# logrotate -v /etc/logrotate.conf
    .....(前面省略).....
    rotating pattern: /var/log/admin.log  10485760 bytes (5 rotations)
    empty log files are rotated, old logs are removed
    considering log /var/log/admin.log
      log does not need rotating
    not running shared prerotate script, since no logs will be rotated
    .....(底下省略).....
    
    # 4. 測試一下強制 logrotate 與相關功能的資訊顯示:
    [root@linux ~]# logrotate -vf /etc/logrotate.d/admin
    reading config file /etc/logrotate.d/admin
    reading config info for /var/log/admin.log
    
    Handling 1 logs
    
    rotating pattern: /var/log/admin.log  forced from command line (5 rotations)
    empty log files are rotated, old logs are removed
    considering log /var/log/admin.log
      log needs rotating
    running shared prerotate script
    rotating log /var/log/admin.log, log->rotateCount is 5
    ....(中間省略)....
    renaming /var/log/admin.log.0 to /var/log/admin.log.1 (rotatecount 5, logstart 1, i 0),
    old log /var/log/admin.log.0 does not exist
    log /var/log/admin.log.6 doesn't exist -- won't try to dispose of it
    renaming /var/log/admin.log to /var/log/admin.log.1
    running shared postrotate script
    
    [root@linux ~]# lsattr /var/log/admin.log*
    -----a------- /var/log/admin.log
    ------------- /var/log/admin.log.1
    
    看到了嗎?透過這個方式,我們可以建立起屬於自己的 logrotate 設定檔案, 很簡便吧!尤其是要注意的, /etc/syslog.conf 與 /etc/logrotate.d/* 檔案常常要搭配起來,例如剛剛我們提到的兩個案例中所建立的 /var/log/admin.log 就是一個很好的例子~建立後,還要使用 logrotate 來輪替啊! ^_^

    分析登錄檔

    登錄檔的分析是很重要的!例如那個 last 可以讓你知道到底誰登錄進主機啦!但是並沒有 pop3 這個收信協定的登錄訊息!這個時候就需要考慮到 /var/log/secure 的紀錄啦!無論如何,既然系統有給我們幾個指令可以約略觀察,那就來查一查吧! ^_^

    一些常見指令: last, lastlog, dmesg

    那就來談一談一些系統有的觀察指令啊:

  • dmesg
  • [root@linux ~]# dmesg | more
    
    在指令列模式直接輸入 dmesg 即可執行!由於系統在開機的過程當中尚未將硬碟 mount 上來,所以無法直接將資料直接給他讀到 log file 當中去,但是為了除錯上面的方便, 所以在開機的過程當中的訊息還是要記錄下來,這個時候系統就將 ram 開了一個小區塊來儲存這個資料囉!這個開機記錄的檔案就是:『/proc/kmsg』啦!同時,預設的 RAM 的區塊容量在不同的版本中並不相同,目前的預設版本是 16KB 的大小呦。

    基本上,幾乎所有的核心資訊都可以使用 dmesg 來查閱得到的,舉例來說, 想要知道開機有沒有捉到網路卡,用的就是『 dmesg | grep 'eth' 』之類的指令啊!

  • last
  • [root@linux ~]# last -n number 
    [root@linux ~]# last -f filename
    參數:
    -n  :我們知道 last 會讀出這個月的資料,若資料量太大,可使用 -n 來嚴格要求
          所以顯示的筆數即可。例如 20 筆資料: last -n 20 或 last -20 均可。
    -f  :last 預設讀出 /var/log/wtmp 這個檔案,但是我們可以透過 -f 讀取不同的
          登錄檔資訊喔!
    範例:
    
    範例一:將上個月的資料讀出,僅讀出 5 筆資料時?
    [root@linux ~]# last -n 5 -f /var/log/wtmp.1
    dmtsai2  pts/2             Mon Oct 24 14:18 - 14:18  (00:00)
    dmtsai2  work:0 work       Mon Oct 24 14:18    gone - no logout
    dmtsai2  work:0 work       Mon Oct 24 14:18 - 14:18  (00:00)
    dmtsai2  pts/2             Mon Oct 24 14:18 - 14:18  (00:00)
    dmtsai2  work:0 work       Mon Oct 24 14:18 - 14:18  (00:00)
    
    夠炫吧?!

  • lastlog
  • [root@linux ~]# lastlog
    Username  Port     From             Latest
    root      tty1                      Tue Aug 16 18:06:20 +0800 2005
    bin                                 **Never logged in**
    .....(中間省略).....
    dmtsai2   vbird-wo vbird-work       Mon Oct 24 14:18:49 +0800 2005
    
    說穿了, lastlog 只是讀出 /var/log/lastlog 內的資訊而已~ 他會顯示目前系統上面的所有帳號當中,每個帳號最近一次登入的時間喔!

    鳥哥自己寫的登錄檔分析工具:

    雖然有一些有用的系統指令,不過,要瞭解系統的狀態,還是得要分析整個登錄檔才行~ 事實上,目前已經有相當多的登錄檔分析工具,例如 FC4 上面預設的 logwatch 這個套件所提供的分析工具, 他會每天分析一次登錄檔案,並且將資料以 email 的格式寄送給 root 呢! 你也可以直接到 logwatch 的官方網站上面看看: 如果是非 FC4 系列的其他 distributions ,可以查閱一下您自己的 distributions 所提供的分析工具, 如果沒有,那麼可以自行安裝 logwatch 幫您分析啊~

    雖然已經有了這些工具,但是鳥哥自己想要分析的資料畢竟與對方不同~ 所以囉,鳥哥就自己寫了一支小程式 (shell script 的語法) 用來分析自己的登錄檔, 這支程式分析的登錄檔資料其實是固定的,包括有:
    • /var/log/secure
    • /var/log/messages
    • /var/log/maillog
    當然啦,還不只這些啦,包括各個主要常見的服務,如 pop3, mail, ftp, su 等會使用到 pam 的服務, 都可以透過鳥哥寫的這個小程式來分析與處理呢~整個資料還會輸出一些系統資訊, 所以輸出結果有點像底下這樣:
    ##########################################################
    歡迎使用本程式來查驗您的登錄檔
    本程式目前版本為: Version 0.1-1
    程式最後更新日期為: 2005-01-09
    若在您的系統中發現本程式有問題, 歡迎與我聯絡!
    鳥哥的首頁 http://linux.vbird.org
    問題回報: http://phorum.vbird.org/viewtopic.php?t=3425
    ##########################################################
     
    =============== 系統彙整 =================================
    核心版本  : Linux version 2.6.12-1.1456_FC4 (bhcompile@tweety.build.redhat.com)
    CPU 資訊  : Pentium III (Coppermine)
             : 997.519 MHz
    主機名稱  : localhost.localdomain
    統計日期  : 2005/October/24 00:10:02 ( Monday )
    分析的日期: Oct 23
    已開機期間: 26 days, 1:02,
    目前主機掛載的 partitions
          Filesystem            Size  Used Avail Use% Mounted on
          /dev/hda1             5.7G  3.3G  2.2G  61% /
          /dev/shm              189M     0  189M   0% /dev/shm
    
    
    ================= Ports 的相關分析資訊 =======================
    主機啟用的 port 與相關的 process owner:
    僅對本機介面開放的 ports (PID|owner|command)
          tcp 25|(root)|/usr/libexec/postfix/master
    對外部介面開放的 ports (PID|owner|command)
          tcp 22|(root)|/usr/sbin/sshd
          udp 68|(root)|/sbin/dhclient -1 -q -cf /etc/dhclient-eth1.conf -lf /var/l
    
    ================= SSH 的登錄檔資訊彙整 =======================
    一共成功登入的次數:         3
          帳號       來源位址        次數
          dmtsai2    192.168.1.51      3
    
    以 su 轉換成 root 的使用者及次數
          帳號                       次數
          (uid=530)                   1
    
    
    ================= POP3 的登錄檔資訊彙整 ======================
    今日沒有使用 POP3 的紀錄
    
    
    ================= Postfix 的登錄檔資訊彙整 ===================
    使用者信箱受信次數:
    
    如果您有興趣看看這支程式的話,歡迎下載: 安裝的方法也很簡單,只要將上述檔按下載後,解壓縮,就會得到一個名為 logfile 的目錄, 將此目錄移動到 /usr/local/virus 當中,修改一下: /usr/local/virus/logfile.sh 檔案, 裡面的 email 與相關的資訊只要修改一下,您就可以使用啦~ 啊!還要記得,將這支程式的執行寫入 /etc/crontab 當中喔! 可以在每天的 12:10am 執行這支小程式啦! ^_^

    本章習題練習

    ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
    修改歷史:
    • 2002/06/24:第一次完成
    • 2003/02/11:重新編排與加入 FAQ
    • 2005/10/12:舊的文章已經被移動到 此處
    • 2005/10/24:終於寫完了~啊!怎麼寫這麼久??
    • 2006/07/23:修改了 /etc/logrotate.d/syslog 的設定資料
    伺服器篇文件
    各版本彙整說明
    CentOS 6.x