2006年01月07日
secure apt
パッケージに正当性を示す電子署名がないのがDebパッケージの弱点だと言われていたのだが、etch/sidに入っているAPTツールでは、パッケージ個々ではない、ちょっと変わったアプローチで署名検証をする機能が入っている。
1月に入り、この署名用の鍵が更新された(セキュリティのために毎年更新される)。etch/sidでaptを使っており、この新しい鍵を登録していない場合、apt-get updateのときに「GPG error: The following signature couldn't be verified (以下の署名は検証できないよ)」という警告が表示され、インストール時には「Install these packages without verification [y/N]? (検証なしにほんとにインストールするんかい)」という質問が尋ねられることになる。
Joey HessがDebian Wikiにまとめてくれたので、これを参考にしながら状況と対処を書いてみよう。
まずは基本概念から(そんなのはもう知ってるという方はスキップ)。Debianミラーには大量のパッケージがあるが、悪意を持つ者によって改変されるのを防ぐ必要がある。信頼できる組織のミラーを使うというのも1つだが、Debian.orgですべてのミラーに目を光らせるというわけにもいかない。
Debianの各パッケージは、そのメタ情報ファイルに、md5ハッシュ値と、バイト数が書かれている。md5のコリジョンは発見されているが、同じバイト数のコリジョンは確か発見されていなかった気がする。なので、この2つがセットとなっていれば、まぁまず一意なものと見なせるだろう。少なくとも、md5比較してパッケージファイルが壊れている/何らかの操作がされていることはこれでわかる。
荒っぽく言えば、上記の各パッケージのメタ情報ファイルをまとめて、ローカル側のデータベースとして使えるようにしたものがPackagesファイルだ(ソース用はSources)。通常はgzipあるいはbzip2で圧縮され、dists/{RELEASE}/{main/contrib/non-free}/binary-{ARCH}/Packagesという単位で存在する。apt-get updateを実行すると、このPackagesがローカルにダウンロードされ、APTデータベースによって参照されるようになる。このPackagesが「信頼できるならば」、その情報にある各パッケージのmd5/バイト数をもとにパッケージが「信頼できる」ことを証明できる。
次にあるのがReleaseファイルだ。実はReleaseファイルには2種あり、dists/{RELEASE}/Releaseと、dists/{RELEASE}/{main/contrib/non-free}/binary-{ARCH}/Releaseがある。後者はそのアーカイブがstable/testing/unstableのうちどれかやリリースバージョンなどが書かれているだけだが、前者はこれ以外に配下にあるPackagesファイル(圧縮したものやSources/Releaseも含む)のmd5ハッシュ値とサイズを記述している。だんだんややこしくなってきたが、このReleaseファイルが「信頼できるならば」、Packagesファイルを「信頼でき」、その中に書かれているパッケージも「信頼できる」ということになるわけだ。
ということで、ようやくテーマであるRelase.gpgにたどりついた。dists/{RELEASE}/Release.gpgファイルは、Debianの自動FTPマネージャのGPG秘密鍵を使って、dists/{RELEASE}/Releaseファイルを電子署名(サイン)した結果値だ。このGPG秘密鍵は、Debian.orgのFTP管理者によって作成されたもので、Debian.orgの極めて限定的なアクセス環境(ごく一部の選ばれたDebian Developerだけがアクセスできる)の下、純粋にRelaseファイル署名のためだけに使われている。この秘密鍵に対応する公開GPG鍵、Releaseファイル、Release.gpgファイルの3つが揃っていれば、Releaseファイルが改ざんの行われていない、正当にFTPマネージャに署名されたものであることを証明できる。
さて、残るはGPG公開鍵の信頼性である。ここが一番難しいところで、これが破綻したらここまでに築いてきたものが全部ダメになってしまう。公開鍵は、ftp-master.debian.orgのWebサイト、およびPGPサーバー(新しい鍵はID 2D230C5F)で配布されている。Debian.orgの(本当に信頼できる!)FTP管理者に直に話して、鍵が本物かどうか聞くのがベストなんだろうけど、まぁそれは難しいので、こちらにせいぜいできるのは、そのGPG鍵に付けられているsign(「署名」と語が似てしまうけど「この鍵は確かにこの人のものですよ」ということを示すもの。キーサインパーティなどをやる目的はこれ)を見て、Debian.org FTP管理者のものだからまぁOKだろう、という判断になるだろう。自分で試すならこんな感じ。
$ gpg --keyserver pgp.mit.edu --recv-keys 2D230C5F ←鍵をPGPサーバーから取り込み gpg: 鍵2D230C5Fをhkpからサーバーpgp.mit.eduに要求 gpg: 鍵2D230C5F: 公開鍵“Debian Archive Automatic Signing Key (2006) <ftpmaster@debian.org>”を読み込みました gpg: 処理数の合計: 1 gpg: 読込み: 1 $ gpg --check-sigs 2D230C5F ←signを見てみる pub 1024D/2D230C5F 2006-01-03 [満了: 2007-02-07] uid Debian Archive Automatic Signing Key (2006) <ftpmaster@debian.org> sig! AB2A91F5 2006-01-04 James Troup <james@nocrew.org> ←いろんな人にsignされている sig! 2A4E3EAA 2006-01-03 Anthony Towns <aj@azure.humbug.org.au> sig! 29982E5A 2006-01-04 Steve Langasek <vorlon@debian.org> sig! FD6645AB 2006-01-04 Ryan Murray <rmurray@cyberhqz.com> sig! 0813569F 2006-01-04 Jeroen van Wolffelaar <jeroen@wolffelaar.nl> sig!3 2D230C5F 2006-01-03 Debian Archive Automatic Signing Key (2006) <ftpmaster@debian.org> 鍵がないため1個の署名を検査しません ←ふむ、誰かの公開鍵が足りないようだ…
Debian developerの鍵は、debian-keyringパッケージをインストールして、gpg --import /usr/share/keyrings/debian-keyring.gpgでインポートできる(さて、debian-keyringパッケージが信頼できるかどうかを判断するにはどうしたらいいものか…)。ちなみに同じディレクトリにはdebian-role-keys.gpgという鍵リングファイルもあり、こちらにFTP GPG公開鍵が入っているので、これをインポートするのもよいだろう。
まとめると、FTP GPG公開鍵を信頼できる→Release.gpg署名を検証できる→Releaseファイルを信頼できる→Packages/Sourcesを信頼できる→Packagesのmd5/サイズを信頼できる→パッケージを信頼できる ということになる。
やれやれ。
ともかく、APTで各パッケージの正当性を検証するには、GPG(gnupgパッケージ)が必要だ。 gnupgパッケージはいろいろ補助機能を実現するために無駄に依存関係が多いのだけど、まぁ我慢してインストールしておこう。
APTのGPG鍵リングを制御するフロントエンドが、apt-keyだ(gpgコマンドのラッパー)。鍵リングは/etc/apt/trusted.gpgとして配置されている。本当はdebian-keyringパッケージを入れておけば「apt-key update」で更新できるらしいんだけど、archive-keyringはないみたいなので、これは動作しない(これって/usr/share/apt/debian-archive.gpgを使うのでいいんじゃないのか?)。
# apt-key list ←とりあえず入ってる公開鍵を見てみる /etc/apt/trusted.gpg -------------------- pub 1024R/1DB114E0 2004-01-15 [満了: 2005-01-27] uid Debian Archive Automatic Signing Key (2004) <ftpmaster@debian.org> pub 1024D/4F368D5D 2005-01-31 [満了: 2006-01-31] uid Debian Archive Automatic Signing Key (2005) <ftpmaster@debian.org>
では、新しい鍵を加えるため、ftp-master.debian.orgからGPG公開鍵ファイル(ziyi_key_2006.asc)をダウンロードしてどこかに置いておこう。先ほど--importして手元に持っているなら、gpg --export -a 2D230C5F > ファイル名 で取り出して使うこともできる。
続いて、apt-keyを使って、このファイルをtrusted.gpgに取り込む。
# apt-key add ziyi_key_2006.asc gpg: 絶対的に信用する鍵が見つかりません OK
まぁなんかおっかないメッセージが出てはいるが(これってsign者を絶対的に信用すればいいんだっけ?)、とりあえず「OK」になった。
# apt-key list /etc/apt/trusted.gpg -------------------- pub 1024R/1DB114E0 2004-01-15 [満了: 2005-01-27] uid Debian Archive Automatic Signing Key (2004) <ftpmaster@debian.org> pub 1024D/4F368D5D 2005-01-31 [満了: 2006-01-31] uid Debian Archive Automatic Signing Key (2005) <ftpmaster@debian.org> pub 1024D/2D230C5F 2006-01-03 [満了: 2007-02-07] ←追加された uid Debian Archive Automatic Signing Key (2006) <ftpmaster@debian.org>
これで、2006年版のFTP GPG鍵が入ったので、めでたくRelease.gpgの署名確認ができるようになった。
ちなみに、dak(mini-dinstallも?)を採用していないような個人リポジトリでこの署名実現はけっこう面倒そうである。
![[hatena]](http://d.hatena.ne.jp/images/b_entry_de.gif)
![[RSS]](/d/rss10.png)