鳥哥的 Linux 私房菜
<<

第 12 堂課:軟體管理與安裝及登錄檔初探

最近更新日期:2017/04/03

許多時刻,我們都需要軟體的安裝與升級,尤其在資安方面,將軟體保持在越新的狀態,就越能解決零時攻擊的問題。 Linux 提供了快速的軟體線上安裝/升級機制,管理員在有網路的情況下,很容易進行軟體的管理。另外,查閱登錄檔也是管理員很重要的工作項目之一。

12.1:Linux 本機軟體管理 rpm

目前主流 Linux distribution 使用的軟體管理機制,大概是底下兩種:

distribution 代表軟體管理機制使用指令線上升級機制(指令)
Red Hat/FedoraRPMrpm, rpmbuildYUM (yum)
Debian/UbuntuDPKGdpkgAPT (apt-get)

CentOS 為 Red Hat 的一支,因此也是使用 RPM 的軟體管理機制。

12.1.1:RPM 管理員簡介

RPM 全名是『 RedHat Package Manager 』簡稱則為 RPM 。顧名思義,當初這個軟體管理的機制是由 Red Hat 這家公司發展出來的。 RPM 是以一種資料庫記錄的方式來將你所需要的軟體安裝到你的 Linux 系統的一套管理機制。

他最大的特點就是將你要安裝的軟體先編譯過, 並且打包成為 RPM 機制的包裝檔案,透過包裝好的軟體裡頭預設的資料庫記錄, 記錄這個軟體要安裝的時候必須具備的相依屬性軟體,當安裝在你的 Linux 主機時, RPM 會先依照軟體裡頭的資料查詢 Linux 主機的相依屬性軟體是否滿足, 若滿足則予以安裝,若不滿足則不予安裝。那麼安裝的時候就將該軟體的資訊整個寫入 RPM 的資料庫中,以便未來的查詢、驗證與反安裝!這樣一來的優點是:

  • 由於已經編譯完成並且打包完畢,所以軟體傳輸與安裝上很方便 (不需要再重新編譯);
  • 由於軟體的資訊都已經記錄在 Linux 主機的資料庫上,很方便查詢、升級與反安裝

如果使用者想要自行修改 RPM 內的軟體參數時,就需要通過含有原始碼在內的 SRPM 來處理。

  • RPM 的軟體命名方式

一般來說,RPM 軟體的命名有其一定的規則,以 rp-pppoe-3.11-5.el7.x86_64.rpm 來說明:

rp-pppoe -        3.11   -     5        .el7.x86_64  .rpm
軟體名稱   軟體的版本資訊 釋出的次數 適合的硬體平台 副檔名

除了後面適合的硬體平台與副檔名外,主要是以『-』來隔開各個部分,這樣子可以很清楚的發現該軟體的名稱、 版本資訊、打包次數與操作的硬體平台!較為特殊的是『適合的硬體平台』項目。

由於 RPM 可以適用在不同的操作平台上,但是不同的平台設定的參數還是有所差異性!並且,我們可以針對比較高階的 CPU 來進行最佳化參數的設定, 這樣才能夠使用高階 CPU 所帶來的硬體加速功能。 所以就有所謂的 i386, i586, i686, x86_64 與 noarch 等的檔案名稱出現。

  • RPM 的優點

由於 RPM 是透過預先編譯並打包成為 RPM 檔案格式後,再加以安裝的一種方式,並且還能夠進行資料庫的記載。 所以 RPM 有以下的優點:

  • RPM 內含已經編譯過的程式與設定檔等資料,可以讓使用者免除重新編譯的困擾;
  • RPM 在被安裝之前,會先檢查系統的硬碟容量、作業系統版本等,可避免檔案被錯誤安裝;
  • RPM 檔案本身提供軟體版本資訊、相依屬性軟體名稱、軟體用途說明、軟體所含檔案等資訊,便於瞭解軟體;
  • RPM 管理的方式使用資料庫記錄 RPM 檔案的相關參數,便於升級、移除、查詢與驗證。

不過,由於軟體彼此之間可能會有相關性的問題,因此 RPM 有所謂的『軟體相依』的情況,亦即某些底層軟體沒有安裝時, 上層軟體安裝會失敗的問題。

  • RPM 屬性相依的克服方式: YUM 線上升級

既然 RPM 已經內建了軟體相依的狀態, yum 則主動的分析 RPM 軟體的屬性相依問題,並做成列表清單,當管理員想要安裝某個軟體時, yum 機制即可立即根據清單來了解底層軟體是否已經安裝,若未安裝則開始相依屬性克服,將所有需要的軟體一口氣進行安裝的動作。

以 CentOS 為例,CentOS 透過 (1)先將釋出的軟體放置到 YUM 伺服器內,然後(2)分析這些軟體的相依屬性問題,將軟體內的記錄資訊寫下來 (header)。 然後再將這些資訊分析後記錄成軟體相關性的清單列表。這些列表資料與軟體所在的本機或網路位置可以稱呼為容器或軟體倉庫或軟體庫 (repository)。 當用戶端有軟體安裝的需求時,用戶端主機會主動的向網路上面的 yum 伺服器的軟體庫網址下載清單列表, 然後透過清單列表的資料與本機 RPM 資料庫已存在的軟體資料相比較,就能夠一口氣安裝所有需要的具有相依屬性的軟體了。

例題:
  1. 目前主流 Linux distribution 大概使用那兩類的軟體安裝機制?
  2. Red Hat 系統使用的線上升級機制為何?
  3. 何謂軟體的相依性問題?

12.1.2:RPM 軟體管理程式: rpm

由於有了 yum 這個線上升級機制,因此目前很少會用到 rpm 來進行安裝、升級的任務,使用者可以略過這方面的學習。 但是 rpm 有本機軟體查詢以及檔案驗證的功能,對於快速檢查相當有幫助。

  • RPM 查詢 (query)

RPM 在查詢的時候,其實查詢的地方是在 /var/lib/rpm/ 這個目錄下的資料庫檔案。常見的查詢選項如下:

[root@localhost ~]# rpm -qa                              <==已安裝軟體
[root@localhost ~]# rpm -q[licdR] 已安裝的軟體名稱       <==已安裝軟體
[root@localhost ~]# rpm -qf 存在於系統上面的某個檔名     <==已安裝軟體
[root@localhost ~]# rpm -qp[licdR] 未安裝的某個檔案名稱  <==查閱RPM檔案
例題:
  1. 找出你的 Linux 是否有安裝 logrotate 這個軟體?
  2. 列出上題當中,屬於該軟體所提供的所有目錄與檔案
  3. 列出 logrotate 這個軟體的相關說明資料
  4. 找出 /bin/sh 是那個軟體提供的?
  5. 如果我誤砍了某個重要檔案,例如 /etc/crontab,偏偏不曉得他屬於哪一個軟體,該怎麼辦?
  • RPM 驗證 (Verify)

驗證 (Verify) 的功能主要在於提供系統管理員一個有用的管理機制,作用的方式是『使用 /var/lib/rpm 底下的資料庫內容來比對目前 Linux 系統的環境下的所有軟體檔案 』 也就是說,當你有資料不小心遺失, 或者是因為你誤殺了某個軟體的檔案,或者是不小心不知道修改到某一個軟體的檔案內容, 就用這個簡單的方法來驗證一下原本的檔案系統即可。

[root@localhost ~]# rpm -Va
[root@localhost ~]# rpm -V  已安裝的軟體名稱
[root@localhost ~]# rpm -Vp 某個 RPM 檔案的檔名
[root@localhost ~]# rpm -Vf 在系統上面的某個檔案

若有檔案的某些資料被修改,則會出現下列的字樣:

  • S :(file Size differs) 檔案的容量大小是否被改變
  • M :(Mode differs) 檔案的類型或檔案的屬性 (rwx) 是否被改變?如是否可執行等參數已被改變
  • 5 :(MD5 sum differs) MD5 這一種指紋碼的內容已經不同
  • D :(Device major/minor number mis-match) 裝置的主/次代碼已經改變
  • L :(readLink(2) path mis-match) Link 路徑已被改變
  • U :(User ownership differs) 檔案的所屬人已被改變
  • G :(Group ownership differs) 檔案的所屬群組已被改變
  • T :(mTime differs) 檔案的建立時間已被改變
  • P :(caPabilities differ) 功能已經被改變
例題:
  1. 列出你的 Linux 內的 logrotate 這個軟體是否被更動過
  2. 查詢一下,你的 /etc/crontab 是否有被更動過
  3. 定期在星期天 2:00 進行一次全系統的軟體驗證,並將驗證結果更新到 /root/rpmv.txt 檔案中
  • RPM 數位簽章 (Signature)

就像自己的簽名一樣,軟體開發商原廠所推出的軟體也會有一個廠商自己的簽章系統,只是這個簽章被數位化了而已。 廠商可以用數位簽章系統產生一個專屬於該軟體的簽章,並將該簽章的公鑰 (public key) 釋出。因此,當你要安裝一個 RPM 檔案時:

  • 首先你必須要先安裝原廠釋出的公鑰檔案;
  • 實際安裝原廠的 RPM 軟體時, rpm 指令會去讀取 RPM 檔案的簽章資訊,與本機系統內的簽章資訊比對,
  • 若簽章相同則予以安裝,若找不到相關的簽章資訊時,則給予警告並且停止安裝。

CentOS 使用的數位簽章系統為 GNU 計畫的 GnuPG (GNU Privacy Guard, GPG)。 GPG 可以透過雜湊運算,算出獨一無二的專屬金鑰系統或者是數位簽章系統。 而根據上面的說明,我們也會知道首先必須要安裝原廠釋出的 GPG 數位簽章的公鑰檔案!CentOS 的數位簽章位於 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 , 至於安裝與找到金鑰的方式如下:

[root@localhost ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@localhost ~]# rpm -qa | grep pubkey
gpg-pubkey-f4a80eb5-53a7ff4b

[root@localhost ~]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
  • RPM 資料庫重建

有時候正在安裝軟體時,卻發生停電的狀況,或者是某些突發狀況,導致的系統問題等等,接可能會直接/間接的造成 /var/lib/rpm 內的 RPM 資料庫錯亂。 此時可以透過底下的方式來重建資料庫:

[root@localhost ~]# rpm --rebuilddb   <==重建資料庫

12.2:Linux 線上安裝/升級機制: yum

如果讀者的 CentOS 可以連上 Internet 的話,那麼就可以透過 CentOS 官網與相關映射站來取得原版官網的軟體,可以進行各項線上安裝/升級的任務, 再也無須使用原版光碟了。

12.2.1:利用 yum 進行查詢、安裝、升級與移除功能

yum 是前台使用的軟體,其實後端 Linux 還是使用 rpm 來進行軟體管理的任務就是了。yum 常見的用法如下:

  • 查詢功能:yum [list|info|search|provides|whatprovides] 參數

如果想要查詢利用 yum 來查詢原版 distribution 所提供的軟體,或已知某軟體的名稱,想知道該軟體的功能,直接使用 yum 搭配參數即可。 例如要找出原版的 raid 作為關鍵字的軟體名稱時:

[root@localhost ~]# yum search raid
Loaded plugins: fastestmirror, langpacks
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Loading mirror speeds from cached hostfile  <==進行清單下載動作
 * base: ftp.ksu.edu.tw                     <==自動找到的最佳映射站
 * extras: ftp.ksu.edu.tw
 * updates: ftp.ksu.edu.tw
================================ N/S matched: raid ================================
dmraid.i686 : dmraid (Device-mapper RAID tool and library)
dmraid.x86_64 : dmraid (Device-mapper RAID tool and library)
dmraid-devel.x86_64 : Development libraries and headers for dmraid.
dmraid-events-logwatch.x86_64 : dmraid logwatch-based email reporting
libstoragemgmt-megaraid-plugin.noarch : Files for LSI MegaRAID support for libstoragemgmt
dmraid-events.x86_64 : dmevent_tool (Device-mapper event tool) and DSO
iprutils.x86_64 : Utilities for the IBM Power Linux RAID adapters
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)

  Name and summary matches only, use "search all" for everything.

yum 進行軟體安裝與升級的動作相當簡單,透過下載伺服器的清單列表後,與本機的 rpm 資料庫比對,若發現伺服器存在但本機不存在者, 則可以進行安裝,若發現伺服器的軟體版本較新而本機軟體較舊,則可以進行升級。另外,yum 也會自動透過速度比對,找到最近的官網映射站來進行網路下載的任務。 如果想要了解上述 dmraid 這個軟體的說明,可以這樣處理:

[root@localhost ~]# yum info dmraid
Installed Packages
Name        : dmraid
Arch        : x86_64
Version     : 1.0.0.rc16
Release     : 26.el7
Size        : 341 k
Repo        : installed
From repo   : anaconda
Summary     : dmraid (Device-mapper RAID tool and library)
URL         : http://people.redhat.com/heinzm/sw/dmraid
License     : GPLv2+
Description : DMRAID supports RAID device discovery, RAID set activation, creation,
            : removal, rebuild and display of properties for ATARAID/DDF1 metadata on
            : Linux >= 2.4 using device-mapper.

其實就是 rpm -qi dmraid 的內容展現!而如果想要知道伺服器上面的所有軟體列表清單,則可以使用『 yum list 』來查閱! 這與 rpm -qa 有點類似,只是 rpm -qa 僅列出本機上面的軟體,而 yum list 可以列出伺服器上面的所有軟體名稱!

從前一小節讀者可以了解『 rpm -qf /local/file/name 』可以透過檔案來找出原本的軟體名稱,那 yum 的相關功能如何達成? 例如,哪個軟體提供了 /etc/passwd 呢?可以這樣處理:

[root@localhost ~]# yum provides "*/passwd"
setup-2.8.71-6.el7.noarch : A set of system configuration and setup files
Repo        : @anaconda
Matched from:
Filename    : /etc/passwd
例題:請使用 yum 進行如下任務,不要使用 rpm 喔!
  1. 那一個軟體提供了 ifconfig 這個指令
  2. 顯示並查閱該軟體的描述 (Description) 嘗試了解該軟體的任務
  3. 列出所有以 qemu 為開頭的軟體名稱
  4. 有個名為 qemu-kvm 的軟體功能為何?
  • 安裝/升級功能:yum [install|update] 軟體

安裝與升級直接字面上的處理為 install/update 即可!

例題:基本的查詢與安裝任務
  1. 用 rpm 本機查詢有沒有安裝 pam-devel 這個軟體?
  2. 用 yum 查詢是否有這個 pam-devel 的軟體名稱?
  3. 用 yum 線上安裝這個 pam-devel 的軟體。
  4. 安裝完畢後,透過 rpm 查詢 pam-devel 的所屬檔名有哪些
例題:基本的升級任務
  1. 先使用 yum check-update 嘗試分析目前伺服器上有比本機 Linux 還要新的軟體群
  2. 隨意選擇一個軟體 (例如 sudo) 來進行單一軟體的升級
  3. 進行一次全系統升級
  4. 如果需要每天凌晨 3 點自動背景進行全系統升級,該如何處理?同時須注意到 yum 是否需要加上特別的參數?
例題:基本的移除任務
  1. 將剛剛安裝的 pam-devel 移除掉 (請自行 man yum 找出移除的選項)
  2. 剛剛已經全系統安裝完畢,請問是否需要重新開機?為什麼?

12.2.2:yum 的設定檔

yum 是透過設定檔的規範去找到安裝/升級伺服器的,因為經常有第三方的協力廠商推出 yum 相容的安裝伺服器, 因此了解與設定 yum 設定檔,是有其必要的。

預設的 CentOS 7 的設定檔的檔名為: /etc/yum.repos.d/*.repo,重點在副檔名必須為 .repo 才行。預設的 CentOS 設定檔內容如下:

[root@localhost ~]# cat /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

相關的設定資料說明如下:

  • [base]:代表軟體庫的名字!中括號一定要存在,裡面的名稱盡量取與軟體有關的關鍵字。此外,不能有兩個相同的軟體庫名稱,否則 yum 指令會誤判
  • name:與 [] 類似,僅作為完整名稱顯示,通常可設定與 [] 內的文字相同即可。
  • mirrorlist=:使用 CentOS 官網記載的映射站分析,透過 yum 主動分析最靠近本機的伺服器來源
  • baseurl=:與 mirrorlist 不同,baseurl 為自行指定固定的 yum 伺服器,第三方協力軟體需要這個設定,管理員自己設定的 yum 伺服器也通常使用 baseurl 來規範來源。
  • enabled=1:是否啟動這個軟體庫,預設為啟動,若只想要設定好這個軟體庫,但平時不想使用時,可將這個項目設定為 enabled=0
  • gpgcheck=1:指定是否需要查閱 RPM 檔案內的數位簽章!
  • gpgkey=:若指定需要數位簽章 (gpgcheck=1),則需要在此填寫數位簽章的檔案檔名。
例題:
  1. 由於 mirrorlist 需要一段時間去測試最快的伺服器,並且偶而會測試錯誤。因此請自行手動找到最近的伺服器, 將 mirrorlist 修改成 baseurl 的方式來設定好 [base], [updates], [extras] 三個軟體庫的內容。
  2. 修改完成後,由於修改過 yum 設定檔,為了擔心清單快取會有重複或者是其他問題,請 yum clean all 清除所有系統快取的資訊。
  3. 再次的 yum update 測試一下是否正確的下載了清單資訊。

若要列出所有的軟體庫,可使用『 yum repolist all 』的選項來處理:

例題:Red Hat 提供了 EPEL 的計畫,由許多志工提供了很多針對 RHEL/CentOS 打包好的軟體,提供給用戶使用。但這些軟體並非官網提供, 因此其軟體庫並沒有在預設的設定檔內,請依據底下的方式來處理 EPEL 的軟體支援:
  1. 先上網查詢 EPEL,分析到如下網頁:https://dl.fedoraproject.org/pub/epel/7/x86_64/
  2. 在 /etc/yum.repos.d/ 新增一名為 epel.repo 的檔案,內容填寫 [epel], name, baseurl, gpgcheck = 0, enabled=0 五個項目即可
  3. 使用 yum repolist all 列出系統上所有的軟體庫,並查看 epel 是否在其中?
  4. 手動使用這個軟體庫時,指令列加上 yum --enablerepo epel 之後,填寫需要的動作。例如列出 (list) netcdf 這個軟體
  5. 承上,若需要安裝 netcdf 這個軟體時,該如何下達指令?

12.2.3:yum 的軟體群組功能

除了個別的軟體之外,許多大型專案的軟體群會集合成為一個『軟體群組』。舉例來說,開發者工具經常需要編譯器、環境檢查確認模組等等, 這些工具則可以整合成為一個軟體群組。yum 提供許多軟體群組讓管理員快速的安裝好所需要的環境。下面以開發工具為例說明:

[root@localhost ~]# LANG=C yum grouplist
Loaded plugins: fastestmirror, langpacks
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
 * base: ftp.ksu.edu.tw
 * extras: ftp.ksu.edu.tw
 * updates: ftp.ksu.edu.tw
Available Environment Groups:  <==還可以安裝的操作界面
   Minimal Install
   Compute Node
   Infrastructure Server
   File and Print Server
   Basic Web Server
   Virtualization Host
   Server with GUI
   GNOME Desktop
   KDE Plasma Workspaces
   Development and Creative Workstation
Available Groups:             <==其他的軟體群組!
   Compatibility Libraries
   Console Internet Tools
   Development Tools          <==開發工具!
   Graphical Administration Tools
   Legacy UNIX Compatibility
   Scientific Support
   Security Tools
   Smart Card Support
   System Administration Tools
   System Management
Done

[root@localhost ~]# yum groupinstall "Development Tools"

12.3:Linux 登錄檔初探

系統的登錄檔管理相當重要,因為各種系統活動的記錄均會記載於登錄檔中。尤其系統有資安等問題時,登錄檔更是查閱相關資訊的重要依據。

12.3.1:CentOS 7 登錄檔簡易說明

各 Linux distribution 所使用的登錄檔記錄位置大多位於 /var/log,但檔名則不見得相同。CentOS 7 常見的檔名與相關內容對應如下:

  • /var/log/cron:記錄由 crond 這個服務所產生的各項資訊,包括使用者 crontab 的結果。
  • /var/log/dmesg:記錄系統在開機的時候核心偵測過程所產生的各項資訊。
  • /var/log/lastlog:記錄系統上面所有的帳號最近一次登入系統時的相關資訊。
  • /var/log/maillog:記錄郵件往來的資訊,包括由 postfix, devecot 服務所產生的系統資訊
  • /var/log/messages:幾乎系統發生的錯誤訊息 (或者是重要的資訊) 都會記錄在這個檔案中; 如果系統發生莫名的錯誤時,這個檔案是一定要查閱的登錄檔之一。
  • /var/log/secure:只要牽涉到『需要輸入帳號密碼』的軟體,那麼當登入時 (不管登入正確或錯誤) 都會被記錄在此檔案中。
  • 登錄檔所需相關服務 (daemon) 與程式

由於 CentOS7 已經改為 systemd 管理系統,systemd 提供了 systemd-journald 這個服務來管理登錄檔日誌記載,不過還是保留舊有的 rsyslog 服務。 然而記載的資料如果過於龐大,那麼記載的檔案本身負荷會比較高,因此還需要一個輪替登錄檔的功能,那就是 logroate 了!

  • systemd-journald.service:最主要的訊息收受者,由 systemd 提供的;
  • rsyslog.service:主要登錄系統與網路等服務的訊息;
  • logrotate:主要在進行登錄檔的輪替功能。
例題:
  1. 檢查一下上述的三個資料中,哪幾個是服務?哪幾個是執行檔?
  2. 並檢查服務項目有沒有啟動?而執行檔又是如何執行的?
  • 登錄檔內容的一般格式

一般來說,系統產生的訊息經過記錄下來的資料中,每條訊息均會記錄底下的幾個重要資料:

  • 事件發生的日期與時間;
  • 發生此事件的主機名稱;
  • 啟動此事件的服務名稱 (如 systemd, CROND 等) 或指令與函式名稱 (如 su, login..);
  • 該訊息的實際資料內容。

舉例來說,假設讀者剛剛使用 student 的身份切換成為 root 的話,那麼記載登錄資訊的 /var/log/secure 內容可能就會出現如下資料:

[root@localhost ~]# cat /var/log/secure
.......
May 17 09:43:16 www   sudo: student : TTY=pts/0 ; PWD=/home/student ; USER=root ; COMMAND=/bin/su -
May 17 09:43:16 www   su: pam_unix(su-l:session): session opened for user root by student(uid=0)
|---日期時間--|-主機-|指令|詳細訊息

因為使用者使用了 sudo su - 這串指令,因此上述表格內即有 sudo 與 su 兩者的記錄狀態。由這個輸出,管理員可以很輕鬆的查詢到正確的日期與時間, 還有哪個使用者操作了什麼指令等等。也由於 /var/log 內的資料大多含有系統資安的記載,因此大多僅有 root 具有查詢的權限。

例題:嘗試說明底下的資訊當中,系統出了什麼問題?
May 18 09:57:58 www sudo: pam_unix(sudo:auth): conversation failed
May 18 09:57:58 www sudo: pam_unix(sudo:auth): auth could not identify password for [student]
May 18 09:58:02 www sudo: student : TTY=pts/0 ; PWD=/home/student ; USER=root ; COMMAND=/bin/su -
May 18 09:58:02 www su: pam_unix(su-l:session): session opened for user root by student(uid=0)

12.3.2:rsyslog 的設定與運作

CentOS 5 以前使用 syslogd 這個服務,在 CentOS 6 以後則使用 rsyslogd 這個服務了。這個服務的設定檔在 /etc/rsyslog.conf , 設定內容主要是針對『(1)什麼服務 (2)的什麼等級訊息 (3)需要被記錄在哪裡(裝置或檔案)』,例如下表的範例:

服務名稱[.=!]訊息等級		訊息記錄的檔名或裝置或主機
mail.info			/var/log/maillog_info
  • 服務名稱

rsyslogd 主要還是透過 Linux 核心提供的 syslog 相關規範來設定資料的分類的,Linux 的 syslog 本身有規範一些服務訊息, 你可以透過這些服務來儲存系統的訊息。Linux 核心的 syslog 認識的服務類型主要有底下這些: (可使用 man 3 syslog 查詢到相關的資訊,或查詢 syslog.h 這個檔案來了解的!)

相對序號服務類別說明
0 kern(kernel) 就是核心 (kernel) 產生的訊息,大多是硬體偵測以及核心功能的啟用
1 user 在使用者層級所產生的資訊
2 mail 只要與郵件收發有關的訊息記錄都屬於這個;
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 函式,就可以將訊息加以定義了! 以下圖為例:

syslog 所制訂的服務名稱與軟體呼叫的方式
圖12.3.1、syslog 所制訂的服務名稱與軟體呼叫的方式
  • 訊息等級

同一個服務所產生的訊息也是有差別的,有啟動時僅通知系統而已的一般訊息 (information), 有出現還不至於影響到正常運作的警告訊息 (warn) , 還有系統硬體發生嚴重錯誤時,所產生的重大問題訊息 (error 等等); 訊息到底有多少種嚴重的等級呢?基本上,Linux 核心的 syslog 將訊息分為七個主要的等級,根據 syslog.h 的定義,訊息名稱與數值的對應如下:

等級數值等級名稱說明
7debug 用來 debug (除錯) 時產生的訊息資料;
6info 僅是一些基本的訊息說明而已;
5notice 雖然是正常資訊,但比 info 還需要被注意到的一些資訊內容;
4warning
(warn)
警示的訊息,可能有問題,但是還不至於影響到某個 daemon 運作的資訊;基本上, info, notice, warn 這三個訊息都是在告知一些基本資訊而已,應該還不至於造成一些系統運作困擾;
3err
(error)
一些重大的錯誤訊息,例如設定檔的某些設定值造成該服務服法啟動的資訊說明, 通常藉由 err 的錯誤告知,應該可以瞭解到該服務無法啟動的問題呢!
2crit 比 error 還要嚴重的錯誤資訊,這個 crit 是臨界點 (critical) 的縮寫,這個錯誤已經很嚴重了喔!
1alert 警告警告,已經很有問題的等級,比 crit 還要嚴重!
0emerg
(panic)
疼痛等級,意指系統已經幾乎要當機的狀態! 很嚴重的錯誤資訊了。通常大概只有硬體出問題,導致整個核心無法順利運作,就會出現這樣的等級的訊息吧!

特別留意一下在訊息等級之前還有 [.=!] 的連結符號喔!他代表的意思是這樣的:

  • . :代表『比後面還要嚴重的等級 (含該等級) 都被記錄下來』的意思,例如: mail.info 代表只要是 mail 的資訊,而且該資訊等級嚴重於 info (含 info 本身)時,就會被記錄下來的意思。
  • .=:代表所需要的等級就是後面接的等級而已, 其他的不要!
  • .!:代表不等於, 亦即是除了該等級外的其他等級都記錄。
  • CentOS 7 預設的 rsyslog.conf 內容

預設的 rsyslog.conf 內容如下:

[root@localhost ~]# grep -v '#' /etc/rsyslog.conf | grep -v '^$'
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log

上表前 5 行主要是用在 rsyslog 環境運作的設定,後面 7 行才是訊息等級記錄設定。該 7 行的設定項目為:

  1. *.info;mail.none;authpriv.none;cron.none:由於 mail, authpriv, cron 等類別產生的訊息較多, 且已經寫入底下的數個檔案中,因此在 /var/log/messages 裡面就不記錄這些項目。除此之外的其他訊息都寫入 /var/log/messages 中。
  2. authpriv.*:認證方面的訊息均寫入 /var/log/secure 檔案;
  3. mail.*:郵件方面的訊息則均寫入 /var/log/maillog 檔案;
  4. cron.*:例行性工作排程均寫入 /var/log/cron 檔案;
  5. *.emerg:當產生最嚴重的錯誤等級時,將該等級的訊息以 wall 的方式廣播給所有在系統登入的帳號得知。
  6. uucp,news.crit:當新聞群組方面的資訊有嚴重錯誤時就寫入 /var/log/spooler 檔案中;
  7. local7.*:將本機開機時應該顯示到螢幕的訊息寫入到 /var/log/boot.log 檔案中;

至於 mail.* 後面的 -/var/log/maillog 為何多了減號?由於郵件所產生的訊息比較多,因此我們希望郵件產生的訊息先儲存在速度較快的記憶體中 (buffer) ,等到資料量夠大了才一次性的將所有資料都填入磁碟內,這樣將有助於登錄檔的存取性能。 只不過由於訊息是暫存在記憶體內,因此若不正常關機導致登錄資訊未回填到登錄檔中,可能會造成部分資料的遺失。

例題:
  1. 設計一個名為 /var/log/admin.log 的登錄檔,將系統的所有登錄資訊通通塞入這個檔案內。
  • 登錄檔伺服器的設定

如果單位內有 10 部伺服器,若每部伺服器的登錄資訊都需要管理員個別登入每部系統來存取,將會導致大量的人力支援耗費。 此時可以指定單位內某部 Linux 成為登錄伺服器,假設為 A 伺服器,再將其他伺服器的登錄資訊轉向到 A 伺服器, 則管理員僅須分析 A 伺服器,即可了解單位內所有伺服器的登錄資訊了。

登錄檔伺服器的架構
圖12.3.2、登錄檔伺服器的架構

Server 端的設定只需要讓 rsyslogd 啟動 port 514 即可。不過有兩種啟動的方式,分別是啟動 TCP 與 UDP 兩種封包格式。 假設 Server/Client 都在內部網路,因此我們使用速度較快的 UDP 封包來處理:

例題:請將你的 Linux 規範成為登錄伺服器:
  1. 先設定 rsyslog.conf ,啟動 port 514 在 UDP 封包上:
    [root@localhost ~]# vim /etc/rsyslog.conf
    $ModLoad imudp             <==大概在 15, 16 行,將這兩個設定註解取消
    $UDPServerRun 514
    
  2. 重新啟動服務,並且觀察 port 是否正確啟動了?
    [root@localhost ~]# systemctl restart rsyslog
    [root@localhost ~]# netstat -tlunp | grep rsyslog
    udp        0      0 0.0.0.0:514        0.0.0.0:*                 6701/rsyslogd
    udp6       0      0 :::514             :::*                      6701/rsyslogd
    
  3. 將防火牆設定中,port 514 解開
    [root@localhost ~]# firewall-cmd --add-port=514/udp
    [root@localhost ~]# firewall-cmd --list-all
    public (default, active)
      interfaces: eth0
      sources:
      services: ftp http https tftp
      ports: 514/udp
      masquerade: no
      forward-ports:
      icmp-blocks:
      rich rules:
            rule family="ipv4" source address="172.16.100.254" accept
            rule family="ipv4" source address="172.16.0.0/16" service name="ssh" accept
    [root@localhost ~]# firewall-cmd --add-port=514/udp --permanent
    
例題:兩兩同學成對,查詢對方的 IP 後,將自己的訊息複製一份到對方的 rsyslog 當中。
  1. 先設定 rsyslog.conf 的內容,加入底下這行:
    [root@localhost ~]# vim /etc/rsyslog.conf
    *.*  @172.16.50.100:514
    
  2. 重新啟動 rsyslog.conf ,再請對方查閱一下自己的 /var/log/messages 是否有收集到對方的登錄資訊。
    [root@localhost ~]# systemctl restart rsyslog
    

12.3.3:systemd-journald.service 簡介

rsyslog 僅是一隻服務,因此許多開機過程中產生的資訊都發生在啟動 rsyslog 之前,因此核心得要額外切出一些服務來記載資訊,這稍微困擾些。 現在系統使用 systemd 來管理,systemd 提供了systemd-journald 來協助記載登錄檔~因此在開機過程中的所有資訊, 包括啟動服務與服務若啟動失敗的情況等等,都可以直接被記錄到 systemd-journald 當中。

不過 systemd-journald 由於是使用於記憶體的登錄檔記錄方式,因此重新開機過後,開機前的登錄檔資訊當然就不會被記載了。 為此,CentOS 7 還是建議啟動 rsyslogd 來協助分類記錄!也就是說,systemd-journald 用來管理與查詢這次開機後的登錄資訊,而 rsyslogd 可以用來記錄以前及現在的所以資料到磁碟檔案中,方便未來進行查詢!

  • 使用 journalctl 列出登錄檔

systemd-journald 服務所產生的任何資訊,都可以透過 journalctl 這個指令來呼叫出來:

[root@localhost ~]# journalctl [-nrpf] [--since TIME] [--until TIME] _optional

要注意 TIME 可以是英文代表 (yesterday,today..) 或者是詳細的年月日 (2016-05-18 00:00:00) 等等。至於常見的 _optional 則有:

  • _SYSTEMD_UNIT=unit.service :只輸出 unit.service 的資訊而已
  • _COMM=bash :只輸出與 bash 有關的資訊
  • _PID=pid :只輸出 PID 號碼的資訊
  • _UID=uid :只輸出 UID 為 uid 的資訊
  • SYSLOG_FACILITY=[0-23] :使用 syslog.h 規範的服務相對序號來呼叫出正確的資料!
例題:
  1. 不加任何參數與選項,列出所有的日誌資料
  2. (1)先用 date 找出日期格式 YYYY-MM-DD 的日期,並以該日期的資訊顯示 log,以及(2)僅今天及(3)僅昨天的日誌資料內容
  3. 只找出 crond.service 的資料,同時只列出最新的 10 筆即可
  4. 找出 su, login 執行的登錄檔,同時只列出最新的 10 筆即可

12.3.4:透過 logwatch 分析

如果系統能夠自動的分析登錄檔,之後做成類似報表的資料提供給管理員進行分析,則管理員會更加輕鬆。 CentOS 提供了 logwatch 這個分析軟體來提供管理員進一步分析登錄檔,管理員僅須安裝此軟體,系統即刻將 logwatch 排進行程, 未來管理員直接觀察 mail 即可。

例題:
  1. 使用 rpm 檢查是否已經安裝了 logwatch
  2. 使用 yum 立刻安裝 logwatch 這套軟體
  3. 使用 rpm -ql 的方式,查詢 logwatch 的所有檔案,並找出與 cron 有關的設定檔名
  4. 承上,找到上述檔案後觀察內容,並將執行的方法『立刻』執行一遍
  5. 使用 root 的身份輸入 mail 查詢輸出的資訊

12.4:課後練習操作

前置動作:請使用 unit12 的硬碟進入作業環境,並請先以 root 身分執行 vbird_book_setup_ip 指令設定好你的學號與 IP 之後,再開始底下的作業練習。

請使用 root 的身份進行如下實做的任務。直接在系統上面操作,操作成功即可,上傳結果的程式會主動找到你的實做結果。 另外,由於底下的題目有部分需要實作後提供答案,故開始實作前,請先回答 ans12.txt 內的問題再繼續往下處理

  1. 請回答下列問題,並將答案寫在 /root/ans12.txt 檔案內:
    1. 請查出 /etc/sudoers 這個檔案屬於哪一個軟體 (1)寫下查詢的指令與 (2)寫下查詢的結果
    2. 承上,上面查到的這個軟體中,該軟體內有那些檔案被修改過?(1)寫下查詢的指令與 (2)寫下查詢的結果
    3. (從本題以後,請完成網路設定後再繼續實作與回答下列問題) 承上,上面查到的軟體中,如果因為有問題,所以需要重新安裝,可以使用怎麼樣的指令直接線上重新安裝? 請寫下安裝的指令
    4. 有個檔名為 misc_conv.3.gz ,這個檔案屬於哪個軟體?(1)寫下查詢的指令與 (2)寫下查詢的結果
    5. root 曾經在某個時段利用 sudo 做過【 cat /etc/shadow 】這個指令,請依據登錄檔的查詢結果, (1)將查詢到的登錄資訊轉存到這個檔案的這個段落來 (2)root執行的時間點是甚麼時候 (日/月/時/分)
  2. 系統的基礎設定-網路的設定部份:
    1. 由於我們的系統是經過 clone 出來的,因此所有的設備恐怕都怪怪的。所以,請先將系統中的 eth0 這個網路連線刪除。
    2. 請依據底下的說明,重新建立 eth0 這個網路連線:
      • 使用的介面卡為 eth0 這個介面卡
      • 需要開機就自動啟動這個連線
      • 網路參數的設定方式為手動設定,不要使用自動取得喔
      • IP address 為: 192.168.251.XXX/24 (XXX 為上課時,老師給予的號碼)
      • Gateway 為: 192.168.251.250
      • DNS server IP為:請依據老師課後說明來設定 (若無規定,請以 168.95.1.1 及 8.8.8.8 這兩個為準)
      • 主機名稱:請設定為 stdXXX.book.vbird (其中 XXX 為上課時,老師給予的號碼)
      務必記得設定完畢後,一定要啟用這個網路連線,否則成績無法上傳喔!
  3. 使用網路安裝相關軟體
    1. 請以貴校的 FTP 或 http 為主,設定好你的 CentOS server 的 YUM 設定檔。以崑山來說,可使用 http://ftp.ksu.edu.tw/ 來查詢所需要的三個軟體倉庫。
    2. 請使用 yum 這個指令的相關功能,找到有關【 epel 】的關鍵字軟體,並且安裝該軟體
    3. 請設定每天凌晨 3 點自動背景進行全系統升級。
    4. 這部主機需要有個科技用的軟體 netcdf-fortran,請安裝這套軟體
    5. 這部主機需要作為未來開發軟體之用,因此需要安裝一個開發用的軟體群組,請安裝他。
  4. 登錄檔處理
    1. 請透過相關動作,讓你的全部登錄資訊 (info 以上等級) 寫入 /var/log/full.log 檔案內
    2. 請讓所有的登錄資訊在進行 log rotate 時,必須要有壓縮
    3. 請安裝 logwatch ,以便未來登錄檔的查詢之用。

作業結果傳輸:請以 root 的身分執行 vbird_book_check_unit 指令上傳作業結果。 正常執行完畢的結果應會出現【XXXXXX;aa:bb:cc:dd:ee:ff;unitNN】字樣。若需要查閱自己上傳資料的時間, 請在作業系統上面使用: http://192.168.251.250 檢查相對應的課程檔案。

2016/05/18:加油!
2017/04/03:增加了習題囉!趕快加油處理處理!
2016/05/18以來統計人數
計數器
>>
HOME
PrePage
NextPage
   http://linux.vbird.org is designed by VBird during 2001-2015.