很多時候大家都需要分析登錄檔!尤其是系統不穩定的時候!透過分析登錄檔,你會更瞭解系統的!
當你的 Linux 系統出現不明原因的問題時,很多人都告訴你,你要查閱一下登錄檔才能夠知道系統出了什麼問題了,所以說, 了解登錄檔是很重要的事情呢。登錄檔可以記錄系統在什麼時間、哪個主機、哪個服務、出現了什麼訊息等資訊, 這些資訊也包括使用者識別資料、系統故障排除須知等資訊。如果你能夠善用這些登錄檔資訊的話,你的系統出現錯誤時, 你將可以在第一時間發現,而且也能夠從中找到解決的方案,而不是昏頭轉向的亂問人呢。 此外,登錄檔所記錄的資訊量是非常大的,要人眼分析實在很困難。此時利用 shell script 或者是其他軟體提供的分析工具來處理複雜的登錄檔,可以幫助你很多很多喔!
『詳細而確實的分析以及備份系統的登錄檔』是一個系統管理員應該要進行的任務之一。 那麼什麼是登錄檔呢?簡單的說,就是記錄系統活動資訊的幾個檔案, 例如:何時、何地 (來源 IP)、何人 (什麼服務名稱)、做了什麼動作 (訊息登錄囉)。 換句話說就是:記錄系統在什麼時候由哪個程序做了什麼樣的行為時,發生了何種的事件等等。
要知道的是,我們的 Linux 主機在背景之下有相當多的 daemons 同時在工作著,這些工作中的程序總是會顯示一些訊息, 這些顯示的訊息最終會被記載到登錄檔當中啦。也就是說,記錄這些系統的重要訊息就是登錄檔的工作啦!
為什麼說登錄檔很重要,重要到系統管理員需要隨時注意他呢?我們可以這麼說:
用 Linux 這麼久了,你應該偶而會發現系統可能會出現一些錯誤,包括硬體捉不到或者是某些系統服務無法順利運作的情況。 此時你該如何是好?由於系統會將硬體偵測過程記錄在登錄檔內,你只要透過查詢登錄檔就能夠瞭解系統作了啥事! 並且由第十六章我們也知道 SELinux 與登錄檔的關係更加的強烈!所以囉,查詢登錄檔可以克服一些系統問題啦!
你可能在做完了某些網路服務的設定後,卻一直無法順利啟動該服務,此時該怎辦?去廟裡面拜拜抽籤嗎? 三太子大大可能無法告訴你要怎麼處理呢!由於網路服務的各種問題通常都會被寫入特別的登錄檔, 其實你只要查詢登錄檔就會知道出了什麼差錯,還不需要請示三太子大大啦!舉例來說,如果你無法啟動郵件伺服器 (postfix), 那麼查詢一下 /var/log/maillog 通常可以得到不錯的解答!
這個東西相當的重要!例如:你發現 WWW 服務 (httpd 軟體) 在某個時刻流量特別大,你想要瞭解為什麼時, 可以透過登錄檔去找出該時段是哪些 IP 在連線與查詢的網頁資料為何,就能夠知道原因。 此外,萬一哪天你的系統被入侵,並且被利用來攻擊他人的主機,由於被攻擊主機會記錄攻擊者,因此你的 IP 就會被對方記錄。這個時候你要如何告知對方你的主機是由於被入侵所導致的問題, 並且協助對方繼續往惡意來源追查呢?呵呵!此時登錄檔可是相當重要的呢!
登錄檔可以幫助我們瞭解很多系統重要的事件,包括登入者的部分資訊,因此登錄檔的權限通常是設定為僅有 root 能夠讀取而已。 而由於登錄檔可以記載系統這麼多的詳細資訊,所以啦,一個有經驗的主機管理員會隨時隨地查閱一下自己的登錄檔, 以隨時掌握系統的最新脈動!那麼常見的幾個登錄檔有哪些呢?一般而言,有下面幾個:
常見的登錄檔就是這幾個,但是不同的 Linux distributions ,通常登錄檔的檔名不會相同 (除了 /var/log/messages 之外 )。所以說,你還是得要查閱你 Linux 主機上面的登錄檔設定資料, 才能知道你的登錄檔主要檔名喔!
那麼這些登錄檔是怎麼產生的呢?基本上有兩種方式,一種是由軟體開發商自行定義寫入的登錄檔與相關格式, 例如 WWW 軟體 apache 就是這樣處理的。另一種則是由 Linux distribution 提供的登錄檔管理服務來統一管理。 你只要將訊息丟給這個服務後,他就會自己分門別類的將各種訊息放置到相關的登錄檔去!CentOS 提供 rsyslog.service 這個服務來統一管理登錄檔喔!
不過要注意的是,如果你任憑登錄檔持續記錄的話,由於系統產生的資訊天天都有,那麼你的登錄檔的容量將會長大到無法無天~ 如果你的登錄檔容量太大時,可能會導致大檔案讀寫效率不佳的問題 (因為要從磁碟讀入記憶體,越大的檔案消耗記憶體量越多)。 所以囉,你需要對登錄檔備份與更新。那...需要手動處理喔?當然不需要,我們可以透過 logrotate (登錄檔輪替) 這玩意兒來自動化處理登錄檔容量與更新的問題喔!
所謂的 logrotate 基本上,就是將舊的登錄檔更改名稱,然後建立一個空的登錄檔,如此一來, 新的登錄檔將重新開始記錄,然後只要將舊的登錄檔留下一陣子,嗯!那就可以達到將登錄檔『輪轉』的目的啦! 此外,如果舊的記錄 (大概要保存幾個月吧!) 保存了一段時間沒有問題,那麼就可以讓系統自動的將他砍掉, 免得佔掉很多寶貴的硬碟空間說!
總結一下,針對登錄檔所需的功能,我們需要的服務與程式有:
由於我們著眼點在於想要瞭解系統上面軟體所產生的各項資訊,因此本章主要針對 rsyslog.service 與 logrotate 來介紹。 接著下來我們來談一談怎麼樣規劃這兩個玩意兒。就由 rsyslog.service 這支程式先談起吧!畢竟得先有登錄檔,才可以進行 logrotate 呀!您說是吧!
CentOS 7 除了保有既有的 rsyslog.service 之外,其實最上游還使用了 systemd 自己的登錄檔日誌管理功能喔!他使用的是 systemd-journald.service 這個服務來支援的。基本上,系統由 systemd 所管理,那所有經由 systemd 啟動的服務,如果再啟動或結束的過程中發生一些問題或者是正常的訊息, 就會將該訊息由 systemd-journald.service 以二進位的方式記錄下來,之後再將這個訊息發送給 rsyslog.service 作進一步的記載。
systemd-journald.service 的記錄主要都放置於記憶體中,因此在存取方面效能比較好~我們也能夠透過 journalctl 以及 systemctl status unit.service 來查看各個不同服務的登錄檔! 這有個好處,就是登錄檔可以隨著個別服務讓你查閱,在單一服務的處理上面,要比跑到 /var/log/messages 去大海撈針來的簡易很多! 不過,因為 system-journald.service 裡面的很多觀念還是沿用 rsyslog.service 相關的資訊,所以,本章還是先從 rsyslog.service 先談起, 談完之後再以 journalctl 進一步了解 systemd 是怎麼去記錄登錄檔日誌功能的呦!
一般來說,系統產生的訊息經過記錄下來的資料中,每條訊息均會記錄底下的幾個重要資料:
當然,這些資訊的『詳細度』是可以修改的,而且,這些資訊可以作為系統除錯之用呢! 我們拿登錄時一定會記載帳號資訊的 /var/log/secure 為例好了:
[root@study ~]# cat /var/log/secure Aug 17 18:38:06 study login: pam_unix(login:session): session opened for user root by LOGIN(uid=0) Aug 17 18:38:06 study login: ROOT LOGIN ON tty1 Aug 17 18:38:19 study login: pam_unix(login:session): session closed for user root Aug 18 23:45:17 study sshd[18913]: Accepted password for dmtsai from 192.168.1.200 port 41524 ssh2 Aug 18 23:45:17 study sshd[18913]: pam_unix(sshd:session): session opened for user dmtsai by (uid=0) Aug 18 23:50:25 study sudo: dmtsai : TTY=pts/0 ; PWD=/home/dmtsai ; USER=root ; COMMAND=/bin/su - Aug 18 23:50:25 study su: pam_unix(su-l:session): session opened for user root by dmtsai(uid=0) |--日期/時間---|--H--|-服務與相關函數-|-----------訊息說明------>
我們拿第一筆資料 (共兩行) 來說明好了,該資料是說:『在 08/17 的 18:38 左右,在名為 study 的這部主機系統上,由 login 這個程式產生的訊息,內容顯示 root 在 tty1 登入了,而相關的權限給予是透過 pam_unix 模組處理的 (共兩行資料)。』有夠清楚吧!那請您自行翻譯一下後面的幾條訊息內容是什麼喔!
其實還有很多的資訊值得查閱的呢!尤其是 /var/log/messages 的內容。記得一個好的系統管理員, 要常常去『巡視』登錄檔的內容喔!尤其是發生底下幾種情況時:
還有很多啦!反正覺得系統不太正常,就得要查詢查詢登錄檔就是了。
另外,不知道你會不會覺得很奇怪?為什麼登錄檔就是登錄本機的資料啊~那怎麼登錄檔格式中,第二個欄位項目是『主機名稱』啊? 這是因為登錄檔可以做成登錄檔伺服器,可以收集來自其他伺服器的登錄檔資料喔!所以囉,為了瞭解到該訊息主要是來自於哪一部主機, 當然得要有第二個欄位項目說明該資訊來自哪一部主機名稱囉!
上一小節提到說 Linux 的登錄檔主要是由 rsyslog.service 在負責,那麼你的 Linux 是否有啟動 rsyslog 呢?而且是否有設定開機時啟動呢?呵呵!檢查一下先:
[root@study ~]# ps aux | grep rsyslog USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 750 0.0 0.1 208012 4732 ? Ssl Aug17 0:00 /usr/sbin/rsyslogd -n # 瞧!確實有啟動的!daemon 執行檔名為 rsyslogd 喔! [root@study ~]# systemctl status rsyslog.service rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled) Active: active (running) since Mon 2015-08-17 18:37:58 CST; 2 days ago Main PID: 750 (rsyslogd) CGroup: /system.slice/rsyslog.service └─750 /usr/sbin/rsyslogd -n # 也有啟動這個服務,也有預設開機時也要啟動這個服務!OK!正常沒問題!!
看到 rsyslog.service 這個服務名稱了吧?所以知道他已經在系統中工作囉!好了,既然本章主要是講登錄檔的服務, 那麼 rsyslog.service 的設定檔在哪裡?如何設定?如果你的 Linux 主機想要當作整個區網的登錄檔伺服器時,又該如何設定? 底下就讓我們來玩玩這玩意!
什麼?登錄檔還有設定檔?喔!不是啦~是 rsyslogd 這個 daemon 的設定檔啦! 我們現在知道 rsyslogd 可以負責主機產生的各個資訊的登錄,而這些資訊本身是有『嚴重等級』之分的, 而且,這些資料最終要傳送到哪個檔案去是可以修改的呢,所以我們才會在一開頭的地方講說, 每個 Linux distributions 放置的登錄檔檔名可能會有所差異啊!
基本上, rsyslogd 針對各種服務與訊息記錄在某些檔案的設定檔就是 /etc/rsyslog.conf, 這個檔案規定了『(1)什麼服務 (2)的什麼等級訊息 (3)需要被記錄在哪裡(裝置或檔案)』 這三個咚咚,所以設定的語法會是這樣:
服務名稱.[=!]訊息等級 訊息記錄的檔名或裝置或主機 # 底下以 mail 這個服務產生的 info 等級為例: mail.info /var/log/maillog_info # 這一行說明:mail 服務產生的大於等於 info 等級的訊息,都記錄到 # /var/log/maillog_info 檔案中的意思。
我們將上面的資料簡單的分為三部分來說明:
rsyslogd 主要還是透過 Linux 核心提供的 syslog 相關規範來設定資料的分類的,Linux 的 syslog 本身有規範一些服務訊息, 你可以透過這些服務來儲存系統的訊息。Linux 核心的 syslog 認識的服務類型主要有底下這些: (可使用 man 3 syslog 查詢到相關的資訊,或查詢 syslog.h 這個檔案來了解的!)
相對序號 | 服務類別 | 說明 |
0 | kern(kernel) | 就是核心 (kernel) 產生的訊息,大部分都是硬體偵測以及核心功能的啟用 |
1 | user | 在使用者層級所產生的資訊,例如後續會介紹到的用戶使用 logger 指令來記錄登錄檔的功能 |
2 | 只要與郵件收發有關的訊息記錄都屬於這個; | |
3 | daemon | 主要是系統的服務所產生的資訊,例如 systemd 就是這個有關的訊息! |
4 | auth | 主要與認證/授權有關的機制,例如 login, ssh, su 等需要帳號/密碼的咚咚; |
5 | syslog | 就是由 syslog 相關協定產生的資訊,其實就是 rsyslogd 這支程式本身產生的資訊啊! |
6 | lpr | 亦即是列印相關的訊息啊! |
7 | news | 與新聞群組伺服器有關的東西; |
8 | uucp | 全名為 Unix to Unix Copy Protocol,早期用於 unix 系統間的程序資料交換; |
9 | cron | 就是例行性工作排程 cron/at 等產生訊息記錄的地方; |
10 | authpriv | 與 auth 類似,但記錄較多帳號私人的資訊,包括 pam 模組的運作等! |
11 | ftp | 與 FTP 通訊協定有關的訊息輸出! |
16~23 | local0 ~ local7 | 保留給本機用戶使用的一些登錄檔訊息,較常與終端機互動。 |
上面談到的都是 Linux 核心的 syslog 函數自行制訂的服務名稱,軟體開發商可以透過呼叫上述的服務名稱來記錄他們的軟體。 舉例來說, sendmail 與 postfix 及 dovecot 都是與郵件有關的軟體,這些軟體在設計登錄檔記錄時,都會主動呼叫 syslog 內的 mail 服務名稱 (LOG_MAIL)。所以上述三個軟體 (sendmail, postfix, dovecot) 產生的訊息在 syslog 看起來,就會『是 mail 』類型的服務了。我們可以將這個概念繪製如底下的圖示來理解:
另外,每種服務所產生的資料量其實差異是很大的,舉例來說, mail 的登錄檔訊息多的要命, 每一封信件進入後, mail 至少需要記錄『寄信人的資訊;與收信者的訊息』等等; 而如果是用來做為工作站主機的,那麼登入者 (利用 login 登錄主機處理事情) 的數量一定不少,那個 authpriv 所管轄的內容可就多的要命了。
為了讓不同的資訊放置到不同的檔案當中,好讓我們分門別類的進行登錄檔的管理, 所以囉,將各種類別的服務之登錄檔,記錄在不同的檔案裡面,就是我們 /etc/rsyslog.conf 所要作的規範了!
同一個服務所產生的訊息也是有差別的,有啟動時僅通知系統而已的一般訊息 (information), 有出現還不至於影響到正常運作的警告訊息 (warn) ,還有系統硬體發生嚴重錯誤時,所產生的重大問題訊息 (error 等等); 訊息到底有多少種嚴重的等級呢?基本上,Linux 核心的 syslog 將訊息分為七個主要的等級,根據 syslog.h 的定義,訊息名稱與數值的對應如下:
等級數值 | 等級名稱 | 說明 |
7 | debug | 用來 debug (除錯) 時產生的訊息資料; |
6 | info | 僅是一些基本的訊息說明而已; |
5 | notice | 雖然是正常資訊,但比 info 還需要被注意到的一些資訊內容; |
4 | warning (warn) |
警示的訊息,可能有問題,但是還不至於影響到某個 daemon 運作的資訊;基本上, info, notice, warn 這三個訊息都是在告知一些基本資訊而已,應該還不至於造成一些系統運作困擾; |
3 | err (error) |
一些重大的錯誤訊息,例如設定檔的某些設定值造成該服務服法啟動的資訊說明, 通常藉由 err 的錯誤告知,應該可以瞭解到該服務無法啟動的問題呢! |
2 | crit | 比 error 還要嚴重的錯誤資訊,這個 crit 是臨界點 (critical) 的縮寫,這個錯誤已經很嚴重了喔! |
1 | alert | 警告警告,已經很有問題的等級,比 crit 還要嚴重! |
0 | emerg (panic) |
疼痛等級,意指系統已經幾乎要當機的狀態! 很嚴重的錯誤資訊了。通常大概只有硬體出問題,導致整個核心無法順利運作,就會出現這樣的等級的訊息吧! |
基本上,在 0(emerg) 到 6(info) 的等級之間,等級數值越高代表越沒事,等級靠近 0 則代表事情大條了!除了 0 到 6 之外還有兩個比較特殊的等級, 那就是 debug(錯誤偵測等級) 與 none (不需登錄等級) 兩個,當我們想要作一些錯誤偵測,或者是忽略掉某些服務的資訊時, 就用這兩個咚咚吧!
特別留意一下在訊息等級之前還有 .[=!] 的連結符號喔!他代表的意思是這樣的:
一般來說,我們比較常使用的是『.』這個連結符號啦!^_^
再來則是這個訊息要放置在哪裡的設定了。通常我們使用的都是記錄的檔案啦!但是也可以輸出到裝置呦! 例如印表機之類的!也可以記錄到不同的主機上頭去呢!底下就是一些常見的放置處:
看完上面的說明,相信你一定會越來越迷糊!啊!怎麼會有 syslog, rsyslogd, rsyslog.service!見鬼~名稱都不相同!那是啥東西? 基本上,這幾個東西你應該要這樣看:
syslog | 這個是 Linux 核心所提供的登錄檔設計指引,所有的要求大概都寫入道一個名為 syslog.h 的標頭檔案中。如果你想要開發與登錄檔有關的軟體, 那你就得要依循這個 syslog 函數的要求去設計才行!可以使用 man 3 syslog 去查詢一下相關的資料! |
rsyslogd | 為了要達成實際上進行訊息的分類所開發的一套軟體,所以,這就是最基本的 daemon 程式! |
rsyslog.service | 為了加入 systemd 的控制,因此 rsyslogd 的開發者設計的啟動服務腳本設定! |
這樣簡單的分類,應該比較容易了解名稱上面的意義了吧?早期 CentOS 5.x 以前,要達成 syslog 的功能是由一隻名為 syslogd 的 daemon 來完成的, 從 CentOS 6 以來 (包含 CentOS 7) 則是透過 rsyslogd 這個 daemon 囉!
基本上,整個 rsyslog.conf 設定檔的內容參數大概就只是這樣而已,底下我們來思考一些例題,好讓你可以更清楚的知道如何設定 rsyslogd 啊!
例題:
如果我要將我的 mail 相關的資料給他寫入 /var/log/maillog 當中,那麼在 /etc/rsyslog.conf 的語法如何設計?
答:
基本的寫法是這樣的:
mail.info /var/log/maillog注意到上面喔,當我們的等級使用 info 時,那麼『任何嚴重於 info 等級(含 info 這個等級)之上的訊息, 都會被寫入到後面接的檔案之中!』這樣可以瞭解嗎?也就是說,我們可以將所有 mail 的登錄資訊都記錄在 /var/log/maillog 裡面的意思啦! |
例題:
我要將新聞群組資料 (news) 及例行性工作排程 (cron) 的訊息都寫入到一個稱為
/var/log/cronnews 的檔案中,但是這兩個程序的警告訊息則額外的記錄在 /var/log/cronnews.warn 中,
那該如何設定我的 rsyslog.conf 呢?
答:
很簡單啦!既然是兩個程序,那麼只好以分號來隔開了,此外,由於第二個指定檔案中,我只要記錄警告訊息,
因此設定上需要指定『.=』這個符號,所以語法成為了:
news.*;cron.* /var/log/cronnews上面那個『.=』就是在指定等級的意思啦!由於指定了等級,因此,只有這個等級的訊息才會被記錄在這個檔案裡面呢! 此外你也必須要注意,news 與 cron 的警告訊息也會寫入 /var/log/cronnews 內喔! |
例題:
我的 messages 這個檔案需要記錄所有的資訊,但是就是不想要記錄 cron, mail 及 news 的資訊,那麼應該怎麼寫才好?
答:
可以有兩種寫法,分別是:
*.*;news,cron,mail.none /var/log/messages使用『,』分隔時,那麼等級只要接在最後一個即可,如果是以『;』來分的話, 那麼就需要將服務與等級都寫上去囉!這樣會設定了吧! |
瞭解語法之後,我們來看一看 rsyslogd 有哪些系統服務已經在記錄了呢?就是瞧一瞧 /etc/rsyslog.conf 這個檔案的預設內容囉! (注意!如果需要將該行做為註解時,那麼就加上 # 符號就可以啦)
# 來自 CentOS 7.x 的相關資料 [root@study ~]# vim /etc/rsyslog.conf 1 #kern.* /dev/console 2 *.info;mail.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 :omusrmsg:* 7 uucp,news.crit /var/log/spooler 8 local7.* /var/log/boot.log
上面總共僅有 8 行設定值,每一行的意義是這樣的:
在上面的第四行關於 mail 的記錄中,在記錄的檔案 /var/log/maillog 前面還有個減號『 - 』是幹嘛用的?由於郵件所產生的訊息比較多,因此我們希望郵件產生的訊息先儲存在速度較快的記憶體中 (buffer) ,等到資料量夠大了才一次性的將所有資料都填入磁碟內,這樣將有助於登錄檔的存取性能。 只不過由於訊息是暫存在記憶體內,因此若不正常關機導致登錄資訊未回填到登錄檔中,可能會造成部分資料的遺失。
此外,每個 Linux distributions 的 rsyslog.conf 設定差異是頗大的,如果你想要找到相對應的登錄資訊時, 可得要查閱一下 /etc/rsyslog.conf 這個檔案才行!否則可能會發生分析到錯誤的資訊喔!舉例來說, 鳥哥有自己寫一支分析登錄檔的 script,這個 script 是依據 Red Hat 系統預設的登錄檔所寫的,因此不同的 distributions 想要使用這支程式時,就得要自行設計與修改一下 /etc/rsyslog.conf 才行喔!否則就可能會分析到錯誤的資訊囉。 那麼如果你有自己的需要而得要修訂登錄檔時,該如何進行?
如果你有其他的需求,所以需要特殊的檔案來幫你記錄時,呵呵!別客氣,千萬給他記錄在 /etc/rsyslog.conf 當中,如此一來,你就可以重複的將許多的資訊記錄在不同的檔案當中,以方便你的管理呢! 讓我們來作個練習題吧!如果你想要讓『所有的資訊』都額外寫入到 /var/log/admin.log 這個檔案時, 你可以怎麼作呢?先自己想一想,並且作一下,再來看看底下的作法啦!
# 1. 先設定好所要建立的檔案設置! [root@study ~]# vim /etc/rsyslog.conf # Add by VBird 2015/08/19 <==再次強調,自己修改的時候加入一些說明 *.info /var/log/admin.log <==有用的是這行啦! # 2. 重新啟動 rsyslogd 呢! [root@study ~]# systemctl restart rsyslog.service [root@study ~]# ll /var/log/admin.log -rw-r--r--. 1 root root 325 Aug 20 00:54 /var/log/admin.log # 瞧吧!建立了這個登錄檔出現囉!
很簡單吧!如此一來,所有的資訊都會寫入 /var/log/admin.log 裡面了!
好了,由上一個小節裡面我們知道了 rsyslog.conf 的設定,也知道了登錄檔內容的重要性了, 所以,如果幻想你是一個很厲害的駭客,想利用他人的電腦幹壞事,然後又不想留下證據, 你會怎麼作?對啦!就是離開的時候將屁股擦乾淨,將所有可能的訊息都給他抹煞掉, 所以第一個動腦筋的地方就是登錄檔的清除工作啦~ 如果你的登錄檔不見了,那該怎辦?
傷腦筋呢!有沒有辦法防止登錄檔被刪除?或者是被 root 自己不小心變更呢?有呀!拔掉網路線或電源線就好了……呵呵! 別擔心,基本上,我們可以透過一個隱藏的屬性來設定你的登錄檔,成為『 只可以增加資料,但是不能被刪除 』的狀態,那麼或許可以達到些許的保護!不過,如果你的 root 帳號被破解了,那麼底下的設定還是無法保護的,因為你要記得『 root 是可以在系統上面進行任何事情的 』,因此,請將你的 root 這個帳號的密碼設定的安全一些!千萬不要輕忽這個問題呢!
既然如此,那麼我們就來處理一下隱藏屬性的東東吧!我們在第六章談到過 lsattr 與 chattr 這兩個東西啦!如果將一個檔案以 chattr 設定 i 這個屬性時,那麼該檔案連 root 都不能殺掉!而且也不能新增資料,嗯!真安全!但是,如此一來登錄檔的功能豈不是也就消失了? 因為沒有辦法寫入呀!所以囉,我們要使用的是 a 這個屬性!你的登錄檔如果設定了這個屬性的話,那麼 他將只能被增加,而不能被刪除!嗯! 這個項目就非常的符合我們登錄檔的需求啦!因此,你可以這樣的增加你的登錄檔的隱藏屬性。
[root@study ~]# chattr +a /var/log/admin.log [root@study ~]# lsattr /var/log/admin.log -----a---------- /var/log/admin.log
加入了這個屬性之後,你的 /var/log/admin.log 登錄檔從此就僅能被增加,而不能被刪除,直到 root 以『 chattr -a /var/log/admin.log 』取消這個 a 的參數之後,才能被刪除或移動喔!
雖然,為了你登錄檔的資訊安全,這個 chattr 的 +a 旗標可以幫助你維護好這個檔案, 不過,如果你的系統已經被取得 root 的權限,而既然 root 可以下達 chattr -a 來取消這個旗標, 所以囉,還是有風險的啦!此外,前面也稍微提到,新手最好還是先不要增加這個旗標, 很容易由於自己的忘記,導致系統的重要訊息無法記錄呢。
基本上,鳥哥認為,這個旗標最大的用處除了在保護你登錄檔的資料外, 他還可以幫助你避免掉不小心寫入登錄檔的狀況喔。要注意的是,當『 你不小心 "手動" 更動過登錄檔後,例如那個 /var/log/messages , 你不小心用 vi 開啟他,離開卻下達 :wq 的參數,呵呵!那麼該檔案未來將不會再繼續進行登錄動作! 』這個問題真的很常發生!由於你以 vi 儲存了登錄檔,則 rsyslogd 會誤判為該檔案已被更動過, 將導致 rsyslogd 不再寫入該檔案新的內容~很傷腦筋的!
要讓該登錄檔可以繼續寫入,你只要重新啟動 rsyslogd.service 即可。 不過,總是比較麻煩。所以啊,如果你針對登錄檔下達 chattr +a 的參數,嘿嘿! 未來你就不需要害怕不小心更動到該檔案了!因為無法寫入嘛!除了可以新增之外~ ^_^
不過,也因為這個 +a 的屬性讓該檔案無法被刪除與修改,所以囉,當我們進行登錄檔案輪替時 (logrotate) ,將會無法移動該登錄檔的檔名呢!所以會造成很大的困擾。這個困擾雖然可以使用 logrotate 的設定檔來解決,但是,還是先將登錄檔的 +a 旗標拿掉吧!
[root@study ~]# chattr -a /var/log/admin.log
我們在之前稍微提到的,在 rsyslog.conf 檔案當中,可以將登錄資料傳送到印表機或者是遠端主機上面去。這樣做有什麼意義呢? 如果你將登錄資訊直接傳送到印表機上面的話,那麼萬一不小心你的系統被 cracker 所入侵, 他也將你的 /var/log/ 砍掉了,怎麼辦?沒關係啊!反正你已經將重要資料直接以印表機記錄起來了, 嘿嘿!他是無法逃開的啦!^_^
再想像一個環境,你的辦公室內有十部 Linux 主機,每一部負責一個網路服務, 你為了要瞭解每部主機的狀態,因此,你常常需要登入這十部主機去查閱你的登錄檔~ 哇!光用想的,每天要進入十部主機去查資料,想到就煩~沒關係~這個時候我們可以讓某一部主機當成 『登錄檔伺服器』,用他來記錄所有的十部 linux 主機的資訊,嘿嘿!這樣我就直接進入一部主機就可以了! 省時又省事,真方便~
那要怎麼達到這樣的功能呢?很簡單啦,我們 CentOS 7.x 預設的 rsyslogd 本身就已經具有這個登錄檔伺服器的功能了, 只是預設並沒有啟動該功能而已。你可以透過 man rsyslogd 去查詢一下相關的選項就能夠知道啦! 既然是登錄檔伺服器,那麼我們的 Linux 主機當然會啟動一個埠口來監聽了,那個預設的埠口就是 UDP 或 TCP 的 port 514 喔!
如上圖所示,伺服器會啟動監聽的埠口,用戶端則將登錄檔再轉出一份送到伺服器去。 而既然是登錄檔『伺服器』,所以當然有伺服器與用戶端 (client) 囉!這兩者的設定分別是這樣的:
# 1. Server 端:修改 rsyslogd 的啟動設定檔,在 /etc/rsyslog.conf 內! [root@study ~]# vim /etc/rsyslog.conf # 找到底下這幾行: # Provides UDP syslog reception #$ModLoad imudp #$UDPServerRun 514 # Provides TCP syslog reception #$ModLoad imtcp #$InputTCPServerRun 514 # 上面的是 UDP 埠口,底下的是 TCP 埠口!如果你的網路狀態很穩定,就用 UDP 即可。 # 不過,如果你想要讓資料比較穩定傳輸,那麼建議使用 TCP 囉!所以修改底下兩行即可! $ModLoad imtcp $InputTCPServerRun 514 # 2. 重新啟動與觀察 rsyslogd 喔! [root@study ~]# systemctl restart rsyslog.service [root@study ~]# netstat -ltnp | grep syslog Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 2145/rsyslogd tcp6 0 0 :::514 :::* LISTEN 2145/rsyslogd # 嘿嘿!你的登錄檔主機已經設定妥當囉!很簡單吧!
透過這個簡單的動作,你的 Linux 主機已經可以接收來自其他主機的登錄資訊了! 當然啦,你必須要知道網路方面的相關基礎,這裡鳥哥只是先介紹,未來瞭解了網路相關資訊後,再回頭來這裡瞧一瞧先! ^_^
至於 client 端的設定就簡單多了!只要指定某個資訊傳送到這部主機即可! 舉例來說,我們的登錄檔伺服器 IP 為 192.168.1.100 ,而 client 端希望所有的資料都送給主機, 所以,可以在 /etc/rsyslog.conf 裡面新增這樣的一行:
[root@study ~]# vim /etc/rsyslog.conf *.* @@192.168.1.100 #*.* @192.168.1.100 # 若用 UDP 傳輸,設定要變這樣! [root@study ~]# systemctl restart rsyslog.service
再重新啟動 rsyslog.service 後,立刻就搞定了!而未來主機上面的登錄檔當中,每一行的『主機名稱』就會顯示來自不同主機的資訊了。 很簡單吧! ^_^。不過你得要特別注意,使用 TCP 傳輸與 UDP 傳輸的設定不太一樣!請依據你的登錄檔伺服器的設定值來選擇你的用戶端語法喔! 接下來,讓我們來談一談,那麼如何針對登錄檔來進行輪替 (rotate) 呢?
假設我們已經將登錄資料寫入了記錄檔中了,也已經利用 chattr 設定了 +a 這個屬性了,那麼該如何進行 logrotate 的工作呢?這裡請特別留意的是:『rsyslogd 利用的是 daemon 的方式來啟動的, 當有需求的時候立刻就會被執行的,但是 logrotate 卻是在規定的時間到了之後才來進行登錄檔的輪替, 所以這個 logrotate 程序當然就是掛在 cron 底下進行的呦!』 仔細看一下 /etc/cron.daily/ 裡面的檔案,嘿嘿~看到了吧! /etc/cron.daily/logrotate 就是記錄了每天要進行的登錄檔輪替的行為啦! ^_^!底下我們就來談一談怎麼樣設計這個 logrotate 吧!
既然 logrotate 主要是針對登錄檔來進行輪替的動作,所以囉,他當然必須要記載『 在什麼狀態下才將登錄檔進行輪替』的設定啊!那麼 logrotate 這個程式的參數設定檔在哪裡呢?呵呵!那就是:
那個 logrotate.conf 才是主要的參數檔案,至於 logrotate.d 是一個目錄, 該目錄裡面的所有檔案都會被主動的讀入 /etc/logrotate.conf 當中來進行!另外,在 /etc/logrotate.d/ 裡面的檔案中,如果沒有規定到的一些細部設定,則以 /etc/logrotate.conf 這個檔案的規定來指定為預設值!
好了,剛剛我們提到 logrotate 的主要功能就是將舊的登錄檔案移動成舊檔, 並且重新建立一個新的空的檔案來記錄,他的執行結果有點類似底下的圖示:
由上面的圖示我們可以清楚的知道,當第一次執行完 rotate 之後,原本的 messages 會變成 messages.1 而且會製造一個空的 messages 給系統來儲存登錄檔。而第二次執行之後,則 messages.1 會變成 messages.2 而 messages 會變成 messages.1 ,又造成一個空的 messages 來儲存登錄檔!那麼如果我們僅設定保留三個登錄檔而已的話,那麼執行第四次時,則 messages.3 這個檔案就會被刪除,並由後面的較新的保存登錄檔所取代!基本的工作就是這樣啦!
不過近年來磁碟空間容量比較大了,加上管理員又擔心登錄檔資料真的給它不見去,因此,你可能已經發現到,最近的登錄檔輪替後的檔名已經會加上日期參數, 然後源源不絕的保留在你的系統上耶~雖然這個設定是可以修訂的,不過,鳥哥也真的希望保留日期的檔名延伸記錄,真的比較不用擔心未來要找問題時, 登錄檔卻已經 GG 了...
那麼多久進行一次這樣的 logrotate 工作呢?這些都記錄在 logrotate.conf 裡面,我們來看一下預設的 logrotate 的內容吧!
[root@study ~]# vim /etc/logrotate.conf # 底下的設定是 "logrotate 的預設設定值" ,如果個別的檔案設定了其他的參數, # 則將以個別的檔案設定為主,若該檔案沒有設定到的參數則以這個檔案的內容為預設值! weekly <==預設每個禮拜對登錄檔進行一次 rotate 的工作 rotate 4 <==保留幾個登錄檔呢?預設是保留四個! create <==由於登錄檔被更名,因此建立一個新的來繼續儲存之意! dateext <==就是這個設定值!可以讓被輪替的檔案名稱加上日期作為檔名喔! #compress <==被更動的登錄檔是否需要壓縮?如果登錄檔太大則可考慮此參數啟動 include /etc/logrotate.d # 將 /etc/logrotate.d/ 這個目錄中的所有檔案都讀進來執行 rotate 的工作! /var/log/wtmp { <==僅針對 /var/log/wtmp 所設定的參數 monthly <==每個月一次,取代每週! create 0664 root utmp <==指定新建檔案的權限與所屬帳號/群組 minsize 1M <==檔案容量一定要超過 1M 後才進行 rotate (略過時間參數) 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 是『預設的輪替狀態』而已, 我們的各個服務都可以擁有自己的登錄檔輪替設定,你也可以自行修改成自己喜歡的樣式啊! 例如,如果你的系統的空間夠大,並且擔心除錯以及駭客的問題,那麼可以:
好了,上面我們大致介紹了 /var/log/wtmp 這個檔案的設定,現在你知道了 logrotate.conf 的設定語法是:
登錄檔的絕對路徑檔名 ... { 個別的參數設定值,如 monthly, compress 等等 }
底下我們再以 /etc/logrotate.d/syslog 這個輪替 rsyslog.service 服務的檔案,來看看該如何設定他的 rotate 呢?
[root@study ~]# vim /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript }
在上面的語法當中,我們知道正確的 logrotate 的寫法為:
那麼 /etc/logrotate.d/syslog 內設定的 5 個檔案的輪替功能就變成了:
假設我們有針對 /var/log/messages 這個檔案增加 chattr +a 的屬性時, 依據 logrotate 的工作原理,我們知道,這個 /var/log/messages 將會被更名成為 /var/log/messages.1 才是。但是由於加上這個 +a 的參數啊,所以更名是不可能成功的! 那怎麼辦呢?呵呵!就利用 prerotate 與 postrotate 來進行登錄檔輪替前、後所需要作的動作啊! 果真如此時,那麼你可以這樣修改一下這個檔案喔!
[root@study ~]# vim /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { 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 ... 的意義,這一行的目的在於將系統的 rsyslogd 重新以其參數檔 (rsyslog.conf) 的資料讀入一次!也可以想成是 reload 的意思啦! 由於我們建立了一個新的空的記錄檔,如果不執行此一行來重新啟動服務的話, 那麼記錄的時候將會發生錯誤呦!(請回到第十六章讀一下 kill 後面的 signal 的內容說明)
好了,設定完成之後,我們來測試看看這樣的設定是否可行呢?給他執行底下的指令:
[root@study ~]# logrotate [-vf] logfile 選項與參數: -v :啟動顯示模式,會顯示 logrotate 運作的過程喔! -f :不論是否符合設定檔的資料,強制每個登錄檔都進行 rotate 的動作! 範例一:執行一次 logrotate 看看整個流程為何? [root@study ~]# logrotate -v /etc/logrotate.conf reading config file /etc/logrotate.conf <==讀取主要設定檔 including /etc/logrotate.d <==呼叫外部的設定 reading config file chrony <==就是外部設定啊! ....(中間省略).... Handling 18 logs <==共有 18 個登錄檔被記錄 ....(中間省略).... rotating pattern: /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler weekly (52 rotations) empty log files are not rotated, old logs are removed considering log /var/log/cron log does not need rotating considering log /var/log/maillog log does not need rotating considering log /var/log/messages <==開始處理 messages log does not need rotating <==因為時間未到,不需要更動! ....(底下省略).... 範例二:強制進行 logrotate 的動作 [root@study ~]# logrotate -vf /etc/logrotate.conf ....(前面省略).... rotating log /var/log/messages, log->rotateCount is 52 dateext suffix '-20150820' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' compressing log with: /bin/gzip ....(底下省略).... # 看到否?整個 rotate 的動作就是這樣一步一步進行的~ [root@study ~]# ll /var/log/messages*; lsattr /var/log/messages -rw-------. 1 root root 143 Aug 20 01:45 /var/log/messages -rw-------. 1 root root 167125 Aug 20 01:40 /var/log/messages-20150820 -----a---------- /var/log/messages <==主動加入 a 的隱藏屬性囉!
上面那個 -f 具有『強制執行』的意思,如果一切的設定都沒有問題的話,那麼理論上,你的 /var/log 這個目錄就會起變化囉!而且應該不會出現錯誤訊息才對!嘿嘿!這樣就 OK 了!很棒不是嗎?!
由於 logrotate 的工作已經加入 crontab 裡頭了!所以現在每天系統都會自動的給他查看 logrotate 囉!不用擔心的啦!只是要注意一下那個 /var/log/messages 裡頭是否常常有類似底下的字眼:
Aug 20 01:45:34 study rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="2145" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
這說明的是 rsyslogd 重新啟動的時間啦 (就是因為 /etc/logrotate.d/syslog 的設定之緣故!) 底下我們來進行一些例題的練習,讓你更詳細的瞭解 logrotate 的功用啊!
假設前提是這樣的,前一小節當中,假設你已經建立了 /var/log/admin.log 這個檔案, 現在,你想要將該檔案加上 +a 這個隱藏標籤,而且設定底下的相關資訊:
那你可以怎麼樣設定呢?呵呵~很簡單啊!看看底下的動作吧!
# 1. 先建立 +a 這個屬性啊! [root@study ~]# chattr +a /var/log/admin.log [root@study ~]# lsattr /var/log/admin.log -----a---------- /var/log/admin.log [root@study ~]# 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@study ~]# vim /etc/logrotate.d/admin # This configuration is from VBird 2015/08/19 /var/log/admin.log { monthly <==每個月進行一次 size=10M <==檔案容量大於 10M 則開始處置 rotate 5 <==保留五個! compress <==進行壓縮工作! sharedscripts prerotate /usr/bin/chattr -a /var/log/admin.log endscript sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true /usr/bin/chattr +a /var/log/admin.log endscript } # 3. 測試一下 logrotate 相關功能的資訊顯示: [root@study ~]# 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 prerotate script, since no logs will be rotated not running postrotate script, since no logs were rotated ....(底下省略).... # 因為還不足一個月,檔案也沒有大於 10M,所以不需進行輪替! # 4. 測試一下強制 logrotate 與相關功能的資訊顯示: [root@study ~]# logrotate -vf /etc/logrotate.d/admin reading config file /etc/logrotate.d/admin reading config file /etc/logrotate.d/admin 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 rotating log /var/log/admin.log, log->rotateCount is 5 dateext suffix '-20150820' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' 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 fscreate context set to system_u:object_r:var_log_t:s0 renaming /var/log/admin.log to /var/log/admin.log.1 running postrotate script compressing log with: /bin/gzip [root@study ~]# lsattr /var/log/admin.log* -----a---------- /var/log/admin.log ---------------- /var/log/admin.log.1.gz <==有壓縮過喔!
看到了嗎?透過這個方式,我們可以建立起屬於自己的 logrotate 設定檔案, 很簡便吧!尤其是要注意的, /etc/rsyslog.conf 與 /etc/logrotate.d/* 檔案常常要搭配起來,例如剛剛我們提到的兩個案例中所建立的 /var/log/admin.log 就是一個很好的例子~建立後,還要使用 logrotate 來輪替啊! ^_^
過去只有 rsyslogd 的年代中,由於 rsyslogd 必須要開機完成並且執行了 rsyslogd 這個 daemon 之後,登錄檔才會開始記錄。所以,核心還得要自己產生一個 klogd 的服務, 才能將系統在開機過程、啟動服務的過程中的資訊記錄下來,然後等 rsyslogd 啟動後才傳送給它來處理~
現在有了 systemd 之後,由於這玩意兒是核心喚醒的,然後又是第一支執行的軟體,它可以主動呼叫 systemd-journald 來協助記載登錄檔~ 因此在開機過程中的所有資訊,包括啟動服務與服務若啟動失敗的情況等等,都可以直接被記錄到 systemd-journald 裡頭去!
不過 systemd-journald 由於是使用於記憶體的登錄檔記錄方式,因此重新開機過後,開機前的登錄檔資訊當然就不會被記載了。 為此,我們還是建議啟動 rsyslogd 來協助分類記錄!也就是說, systemd-journald 用來管理與查詢這次開機後的登錄資訊,而 rsyslogd 可以用來記錄以前及現在的所以資料到磁碟檔案中,方便未來進行查詢喔!
那麼 systemd-journald.service 的資料要如何叫出來查閱呢?很簡單!就透過 journalctl 即可!讓我們來瞧瞧這個指令可以做些什麼事?
[root@study ~]# journalctl [-nrpf] [--since TIME] [--until TIME] _optional 選項與參數: 預設會秀出全部的 log 內容,從舊的輸出到最新的訊息 -n :秀出最近的幾行的意思~找最新的資訊相當有用 -r :反向輸出,從最新的輸出到最舊的資料 -p :秀出後面所接的訊息重要性排序!請參考前一小節的 rsyslogd 資訊 -f :類似 tail -f 的功能,持續顯示 journal 日誌的內容(即時監測時相當有幫助!) --since --until:設定開始與結束的時間,讓在該期間的資料輸出而已 _SYSTEMD_UNIT=unit.service :只輸出 unit.service 的資訊而已 _COMM=bash :只輸出與 bash 有關的資訊 _PID=pid :只輸出 PID 號碼的資訊 _UID=uid :只輸出 UID 為 uid 的資訊 SYSLOG_FACILITY=[0-23] :使用 syslog.h 規範的服務相對序號來呼叫出正確的資料! 範例一:秀出目前系統中所有的 journal 日誌資料 [root@study ~]# journalctl -- Logs begin at Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 00:01:01 CST. -- Aug 17 18:37:52 study.centos.vbird systemd-journal[105]: Runtime journal is using 8.0M (max 142.4M, leaving 213.6M of free 1.3G, current limit 142.4M). Aug 17 18:37:52 study.centos.vbird systemd-journal[105]: Runtime journal is using 8.0M (max 142.4M, leaving 213.6M of free 1.3G, current limit 142.4M). Aug 17 18:37:52 study.centos.vbird kernel: Initializing cgroup subsys cpuset Aug 17 18:37:52 study.centos.vbird kernel: Initializing cgroup subsys cpu .....(中間省略)..... Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19268]: finished 0anacron Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19270]: starting 0yum-hourly.cron Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19274]: finished 0yum-hourly.cron # 從這次開機以來的所有資料都會顯示出來!透過 less 一頁頁翻動給管理員查閱!資料量相當大! 範例二:(1)僅顯示出 2015/08/18 整天以及(2)僅今天及(3)僅昨天的日誌資料內容 [root@study ~]# journalctl --since "2015-08-18 00:00:00" --until "2015-08-19 00:00:00" [root@study ~]# journalctl --since today [root@study ~]# journalctl --since yesterday --until today 範例三:只找出 crond.service 的資料,同時只列出最新的 10 筆即可 [root@study ~]# journalctl _SYSTEMD_UNIT=crond.service -n 10 範例四:找出 su, login 執行的登錄檔,同時只列出最新的 10 筆即可 [root@study ~]# journalctl _COMM=su _COMM=login -n 10 範例五:找出訊息嚴重等級為錯誤 (error) 的訊息! [root@study ~]# journalctl -p err 範例六:找出跟登錄服務 (auth, authpriv) 有關的登錄檔訊息 [root@study ~]# journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10 # 更多關於 syslog_facility 的資料,請參考 18.2.1 小節的內容囉!
基本上,有 journalctl 就真的可以搞定你的訊息資料囉!全部的資料都在這裡面耶~再來假設一下,你想要了解到登錄檔的即時變化, 那又該如何處置呢?現在,請開兩個終端機,讓我們來處理處理!
# 第一號終端機,請使用底下的方式持續偵測系統! [root@study ~]# journalctl -f # 這時系統會好像卡住~其實不是卡住啦!是類似 tail -f 在持續的顯示登錄檔資訊的! # 第二號終端機,使用底下的方式隨便發一封 email 給系統上的帳號! [root@study ~]# echo "testing" | mail -s 'tset' dmtsai # 這時,你會發現到第一號終端機竟然一直輸出一些訊息吧!沒錯!這就對了!
如果你有一些必須要偵測的行為,可以使用這種方式來即時了解到系統出現的訊息~而取消 journalctl -f 的方法,就是 [ctrl]+c 啊!
上面談到的是叫出登錄檔給我們查閱,那換個角度想,『如果你想要讓你的資料儲存到登錄檔當中』呢?那該如何是好? 這時就得要使用 logger 這個好用的傢伙了!這個傢伙可以傳輸很多資訊,不過,我們只使用最簡單的本機資訊傳遞~ 更多的用法就請您自行 man logger 囉!
[root@study ~]# logger [-p 服務名稱.等級] "訊息" 選項與參數: 服務名稱.等級 :這個項目請參考 rsyslogd 的本章後續小節的介紹; 範例一:指定一下,讓 dmtsai 使用 logger 來傳送資料到登錄檔內 [root@study ~]# logger -p user.info "I will check logger command" [root@study ~]# journalctl SYSLOG_FACILITY=1 -n 3 -- Logs begin at Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 18:03:17 CST. -- Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29710]: starting 0yum-hourly.cron Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29714]: finished 0yum-hourly.cron Aug 19 18:03:17 study.centos.vbird dmtsai[29753]: I will check logger command
現在,讓我們來瞧一瞧,如果我們之前寫的 backup.service 服務中,如果使用手動的方式來備份,亦即是使用 "/backups/backup.sh log" 來執行備份時, 那麼就透過 logger 來記錄備份的開始與結束的時間!該如何是好呢?這樣作看看!
[root@study ~]# vim /backups/backup.sh #!/bin/bash if [ "${1}" == "log" ]; then logger -p syslog.info "backup.sh is starting" fi source="/etc /home /root /var/lib /var/spool/{cron,at,mail}" target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz" [ ! -d /backups ] && mkdir /backups tar -zcvf ${target} ${source} &> /backups/backup.log if [ "${1}" == "log" ]; then logger -p syslog.info "backup.sh is finished" fi [root@study ~]# /backups/backup.sh log [root@study ~]# journalctl SYSLOG_FACILITY=5 -n 3 Aug 19 18:09:37 study.centos.vbird dmtsai[29850]: backup.sh is starting Aug 19 18:09:54 study.centos.vbird dmtsai[29855]: backup.sh is finished
透過這個玩意兒,我們也能夠將資料自行處置到登錄檔當中囉!
再強調一次,這個 systemd-journald.servicd 的訊息是不會放到下一次開機後的,所以,重新開機後,那之前的記錄通通會遺失。 雖然我們大概都有啟動 rsyslogd 這個服務來進行後續的登錄檔放置,不過如果你比較喜歡 journalctl 的存取方式,那麼可以將這些資料儲存下來喔!
基本上,systemd-journald.service 的設定檔主要參考 /etc/systemd/journald.conf 的內容,詳細的參數你可以參考 man 5 journald.conf 的資料。 因為預設的情況底下,設定檔的內容應該已經符合我們的需求,所以這邊鳥哥就不再修改設定檔了。只是如果想要保存你的 journalctl 所讀取的登錄檔, 那麼就得要建立一個 /var/log/journal 的目錄,並且處理一下該目錄的權限,那麼未來重新啟動 systemd-journald.service 之後, 日誌登錄檔就會主動的複製一份到 /var/log/journal 目錄下囉!
# 1. 先處理所需要的目錄與相關權限設定 [root@study ~]# mkdir /var/log/journal [root@study ~]# chown root:systemd-journal /var/log/journal [root@study ~]# chmod 2775 /var/log/journal # 2. 重新啟動 systemd-journald 並且觀察備份的日誌資料! [root@study ~]# systemctl restart systemd-journald.service [root@study ~]# ll /var/log/journal/ drwxr-sr-x. 2 root systemd-journal 27 Aug 20 02:37 309eb890d09f440681f596543d95ec7a
你得要注意的是,因為現在整個日誌登錄檔的容量會持續長大,因此你最好還是觀察一下你系統能用的總容量喔!避免不小心檔案系統的容量被灌爆! 此外,未來在 /run/log 底下就沒有相關的日誌可以觀察了!因為移動到 /var/log/journal 底下來囉!
其實鳥哥是這樣想的,既然我們還有 rsyslog.service 以及 logrotate 的存在,因此這個 systemd-journald.service 產生的登錄檔, 個人建議最好還是放置到 /run/log 的記憶體當中,以加快存取的速度!而既然 rsyslog.service 可以存放我們的登錄檔, 似乎也沒有必要再保存一份 journal 登錄檔到系統當中就是了。單純的建議!如何處理,依照您的需求即可喔!
登錄檔的分析是很重要的!你可以自行以 vim 或者是 journalctl 進入登錄檔去查閱相關的資訊。而系統也提供一些軟體可以讓你從登錄檔中取得資料, 例如之前談過的 last, lastlog, dmesg 等等指令。不過,這些資料畢竟都非常的分散,如果你想要一口氣讀取所有的登錄資訊, 其實有點困擾的。不過,好在 CentOS 有提供 logwatch 這個登錄檔分析程式,你可以藉由該程式來瞭解登錄檔資訊。 此外,鳥哥也依據 Red Hat 系統的 journalctl 搭配 syslog 函數寫了一支小程式給大家使用喔!
雖然有一些有用的系統指令,不過,要瞭解系統的狀態,還是得要分析整個登錄檔才行~ 事實上,目前已經有相當多的登錄檔分析工具,例如 CentOS 7.x 上面預設的 logwatch 這個套件所提供的分析工具, 他會每天分析一次登錄檔案,並且將資料以 email 的格式寄送給 root 呢! 你也可以直接到 logwatch 的官方網站上面看看:
不過在我們的安裝方式裡面,預設並沒有安裝 logwatch 就是了!所以,我們先來安裝一下 logwatch 這套軟體再說。假設你已經將 CentOS 7.1 的原版光碟掛載在 /mnt 當中了,那使用底下的方式來處理即可:
[root@study ~]# yum install /mnt/Packages/perl-5.*.rpm > /mnt/Packages/perl-Date-Manip-*.rpm \ > /mnt/Packages/perl-Sys-CPU-*.rpm \ > /mnt/Packages/perl-Sys-MemInfo-*.rpm \ > /mnt/Packages/logwatch-*.rpm # 得要安裝數個軟體才能夠順利的安裝好 logwatch 喔!當然,如果你有網路,直接安裝就好了! [root@study ~]# ll /etc/cron.daily/0logwatch -rwxr-xr-x. 1 root root 434 Jun 10 2014 /etc/cron.daily/0logwatch [root@study ~]# /etc/cron.daily/0logwatch
安裝完畢以後,logwatch 就已經寫入 cron 的運作當中了!詳細的執行方式你可以參考上表中 0logwatch 檔案內容來處理,未來則每天會送出一封 email 給 root 查閱就是了。因為我們剛剛安裝,那可以來分析一下嗎?很簡單啦!你就直接執行 0logwatch 即可啊!如上表最後一個指令的示意。因為鳥哥的測試機目前的服務很少, 所以產生的資訊量也不多,因此執行的速度很快。比較忙的系統資訊量比較大,分析過程會花去一小段時間。如果順利執行完畢,那請用 root 的身份去讀一下 email 囉!
[root@study ~]# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 5 messages 2 new 4 unread >N 4 root Thu Jul 30 19:35 29/763 "testing at job" N 5 logwatch@study.cento Thu Aug 20 17:55 97/3045 "Logwatch for study.centos.vbird (Linux)" & 5 Message 5: From root@study.centos.vbird Thu Aug 20 17:55:23 2015 Return-Path: <root@study.centos.vbird> X-Original-To: root Delivered-To: root@study.centos.vbird To: root@study.centos.vbird From: logwatch@study.centos.vbird Subject: Logwatch for study.centos.vbird (Linux) Auto-Submitted: auto-generated Precedence: bulk Content-Type: text/plain; charset="iso-8859-1" Date: Thu, 20 Aug 2015 17:55:23 +0800 (CST) Status: R # logwatch 會先說明分析的時間與 logwatch 版本等等資訊 ################### Logwatch 7.4.0 (03/01/11) #################### Processing Initiated: Thu Aug 20 17:55:23 2015 Date Range Processed: yesterday ( 2015-Aug-19 ) Period is day. Detail Level of Output: 0 Type of Output/Format: mail / text Logfiles for Host: study.centos.vbird ################################################################## # 開始一項一項的資料進行分析!分析得很有道理啊! --------------------- pam_unix Begin ------------------------ su-l: Sessions Opened: dmtsai -> root: 2 Time(s) ---------------------- pam_unix End ------------------------- --------------------- Postfix Begin ------------------------ 894 Bytes accepted 894 894 Bytes delivered 894 ======== ================================================== 2 Accepted 100.00% -------- -------------------------------------------------- 2 Total 100.00% ======== ================================================== 2 Removed from queue 2 Delivered ---------------------- Postfix End ------------------------- --------------------- SSHD Begin ------------------------ Users logging in through sshd: dmtsai: 192.168.1.200: 2 times Received disconnect: 11: disconnected by user : 1 Time(s) ---------------------- SSHD End ------------------------- --------------------- Sudo (secure-log) Begin ------------------------ dmtsai => root -------------- /bin/su - 2 Time(s). ---------------------- Sudo (secure-log) End ------------------------- # 當然也得說明一下目前系統的磁碟使用狀態喔! --------------------- Disk Space Begin ------------------------ Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 10G 3.7G 6.3G 37% / devtmpfs 1.4G 0 1.4G 0% /dev /dev/vda2 1014M 141M 874M 14% /boot /dev/vda4 1014M 33M 982M 4% /srv/myproject /dev/mapper/centos-home 5.0G 642M 4.4G 13% /home /dev/mapper/raidvg-raidlv 1.5G 33M 1.5G 3% /srv/raidlvm ---------------------- Disk Space End -------------------------
由於鳥哥的測試用主機尚未啟動許多服務,所以分析的項目很少。若你的系統已經啟動許多服務的話, 那麼分析的項目理應會多很多才對。
雖然已經有了類似 logwatch 的工具,但是鳥哥自己想要分析的資料畢竟與對方不同~所以囉,鳥哥就自己寫了一支小程式 (shell script 的語法) 用來分析自己的登錄檔,這支程式分析的登錄檔主要由 journalctl 所產生,而且只會抓前一天的登錄檔來分析而已~ 若比對 rsyslog.service 所產生的登錄檔,則主要用到底下幾個對應的檔名 (雖然真的沒用到! ^_^):
當然啦,還不只這些啦,包括各個主要常見的服務,如 pop3, mail, ftp, su 等會使用到 pam 的服務, 都可以透過鳥哥寫的這個小程式來分析與處理呢~整個資料還會輸出一些系統資訊。如果你想要使用這個程式的話, 歡迎下載:
安裝的方法也很簡單,你只要將上述的檔案在根目錄底下解壓縮,自然就會將 cron 排程與相對應的檔案放到正確的目錄去。 基本上鳥哥會用到的目錄有 /etc/cron.d 以及 /root/bin/logfile 而已!鳥哥已經寫了一個 crontab 在檔案中,設定每日 00:10 去分析一次系統登錄檔。 不過請注意,這次鳥哥使用的登錄檔真的是來自於 journalctl ,所以 CentOS 6 以前的版本千萬不要使用喔!現在假設我將下載的檔案放在跟目錄,所以:
[root@study ~]# tar -zxvf /logfile_centos7.tar.gz -C / [root@study ~]# cat /etc/cron.d/vbirdlogfile 10 0 * * * root /bin/bash /root/bin/logfile/logfile.sh &> /dev/null [root@study ~]# sh /root/bin/logfile/logfile.sh # 開始嘗試分析系統的登錄檔,依據你的登錄檔大小,分析的時間不固定! [root@study ~]# mail # 自己找到剛剛輸出的結果,該結果的輸出有點像底下這樣: Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 9 messages 4 new 7 unread N 8 root Thu Aug 20 19:26 60/2653 "study.centos.vbird logfile analysis results" >N 9 root Thu Aug 20 19:37 59/2612 "study.centos.vbird logfile analysis results" & 9 # 先看看你的硬體與作業系統的相關情況,尤其是 partition 的使用量更需要隨時注意! =============== system summary ================================= Linux kernel : Linux version 3.10.0-229.el7.x86_64 (builder@kbuilder.dev.centos.org) CPU informatin: 2 Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz CPU speed : 2299.996 MHz hostname is : study.centos.vbird Network IP : 192.168.1.100 Check time : 2015/August/20 19:37:25 ( Thursday ) Summary date : Aug 20 Up times : 3 days, 59 min, Filesystem summary: Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/centos-root xfs 10G 3.7G 6.3G 37% / devtmpfs devtmpfs 1.4G 0 1.4G 0% /dev tmpfs tmpfs 1.4G 48K 1.4G 1% /dev/shm tmpfs tmpfs 1.4G 8.7M 1.4G 1% /run tmpfs tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup /dev/vda2 xfs 1014M 141M 874M 14% /boot /dev/vda4 xfs 1014M 33M 982M 4% /srv/myproject /dev/mapper/centos-home xfs 5.0G 642M 4.4G 13% /home /dev/mapper/raidvg-raidlv xfs 1.5G 33M 1.5G 3% /srv/raidlvm /dev/sr0 iso9660 7.1G 7.1G 0 100% /mnt # 這個程式會將針對 internet 與內部監聽的埠口分開來顯示! ================= Ports 的相關分析資訊 ======================= 主機啟用的 port 與相關的 process owner: 對外部介面開放的 ports (PID|owner|command) tcp 21|(root)|/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf tcp 22|(root)|/usr/sbin/sshd -D tcp 25|(root)|/usr/libexec/postfix/master -w tcp 222|(root)|/usr/sbin/sshd -f /etc/ssh/sshd2_config -D tcp 514|(root)|/usr/sbin/rsyslogd -n tcp 555|(root)|/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf # 以下針對有啟動的服務個別進行分析! ================= SSH 的登錄檔資訊彙整 ======================= 今日沒有使用 SSH 的紀錄 ================= Postfix 的登錄檔資訊彙整 =================== 使用者信箱受信次數:
目前鳥哥都是透過這支程式去分析自己管理的主機,然後再據以瞭解系統狀況,如果有特殊狀況則即時進行系統處理! 而且鳥哥都是將上述的 email 調整成自己可以在 Internet 上面讀到的郵件,這樣我每天都可以收到正確的登錄檔分析資訊哩!