不過最近發現,其實在 CentOS 上執行 yum-plugin-security 是沒有作用的,執行『yum list-security』會檢查安全更新,但總是會回報沒有需要的更新,以前覺得怪怪,不過因為都是剛裝好後執行,想說 CentOS 版本比較新吧,所以不以為意。
但是最近安全漏洞比較多, yum-plugin-security 也沒找到更新,所以特別去搜尋了一下 CentOS 的論壇,發現原來這 plugin 在 CentOS 上是沒作用的... orz
可以參考這篇討論:https://www.centos.org/forums/viewtopic.php?f=17&t=49639
為了解決這問題,網路上一陣搜尋後,還是找到可以讓 yum-plugin-security 發揮作用的方法,就是使用 generate_updateinfo 這個工具把給 RedHad 的 Errata updateinfo,處理成 CentOS 用,這樣就能讓 yum-plugin-security 發揮作用了。
環境準備:
1. Python 2.6
2. createrepo 套件
3. CentOS 5: yum-security
CentOS 6: yum-plugin-security
如果不確定 Python 的版本,可以下指令『python -V』,如果你是用 CentOS 5 ,那大概是2.4無誤,確認版本後,如果真的是2.4,那你可以安裝 epel repo , epel 有提供 Python26 ,安裝以後不會弄壞原本系統中需要 Python 2.4 的程式。
====== CentOS 5 安裝 EPEL repo + Python26 方法 ======
CentOS 5 x86:
rpm -UvH http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm yum install python26CentOS 5 x64:
rpm -UvH http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm yum install python26
接下來安裝需要套件:
CentOS 5:
yum install createrepo yum install yum-security
CentOS 6:
yum install createrepo yum install yum-plugin-security
再來要在系統中建立一個 security repo 的目錄,假設要建立在『/security』這個目錄下
mkdir /security createrepo /security
如果正確的話,『/security』這個目錄底下會產生一個『repodata』的子目錄,裡面會有如下幾個檔案:
filelists.xml.gz other.xml.gz primary.xml.gz repomd.xml
security repo 目錄建立完成後,要修改 CentOS 的 yum repo 檔,把這個 security repo 加到裡面,編輯『/etc/yum.repos.d/CentOS-Base.repo』,在最底下加入:
[security] name=CentOS-$releasever - Security baseurl=file:///security
接著把目錄切換到『/security』底下,下載產生 Errata updateinfo 需要的檔案跟工具:
cd /security wget -N -P/security http://cefs.steve-meier.de/errata.latest.xml wget --no-check-certificate https://github.com/vmfarms/generate_updateinfo/raw/master/generate_updateinfo.py chmod 755 generate_updateinfo.py
若要做 script 定期更新 errata.latest.xml ,建議使用『wget -q -N -P/security』, -q 為安靜模式,不輸出畫面; -N 則是檢查檔案的 timestamp ,如果遠端比本地新才會下載; -P 則是檔案要下載到哪個目錄,請記得使用 -N 幫網站節省點流量。
接著要修改『generate_updateinfo.py』這個檔案:
=========== CentOS 5 ============
1. 這檔案預設使用『#!/usr/bin/env python26』,如果你是安裝Python26,那這行不用改 2. 修改第37行『RELEASES = ['6','other']』,改成『RELEASES = ['5','other']』
=========== CentOS 6 ============
1. 6應該是Python 2.6,第一行『#!/usr/bin/env python26』改成『#!/usr/bin/env python』 2. 第37行『RELEASES = ['6','other']』不用修改
generate_updateinfo.py 修改好後,下指令產生 updateinfo.xml 檔:
./generate_updateinfo.py errata.latest.xml WARNING::Package name '9755e86ad8536c908f95340be308190b52989bfa0d9268a461c40a3f0d493bc7' couldn't be matched against regex WARNING::Package name 'b1e14edd0d675c6fb0be64cb875fbd9fac208a58e427ea32f373c9359b35642c' couldn't be matched against regex WARNING::Package name 'b71bd90354d2724f256f9f23e113eea89c98b3ce923380657461cb78d34ab8da' couldn't be matched against regex ......如果有產生『WARNING::Package name xxxxxx couldn't be matched against regex』的錯誤訊息,不用管他,沒什麼影響。
script 跑完後會在 /tmp/ 下產生兩個目錄:
CentOS 5:
updateinfo-5 updateinfo-other
CentOS 6:
updateinfo-6 updateinfo-other
再來把 updateinfo.xml 合併到 security repo 裡面:
=========== CentOS 5 ============
/usr/bin/modifyrepo /tmp/updateinfo-5/updateinfo.xml /security/repodata
=========== CentOS 6 ============
/usr/bin/modifyrepo /tmp/updateinfo-6/updateinfo.xml /security/repodata
執行成功會產生類似如下訊息:
Wrote: /security/repodata/updateinfo.xml.gz type = updateinfo location = repodata/updateinfo.xml.gz checksum = 3b3cd257c3926053b76cca78738f2f8e98dc034b timestamp = 1423129008 open-checksum = 659b045d2d084f24d7d68f9d6ddf95bafeaa3879 Wrote: /security/repodata/repomd.xml
做到這裡,已經把 yum-plugin-security 需要的檔案準備好了,接著下指令『yum list-security』,應該會有類似如下所示的訊息:
Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile FEDORA-EPEL-2011-0466 bugfix PyPAM-0.5.0-11.el5.i386 CESA_2009__1642 security acpid-1.0.4-9.el5_4.1.i386 CESA_2014__1193 security axis-1.2.1-2jpp.8.el5_10.i386 CESA_2014__1293 security bash-3.2-33.el5.1.i386 CESA_2014__1306 security bash-3.2-33.el5_10.4.i386 CESA_2014__1306 security bash-3.2-33.el5_11.4.i386 .......
這指令會把可用的安全更新列表出來,由於原本的 yum-plugin-security 是針對 RedHat 系統設計的,所以『yum list-sec cves』、『yum update --cve CVE-2007-5707』這些指令是沒作用的。
要注意的是 CentOS 的安全更新編號跟 RedHat 不一樣,以最近最新的 glibc ghost 漏洞作為例子:
CVE 編號:CVE-2015-0235
RedHat 編號: RHSA-2015:0090-1
CentOS 編號:CESA-2015:0090
經過處理的更新資訊已經從原本 RedHat 替換成 CentOS 的編號了,在查詢安全更新的資料時要以 CentOS 的公告為主。
若是想查查看有沒有 glibc 可用的安全更新,可以下指令『yum list-sec glibc』,若有會有如下列表:
CESA_2010__0787 security glibc-2.5-49.el5_5.6.i686 CESA_2010__0793 security glibc-2.5-49.el5_5.7.i686 CESA_2011__0412 security glibc-2.5-58.el5_6.2.i686 CESA_2014__1110 security glibc-2.5-118.el5_10.3.i686 CESA_2015__0090 security glibc-2.5-123.el5_11.1.i686 CESA_2014__1110 security glibc-2.12-1.132.el6_5.4.i686 CESA_2014__1110 security glibc-2.17-55.el7_0.1.i686 list-sec done
若是想瞭解現在系統需要安裝的安全更新與相關套件,可下指令『yum --security check-update』,若有會有如下列表:
Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile Limiting package lists to security relevant ones Needed 99 of 559 packages, for security acpid.i386 1.0.4-12.el5 base axis.i386 1.2.1-2jpp.8.el5_10 updates bash.i386 3.2-33.el5_11.4 updates bzip2.i386 1.0.3-6.el5_5 base bzip2-devel.i386 1.0.3-6.el5_5 base bzip2-libs.i386 1.0.3-6.el5_5 base dbus-glib.i386 0.73-11.el5_9 base dbus-glib-devel.i386 0.73-11.el5_9 base ...最後要更新安全更新,則下指令『yum update --security』即可。
日後只要定期去更新 errata.latest.xml ,然後產生新的 updateinfo.xml 檔,就可以檢查有沒有需要的安全更新了。
可能有人會想,花了大把功夫,還沒辦法全自動,有沒有簡單點的方案?
1. 花錢買 RedHat ,訂閱他們的更新
2. 用 Fedora
3. 換 Scientific Linux 6 以上,SL 官方從 6 開始有做對應的 updateinfo.xml
4. 祈禱 CentOS 官方早日開始做對應的 updateinfo.xml
參考資料:
1. http://serverfault.com/questions/369833/automatically-check-for-security-updates-on-centos-or-scientific-linux
2. http://blog.vmfarms.com/2013/12/inject-little-security-in-to-your.html
3. https://github.com/vmfarms/generate_updateinfo
4. http://cefs.steve-meier.de/
5. http://vogel.at.webry.info/201402/article_4.html