ダウンロードファイルが真正なものであるかを確認仕事で使える魔法のLAMP(10)

今回は、ビルドに必要なソースコードのファイルを入手して、それが真正なものであるかどうかを調べる方法を解説します(編集部)

» 2011年06月17日 00時00分 公開
[山口晴広株式会社イメージズ・アンド・ワーズ]

試しに小さなソフトウェアから始めよう

 ビルドに関する用語や基礎知識は、前回まででおおよその部分をカバーできました。これからは、実際のフリーソフトウェアやオープンソースソフトウェア(以下FOSS)を入手し、ビルドしながら解説を進めていきたいと思います。最初に取り上げるFOSSは、GNU Helloです。

 GNU Helloは、実は「Hello, world!」と表示するだけのソフトウェアです。現在のバージョンは2.7で、つい最近もバージョンアップがありました。持っている機能はこれまで取り上げてきた、たった数行のコード例と同じです。そういうものにバージョンまで付けてリリースしている人たちがいるなんて不思議な感じがしますが、もちろんこれにはちゃんとした理由があります。

 FOSSにおいて、配布されるソースコードは、多種多様なユーザーの環境でビルドとインストールができなくてはなりません。ビルドの手間も少ないに越したことはありません。そのため、ビルドをサポートをするような仕組みも、ソースコードと一緒に配布する必要があるわけです。

 GNU Helloは、ソフトウェアとして役に立つ機能は持っていませんが、そういった配布パッケージとしての体裁はきちんと整っています。これはつまり、他のソフトウェアの手本となるべき存在としてリリースされているのです。手始めに取り上げるFOSSとしてはうってつけでしょう。

ソースコード配布パッケージを入手

 今回は初めてなので、ソースコード配布パッケージを入手するところから解説します。まずは、検索エンジンで調べるなどして、入手したいソフトウェアのサイトを開きます。GNU HelloのWebサイトを開くと図1のようになります。

図1 GNU helloのサイト。「Downloading Hello」の周辺にダウンロードページへのリンクがある。 図1 GNU helloのサイト。「Downloading Hello」の周辺にダウンロードページへのリンクがある。クリックすると拡大

 「Downloading Hello」の周辺にダウンロードのためのリンクがあります。手元のコンピュータにダウンロードしてからサーバに転送してもよいのですが、ここではwgetというコマンドで直接サーバにダウンロードしましょう。wgetを使うにはまず、次のようにしてインストールします。

$ sudo yum install wget

 サイトからダウンロードファイルのURLをコピーし、wgetの引数になるようにペーストします。GNU Helloの最新版である、2.7であれば次のようになります。

$ wget http://ftp.gnu.org/gnu/hello/hello-2.7.tar.gz

 Webサイトでリンクをクリックすると、ダウンロードが自動で始まってしまうため、ダウンロードファイルのURLが分からないという場合も多いかと思いますが、ダウンロードURLもページのどこかにあることがほとんどです。例えば、多くのFOSS開発プロジェクトをホスティングしているsourceforge.netでは、ダウンロードが始まる直前のページにある「direct link」というリンクのURLがそれです。

 配布パッケージの主な形式としては、tar.gzまたはtar.bz2があります。それぞれgzip、bzip2での圧縮ですが、bzip2の方が圧縮率が優れていますので、両方ともある場合はtar.bz2を選べばよいでしょう。

 最近では、さらに圧縮率の高いtar.xzもあります(GNU Helloにもありました)。CentOSのパッケージは古いため、この形式の圧縮ファイルは展開できませんので、tar.gzまたはtar.bz2を選びましょう。

チェックサムでダウンロードファイルを検証

 次にダウンロードしたファイルが本物であるか検証します。偽のサイトから、マルウェア入りのソースコードをユーザーにダウンロードさせるという攻撃もありますので、検証を怠らないようにしましょう。少なくともダウンロードファイルのURLくらいは、よく確認するべきです。

 ソースコードパッケージが本物かどうかを検証する手段ですが、チェックサムを利用するものと、電子署名(第4回参照)によるものの2通りがあります。さらに、チェックサムにはいくつかの種類があります。どれか1つだけでなく、複数の手段を用意しているFOSSもあります。

 Apache HTTP Server(以下Apache)は各種の検証手段がありますので、これを例に説明します。Apacheのダウンロードページには、ソースコードパッケージファイルのあとに、PGPMD5SHA1とあるリンクが見えます(図2)。

図2 Apacheのダウンロードページ。各種の検証用ファイルへのリンクがある。 図2 Apacheのダウンロードページ。各種の検証用ファイルへのリンクがある。クリックすると拡大

 PGPは電子署名で、MD5とSHA1がチェックサムによる検証手段になります。MD5をクリックすると、次のような1行のテキストが表示されます。もちろんwgetでダウンロードしてもよいです。

832f96a6ec4b8fc7cf49b9efd4e89060 *httpd-2.2.19.tar.bz2

 この前半部分がチェックサムの値です。チェックサムとは、ファイル内容から計算して導き出した一定の長さの値のことです。ファイル内容が同じであれば値も同じになり、内容が異なれば値も別のものになります。ファイルの内容がほんの一部、1bitでも差があるだけでチェックサムの値はまるっきり変わるようになっています。このような計算アルゴリズムの一種がMD5です。

 配布元のサイトで公開しているチェックサムの値と、ダウンロードしたファイルから導いた値が一致していれば、同じファイルである、つまり本物であると確認できるわけです。なお、チェックサムは一定の長さの値ですから、内容が異なっていても非常にまれに、同じ値にぶつかることが考えられます。しかし、そういうファイルを意図的に作ることはほとんど不可能ですので、チェックサムの比較で本物と判定できるわけです。

 サーバ上にダウンロードしたファイルのチェックサムを計算するにはmd5sumコマンドを使います。-bはファイルがバイナリであることを指示しています。

$ md5sum -b httpd-2.2.19.tar.gz
832f96a6ec4b8fc7cf49b9efd4e89060 *httpd-2.2.19.tar.bz2

 先ほど確認した値と一致していると確かめられました。また、チェックサムデータをファイルに格納すれば、次のように-cオプションを使うことで目視ではなく自動的に確認できます。

$ md5sum -c httpd-2.2.19.tar.bz2.md5sum
httpd-2.2.19.tar.bz2: OK

 SHA1も、チェックサムの計算アルゴリズムが異なるだけで確認の手順はまったく同様です。コマンドはsha1sumになります。

 いずれにせよ、チェックサムは配布サイトから正しく入手しなければならないという大前提があります。もし配布サイトそのものがクラックされて改ざんされていたとしたら、マルウェア入りの配布パッケージのチェックサムを犯人が置くことも可能です。実際にはそこまでのクラックはあまりないにせよ、そういうことも可能であるという認識は持っておくべきでしょう。

電子署名でダウンロードファイルを検証

 電子署名を利用した検証には、PGPという暗号ソフトウェアを使います。PGPの仕様は公開されているため、本家のPGP以外の実装もあり、Linux向けのものとしてはGnuPGが有名です。まずはGnuPGを次のようにコマンドを入力してインストールします。電子署名そのものについては第4回で概要を説明していますので、そちらも参照してください。

$ sudo yum install gnupg

 GnuPGのコマンドはgpgです。設定ファイルを初期化するため、次のように実行します。「--list-keys」の部分はgpgに登録されている公開鍵を表示するコマンドで、初回の実行ではもちろん何も出てきません。初回の実行で設定ファイルが自動的に作成されるため、意味はないようですが実行しているのです。

$ gpg --list-keys

 次に、~/.gnupg/gpg.confの中ほどにあるkeyserver-options行のコメントを外します。これで、公開鍵を鍵サーバから自動的に取得できるようになります。

keyserver-options auto-key-retrieve

 これで準備は完了です。Apacheのダウンロードページにある、PGPのリンクから電子署名をダウンロードします。

$ wget http://www.apache.org/dist/httpd/httpd-2.2.19.tar.bz2.asc

 このように、電子署名のファイルは元のファイル名に.ascという拡張子を追加したものであることが多いです。GNU Helloのように.sigの場合もあります。

 電子署名ファイルを使って、署名を確認します(図3)。署名を確認するときは--verifyで電子署名ファイルを指定します。

$ gpg --verify httpd-2.2.19.tar.bz2.asc
gpg: Signature made Sat May 21 02:07:46 2011 JST using RSA key ID 7F7214A7
gpg: requesting key 7F7214A7 from hkp server subkeys.pgp.net
gpg: key B55D9977: public key "William A. Rowe, Jr. " imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
gpg: Good signature from "William A. Rowe, Jr. "
gpg:                 aka "William A. Rowe, Jr. "
gpg:                 aka "William A. Rowe, Jr. "
gpg:                 aka "William A. Rowe, Jr. "
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: B1B9 6F45 DFBD CCF9 7401  9235 193F 180A B55D 9977
     Subkey fingerprint: 4962 0827 E32B C882 DC6B  EF54 A348 B984 7F72 14A7
図3 電子署名でダウンロードファイルが真正なものかどうかを確認したところ

 初回実行時は、署名者の公開鍵を自動的に取得して登録します。2〜6行目の出力がその部分で、同じ署名者であれば2回目以降の実行では表示されません。7行目にある「Good signature from〜」という行が、署名によりファイルが検証できたことを意味しています。もし不正なファイルであれば「BAD signature from〜」と表示されます。

 その後に表示されている警告は、公開鍵を信頼していない状態で表示されるものです。公開鍵を信頼する作業をすれば警告は現れなくなります。今回は、その作業の手順については割愛しますので、興味のある方は調べてみてください。

 署名者が変われば公開鍵も変わるので、再び警告が出ることになり、新しい人が署名したということが分かります。仮にサイトが改ざんされて、別の署名者になったとしても気付くというわけです。

 署名者の公開鍵は、自動的に取得するだけではなく、手動でインポートすることもできます。公開鍵は、それぞれのFOSSのプロジェクトサイトで配布しています。鍵サーバに公開鍵が登録されてなく、取得できない場合は、FOSSのサイトから入手して手動でインポートします。

 Apacheであれば次のURLで配布しているということがWebサイトに書かれていますので、wgetで入手します。

$ wget http://www.apache.org/dist/httpd/KEYS

 この公開鍵ファイルをインポートするには、--importオプションを使います。

$ gpg --import KEYS

 以上で、ダウンロードしたファイルの検証ができるようになりました。次回はGNU Helloを展開して中身を見ていきます。

著者紹介

株式会社イメージズ・アンド・ワーズ
代表取締役
山口晴広(やまぐち はるひろ)



「仕事で使える魔法のLAMP」バックナンバー

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。