おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

作った RPM に署名を付けてみようじゃないか

これまでのシリーズで作ってきた RPM は署名を付けてなかったので、改竄されてもわかんないという真面目な理由以外に、yum localinstall のときに --nogpg を付けないと怒られてめんどっちいという理由があったので、ここで一発、暗号鍵を付けてみることにしました。
え、お前いまさらそんなこと知らなかったのかって? ええそうなんすよ。すんませんね (^^;)

参考文献

参考資料は Fedora Project の RPM 作成ガイドと、英語が苦手な軟弱な日本人である私は、

Red Hat RPM Guide (redhat PRESS)

Red Hat RPM Guide (redhat PRESS)

のpp.229--233 を参考にしました。

あとこのページが決め手になりました。つかなんで気づかなかったんだろうってことなんですけどね。その内容は後ほど。

暗号鍵の生成

まずは gpg を使って鍵を生成します。このときにはユニークなメールアドレスと名前が必要になるので注意が必要です。たとえば会社で RPM を作るなどの場合には、特定の社員のメールアドレスでいいのかとかそういう話があるのでちょっと考えたほうがいいかもしれません。

$ gpg --gen-key
gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

gpg: ディレクトリー「/home/hogehoge/.gnupg」ができました
gpg: 新しい構成ファイル「/home/hogehoge/.gnupg/gpg.conf」ができました
gpg: 警告: 「/home/hogehoge/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
gpg: 鍵輪「/home/hogehoge/.gnupg/secring.gpg」ができました
gpg: 鍵輪「/home/hogehoge/.gnupg/pubring.gpg」ができました
ご希望の鍵の種類を選択してください:
   (1) DSAとElgamal (既定)
   (2) DSA (署名のみ)
   (5) RSA (署名のみ)
選択は? 1
DSA keypair will have 1024 bits.
ELG-E keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 1024
要求された鍵長は1024ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
        = 鍵は n 日間で満了
      w = 鍵は n 週間で満了
      m = 鍵は n か月間で満了
      y = 鍵は n 年間で満了
鍵の有効期間は? (0)
Key does not expire at all
これで正しいですか? (y/N) y

あなたの鍵を同定するためにユーザーIDが必要です。
このソフトは本名、コメント、電子メール・アドレスから
次の書式でユーザーIDを構成します:
    "Heinrich Heine (Der Dichter) "

本名: Printer Driver Packager
電子メール・アドレス: packager@hogehoge.co.jp
コメント: 
次のユーザーIDを選択しました:
    “Printer Driver Packager ”

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? o
秘密鍵を保護するためにパスフレーズがいります。
<<ここでパスフレーズをタイプする。あとで使うので注意>>

今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
 .++++++++++..++++++++++++++++++++.+++++.++++++++++.++++++++++++++++
 +++++++++.+++++.++++++++++++++++++++.++++++++++.+++++++++++++++++++
 +++++++++++......................>..+++++..........................
 .........................+++++
十分な長さの乱数が得られません。OSがもっと乱雑さを収集
できるよう、何かしてください! (あとxxxバイトいります)
 +++++..+++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ++++++++++++++++.++++++++++.++++++++++++++++++++.++++++++++.+++++..
 +++++>+++++>+++++...................................+++++^^^
gpg: /home/hogehoge/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵B550C887を絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。

gpg: 信用データベースの検査
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
pub   yyyyy/xxxxxxxx 2009-07-30
                 指紋 = oooo oooo oooo oooo oooo  oooo oooo oooo oooo oooo
uid                  Printer Driver Packager 
sub   yyyy/zzzzzzzz 2009-07-30

(ユーザ名とかは改竄してるのでご容赦)

基本的にはほとんどのオプションはデフォルトで問題ないですが、鍵長だけは 1024 にしておきました。これは Fedora のドキュメントがそうなってるだけ (歴史的理由という気もするけど) で深い意味はありません。たぶん。

あとパスフレーズはあとで使いますので忘れないような、しかもちゃんと安全なやつを選びましょう。

今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。

についてはキーボードをがちゃがちゃやったりマウスをぶんぶん振ったりして頑張りましょう。頑張っているとキーが生成された旨表示されて終了です。
キーボードを頑張って叩きすぎると気づいたらメッセージがスクロールしてたりするのでご注意 (^^;)

RPM への署名

まずは ~/.rpmmacros に次の内容を書き込みましょう。

%_signature gpg
%_gpg_path /home/hogehoge/.gnugp
%_gpg_name Printer Driver Packager 
%_gpgbin /usr/bin/gpg

あたりまえですが %_gpgbin は which gpg した値にしましょう。
あと %_gpg_name は先の gpg --gen-key で指定した値と揃えること。

これができたら rpmbuild コマンドで署名できます。

$ rpmbuild -bb --sign my-ps-ppds.specs
パスフレーズの入力: <さっきのパスフレーズ>
パスフレーズは正常です。

これで無事に署名付き RPM ができたわけです。めでたしめでたし。

確認しましょう

まずは rpm の -K オプションでチェック。

$ rpm -K my-ps-ppds-20090626.noarch.rpm
/home/hogehoge/my-ps-ppds-20090626.noarch.rpm: (SHA1)
 DSA sha1 md5 (GPG) OK ではありません (見つからない鍵: GPG#xxxxxxxx)

一瞬びっくりするかもですね。
ええ、というか私は100瞬ぐらいびっくりしました。
2時間ぐらいここで悩んだのはヒミツ。

でもここで肝心なのは「署名されている」という事実なのです。
今はまだ rpm の環境に鍵を導入していないので、ほどけないのは当然です。

ということで次は鍵の導入です。

鍵の導入

まずは公開鍵を作ります。

$ gpg --export --armor Printer Driver Packager > RPM-GPG-KEY

これをインポートします。この操作は管理者権限が必要ですのでご注意。

$ su

# rpm --import RPM-GPG-KEY
# exit

これで再び rpm -K でチェック。

$ rpm -K my-ps-ppds-20090626.noarch.rpm
/home/hogehoge/my-ps-ppds-20090626.noarch.rpm: (sha1) dsa sha1 md5 gpg OK

yum localinstall でインストールできるかどうかも確かめましょう。
実行結果コピペするのめんどくさいのでやめますが、ちゃんとインストールできます。やったい。

結論

ということで、

  • GPG で鍵を作って
  • それで RPM を署名して
  • 公開鍵が導入されてない環境ではうまく動かないことを確認できて
  • 公開鍵を導入すればうまく動くことを確認できた

わけです。ばんざい。

あとはお客さんに渡すときには公開鍵をセットで渡せばいいわけですね。たぶん。
でもこんなオペレーション煩雑だから、実際はプリンタドライバごときじゃ署名しないのかなぁ……。