2015/02/06

如何讓 yum-plugin-security 在 CentOS 上發揮作用

yum-plugin-security 是 RedHat 給 Yum 用來做 "僅搜尋安裝安全更新" 的 plugin,在 CentOS 上也是可以安裝執行的。

不過最近發現,其實在 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 python26
CentOS 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