22.2.5 RPM 驗證與數位簽章 (Verify/signature)
驗證 (Verify) 的功能主要在於提供系統管理員一個有用的管理機制!作用的方式是『使用
/var/lib/rpm 底下的資料庫內容來比對目前 Linux
系統的環境下的所有軟體檔案 』也就是說,當你有資料不小心遺失,
或者是因為你誤殺了某個軟體的檔案,或者是不小心不知道修改到某一個軟體的檔案內容,
就用這個簡單的方法來驗證一下原本的檔案系統吧!好讓你瞭解這一陣子到底是修改到哪些檔案資料了!驗證的方式很簡單:
[root@study ~]# rpm -Va
[root@study ~]# rpm -V 已安裝的軟體名稱
[root@study ~]# rpm -Vp 某個 RPM 檔案的檔名
[root@study ~]# rpm -Vf 在系統上面的某個檔案
選項與參數:
-V :後面加的是軟體名稱,若該軟體所含的檔案被更動過,才會列出來;
-Va :列出目前系統上面所有可能被更動過的檔案;
-Vp :後面加的是檔案名稱,列出該軟體內可能被更動過的檔案;
-Vf :列出某個檔案是否被更動過~
範例一:列出你的 Linux 內的 logrotate 這個軟體是否被更動過?
[root@study ~]# rpm -V logrotate
# 如果沒有出現任何訊息,恭喜你,該軟體所提供的檔案沒有被更動過。
# 如果有出現任何訊息,才是有出現狀況啊!
範例二:查詢一下,你的 /etc/crontab 是否有被更動過?
[root@study ~]# rpm -Vf /etc/crontab
.......T. c /etc/crontab
# 瞧!因為有被更動過,所以會列出被更動過的資訊類型!
好了,那麼我怎麼知道到底我的檔案被更動過的內容是什麼?例如上面的範例二。呵呵!簡單的說明一下吧!
例如,我們檢查一下 logrotate 這個軟體:
[root@study ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
# 呵呵!共有 10 個檔案啊!請修改 /etc/logrotate.conf 內的 rotate 變成 5
[root@study ~]# rpm -V logrotate
..5....T. c /etc/logrotate.conf
你會發現在檔名之前有個 c ,然後就是一堆奇怪的文字了。那個 c 代表的是 configuration ,
就是設定檔的意思。至於最前面的幾個資訊是:
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) 功能已經被改變
所以,如果當一個設定檔所有的資訊都被更動過,那麼他的顯示就會是:
SM5DLUGTP c filename
至於那個 c 代表的是『 Config file 』的意思,也就是檔案的類型,檔案類型有底下這幾類:
c :設定檔 (config file)
d :文件資料檔 (documentation)
g :鬼檔案~通常是該檔案不被某個軟體所包含,較少發生!(ghost file)
l :授權檔案 (license file)
r :讀我檔案 (read me)
經過驗證的功能,你就可以知道那個檔案被更動過。那麼如果該檔案的變更是『預期中的』,
那麼就沒有什麼大問題,但是如果該檔案是『非預期的』,那麼是否被入侵了呢?呵呵!得注意注意囉!
一般來說,設定檔 (configure) 被更動過是很正常的,萬一你的 binary program 被更動過呢?
那就得要特別特別小心啊!
Tips
雖說家醜不可外揚,不過有件事情還是跟大家分享一下的好。鳥哥之前的主機曾經由於安裝一套軟體,導致被攻擊成為跳板。
會發現的原因是系統中只要出現 *.patch 的副檔名時,使用 ls -l 就是顯示不出來該檔名 (該檔名確實存在)。
找了好久,用了好多工具都找不出問題,最終利用 rpm -Va 找出來,原來好多 binary program 被更動過,連 init
都被惡搞!此時,趕緊重新安裝 Linux 並移除那套軟體,之後就比較正常了。所以說,這個 rpm -Va 是個好功能喔!
數位簽章 (digital signature)
談完了軟體的驗證後,不知道你有沒有發現一個問題,那就是,驗證只能驗證軟體內的資訊與 /var/lib/rpm/
裡面的資料庫資訊而已,如果該軟體檔案所提供的資料本身就有問題,那你使用驗證的手段也無法確定該軟體的正確性啊!
那如何解決呢?在 Tarball 與檔案的驗證方面,我們可以使用前一章談到的 md5 指紋碼來檢查,
不過,連指紋碼也可能會被竄改的嘛!那怎辦?沒關係,我們可以透過數位簽章來檢驗軟體的來源的!
就像你自己的簽名一樣,我們的軟體開發商原廠所推出的軟體也會有一個廠商自己的簽章系統!
只是這個簽章被數位化了而已。廠商可以數位簽章系統產生一個專屬於該軟體的簽章,並將該簽章的公鑰 (public key) 釋出。
當你要安裝一個 RPM 檔案時:
首先你必須要先安裝原廠釋出的公鑰檔案;
實際安裝原廠的 RPM 軟體時, rpm 指令會去讀取 RPM 檔案的簽章資訊,與本機系統內的簽章資訊比對,
若簽章相同則予以安裝,若找不到相關的簽章資訊時,則給予警告並且停止安裝喔。
我們 CentOS 使用的數位簽章系統為 GNU 計畫的 GnuPG (GNU Privacy Guard, GPG)(註1)。
GPG 可以透過雜湊運算,算出獨一無二的專屬金鑰系統或者是數位簽章系統,有興趣的朋友可以參考文末的延伸閱讀,
去瞭解一下 GPG 加密的機制喔!這裡我們僅簡單的說明數位簽章在 RPM 檔案上的應用而已。
而根據上面的說明,我們也會知道首先必須要安裝原廠釋出的 GPG 數位簽章的公鑰檔案啊!CentOS 的數位簽章位於:
[root@study ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
-rw-r--r--. 1 root root 1690 Apr 1 06:27 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@study ~]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)
mQINBFOn/0sBEADLDyZ+DQHkcTHDQSE0a0B2iYAEXwpPvs67cJ4tmhe/iMOyVMh9
....(中間省略)....
-----END PGP PUBLIC KEY BLOCK-----
從上面的輸出,你會知道該數位簽章碼其實僅是一個亂數而已,這個亂數對於數位簽章有意義而已,
我們看不懂啦!那麼這個檔案如何安裝呢?透過底下的方式來安裝即可喔!
[root@study ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
由於不同版本 GPG 金鑰檔案放置的位置可能不同,不過檔名大多是以 GPG-KEY 來說明的,
因此你可以簡單的使用 locate 或 find 來找尋,如以下的方式來搜尋即可:
[root@study ~]# locate GPG-KEY
[root@study ~]# find /etc -name '*GPG-KEY*'
那安裝完成之後,這個金鑰的內容會以什麼方式呈現呢?基本上都是使用 pubkey 作為軟體的名稱的!
那我們先列出金鑰軟體名稱後,再以 -qi 的方式來查詢看看該軟體的資訊為何:
[root@study ~]# rpm -qa | grep pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
[root@study ~]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
Name : gpg-pubkey
Version : f4a80eb5
Release : 53a7ff4b
Architecture: (none)
Install Date: Fri 04 Sep 2015 11:30:46 AM CST
Group : Public Keys
Size : 0
License : pubkey
Signature : (none)
Source RPM : (none)
Build Date : Mon 23 Jun 2014 06:19:55 PM CST
Build Host : localhost
Relocations : (not relocatable)
Packager : CentOS-7 Key (CentOS 7 Official Signing Key)
Summary : gpg(CentOS-7 Key (CentOS 7 Official Signing Key) )
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.11.1 (NSS-3)
....(底下省略)....
重點就是最後面出現的那一串亂碼啦!那可是作為數位簽章非常重要的一環哩!
如果你忘記加上數位簽章,很可能很多原版軟體就不能讓你安裝囉~除非你利用 rpm 時選擇略過數位簽章的選項。