Linux 基礎學習篇 - Mandrake 9

第二十二章、認識與分析登錄檔 - for Mandrake 9

鳥哥的第一本書籍的主要內容,內容稍微與書籍不太一樣了!

最近更新時間: 2003/02/11

鳥哥的第一本書大約是在 2002 年的年底左右出版的,內容幾乎都是 Linux 基礎學習,一點也沒有談到伺服器的部份!這也是後來的雛型! 不過內容錯誤的地方很多,導致在 2003 年的年底推出了『基礎學習篇增訂版』的內容,大致上就是處理掉一些比較有嚴重錯誤的部份。 不過,因為 Linux 的版本變化非常快速,因此,寫完了這些文件之後,鳥哥還是持續在網站上更新文件內容,導致原本書籍內容的資料與網站資料差異太大! 這個問題直到鳥哥在 2008 年左右才發現!糟糕了!舊版的文件資料已經遺失~覺得相當扼腕~

因此,在底下的文件內容與當初的書籍內容雖然大同小異,不過章節的編排卻是有所不同!再花時間去一個一個處理,似乎也不太符合成本效益! 鳥哥僅是想要將自己以前的文件記錄下來而已,同時將過時的 big5 編碼改回 utf8 編碼,再加上可以支援 RWD 的樣式而已啦! 內容已經不多做編排~因此,如果內容文件你看不懂,那也是應該的! ^_^

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。最新文章請前往鳥站首頁查閱囉!

什麼是登錄檔、幹嘛要分析登錄檔

這部分是最容易被新手所忽略的,那就是詳細而確實的紀錄或者是備份系統的登錄檔。什麼是登錄檔呢?簡單的說,就是記錄系統活動記錄的幾個檔案,例如:何時、何地(來源 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: 分別是幾個不同的網路服務的記錄檔啦!
好了,那麼記錄了這些登錄檔之後,我要做什麼分析呀!?基本上,一個好的系統管理員大概都知道『一部主機負責的服務最好能少盡量少』,這是什麼意思呢?也就是說,這部主機為郵件主機那麼就專門負責郵件工作,不要還搞 WWW 服務!這樣有幾個好處,除了系統的安全性較佳之外(因為開的 port 變少了!),記錄檔的解析也會比較簡單!因為我們的 /var/log/secure 記錄的登入者資訊就會比較有一致性!那麼我們就可以查詢一下每日登入的使用者帳號啦與錯誤訊息啦等等的!(當然囉,如果你的頻寬夠、經驗豐富的話,那麼一部主機上面安裝所有的網路服務也是可以的啦!)基本上,檢查/var/log/messages、/var/log/secure這些個檔案也就相當夠了!因為系統發生的錯誤或者是警告訊息通常都會寫入這個檔案中。
 
但是,如果我手邊有數十部主機怎麼辦?我要不要一部一部去察看 log file 呢?呵呵!那樣察看會死人ㄋㄟ?因此,我們底下也使用一個簡易的登錄檔來分析 Red Hat 或 Mandrake 這兩種 Linux distribution 的登錄檔吧!

Linux 登錄檔的規劃: syslogd, logrotate,

    在系統的登錄檔系統當中,大多以一支常駐程式來進行寫入這些訊息的這個工作,那就是 syslogd 這支程式啦!另外,由於登錄檔如果一直長大的話,那麼這些登錄檔的寫入動作將會很沒有效率,這是因為檔案太大時,ASCII 格式碼的資料檔案寫入比較麻煩的緣故!那麼怎麼進行登錄檔資料的備份工作呢?呵呵!那就使用 logrotate 吧!將資料進行輪轉( rotate )?什麼是輪轉?!(我ㄌㄟ台語不輪轉呦!?)其實也可以稱為輪替啦!基本上,就是將舊的 log 檔案更改名稱,然後建立一個空的 log 檔案,如此一來,新的 log 檔案將從零開始記錄,然後只要將舊的 log 檔案留下一陣子,嗯!那就可以達到將登錄檔『輪轉』的目的啦!此外,如果舊的紀錄(大概要保存幾個月吧!)保存了一段時間沒有問題,那麼就可以讓系統自動的將他砍掉,免得佔掉很多寶貴的硬碟空間說!(舉個例子來說,我的 WWW 網站一個月的登錄檔,所佔掉的硬碟空間大小,大概就有 1GB 這麼多....而且都是純文字檔....很可怕吧!)
     
    所以說,基本上,針對 log 檔案來設計的服務有這兩支:
    • syslogd:進行系統或者是網路服務的登錄檔記錄工作;
    • logrotate:將舊的資料更名,並且建立新的登錄檔,以保持登錄檔的『新鮮』,並視設定將最舊的登錄檔刪除。
    所以,接著下來我們來談一談怎麼樣規劃這兩支程式呢?!就由 syslogd 這支程式先談起吧!畢竟得先有登錄檔,才可以進行 logrotate 呀!您說是吧!?

    • syslogd

    • 我們在Linux裡面預設就已經使用了syslogd這支程式來記錄系統的登入資料,不相信的話,你可以使用ps來查詢一下:
       
      [root @test root]# ps -aux|grep syslog
      root       782  0.0  0.8  1340  508 ?        S    Oct30   0:00 syslogd -m 0
      root     11044  0.0  1.1  2408  732 pts/1    S    00:03   0:00 grep syslog
       
      看到syslog這個服務名稱了吧?!呵呵!所以知道他已經在背景底下工作囉!syslog 這支程式可以提供『系統登入資訊記錄』及『Kernel錯誤或警示資訊記錄』等功能,此外,他還提供了『本地端與遠端電腦的登錄資訊記錄』功能,所以,可以將遠端的主機登入資訊同時記錄在本地端呢!很不錯的功能吧!!此外,目前正規使用的系統服務中,大都預設支援以 syslog 這一個服務來記錄他的登錄檔案資料,例如apache, samba, sendmail 等等。而通常syslog提供的記錄參數主要有:
       
      • 事件發生時間;
      • 主機名稱;
      • 啟動此事件的服務名稱(例如 httpd, samba...)
      • 訊息資料內容
       
      等等這些資訊,當然,這些資訊的詳細度是可以修改的,此外,這些資訊可以作為系統除錯之用呢!我們先來看一下/var/log/secure的內容顯示些什麼呢?
       
      [root @test root]# vi /var/log/secure
      Nov  4 16:28:35 test xinetd[7831]: START: telnet pid=7841 from=192.168.1.11
      Nov  4 16:28:35 test xinetd[7841]: FAIL: telnet address from=192.168.1.11
      Nov  4 23:41:17 test sshd[10803]: Accepted password for test from 192.168.1.11 port 3117 ssh2
      Nov  4 23:41:17 test sshd(pam_unix)[10805]: session opened for user test by (uid=500)
      Nov  4 23:41:29 test su(pam_unix)[10838]: authentication failure; logname=test uid=500 euid=0 tty= ruser=test rhost=  user=root
      Nov  4 23:41:34 test su(pam_unix)[10839]: session opened for user root by test(uid=500)
       
      在上面的表格中,可以看到每筆記錄的主要內容是:
       
        <日期與時間><主機名稱><服務名稱><顯示訊息>
       
      以第一筆資料來看,<日期是 Nov 4 的 16:28:35 時候>,在<主機 test 當中>,<那個 xinetd 服務的內容有資料啦>,<該程序的 PID 為 7831,顯示的訊息,說的是telnet這個由xinetd啟動的服務有人登入,登入者的IP是192.168.1.11>,這樣夠詳細了吧!還有很多的資訊值得看的呢!尤其是/var/log/messages的內容。然後,不要忘記了,在最後一筆資料中,還記錄了可以使用su的使用者的uid為500,帳號名稱為test,那麼如果這個資料被人家奪走了,呵呵!未來外面的cracker將可能試圖以test這個帳號來猜測你的密碼,並加以破解,嗯!真的很重要吧!所以這些資料很多都不能外流呢!
       
      好了,再來看到我們要如何來設定 syslogd 呢?!剛剛說到 syslog 可以記錄我們系統中的幾乎所有的預設的系統工作,那麼萬一我的網路服務是自行設定的呢?!例如以 Tarball 安裝好的服務套件。OK!我們可以藉由修改 syslog 的參數檔來達到這個目的。那麼預設的 syslog 參數檔放在哪裡呢?!
       
      • /etc/syslog.conf
       
      其實預設的 syslogd 程式的參數檔案就是 /etc/syslog.conf 這個檔案內容啦!這個檔案的內容可以規定『什麼服務需要被記錄、該服務被紀錄的訊息等級如何?』。基本上,可以使用底下的句子語法來說明:
         
        服務名稱.訊息等級   存放或顯示地點
      • 服務名稱:例如 mail, http, news, cron, at 等等的服務名稱;
       
      • 訊息等級:總共分成下列幾種等級:
        • info : 提示一些訊息資料;
        • notice : 注意!需要比較留意的訊息;
        • waringwarn : 警示的訊息,以上三個訊息都還是沒有錯誤的情況,雖然是需要留意,但是還沒有到錯誤的情況;
        • errerror : 呀!錯誤訊息出現了!該要檢驗錯誤的問題發生原因了;
        • crit : 臨界點了!再不處理可就傷腦筋了!
        • alert : 錯誤訊息一再地警告警告!你將要完蛋了!
        • emergpanic : 阿!系統已經進入混亂的階段!真的是完蛋了~~
        • 特殊等級:例如 debug (顯示較多的資訊!)及 none (不要記錄該服務的內容!)等!
         
      • 存放或顯示地點:通常我們使用的都是記錄的檔案啦!但是也可以輸出到裝置呦!例如印表機之類的!
        • 檔案的絕對路徑:通常就是放在 /var/log 裡頭的檔案啦!
        • 印表機或其他:例如 /dev/lp0 這個印表機裝置
        • 使用者名稱:顯示給使用者囉!
        • 遠端主機:例如 @test.adsldns.org
       
      例題一:如果我要將我的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 這個檔案的預設內容囉!(注意!如果需要將該行做為註解時,那麼就加上 # 符號就可以啦!)
       
      第一個例子:來自 Red Hat 7.x 版本的 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 這個檔案當中呦!

      第二個例子:來自 Mandrake 9.0 的 syslog.conf 內容!
      # 各種系統的訊息
      # 下面三行中,分別記錄的是:
      # 1. 第一行記錄的是有關『身份確認』的資訊,只要是有『登入』主機,即有
      #   『輸入帳號與密碼』的程序時,都記錄到 auth.log 裡面去了,這部份的記錄主要有:
      #    xinet(telnet, ftp), ssh, su, postfix, pop3 等等
      # 2. 第二行則是除了身份記錄的資訊之外,其他的都需要記錄在/var/log/syslog當中!
      # 3. 第三行則是記錄了任何 user 執行的指令有呼叫系統功能所產生的某些訊息!
      auth,authpriv.*                                /var/log/auth.log
      *.*;auth,authpriv.none                        -/var/log/syslog
      user.*                                        -/var/log/user.log

      # 這個部分則是在記錄任何資訊!其實跟上面的 /var/log/syslog 有點重複了!
      # 不過,底下這一行中,跟 mail, news, authpriv 有關的資訊都不會被紀錄。
      *.info;mail.none;;news.none;authpriv.none     -/var/log/messages

      # 任何跟認證資訊有關的訊息都會被紀錄在 /var/log/secure 這個檔案當中,
      # 其實跟 /var/log/auth.log 也有點重複了!無論如何,多記錄幾份總是好的!
      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 在進行破壞的行為,
      # 所以適時的瞭解 cron 也是很重要的!
      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

      # 將所有已經呈現『嚴重錯誤的訊息』隨即的發送給目前在主機上面的任何人!
      # 這有個好處了,如果主機萬一不幸有發生緊急事件時,那麼線上使用者可以立刻知道,
      # 如果能夠立即聯絡 root 的話,那麼主機的傷害將可減到最低!
      *.emerg                                       *

      # 任何跟 Mandrake Linux 有關的設定工具,所顯示的資訊都會被紀錄在這個檔案中!
      Local1.*                                      -/var/log/explanations

       
      大致上就是有這些功能啦!這樣一來,我們的一些不同的資訊就可以存在不同的檔案當中,可以方便我們來進行登入資料的解析呢!另外,這些檔案都相當的重要(例如什麼時候被誰登入進來主機啦!?),所以他們的權限大多是屬於 root 的可讀寫而已!這點非常需要小心而留意!(請注意,在系統的預設狀況中,所有的未知狀態的訊息幾乎都是寫入 /var/log/messages 這個檔案中,所以,如果系統有問題,請詳細的檢查一下這個 /var/log/messages 檔案吧!!
       
      如果您有其他的需求,所以需要特殊的檔案來幫你記錄時,呵呵!別客氣,千萬給他記錄在/etc/syslog.conf當中,如此一來,您就可以重複的將許多的資訊記錄在不同的檔案當中,以方便您的管理呢!
       

    • 登錄檔的安全屬性設定

    • 好了,由上一個章節裡面我們知道了 syslog.conf 的設定,也知道了登錄檔內容的重要性了,所以,如果幻想你是一個很厲害的駭客,想利用他人的電腦幹壞事,然後又不想留下證據,你會怎麼作?對啦!就是離開的時候將屁股擦乾淨,將所有可能的訊息都給他抹煞掉,所以第一個動腦筋的地方就是登錄檔的清除工作啦~哇!鳥哥教人家幹壞事…..喂!不要亂講話~俺的意思是,如果改天你發現你的登錄檔不翼而非了,或者是發現你的登錄檔似乎不太對勁的時候,最常發現的就是網友常常會回報說,他的/var/log這個目錄『不見了!』不要笑!這是真的事情?請記得,『趕快清查你的系統!』
       
      傷腦筋呢!那麼有沒有辦法防止這樣的事情呢?有呀!拔掉網路線…..呵呵!別擔心,基本上,我們可以透過一個隱藏的屬性來設定你的登錄檔,成為『只可以增加資料,但是不能被刪除』的狀態,那麼或許可以達到些許的保護!不過,如果你的 root 帳號被破解了,那麼底下的設定還是無法保護的,因為你要記得『 root 是可以在系統上面進行任何事情的』,因此,請將你的 root 這個帳號的密碼設定的安全一些!千萬不要輕忽這個問題呢!好了,開始來設定一下基本的隱藏屬性吧!那就是在 檔案屬性 提過的 lsattrchattr 這個東西啦!如果將一個檔案以 chattr 設定i這個屬性時,那麼該檔案連 root 都不能殺掉!而且也不能新增資料,嗯!真安全!但是,如此一來登錄檔的功能豈不是也就消失了?因為沒有辦法寫入呀!所以囉,我們要使用的是 a 這個屬性!你的登錄檔如果設定了這個屬性的話,那麼他將只能被增加,而不能被刪除!嗯!這個項目就非常的符合我們登錄檔的需求啦!因此,建議您可以這樣的增加你的登錄檔的隱藏屬性。
       
      [root @test root]# chattr +a /var/log/messages
      [root @test root]# lsattr /var/log/messages
      ----a--------- messages
       
      加入了這個屬性之後,你的/var/log/messages登錄檔從此就僅能被增加,而不能被刪除,直到root以chattr –a /var/log/messages取消這個a的參數之後,才能被刪除或移動喔!
       
      為了您的登錄檔資訊安全,強烈的建議您使用這個屬性!不過,在底下的logrotate當中,我們必需要將這個屬性去除之後,才能進行輪替喔!呵呵!接下來我們來看看如何進行登錄檔資料的輪替吧!

  • logrotate

  • 好了!那麼我們已經將登錄資料寫入了記錄檔中了,也已經利用chattr設定了a這個屬性了,那麼該如何進行 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 當中來進行!另外,在/etc/logrotate.d裡面的檔案中,如果沒有規定到的一些細部設定,則以/etc/logrotate.conf這個檔案的規定來指定為預設值!好了,剛剛我們提到 log rotate 的主要功能就是將舊的登錄檔案移動成舊檔,並且重新建立一個新的空的檔案來記錄,他的執行結果有點類似底下的圖示:
     
     
    由上面的圖示我們可以清楚的知道,當第一次執行完rotate之後,原本的messages會變成messages.1而且會製造一個空的messages給系統來儲存登錄檔。而第二次執行之後,則messages.1會變成messages.2而messages會變成messages.1,又造成一個空的messages來儲存登錄檔!那麼如果我們僅設定保留三個登錄檔而已的話,那麼執行第四次時,則messages.3這個檔案就會被刪除,並由後面的較新的保存登錄檔所取代!基本的工作就是這樣啦!
     
    那麼多久進行一次 logrotate 的工作呢?嗯!這些都記錄在 logrotate.conf 裡面,我們來看一下預設的 logrotate 的內容吧!
     
    # 底下的設定是 logrotate 的預設設定值,如果個別的檔案設定了其他的參數,
    # 那麼將以個別的檔案設定為主,若該檔案沒有設定到的參數,
    # 則以這個檔案的內容為預設值!

    # 每個禮拜進行一次 rotate 的工作
    weekly

    # 保留幾個登錄檔呢?預設是保留四個!
    rotate 4

    # 是否建立新的登錄檔來記錄呢?因為我們要繼續記錄,所以當然是建立囉!
    create

    # rotate之後的登錄檔,要不要壓縮,通常是不要壓縮啦,
    # 但是如果你的系統很忙碌,表示你的登錄檔很龐大的時候,
    # 那麼最好就是給他壓縮一下比較不會佔空間!
    Compress

    # 將底下這個目錄中的所有檔案都讀進來執行 rotate 的工作!
    include /etc/logrotate.d

    # 至於登錄的資訊部分,有使用 last 來紀錄的登錄者資訊就是記錄在這個檔案中!
    # 底下就是 /var/log/wtmp 這個檔案的 rotate 情況,他的意思是:
    # 1. 每個月進行一次 log rotate 的工作; 
    # 2. 將檔案的權限設定為 664 囉! 
    # 3. 僅保存前一個月的 rotate 備份!這個可以改大一點,例如 5 !保存五個月,以利追蹤
    /var/log/wtmp {
        monthly
        create 0664 root utmp
        rotate 1
    }

    # 底下這個檔案跟 /var/log/wtmp 類似!
    /var/log/lastlog {
        monthly
        rotate 1
    }

     
    由這個檔案的設定我們可以知道 /etc/logrotate.d 其實就是由 /etc/logrotate.conf 所規劃出來的目錄,所以,其實我們可以將所有的資料都給他寫入 /etc/logrotate.conf 即可,但是這樣一來這個檔案就實在是太複雜了,因此,獨立出來一個 RPM 套件 就一個 rotate 的執行檔案,呵呵!似乎是比較合理的一個方法!上面的資訊是系統的預設rotate情況,不過,您可以自行的修改為自己喜歡的樣式,例如,如果您的系統的空間夠大,並且擔心除錯以及駭客的問題,那麼可以:
     
    • 將 rotate 4 改成 rotate 9 左右,以保存較多的備份檔案;
    • 大部分的登錄檔不需要 compress 囉!但是空間太小就需要 compress !尤其是很佔硬碟空間的httpd更需要compress的!
     
    好了,上面我們大致介紹了 /var/log/wtmp 這個檔案的設定,但是還是不很詳細啦,所以底下我們以 /etc/logrotate.d/syslog 這個輪替 syslog 這個服務的檔案,來看看該如何設定他的rotate呢:
     
    /var/log/auth.log /var/log/syslog /var/log/user.log /var/log/secure /var/log/messages /var/log/boot.log /var/log/mail/errors /var/log/mail/info /var/log/mail/warnings /var/log/cron/errors /var/log/cron/info /var/log/cron/warnings /var/log/kernel/errors /var/log/kernel/info /var/log/kernel/warnings /var/log/lpr/errors /var/log/lpr/info /var/log/lpr/warnings /var/log/news/news.err /var/log/news/news.notice /var/log/news/news.crit /var/log/daemons/errors /var/log/daemons/info /var/log/daemons/warnings /var/log/explanations {
        sharedscripts
        rotate 5
        weekly
        postrotate
        /usr/bin/killall -HUP syslogd #
        endscript
    }
     
    正確的 logrotate 的寫法中:
     
    • 將 log file 名稱(包含絕對路徑)寫在前面,可以使用空白字元分隔多個 log files ;
    • 用 { } 包括所有的設定;
    • 設定的項目與前面提到的相同,並且可加入 rotate 前 (pre) 與後 (post) 的一些特殊執行的指令!
      • prerotate:在啟動 logrotate 之前進行的指令,例如修改 log file 的屬性!!
      • postrotate:在做完 logrotate 之後啟動的指令,例如重新啟動( kill -1 或 kill -HUP )某個服務!
      • Prerotate與postrotate對於已經加上了特殊屬性的檔案處理上面,是相當重要的執行程序!
     
    由於我們已經將登錄檔的屬性設定了chattr +a,所以必需要在logrotate之前將這個屬性拿掉,並在logrotate之後,再將這個屬性加回去!所以囉,那個prerotate與postrotate就顯的相當的重要啦!假設我們僅針對/var/log裡面的幾個檔案設定屬性:
     
    • messages
    • secure
    • auth.log
     
    那麼應該如何修改上面顯示的內容呢?嗯!你可以這樣做:
     
    /var/log/auth.log /var/log/syslog /var/log/user.log /var/log/secure /var/log/messages /var/log/boot.log /var/log/mail/errors /var/log/mail/info /var/log/mail/warnings /var/log/cron/errors /var/log/cron/info /var/log/cron/warnings /var/log/kernel/errors /var/log/kernel/info /var/log/kernel/warnings /var/log/lpr/errors /var/log/lpr/info /var/log/lpr/warnings /var/log/news/news.err /var/log/news/news.notice /var/log/news/news.crit /var/log/daemons/errors /var/log/daemons/info /var/log/daemons/warnings /var/log/explanations {
        sharedscripts
        rotate 5
        weekly
        prerotate
            /usr/bin/chattr -a /var/log/auth.log
            /usr/bin/chattr -a /var/log/messages
            /usr/bin/chattr -a /var/log/secure
        endscript
        postrotate
            /usr/bin/killall -HUP syslogd
            /usr/bin/chattr +a /var/log/auth.log
            /usr/bin/chattr +a /var/log/messages
            /usr/bin/chattr +a /var/log/secure
        endscript
    }
     
    看到否?就是先給他去掉 a 這個屬性,然後執行了之後,再給他加入這個屬性!請特別留意的是,那個 /usr/bin/killall –HUP syslogd 的意義,這一行的目的在於將系統的 syslogd 重新以其參數檔( syslog.conf )的資料讀入一次!也可以想成是 reload 的意思啦!由於我們建立了一個新的空的紀錄檔,如果不執行此一行來重新啟動服務的話,那麼記錄的時候將會發生錯誤呦!!(請回到資源管理的章節讀一下 kill 後面的 signal 的內容說明)!
     
    Logrotate的測試:
    好了,設定完成之後,我們來測試看看這樣的設定是否可行呢?給他執行底下的指令:
     
    [root @test root]# logrotate –f /etc/logrotate.conf
    [root @test root]# lsattr /var/log/auth.log /var/log/messages /var/log/secure
    ----a--------- /var/log/auth.log
    ----a--------- /var/log/messages
    ----a--------- /var/log/secure
     
    上面那個 -f 具有『強制執行』的意思,如果一切的設定都沒有問題的話,那麼理論上,您的 /var/log 這個目錄就會起變化囉!而且應該不會出現錯誤訊息才對!嘿嘿!這樣就 OK 了!很棒不是嗎?!

    好了,那麼預設的logrotate什麼時候執行呢?呵呵!不用擔心,系統已經幫我們設定好了!放在哪裡呢?
     

      /etc/cron.daily/logrotate
     
    注意看一下裡面的內容:
     
      /usr/sbin/logrotate /etc/logrotate.conf
     
    由於 logrotate 的工作已經加入 crontab 裡頭了!所以現在每天系統都會自動的給他查看 logrotate 囉!不用擔心的啦!!只是要注意一下那個 /var/log/messages 裡頭是否常常有:『Jun 23 04:02:00 test syslogd 1.4.1: restart.』這樣的字樣!?這說明的是 syslogd 重新啟動的時間啦(就是因為 /etc/logrotate.d/syslog 的設定之緣故!)
     
    例題:我的/var/log/messages只希望記錄一些相當重要的資訊,關於cron的內容已經在/var/log/cron裡面記錄了,所以我想將cron的資訊移除,那麼該怎麼修改我的syslog.conf的設定呢?
    答:
    基本上,你可以這樣設定啦!

    [root @test root]# vi /etc/syslog.conf

    修改 /var/log/messages 那一行,使成為底下的模樣就可以了!

    *.info;mail.none;;news.none;authpriv.none;cron.none      -/var/log/messages

    [root @test root]# /etc/rc.d/init.d/syslog restart

    這樣就可以啦!簡單的很!

     
    例題:將 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 來詳細查看一下用法囉!

登錄檔分析

    登錄檔的分析是很重要的!例如那個 last 可以讓你知道到底誰登錄進主機啦!但是並沒有 pop3 這個收信協定的登錄訊息!這個時候就需要考慮到 /var/log/secure 的紀錄啦!無論如何,系統最常使用的查閱登錄檔的指令分別有底下幾個:

  • dmesg
  • [root @test /root]# dmesg
    在指令列模式直接輸入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  <==叫出上個月的登入資料!
    那麼如果要叫出來上個月的登入資料呢?!可以使用上面的第二個範例!

VBird 寫的 logfile.sh

  • Mandrake 9.0

  • 雖然很多的套件都有他們的喜好的登錄分析資料檔案,但是總覺得不是很對自己的口味,所以呢,VBird就自己寫了一支程式來分析自己的登錄檔!目前這支程式已經被改成可以支援Mandrake 9.0了,而且已經打包成為RPM檔案,應該是很容易安裝啦!

    我的設計理念很簡單,就是單純分析我們常常使用的幾個服務:

    • SSH登入次數與登入者帳號與IP分析;
    • 使用su轉化成root的次數
    • 使用FTP登入主機的次數與登入者帳號與IP分析;
    • 使用POP3登入主機的次數與登入者帳號與IP分析;
    • 使用Postfix的狀態
    大概就是分析這機個資料,而分析的檔案為:
    • /var/log/auth.log
    • /var/log/mail/info, /var/log/mail/warnings, /var/log/mail/errors
    • /var/log/messages
    下載的網頁: 安裝的步驟很簡單的,就是直接以RPM的方式來安裝即可!容易的很?此外,這個程式預設會將分析的資料寄給root@localhost,所以,如果您想要讓這個程式的分析結果寄到其他的信箱去的話,那麼就需要手動的修改一下檔案,亦即是/usr/local/virus/logfile/logfile.sh這個檔案,修改那個email的變數,將他由原先的root改成你的e-mail address即可!
    祝大家都能很輕鬆的管理自己的主機喔!
     

  • Red Hat 7.X

  • 雖然 Red Hat 已經寫了一支很棒的程式來分析 log files ,但是我總覺得不是很合我的口味!!所以就直接以 awk 配合 cut 與一些相關的 command ,將我的幾個重要的 secure 的 log files 叫出來,重新分析一番!寫出了一個叫做 logfile.sh 的分析檔案!這個檔案主要分析的項目為:
    • /var/log/secure  :含 ssh 登入、ftp 登入、pop3 登入及 sendmail 登入等四大項目;
    • /var/log/messages:分析因錯誤登入而發生的錯誤訊息顯示;
    • /var/log/maillog :分析是否可能被當作轉信站了?!檢查試圖使用我們主機的 IP !
    安裝的步驟很簡單!不過請注意,我的這個檔案主要的環境是在 Red Hat 7.2 底下,而在 Red Hat 7.1 底下使用過也沒有任何問題!說說安裝的方法吧!
    • 建立一個目錄,名稱為 /usr/local/virus/logfile

    • mkdir /usr/local/virus
      mkdir /usr/local/viurs/logfile
    • 將檔案 copy 到該目錄下,並且變更權限:

    • cp /root/logfile.sh /usr/local/virus/logfile
      chmod 700 /usr/local/virus/logfile/logfile.sh
    • 設定這個檔案在每天的 11:57pm 執行一次!編輯 /etc/crontab 檔案!

    • vi /etc/crontab
      57 23 * * * root /usr/local/virus/logfile/logfile.sh
    這樣子一來,每天的晚上 11:57 就會自動的執行這一個分析檔案,並且將資料寄給您(root),所以如果你不想將資料寄給 root 的話,請進入 logfile.sh 裡面,修改『email="root@localhost"』這一個項目,改成您要的 e-mail 就可以啦!祝使用愉快!
     

  • 網友回報動作:

  • 感謝網友文桐兄所提供的資訊,由於我們的程式使用的是 Wu-ftp 這支 ftp 的服務,所以針對 proftp 並沒有辦法成功的將之搞定!還好文桐兄已經幫大家搞定了!嗯!感謝他吧!! ^_^如果您還有新的發現,歡迎提出來與我們分享呦!謝謝囉!以下將文桐兄寫的關於 proftp 的部分貼上來,如果您使用的是 proftp 的話,那麼請將底下的資料剪下之後,貼到 logfile.sh 當中,取代原先的 2.3 那一部份關於 ftp 的處理碼!
     
    # 2.3a FTP {for proftpd}
    echo "========================== "                                                           >> $logfile
    echo "3. 關於 FTP  登錄檔的登入次數統計"                                                     >> $logfile
    echo "帳號   來源位址 次數 "|awk '{printf("\%-15s \%-25s \%-4s\n", $1, $2, $3)}'             >> $logfile
    echo "FTP登入次數: `cat $basedir/messageslog|grep "FTP session opened." | wc -l`"|awk '{printf( "\%-41s \%3d\n", $1, $2)}' >> $logfile
    # add login ip script
    cat $basedir/messageslog | grep "FTP session opened."|awk '{print $7}'|cut -d"[" -f2 | cut -d"]" -f1 >"$basedir/ftploginip"
    /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ };
         END{ for( course in Number )
         printf( "\%-41s \%3d\n", course, Number[course])}' $basedir/ftploginip|sort +2 -gr |awk '{printf("\%-41s \%3d\n", $1, $2)}'>>$logfile
    echo " "      >> $logfile
    echo "FTP登入成功帳號"      >> $logfile
    cat $basedir/messageslog | grep "(ftp) session opened for user" | awk '{print $11}' > "$basedir/messagesftp"
    /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ };
         END{ for( course in Number )
         printf( "\%-41s \%3d\n", course, Number[course])}' $basedir/messagesftp|sort +2 -gr|awk '{printf("\%-41s \%3d\n", $1, $2)}'>>$logfile
    echo " "      >> $logfile
    cat $basedir/messageslog|grep "Authentication failure." >$basedir/ftperr
    cat $basedir/messageslog|grep "no such user '" >>$basedir/ftperr
    echo "FTP錯誤登入次數:`cat $basedir/ftperr| wc -l`"|awk '{printf( "\%-41s \%3d\n", $1, $2)}' >> $logfile
    cat $basedir/ftperr|grep "failure."|awk '{print $7 " " $9}'|cut -d'[' -f2|cut -d':' -f1|awk '{print $2 " " $1}'|cut -d'M' -f2|cut -d']' -f1>"$basedir/ftpfail"
    /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ };
         END{ for( course in Number )
         printf( "\%-15s \%3d\n", course, Number[course])}' $basedir/ftpfail|sort +2 -gr|awk '{printf("\%-15s \%-25s \%3d\n", $1, $2, $3)}'>>$logfile
    cat $basedir/ftperr|grep "no such user '"|awk '{print $7 " " $12}'|cut -d'[' -f2|awk '{print $2 " " $1}'|cut -d']' -f1>"$basedir/ftpxusr"
    /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ };
         END{ for( course in Number )
         printf( "\%-15s \%3d\n", course, Number[course])}' $basedir/ftpxusr|sort +2 -gr|awk '{printf("\%-15s \%-25s \%3d\n", $1, $2, $3)}'>>$logfile
    echo " "      >> $logfile
修改歷史:
  • 2002/06/24:第一次完成
  • 2003/02/11:重新編排與加入 FAQ
伺服器篇文件
各版本彙整說明
CentOS 6.x