鸟哥的Linux私房菜(基础篇)- 第十九章、认识与分析登录文件
最近升級日期:2009/09/14
| 當你的 Linux 系統出現不明原因的問題時,很多人都告訴你,你要查閱一下登錄文件才能夠知道系統出了什么問題了,所以說,了解登錄文件是很重要的事情呢。登錄文件可以記錄系統在什么時間、哪個主機、哪個服務、出現了什么信息等資訊,這些資訊也包括使用者識別數據、系統故障排除須知等資訊。如果你能夠善用這些登錄文件資訊的話,你的系統出現錯誤時,你將可以在第一時間發現,而且也能夠從中找到解決的方案,而不是昏頭轉向的亂問人呢。此外,登錄文件所記錄的資訊量是非常大的,要人眼分析實在很困難。此時利用 shell script 或者是其他軟件提供的分析工具來處理復雜的登錄文件,可以幫助你很多很多喔! |
1. 什么是登錄文件:登錄文件的重要性, 常見檔名,服務與程序
2. syslogd :記錄登錄文件的服務
2.1 登錄文件內容的一般格式
2.2 syslog 的配置檔: /etc/syslog.conf, 默認的 syslog.conf 內容
2.3 登錄文件的安全性配置
2.4 登錄文件服務器的配置
3. 登錄文件的輪替 (logrotate)
3.1 logrotate 的配置檔
3.2 實際測試 logrotate 的動作
3.3 自訂登錄文件的輪替功能
4. 分析登錄文件
4.1 CentOS 默認提供的 logwatch
4.2 鳥哥自己寫的登錄文件分析工具:
5. 本章習題練習
6. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23895
什么是登錄文件
『詳細而確實的分析以及備份系統的登錄文件』是一個系統管理員應該要進行的任務之一。那么什么是登錄文件呢?簡單的說,就是記錄系統活動資訊的幾個文件,例如:何時、何地 (來源 IP)、何人 (什么服務名稱)、做了什么動作 (信息登錄羅)。換句話說就是:記錄系統在什么時候由哪個程序做了什么樣的行為時,發生了何種的事件等等。
要知道的是,我們的 Linux 主機在背景之下有相當多的 daemons 同時在工作著,這些工作中的程序總是會顯示一些信息,這些顯示的信息最終會被記載到登錄文件當中啦。也就是說,記錄這些系統的重要信息就是登錄文件的工作啦!
登錄文件的重要性
為什么說登錄文件很重要,重要到系統管理員需要隨時注意他呢?我們可以這么說:
- 解決系統方面的錯誤:
用 Linux 這么久了,你應該偶而會發現系統可能會出現一些錯誤,包括硬件捉不到或者是某些系統程序無法順利運行的情況。此時你該如何是好?由於系統會將硬件偵測過程記錄在登錄文件內,你只要透過查詢登錄文件就能夠了解系統作了啥事!并且由第十七章我們也知道 SELinux 與登錄文件的關系更加的強烈!所以羅,查詢登錄文件可以克服一些系統問題啦!
- 解決網絡服務的問題:
你可能在做完了某些網絡服務的配置后,卻一直無法順利啟動該服務,此時該怎辦?去廟里面拜拜抽簽嗎?三太子大大可能無法告訴你要怎么處理呢!由於網絡服務的各種問題通常都會被寫入特別的登錄文件,其實你只要查詢登錄文件就會知道出了什么差錯,還不需要請示三太子大大啦!舉例來說,如果你無法啟動郵件服務器 (sendmail),那么查詢一下 /var/log/maillog 通常可以得到不錯的解答!
- 過往事件記錄簿:
這個東西相當的重要!例如:你發現 WWW 服務 (apache 軟件) 在某個時刻流量特別大,你想要了解為什么時,可以透過登錄文件去找出該時段是哪些 IP 在連線與查詢的網頁數據為何,就能夠知道原因。此外,萬一哪天你的系統被入侵,并且被利用來攻擊他人的主機,由於被攻擊主機會記錄攻擊者,因此你的 IP 就會被對方記錄。這個時候你要如何告知對方你的主機是由於被入侵所導致的問題,并且協助對方繼續往惡意來源追查呢?呵呵!此時登錄文件可是相當重要的呢!
| Tips: 所以我們常說『天助自助者』是真的啦!你可以透過 (1)察看螢幕上面的錯誤信息與(2)登錄文件的錯誤資訊,幾乎可以解決大部分的 Linux 問題! |
Linux 常見的登錄文件檔名
登錄文件可以幫助我們了解很多系統重要的事件,包括登陸者的部分資訊,因此登錄文件的權限通常是配置為僅有 root 能夠讀取而已。而由於登錄文件可以記載系統這么多的詳細資訊,所以啦,一個有經驗的主機管理員會隨時隨地查閱一下自己的登錄文件,以隨時掌握系統的最新脈動!那么常見的幾個登錄文件有哪些呢?一般而言,有下面幾個:
- /var/log/cron:
還記得第十六章例行性工作排程吧?你的 crontab 排程有沒有實際被進行?進行過程有沒有發生錯誤?你的 /etc/crontab 是否撰寫正確?在這個登錄文件內查詢看看。
- /var/log/dmesg:
記錄系統在啟動的時候核心偵測過程所產生的各項資訊。由於 CentOS 默認將啟動時核心的硬件偵測過程取消顯示,因此額外將數據記錄一份在這個文件中;
- /var/log/lastlog:
可以記錄系統上面所有的帳號最近一次登陸系統時的相關資訊。第十四章講到的 lastlog 命令就是利用這個文件的記錄資訊來顯示的。
- /var/log/maillog 或 /var/log/mail/*:
記錄郵件的往來資訊,其實主要是記錄 sendmail (SMTP 協議提供者) 與 dovecot (POP3 協議提供者) 所產生的信息啦。SMTP 是發信所使用的通訊協議, POP3 則是收信使用的通訊協議。 sendmail 與 dovecot 則分別是兩套達成通訊協議的軟件。
- /var/log/messages:
這個文件相當的重要,幾乎系統發生的錯誤信息 (或者是重要的資訊) 都會記錄在這個文件中;如果系統發生莫名的錯誤時,這個文件是一定要查閱的登錄文件之一。
- /var/log/secure:
基本上,只要牽涉到『需要輸入帳號口令』的軟件,那么當登陸時 (不管登陸正確或錯誤) 都會被記錄在此文件中。包括系統的 login 程序、圖形介面登陸所使用的 gdm 程序、 su, sudo 等程序、還有網絡連線的 ssh, telnet 等程序,登陸資訊都會被記載在這里;
- /var/log/wtmp, /var/log/faillog:
這兩個文件可以記錄正確登陸系統者的帳號資訊 (wtmp) 與錯誤登陸時所使用的帳號資訊 (faillog) !我們在第十一章談到的 last 就是讀取 wtmp 來顯示的,這對於追蹤一般帳號者的使用行為很有幫助!
- /var/log/httpd/*, /var/log/news/*, /var/log/samba/*:
不同的網絡服務會使用它們自己的登錄文件來記載它們自己產生的各項信息!上述的目錄內則是個別服務所制訂的登錄文件。
常見的登錄文件就是這幾個,但是不同的 Linux distributions ,通常登錄文件的檔名不會相同 (除了 /var/log/messages 之外 )。所以說,你還是得要查閱你 Linux 主機上面的登錄文件配置數據,才能知道你的登錄文件主要檔名喔!
登錄文件所需相關服務 (daemon) 與程序
那么這些登錄文件是怎么產生的呢?基本上有兩種方式,一種是由軟件開發商自行定義寫入的登錄文件與相關格式,例如 WWW 軟件 apache 就是這樣處理的。另一種則是由 Linux distribution 提供的登錄文件管理服務來統一管理。你只要將信息丟給這個服務后,他就會自己分門別類的將各種信息放置到相關的登錄文件去!CentOS 提供 syslogd 這個服務來統一管理登錄文件喔!
除了這個 syslogd 之外,我們的核心也需要額外的登錄服務來記錄核心產生的各項資訊,這個專門記錄核心資訊的登錄文件服務就是 klogd 啦。所以說,登錄文件所需的服務主要就是 syslogd與 klogd 這兩者。
不過要注意的是,如果你任憑登錄文件持續記錄的話,由於系統產生的資訊天天都有,那么你的登錄文件的容量將會長大到無法無天~如果你的登錄文件容量太大時,可能會導致大文件讀寫效率不佳的問題 (因為要從磁碟讀入內存,越大的文件消耗內存量越多)。所以羅,你需要對登錄文件備份與升級。那...需要手動處理喔?當然不需要,我們可以透過 logrotate (登錄文件輪替) 這玩意兒來自動化處理登錄文件容量與升級的問題喔!
所謂的 logrotate 基本上,就是將舊的登錄文件更改名稱,然后創建一個空的登錄文件,如此一來,新的登錄文件將重新開始記錄,然后只要將舊的登錄文件留下一陣子,嗯!那就可以達到將登錄文件『輪轉』的目的啦!此外,如果舊的紀錄 (大概要保存幾個月吧!) 保存了一段時間沒有問題,那么就可以讓系統自動的將他砍掉,免得占掉很多寶貴的磁盤空間說!
總結一下,針對登錄文件所需的功能,我們需要的服務與程序有:
- syslogd:主要登錄系統與網絡等服務的信息;
- klogd:主要登錄核心產生的各項資訊;
- logrotate:主要在進行登錄文件的輪替功能。
由於我們著眼點在於想要了解系統上面軟件所產生的各項資訊,因此本章主要針對 syslogd 與 logrotate 來介紹。接著下來我們來談一談怎么樣規劃這兩個玩意兒。就由 syslogd 這支程序先談起吧!畢竟得先有登錄文件,才可以進行logrotate 呀!您說是吧!
syslogd :記錄登錄文件的服務
剛剛提到說 Linux 的登錄文件主要是由 syslogd 在負責,那么你的 Linux是否有啟動 syslogd 呢?而且是否有配置啟動時啟動呢?呵呵!檢查一下先:
| [root@www ~]# ps aux | grep syslog USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 4294 0.0 0.0 1716 568 ? Ss Mar31 0:00 syslogd -m 0 # 瞧!確實有啟動的![root@www ~]# chkconfig --list syslog syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 默認情況下,文字介面與圖形介面 (3, 5) 都有啟動喔! |
看到 syslog 這個服務名稱了吧?所以知道他已經在系統中工作羅!好了,既然本章主要是講登錄文件,那么你知道登錄文件的內容是如何展現的?syslog 的配置檔在哪里?如何配置?如果你的 Linux 主機想要當作整個局域網的登錄文件服務器時,又該如何配置?底下就讓我們來玩玩這玩意!
登錄文件內容的一般格式
一般來說,系統產生的信息經過 syslog 而記錄下來的數據中,每條信息均會記錄底下的幾個重要數據:
- 事件發生的日期與時間;
- 發生此事件的主機名稱;
- 啟動此事件的服務名稱 (如 samba, xinetd 等) 或函式名稱 (如 libpam ..);
- 該信息的實際數據內容。
當然,這些資訊的『詳細度』是可以修改的,而且,這些資訊可以作為系統除錯之用呢!我們拿登錄時一定會記載帳號資訊的 /var/log/secure 為例好了:
| [root@www ~]# cat /var/log/secure 1 Mar 14 15:38:00 www atd[18701]: pam_unix(atd:session): session opened for user root by (uid=0) 2 Mar 14 15:38:00 www atd[18701]: pam_unix(atd:session): session closed foruser root 3 Mar 16 16:01:51 www su: pam_unix(su-l:auth): authentication failure; logname=vbird uid=500 euid=0 tty=pts/1 ruser=vbird rhost= user=root 4 Mar 16 16:01:55 www su: pam_unix(su-l:session): session opened for user root by vbird(uid=500) 5 Mar 16 16:02:22 www su: pam_unix(su-l:session): session closed for user root |--日期/時間---|-H-|-----服務與相關函數-------|--信息說明------> |
我們拿第一筆數據來說明好了,該數據是說:『在三月14日 (Mar 14) 的下午 15:38 分,由 www 這部主機的 atd [PID 為 18701] 傳來的消息,這個消息是透過 pam_unix 這個模塊所提出的。信息內容為 root (uid=0) 這個帳號已經開啟 atd 的活動了。』有夠清楚吧!那請您自行翻譯一下后面的 4 條信息內容是什么喔!
其實還有很多的資訊值得查閱的呢!尤其是 /var/log/messages 的內容。記得一個好的系統管理員,要常常去『巡視』登錄文件的內容喔!尤其是發生底下幾種情況時:
- 當你覺得系統似乎不太正常時;
- 某個 daemon 老是無法正常啟動時;
- 某個使用者老是無法登陸時;
- 某個 daemon 運行過程老是不順暢時;
還有很多啦!反正覺得系統不太正常,就得要查詢查詢登錄文件就是了。
| Tips: 提供一個鳥哥常做的檢查方式。當我老是無法成功的啟動某個服務時,我會在最后一次啟動該服務后,立即檢查登錄文件,先 (1)找到現在時間所登錄的資訊『第一欄位』; (2)找到我想要查詢的那個服務『第三欄位』,(3)最后再仔細的查閱第四欄位的資訊,來藉以找到錯誤點。 |
syslog 的配置檔:/etc/syslog.conf
什么?登錄文件還有配置檔?喔!不是啦~是 syslogd 這個 daemon 的配置檔啦!我們現在知道 syslogd 可以負責主機產生的各個資訊的登錄,而這些資訊本身是有『嚴重等級』之分的,而且,這些數據最終要傳送到哪個文件去是可以修改的呢,所以我們才會在一開頭的地方講說,每個 Linux distributions 放置的登錄文件檔名可能會有所差異啊!
基本上, syslog 針對各種服務與信息記錄在某些文件的配置檔就是 /etc/syslog.conf,這個文件規定了『(1)什么服務 (2)的什么等級信息 (3)需要被記錄在哪里(裝置或文件)』這三個咚咚,所以配置的語法會是這樣:
| 服務名稱[.=!]信息等級 信息記錄的檔名或裝置或主機 # 底下以 mail 這個服務產生的 info 等級為例: mail.info /var/log/maillog_info # 這一行說明:mail 服務產生的大於等於 info 等級的信息,都記錄到 # /var/log/maillog_info 文件中的意思。 |
我們將上面的數據簡單的分為三部分來說明:
- 服務名稱
syslog 本身有規范一些服務,你可以透過這些服務來儲存系統的信息。syslog 認識的服務主要有底下這些:(可使用 man 3 syslog 查詢到相關的資訊)
| 服務類別 | 說明 |
| auth (authpriv) | 主要與認證有關的機制,例如 login, ssh, su 等需要帳號/口令的咚咚; |
| cron | 就是例行性工作排程 cron/at 等產生信息記錄的地方; |
| daemon | 與各個 daemon 有關的信息; |
| kern | 就是核心 (kernel) 產生信息的地方; |
| lpr | 亦即是列印相關的信息啊! |
| 只要與郵件收發有關的信息紀錄都屬於這個; | |
| news | 與新聞群組服務器有關的東西; |
| syslog | 就是 syslogd 這支程序本身產生的資訊啊! |
| user, uucp, local0 ~ local7 | 與 Unix like 機器本身有關的一些信息。 |
上面談到的都是 syslog 自行制訂的服務名稱,軟件開發商可以透過呼叫上述的服務名稱來記錄他們的軟件。舉例來說, sendmail 與 postfix 及 dovecot 都是與郵件有關的軟件,這些軟件在設計登錄文件記錄時,都會主動呼叫 syslogd 內的 mail 服務名稱 (LOG_MAIL),所以上述三個軟件 (sendmail, postfix, dovecot) 產生的信息在 syslog 看起來,就會『是 mail 』類型的服務了。我們可以將這個概念繪制如底下的圖示來理解:
圖 2.2.1、 syslog 所制訂的服務名稱與軟件呼叫的方式
另外,每種服務所產生的數據量其實差異是很大的,舉例來說, mail 的登錄文件信息多的要命,每一封信件進入后, mail 至少需要記錄『寄信人的資訊;與收信者的信息』等等;而如果是用來做為工作站主機的,那么登陸者 (利用 login 登錄主機處理事情)的數量一定不少,那個 authpriv 所管轄的內容可就多的要命了。
為了讓不同的資訊放置到不同的文件當中,好讓我們分門別類的進行登錄文件的管理,所以羅,將各種類別的服務之登錄文件,記錄在不同的文件里面,就是我們 /etc/syslog.conf 所要作的規范了!
- 信息等級
同一個服務所產生的信息也是有差別的,有啟動時僅通知系統而已的一般信息 (information),有出現還不至於影響到正常運行的警告信息 (warn) ,還有系統硬件發生嚴重錯誤時,所產生的重大問題信息 (error 等等);信息到底有多少種嚴重的等級呢?基本上,syslog 將信息分為七個主要的等級,依序是這樣的(由不重要排列到重要信息等級):
| 等級 | 等級名稱 | 說明 |
| 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 這個打印機裝置
- 使用者名稱:顯示給使用者羅!
- 遠程主機:例如 @www.vbird.tsai 當然啦,要對方主機也能支持才行!
- *:代表『目前在線上的所有人』,類似 wall 這個命令的意義!
- syslog.conf 語法練習
基本上,整個 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 中,那該如何配置我的 syslog.conf 呢? 答: 很簡單啦!既然是兩個程序,那么只好以分號來隔開了,此外,由於第二個指定文件中,我只要記錄警告信息,因此配置上需要指定『.=』這個符號,所以語法成為了: news.*;cron.* /var/log/cronnews news.=warn;cron.=warn /var/log/cronnews.warn 上面那個『.=』就是在指定等級的意思啦!由於指定了等級,因此,只有這個等級的信息才會被紀錄在這個文件里面呢!此外你也必須要注意,news 與 cron 的警告信息也會寫入 /var/log/cronnews 內喔! |
| 例題: 我的 messages 這個文件需要記錄所有的資訊,但是就是不想要記錄 cron, mail 及 news 的資訊,那么應該怎么寫才好? 答: 可以有兩種寫法,分別是: *.*;news,cron,mail.none /var/log/messages *.*;news.none;cron.none;mail.none /var/log/messages 使用『,』分隔時,那么等級只要接在最后一個即可,如果是以『;』來分的話,那么就需要將服務與等級都寫上去羅!這樣會配置了吧! |
- CentOS 5.x 默認的 syslog.conf 內容
了解語法之后,我們來看一看 syslog 有哪些系統服務已經在記錄了呢?就是瞧一瞧 /etc/syslog.conf 這個文件的默認內容羅!(注意!如果需要將該行做為注解時,那么就加上 # 符號就可以啦)
| # 來自 CentOS 5.x 的相關數據 [root@www ~]# vim /etc/syslog.conf 1 #kern.* /dev/console 2 *.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages 3 authpriv.* /var/log/secure 4 mail.* -/var/log/maillog 5 cron.* /var/log/cron 6 *.emerg * 7 uucp,news.crit /var/log/spooler 8 local7.* /var/log/boot.log 9 news.=crit /var/log/news/news.crit 10 news.=err /var/log/news/news.err 11 news.notice /var/log/news/news.notice |
上面總共僅有十一行配置值,每一行的意義是這樣的:
在上面的第四行關於 mail 的記錄中,在記錄的文件 /var/log/maillog 前面還有個減號『 - 』是干嘛用的?由於郵件所產生的信息比較多,因此我們希望郵件產生的信息先儲存在速度較快的內存中 (buffer) ,等到數據量夠大了才一次性的將所有數據都填入磁碟內,這樣將有助於登錄文件的存取性能。只不過由於信息是緩存在內存內,因此若不正常關機導致登錄資訊未回填到登錄文件中,可能會造成部分數據的遺失。
此外,每個 Linux distributions 的 syslog.conf 配置差異是頗大的,如果你想要找到相對應的登錄資訊時,可得要查閱一下 /etc/syslog.conf 這個文件才行!否則可能會發生分析到錯誤的資訊喔!舉例來說,鳥哥有自己寫一支分析登錄文件的 script,這個 script 是依據 Red Hat 系統默認的登錄文件所寫的,因此不同的 distributions 想要使用這支程序時,就得要自行設計與修改一下 /etc/syslog.conf 才行喔!否則就可能會分析到錯誤的資訊羅。那么如果你有自己的需要而得要修訂登錄文件時,該如何進行?
- 自行添加登錄文件文件功能
如果你有其他的需求,所以需要特殊的文件來幫你記錄時,呵呵!別客氣,千萬給他記錄在/etc/syslog.conf 當中,如此一來,你就可以重復的將許多的資訊記錄在不同的文件當中,以方便你的管理呢!讓我們來作個練習題吧!如果你想要讓『所有的資訊』都額外寫入到 /var/log/admin.log 這個文件時,你可以怎么作呢?先自己想一想,并且作一下,再來看看底下的作法啦!
| # 1. 先配置好所要創建的文件配置! [root@www ~]# vim /etc/syslog.conf # Add by VBird 2009/04/08 <==再次強調,自己修改的時候加入一些說明 *.info /var/log/admin.log <==有用的是這行啦!# 2. 重新啟動 syslog 呢! [root@www ~]# /etc/init.d/syslog restart [root@www ~]# ll /var/log/admin.log -rw------- 1 root root 118 Apr 8 13:50 /var/log/admin.log # 瞧吧!創建了這個登錄文件出現羅! |
很簡單吧!如此一來,所有的資訊都會寫入 /var/log/admin.log 里面了!
登錄文件的安全性配置
好了,由上一個小節里面我們知道了 syslog.conf 的配置,也知道了登錄文件內容的重要性了,所以,如果幻想你是一個很厲害的黑客,想利用他人的計算機干壞事,然后又不想留下證據,你會怎么作?對啦!就是離開的時候將屁股擦干凈,將所有可能的信息都給他抹煞掉,所以第一個動腦筋的地方就是登錄文件的清除工作啦~如果你的登錄文件不見了,那該怎辦?
| Tips: 哇!鳥哥教人家干壞事……喂!不要亂講話~俺的意思是,如果改天你發現你的登錄文件不翼而飛了,或者是發現你的登錄文件似乎不太對勁的時候,最常發現的就是網友常常會回報說,他的/var/log 這個目錄『不見了!』不要笑!這是真的事情!請記得,『趕快清查你的系統!』 |
傷腦筋呢!有沒有辦法防止登錄文件被刪除?或者是被 root 自己不小心變更呢?有呀!拔掉網絡線或電源線就好了……呵呵!別擔心,基本上,我們可以透過一個隱藏的屬性來配置你的登錄文件,成為『只可以添加數據,但是不能被刪除』的狀態,那么或許可以達到些許的保護!不過,如果你的root 帳號被破解了,那么底下的配置還是無法保護的,因為你要記得『 root是可以在系統上面進行任何事情的 』,因此,請將你的 root 這個帳號的口令配置的安全一些!千萬不要輕忽這個問題呢!
| Tips: 為什么登錄文件還要防止被自己 (root) 不小心所修改過呢?鳥哥在教 Linux 的課程時,我的學生常常會舉手說:『老師,我的登錄文件不能記錄資訊了!糟糕!是不是被入侵了啊?』怪怪!明明是計算機教室的主機,使用的是 Private IP 而且學校計中還有抵擋機制,不可能被攻擊吧?查詢了才知道原來同學很喜歡使用『 :wq 』來離開 vim 的環境,但是 syslog 的登錄文件只要『被編輯過』就無法繼續記錄!所以才會導致不能記錄的問題。此時你得要 (1)改變使用 vim 的習慣; (2)重新啟動 syslog 讓他再繼續提供服務才行喔! |
既然如此,那么我們就來處理一下隱藏屬性的東東吧!我們在第七章談到過 lsattr與 chattr這兩個東西啦!如果將一個文件以 chattr 配置 i 這個屬性時,那么該文件連 root都不能殺掉!而且也不能新增數據,嗯!真安全!但是,如此一來登錄文件的功能豈不是也就消失了?因為沒有辦法寫入呀!所以羅,我們要使用的是a 這個屬性!你的登錄文件如果配置了這個屬性的話,那么他將只能被添加,而不能被刪除!嗯!這個項目就非常的符合我們登錄文件的需求啦!因此,你可以這樣的添加你的登錄文件的隱藏屬性。
| Tips: 請注意,底下的這個 chattr 的配置狀態:『僅適合已經對 Linux 系統很有概念的朋友』來配置,對於新手來說,建議你直接使用系統的默認值就好了,免得到最后登錄文件無法寫入~那就比較糗一點! @_@ |
| [root@www ~]# chattr +a /var/log/messages [root@www ~]# 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@www ~]# chattr -a /var/log/messages |
登錄文件服務器的配置
我們在之前稍微提到的,在 syslog.conf 文件當中,可以將登錄數據傳送到打印機或者是遠程主機上面去。這樣做有什么意義呢?如果你將登錄資訊直接傳送到打印機上面的話,那么萬一不小心你的系統被 cracker 所入侵,他也將你的 /var/log/ 砍掉了,怎么辦?沒關系啊!反正你已經將重要數據直接以打印機記錄起來了,嘿嘿!他是無法逃開的啦!^_^
再想像一個環境,你的辦公室內有十部 Linux 主機,每一部負責一個網絡服務,你為了要了解每部主機的狀態,因此,你常常需要登陸這十部主機去查閱你的登錄文件~哇!光用想的,每天要進入十部主機去查數據,想到就煩~沒關系~這個時候我們可以讓某一部主機當成『登錄文件服務器』,用他來記錄所有的十部 linux 主機的資訊,嘿嘿!這樣我就直接進入一部主機就可以了!省時又省事,真方便~
那要怎么達到這樣的功能呢?很簡單啦,我們 CentOS 5.x 默認的 syslog 本身就已經具有這個登錄文件服務器的功能了,只是默認并沒有啟動該功能而已。你可以透過 man syslogd 去查詢一下相關的選項就能夠知道啦!既然是登錄文件服務器,那么我們的 Linux 主機當然會啟動一個端口來監聽了,那個默認的端口就是 UDP 的 514 喔!
圖 2.4.1、登錄文件服務器的架構
如上圖所示,服務器會啟動監聽的端口,用戶端則將登錄文件再轉出一份送到服務器去。而既然是登錄文件『服務器』,所以當然有服務器與用戶端 (client) 羅!這兩者的配置分別是這樣的:
| # 1. Server 端:修改 syslogd 的啟動配置檔,通常在 /etc/sysconfig 內! [root@www ~]# vim /etc/sysconfig/syslog # 找到底下這一行: SYSLOGD_OPTIONS="-m 0" # 改成底下這樣子! SYSLOGD_OPTIONS="-m 0 -r"# 2. 重新啟動與觀察 syslogd 喔! [root@www ~]# /etc/init.d/syslog restart [root@www ~]# netstat -lunp | grep syslog 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:* 13981/syslogd # 嘿嘿!你的登錄文件主機已經配置妥當羅!很簡單吧! |
透過這個簡單的動作,你的 Linux 主機已經可以接收來自其他主機的登錄資訊了!當然啦,你必須要知道網絡方面的相關基礎,這里鳥哥只是先介紹,未來了解了網絡相關資訊后,再回頭來這里瞧一瞧先! ^_^
至於 client 端的配置就簡單多了!只要指定某個資訊傳送到這部主機即可!舉例來說,我們的登錄文件服務器 IP 為 192.168.1.100 ,而 client 端希望所有的數據都送給主機,所以,可以在 /etc/syslog.conf 里面新增這樣的一行:
| [root@www ~]# vim /etc/syslog.conf *.* @192.168.1.100 |
再重新啟動 syslog 后,立刻就搞定了!而未來主機上面的登錄文件當中,每一行的『主機名稱』就會顯示來自不同主機的資訊了。很簡單吧! ^_^。接下來,讓我們來談一談,那么如何針對登錄文件來進行輪轉 (rotate) 呢?
登錄文件的輪替(logrotate)
假設我們已經將登錄數據寫入了記錄檔中了,也已經利用 chattr 配置了 +a 這個屬性了,那么該如何進行logrotate 的工作呢?這里請特別留意的是:『syslog 利用的是 daemon 的方式來啟動的,當有需求的時候立刻就會被運行的,但是 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 的主要功能就是將舊的登錄文件移動成舊檔,并且重新創建一個新的空的文件來記錄,他的運行結果有點類似底下的圖示:
圖 3.1.1、 登錄文件進行 logrotate 的結果
由上面的圖示我們可以清楚的知道,當第一次運行完 rotate 之后,原本的 messages 會變成 messages.1而且會制造一個空的 messages 給系統來儲存登錄文件。而第二次運行之后,則 messages.1 會變成messages.2 而 messages 會變成 messages.1 ,又造成一個空的 messages 來儲存登錄文件!那么如果我們僅配置保留三個登錄文件而已的話,那么運行第四次時,則messages.3 這個文件就會被刪除,并由后面的較新的保存登錄文件所取代!基本的工作就是這樣啦!
那么多久進行一次這樣的 logrotate 工作呢?這些都記錄在 logrotate.conf 里面,我們來看一下默認的 logrotate 的內容吧!
| [root@www ~]# vim /etc/logrotate.conf # 底下的配置是 "logrotate 的默認配置值" ,如果個別的文件配置了其他的參數, # 則將以個別的文件配置為主,若該文件沒有配置到的參數則以這個文件的內容為默認值!weekly <==默認每個禮拜對登錄文件進行一次 rotate 的工作 rotate 4 <==保留幾個登錄文件呢?默認是保留四個! create <==由於登錄文件被更名,因此創建一個新的來繼續儲存之意! #compress <==被更動的登錄文件是否需要壓縮?如果登錄文件太大則可考慮此參數啟動include /etc/logrotate.d # 將 /etc/logrotate.d/ 這個目錄中的所有文件都讀進來運行 rotate 的工作!/var/log/wtmp { <==僅針對 /var/log/wtmp 所配置的參數monthly <==每個月一次,取代每周!minsize 1M <==文件容量一定要超過 1M 后才進行 rotate (略過時間參數)create 0664 root utmp <==指定新建文件的權限與所屬帳號/群組rotate 1 <==僅保留一個,亦即僅有 wtmp.1 保留而已。 } # 這個 wtmp 可記錄登陸者與系統重新啟動時的時間與來源主機及登陸期間的時間。 # 由於具有 minsize 的參數,因此不見得每個月一定會進行一次喔!要看文件容量。 # 由於僅保留一個登錄文件而已,不滿意的話可以將他改成 rotate 5 吧! |
由這個文件的配置我們可以知道 /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 這個文件的配置,現在你知道了 logrotate.conf 的配置語法是:
| 登錄文件的絕對路徑檔名 ... {個別的參數配置值,如 monthly, compress 等等 } |
底下我們再以 /etc/logrotate.d/syslog 這個輪替 syslog 服務的文件,來看看該如何配置他的 rotate 呢?
| [root@www ~]# vi /etc/logrotate.d/syslog /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \ /var/log/boot.log /var/log/cron {sharedscriptspostrotate/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || trueendscript } |
在上面的語法當中,我們知道正確的 logrotate 的寫法為:
- 檔名:被處理的登錄文件絕對路徑檔名寫在前面,可以使用空白字節分隔多個登錄文件;
- 參數:上述檔名進行輪替的參數使用 { } 包括起來;
- 運行腳本:可呼叫外部命令來進行額外的命令下達,這個配置需與 sharedscripts .... endscript 配置合用才行。至於可用的環境為:
- prerotate:在啟動 logrotate 之前進行的命令,例如修改登錄文件的屬性等動作;
- postrotate:在做完 logrotate 之后啟動的命令,例如重新啟動(kill -HUP) 某個服務!
- Prerotate 與 postrotate 對於已加上特殊屬性的文件處理上面,是相當重要的運行程序!
那么 /etc/logrotate.d/syslog 內配置的六個文件的輪替功能就變成了:
- 該配置只對 /var/log/ 內的 messages, secure, maillog, spooler, boot.log, cron 有效;
- 登錄文件輪替每周一次、保留四個、且輪替下來的登錄文件不進行壓縮(未更改默認值);
- 輪替完畢后 (postrotate) 取得 syslog 的 PID 后,以 kill -HUP 重新啟動 syslogd
假設我們有針對 /var/log/messages 這個文件添加 chattr +a 的屬性時,依據 logrotate 的工作原理,我們知道,這個 /var/log/messages 將會被更名成為 /var/log/messages.1 才是。但是由於加上這個 +a 的參數啊,所以更名是不可能成功的!那怎么辦呢?呵呵!就利用 prerotate 與 postrotate 來進行登錄文件輪替前、后所需要作的動作啊!果真如此時,那么你可以這樣修改一下這個文件喔!
| [root@www ~]# vi /etc/logrotate.d/syslog /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \ /var/log/boot.log /var/log/cron {sharedscriptsprerotate/usr/bin/chattr -a /var/log/messagesendscriptsharedscriptspostrotate/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true/usr/bin/chattr +a /var/log/messagesendscript } |
看到否?就是先給他去掉 a 這個屬性,讓登錄文件 /var/log/messages 可以進行輪替的動作,然后運行了輪替之后,再給他加入這個屬性!請特別留意的是,那個/bin/kill -HUP ... 的意義,這一行的目的在於將系統的 syslogd重新以其參數檔 (syslog.conf) 的數據讀入一次!也可以想成是 reload 的意思啦!由於我們創建了一個新的空的紀錄檔,如果不運行此一行來重新啟動服務的話,那么記錄的時候將會發生錯誤呦!(請回到第十七章讀一下kill 后面的 signal 的內容說明)
實際測試 logrotate 的動作
好了,配置完成之后,我們來測試看看這樣的配置是否可行呢?給他運行底下的命令:
| [root@www ~]# logrotate [-vf] logfile 選項與參數: -v :啟動顯示模式,會顯示 logrotate 運行的過程喔! -f :不論是否符合配置檔的數據,強制每個登錄文件都進行 rotate 的動作!范例一:運行一次 logrotate 看看整個流程為何? [root@www ~]# logrotate -v /etc/logrotate.conf reading config file /etc/logrotate.conf <==讀取主要配置檔 including /etc/logrotate.d <==呼叫外部的配置 reading config file acpid <==就是外部配置啊! ....(中間省略).... Handling 21 logs <==共有 21 個登錄文件被記錄 ....(中間省略).... rotating pattern: /var/log/messages /var/log/secure /var/log/maillog \ /var/log/spooler /var/log/boot.log /var/log/cron weekly (4 rotations) empty log files are rotated, old logs are removed considering log /var/log/messages <==開始處理 messageslog does not need rotating <==因為時間未到,不需要更動! ....(底下省略)....范例二:強制進行 logrotate 的動作 [root@www ~]# logrotate -vf /etc/logrotate.conf ....(前面省略).... rotating log /var/log/messages, log->rotateCount is 4 renaming /var/log/messages.4 to /var/log/messages.5 (rotatecount 4, logstart 1, i 4), renaming /var/log/messages.3 to /var/log/messages.4 (rotatecount 4, logstart 1, i 3), renaming /var/log/messages.2 to /var/log/messages.3 (rotatecount 4, logstart 1, i 2), renaming /var/log/messages.1 to /var/log/messages.2 (rotatecount 4, logstart 1, i 1), renaming /var/log/messages.0 to /var/log/messages.1 (rotatecount 4, logstart 1, i 0), old log /var/log/messages.0 does not exist ....(底下省略).... # 看到否?整個 rotate 的動作就是這樣一步一步進行的~[root@www ~]# ll /var/log/messages*; lsattr /var/log/messages -rw------- 1 root root 63 Apr 8 15:19 /var/log/messages -rw------- 1 root root 670 Apr 8 14:22 /var/log/messages.1 -rw------- 1 root root 24984 Apr 1 19:26 /var/log/messages.2 -rw------- 1 root root 1911 Mar 28 11:32 /var/log/messages.3 -rw------- 1 root root 25193 Mar 22 04:02 /var/log/messages.4 -----a------- /var/log/messages <==主動加入 a 的隱藏屬性羅! |
上面那個 -f 具有『強制運行』的意思,如果一切的配置都沒有問題的話,那么理論上,你的/var/log 這個目錄就會起變化羅!而且應該不會出現錯誤信息才對!嘿嘿!這樣就OK 了!很棒不是嗎?!
由於 logrotate 的工作已經加入 crontab 里頭了!所以現在每天系統都會自動的給他查看logrotate 羅!不用擔心的啦!只是要注意一下那個 /var/log/messages 里頭是否常常有類似底下的字眼:
Apr 8 15:19:47 www syslogd 1.4.1: restart (remote reception).這說明的是 syslogd 重新啟動的時間啦 (就是因為 /etc/logrotate.d/syslog 的配置之緣故!)底下我們來進行一些例題的練習,讓你更詳細的了解 logrotate 的功用啊!
自訂登錄文件的輪替功能
假設前提是這樣的,前一小節當中,假設你已經創建了 /var/log/admin.log 這個文件,現在,你想要將該文件加上 +a 這個隱藏標簽,而且配置底下的相關資訊:
- 登錄文件輪替一個月進行一次;
- 該登錄文件若大於 10MB 時,則主動進行輪替,不需要考慮一個月的期限;
- 保存五個備份文件;
- 備份文件需要壓縮
那你可以怎么樣配置呢?呵呵~很簡單啊!看看底下的動作吧!
| # 1. 先創建 +a 這個屬性啊! [root@www ~]# chattr +a /var/log/admin.log [root@www ~]# lsattr /var/log/admin.log -----a------- /var/log/admin.log [root@www ~]# mv /var/log/admin.log /var/log/admin.log.1 mv: cannot move `/var/log/admin.log' to `/var/log/admin.log.1': Operation not permitted # 這里確定了加入 a 的隱藏屬性!所以 root 無法移動此登錄文件!# 2. 開始創建 logrotate 的配置檔,添加一個文件在 /etc/logrotate.d 內就對了! [root@www ~]# vi /etc/logrotate.d/admin # This configuration is from VBird 2009/04/08 /var/log/admin.log {monthly <==每個月進行一次size=10M <==文件容量大於 10M 則開始處置rotate 5 <==保留五個!compress <==進行壓縮工作!sharedscriptsprerotate/usr/bin/chattr -a /var/log/admin.logendscriptsharedscriptspostrotate/usr/bin/killall -HUP syslogd/usr/bin/chattr +a /var/log/admin.logendscript }# 3. 測試一下 logrotate 相關功能的資訊顯示: [root@www ~]# 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.loglog does not need rotating not running prerotate script, since no logs will be rotated not running postrotate script, since no logs were rotated ....(底下省略).... # 因為還不足一個月,文件也沒有大於 10M,所以不需進行輪替!# 4. 測試一下強制 logrotate 與相關功能的資訊顯示: [root@www ~]# logrotate -vf /etc/logrotate.d/admin reading config file /etc/logrotate.d/admin reading config info for /var/log/admin.logHandling 1 logsrotating 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.loglog needs rotating rotating log /var/log/admin.log, log->rotateCount is 5 renaming /var/log/admin.log.5.gz to /var/log/admin.log.6.gz (rotatecount 5, logstart 1, i 5), old log /var/log/admin.log.5.gz does not exist renaming /var/log/admin.log.4.gz to /var/log/admin.log.5.gz (rotatecount 5, logstart 1, i 4), old log /var/log/admin.log.4.gz does not exist renaming /var/log/admin.log.3.gz to /var/log/admin.log.4.gz (rotatecount 5, logstart 1, i 3), old log /var/log/admin.log.3.gz does not exist renaming /var/log/admin.log.2.gz to /var/log/admin.log.3.gz (rotatecount 5, logstart 1, i 2), old log /var/log/admin.log.2.gz does not exist renaming /var/log/admin.log.1.gz to /var/log/admin.log.2.gz (rotatecount 5, logstart 1, i 1), old log /var/log/admin.log.1.gz does not exist renaming /var/log/admin.log.0.gz to /var/log/admin.log.1.gz (rotatecount 5, logstart 1, i 0), old log /var/log/admin.log.0.gz does not exist log /var/log/admin.log.6.gz doesn't exist -- won't try to dispose of it running prerotate script renaming /var/log/admin.log to /var/log/admin.log.1 running postrotate script compressing log with: /bin/gzip[root@www ~]# lsattr /var/log/admin.log* -----a------- /var/log/admin.log ------------- /var/log/admin.log.1.gz <==有壓縮過喔! |
看到了嗎?透過這個方式,我們可以創建起屬於自己的 logrotate 配置文件,很簡便吧!尤其是要注意的, /etc/syslog.conf 與 /etc/logrotate.d/* 文件常常要搭配起來,例如剛剛我們提到的兩個案例中所創建的 /var/log/admin.log就是一個很好的例子~創建后,還要使用 logrotate 來輪替啊! ^_^
分析登錄文件
登錄文件的分析是很重要的!你可以自行以 vi 進入登錄文件去查閱相關的資訊。而系統也提供一些軟件可以讓你從登錄文件中取得數據,例如之前談過的 last, lastlog, dmesg 等等命令。不過,這些數據畢竟都非常的分散,如果你想要一口氣讀取所有的登錄資訊,其實有點困擾的。不過,好在 CentOS 有提供 logwatch 這個登錄文件分析程序,你可以藉由該程序來了解登錄文件資訊。此外,鳥哥也依據 Red Hat 系統的 syslog 寫了一支小程序給大家使用喔!
CentOS 默認提供的 logwatch
雖然有一些有用的系統命令,不過,要了解系統的狀態,還是得要分析整個登錄文件才行~事實上,目前已經有相當多的登錄文件分析工具,例如 CentOS 5.x 上面默認的 logwatch 這個套件所提供的分析工具,他會每天分析一次登錄文件,并且將數據以 email 的格式寄送給 root 呢!你也可以直接到 logwatch 的官方網站上面看看:
- http://www.logwatch.org/
logwatch 分析的結果如下所示:
| [root@www ~]# mail Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/root": 433 messages 433 new >N 1 logwatch@www.vbird.t Fri Sep 5 11:42 43/1542 "Logwatch for www.vbird.tsai (Linux)"N 2 logwatch@www.vbird.t Sat Sep 6 15:34 92/2709 "Logwatch for www.vbird.tsai (Linux)"N 3 logwatch@www.vbird.t Mon Sep 8 15:26 43/1542 "Logwatch for www.vbird.tsai (Linux)" ....(中間省略)....N431 logwatch@www.vbird.t Wed Apr 8 04:02 53/1772 "Logwatch for www.vbird.tsai (Linux)" & 431 Message 431: From root@www.vbird.tsai Wed Apr 8 04:02:05 2009 Date: Wed, 8 Apr 2009 04:02:05 +0800 To: root@www.vbird.tsai From: logwatch@www.vbird.tsai Subject: Logwatch for www.vbird.tsai (Linux) MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="iso-8859-1"# 先會說明分析的日期與相關的分析期間!################### Logwatch 7.3 (03/24/06) ####################Processing Initiated: Wed Apr 8 04:02:05 2009Date Range Processed: yesterday( 2009-Apr-07 )Period is day.Detail Level of Output: 0Type of Output: unformattedLogfiles for Host: www.vbird.tsai################################################################### 底下則是依據各種服務來進行各項分析!先是登陸者的 ssh 服務分析--------------------- SSHD Begin ------------------------Users logging in through sshd:root:192.168.100.101: 1 time192.168.100.254: 1 time---------------------- SSHD End -------------------------# 磁碟容量分析!可以避免你的系統使用過量磁碟,導致的系統不穩問題!--------------------- Disk Space Begin ------------------------Filesystem Size Used Avail Use% Mounted on/dev/hda2 9.5G 3.8G 5.3G 42% //dev/hda3 4.8G 1.1G 3.5G 23% /home/dev/hda1 99M 21M 73M 23% /boot---------------------- Disk Space End -------------------------###################### Logwatch End ######################### |
由於鳥哥的測試用主機尚未啟動許多服務,所以分析的項目很少。若你的系統已經啟動許多服務的話,那么分析的項目理應會多很多才對。
鳥哥自己寫的登錄文件分析工具:
雖然已經有了類似 logwatch 的工具,但是鳥哥自己想要分析的數據畢竟與對方不同~所以羅,鳥哥就自己寫了一支小程序 (shell script 的語法) 用來分析自己的登錄文件,這支程序分析的登錄文件數據其實是固定的,包括有:
- /var/log/secure
- /var/log/messages
- /var/log/maillog
當然啦,還不只這些啦,包括各個主要常見的服務,如 pop3, mail, ftp, su 等會使用到 pam 的服務,都可以透過鳥哥寫的這個小程序來分析與處理呢~整個數據還會輸出一些系統資訊。如果你想要使用這個程序的話,歡迎下載:
- http://vbird.dic.ksu.edu.tw/download/index.php?action=detail&fileid=69
安裝的方法也很簡單,只要將上述文件下載并解壓縮后,就會得到一個名為 logfile 的目錄,將此目錄移動到 /usr/local/virus/ 目錄下并修改一下: /usr/local/virus/logfile.sh 文件,里面的 email 與相關的資訊只要修改一下,你就可以使用啦~啊!還要記得,將這支程序的運行寫入 /etc/crontab 當中喔!可以在每天的 12:10am 運行這支小程序啦! ^_^
| [root@www ~]# mkdir /usr/local/virus [root@www ~]# tar -zxvf logfile-0.1-4-2.tgz -C /usr/local/virus [root@www ~]# cd /usr/local/virus/logfile [root@www ~]# vi logfile.sh email="root@localhost" <==大約在 93 行左右,請填入你的 email ,否則保留默認值 basedir="/usr/local/virus/logfile" <==保留默認值,除非你的運行目錄不同與此![root@www ~]# sh logfile.sh # 開始嘗試分析系統的登錄文件,依據你的登錄文件大小,分析的時間不固定![root@www ~]# vi /etc/crontab 10 0 * * * root /usr/local/virus/logfile/logfile.sh # 添加這一行!讓系統在每天的凌晨自己進行登錄文件分析![root@www ~]# mail # 自己找到剛剛輸出的結果,該結果的輸出有點像底下這樣:# 先進行程序的宣告!你也可以在底下的連結找到一些錯誤回報! ########################################################## 歡迎使用本程序來查驗您的登錄文件 本程序目前版本為: Version 0.1-4-2 程序最后升級日期為: 2006-09-22 若在您的系統中發現本程序有問題, 歡迎與我聯絡! 鳥哥的首頁 http://linux.vbird.org 問題回報: http://phorum.vbird.org/viewtopic.php?t=3425 ########################################################### 先看看你的硬件與操作系統的相關情況,尤其是 partition 的使用量更需要隨時注意! =============== 系統匯整 ================================= 核心版本 : Linux version 2.6.18-92.el5 (mockbuild@builder16.centos.org) CPU 資訊 : Intel(R) Celeron(TM) CPU: 1200.062 MHz 主機名稱 : www.vbird.tsai 統計日期 : 2009/April/08 17:00:59 ( Wednesday ) 分析的日期: Apr 8 已啟動期間: 7 days, 22:46, 目前主機掛載的 partitionsFilesystem Size Used Avail Use% Mounted on/dev/hda2 9.5G 3.8G 5.3G 42% //dev/hda3 4.8G 1.1G 3.5G 23% /home/dev/hda1 99M 21M 73M 23% /boottmpfs 363M 0 363M 0% /dev/shm# 這個程序會將針對 internet 與內部監聽的端口分開來顯示! ================= Ports 的相關分析資訊 ======================= 主機激活的 port 與相關的 process owner: 僅對本機介面開放的 ports (PID|owner|command)tcp 25|(root)|sendmail: accepting connectionstcp 631|(root)|cupsdtcp 2207|(root)|python ./hpssd.pytcp 2208|(root)|./hpiod 對外部介面開放的 ports (PID|owner|command)tcp 22|(root)|/usr/sbin/sshdtcp 111|(rpc)|portmaptcp 737|(root)|rpc.statdudp 111|(rpc)|portmapudp 514|(root)|syslogd -m 0 -rudp 631|(root)|cupsdudp 731|(root)|rpc.statdudp 734|(root)|rpc.statdudp 5353|(avahi)|avahi-daemon: running [www.local]udp 32768|(avahi)|avahi-daemon: running [www.local]udp 32769|(avahi)|avahi-daemon: running [www.local]# 以下針對有啟動的服務個別進行分析! ================= SSH 的登錄文件資訊匯整 ======================= 今日沒有使用 SSH 的紀錄================= Sednamil 的登錄文件資訊匯整 ================== 您的主機有進行 SASL 身份認證的功能今日沒有 sendmail 的相關資訊================= 全部的登錄文件資訊匯整 ======================= 1. 重要的登錄記錄檔 ( Secure file )說明:已經取消了 pop3 的資訊! Apr 8 15:46:22 www su: session opened for user vbird by root(uid=0) Apr 8 15:47:02 www su: session closed for user vbird2. 使用 last 這個命令輸出的結果wtmp begins Wed Apr 8 15:19:47 20093. 將特重要的 /var/log/messages 列出來瞧瞧!已經取消 crond 與 snmpd 的信息 Apr 8 15:19:47 www syslogd 1.4.1: restart (remote reception). Apr 8 15:34:25 www syslogd 1.4.1: restart (remote reception). |
目前鳥哥都是透過這支程序去分析自己管理的主機,然后再據以了解系統狀況,如果有特殊狀況則即時進行系統處理!而且鳥哥都是將上述的 email 調整成自己可以在 Internet 上面讀到的郵件,這樣我每天都可以收到正確的登錄文件分析資訊哩!
重點回顧
- 登錄文件可以記錄一個事件的何時、何地、何人、何事等四大資訊,故系統有問題時務必查詢登錄文件;
- 系統的登錄文件默認都集中放置到 /var/log/ 目錄內,其中又以 messages 記錄的資訊最多!
- 登錄文件記錄的主要服務與程序為: syslogd, klogd, log
- syslogd 的配置檔在 /etc/syslog.conf ,內容語法為:『 服務.等級 記載裝置或文件』
- syslogd 本身有提供登錄文件服務器的功能,透過修改 /etc/sysconfig/syslog 內容即可達成;
- logrotate 程序利用 crontab 來進行登錄文件的輪替功能;
- logrotate 的配置檔為 /etc/logrotate.conf ,而額外的配置則可寫入 /etc/logrotate.d/* 內;
- logwatch 為 CentOS 5 默認提供的一個登錄文件分析軟件。
本章習題
( 要看答案請將鼠標移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 ) 實作題:
- 請在你的 CentOS 5.x 上面,依照鳥哥提供的 logfile.sh 去安裝,并將結果取出分析看看。
簡答題部分:
- syslogd 可以作為登錄文件服務器,請以 man page 的方式配合 network 關鍵字,查出 syslogd 需要加上什么選項就能夠成為登錄文件服務器? 透過 man syslogd ,查詢到 -r 的選項。
- 如果你想要將 auth 這個服務的結果中,只要信息等級高於 warn 就給予發送 email 到 root 的信箱,該如何處理? 利用 vim 去編輯 /etc/syslog.conf 文件,內容為
auth.warn root - 啟動系統登錄資訊時,需要啟動哪兩個 daemon 呢? syslogd 記錄系統軟件, klogd 記錄核心資訊。
- syslogd 以及 logrotate 個別透過什么機制來運行? syslogd 為 stand alone daemon 的機制; logrotate 則是透過 crontab 來運行的!只是個命令而已。
參考數據與延伸閱讀
- 注1:關於 console 的說明可以參考底下的連結:
http://en.wikipedia.org/wiki/Console
http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.files/doc/aixfiles/console.htm - 關於 logfile 也有網友提供英文版喔!我將他放置到:http://vbird.dic.ksu.edu.tw//download/vbird/logfile_en.txt
2002/06/24:第一次完成
2003/02/11:重新編排與加入 FAQ
2005/10/12:舊的文章已經被移動到 此處。
2005/10/24:終於寫完了~啊!怎么寫這么久??
2006/07/23:修改了 /etc/logrotate.d/syslog 的配置數據
2009/03/31:將舊的基於 FC4 版本的數據移動至 此處
2009/09/14:加入了一些例題而已。這一篇太簡單了~想不到什么好的題目說~
2010/12/24:感謝網友 eujiang 提供的英文版 logfile.sh 程序喔!
出處:http://vbird.dic.ksu.edu.tw/linux_basic/0570syslog.php
總結
以上是生活随笔為你收集整理的鸟哥的Linux私房菜(基础篇)- 第十九章、认识与分析登录文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸟哥的Linux私房菜(基础篇)- 第十
- 下一篇: 鸟哥的Linux私房菜(基础篇)- 第二