IT井戸端会議

IT井戸端会議

インフラ、ネットワーク、アプリケーション開発、IT界隈の話等々を東京都千代田区界隈から発信します。

RPMパッケージにパッチを当てる方法

ソースRPMを取得し、バッチを追加後、RPMパッケージを作成する方法について デモを交えて説明していきます。

ソースRPMの取得

まず、元となるソースRPMを取得します。 今回は、opensslで実施したいと思います。

$ cd
$ wget http://vault.centos.org/6.6/os/Source/SPackages/openssl-1.0.1e-30.el6.src.rpm

ソースRPMのインストール

ダウンロードしたソースRPMをインストールします。

$ rpm -vih openssl-1.0.1e-30.el6.src.rpm

正常終了すると、以下のフォルダが作成されます。

  • SOURCES(ソースコード・パッチ格納ディレクトリ)
  • SPECS(SPECファイル格納ディレクトリ)

パッチの取得

githubからパッチを取得し、SOURCESディレクトリにコピーします。

$ git install yum

$ cd /tmp/
$ git clone https://github.com/ptudor/centos6-openssl

$ cp -p /tmp/centos6-openssl/SOURCES/openssl-1.0.1e-cve-2015-0293.patch ~/rpmbuild/SOURCES/

SPECファイルの修正

以下の通り、パッチ定義を追加します。

vi ~/rpmbuild/SPECS/openssl.spec
@@ -105,6 +105,7 @@
 Patch104: openssl-1.0.1e-cve-2014-3509.patch
 Patch105: openssl-1.0.1e-cve-2014-3510.patch
 Patch106: openssl-1.0.1e-cve-2014-3511.patch
+Patch107: openssl-1.0.1e-cve-2015-0293.patch
 
 License: OpenSSL
 Group: System Environment/Libraries
@@ -231,6 +232,7 @@
 %patch104 -p1 -b .tlsext-race
 %patch105 -p1 -b .adh-dos
 %patch106 -p1 -b .frag-downgrade
+%patch107 -p1 -b .hoge
 
 sed -i 's/SHLIB_VERSION_NUMBER "1.0.0"/SHLIB_VERSION_NUMBER "%{version}"/' crypto/opensslv.h

RPMの作成

RPMをビルドするために必要となるパッケージをインストールします。

$ yum install rpm-build
$ yum install gcc

ビルドの実行

SPECファイルを指定してビルドしてみます。

$ rpmbuild -ba SPECS/openssl.spec
...
エラー: ビルド依存性の失敗:
    krb5-devel は openssl-1.0.1e-30.el6.x86_64 に必要とされています
    zlib-devel は openssl-1.0.1e-30.el6.x86_64 に必要とされています

openssl をビルドするのに必要なパッケージが足りないようなので追加します。

yum install krb5-devel zlib-devel

再びビルドを実行します。

$ rpmbuild -ba SPECS/openssl.spec
...
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.4121ir
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd openssl-1.0.1e
+ '[' /root/rpmbuild/BUILDROOT/openssl-1.0.1e-30.el6.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/openssl-1.0.1e-30.el6.x86_64
+ exit 0

無事に成功しました。

rpmbuild ディレクトリ配下を確認すると以下のディレクトリが確認できます。

  • BUILD(ビルドする際に使用される作業用ディレクトリ)
  • BUILDROOT()
  • RPMS(ビルド後に生成されるRPM格納ディレクトリ)
  • SOURCES(ソースコード・パッチ格納ディレクトリ)
  • SPECS(SPECファイル格納ディレクトリ)
  • SRPMS(ビルドにて生成されるソースRPM格納ディレクトリ)

RPMS ディレクトリ配下を確認すると、rpmが生成されていることが確認できます。

$ tree ~/rpmbuild/RPMS/
/root/rpmbuild/RPMS/
└── x86_64
    ├── openssl-1.0.1e-30.el6.x86_64.rpm
    ├── openssl-devel-1.0.1e-30.el6.x86_64.rpm
    ├── openssl-perl-1.0.1e-30.el6.x86_64.rpm
    └── openssl-static-1.0.1e-30.el6.x86_64.rpm