ダウンロードファイルが真正なものであるかを確認:仕事で使える魔法のLAMP(10)
今回は、ビルドに必要なソースコードのファイルを入手して、それが真正なものであるかどうかを調べる方法を解説します(編集部)
試しに小さなソフトウェアから始めよう
ビルドに関する用語や基礎知識は、前回まででおおよその部分をカバーできました。これからは、実際のフリーソフトウェアやオープンソースソフトウェア(以下FOSS)を入手し、ビルドしながら解説を進めていきたいと思います。最初に取り上げるFOSSは、GNU Helloです。
GNU Helloは、実は「Hello, world!」と表示するだけのソフトウェアです。現在のバージョンは2.7で、つい最近もバージョンアップがありました。持っている機能はこれまで取り上げてきた、たった数行のコード例と同じです。そういうものにバージョンまで付けてリリースしている人たちがいるなんて不思議な感じがしますが、もちろんこれにはちゃんとした理由があります。
FOSSにおいて、配布されるソースコードは、多種多様なユーザーの環境でビルドとインストールができなくてはなりません。ビルドの手間も少ないに越したことはありません。そのため、ビルドをサポートをするような仕組みも、ソースコードと一緒に配布する必要があるわけです。
GNU Helloは、ソフトウェアとして役に立つ機能は持っていませんが、そういった配布パッケージとしての体裁はきちんと整っています。これはつまり、他のソフトウェアの手本となるべき存在としてリリースされているのです。手始めに取り上げるFOSSとしてはうってつけでしょう。
ソースコード配布パッケージを入手
今回は初めてなので、ソースコード配布パッケージを入手するところから解説します。まずは、検索エンジンで調べるなどして、入手したいソフトウェアのサイトを開きます。GNU HelloのWebサイトを開くと図1のようになります。
「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のダウンロードページには、ソースコードパッケージファイルのあとに、PGP、MD5、SHA1とあるリンクが見えます(図2)。
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
初回実行時は、署名者の公開鍵を自動的に取得して登録します。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を展開して中身を見ていきます。
- CMakeでMySQLをビルドしてみる
- MySQLのビルドに欠かせないCMakeを準備する
- いよいよMySQL編、ソースからビルドすべきか?
- PHPでセッションを利用するための設定
- クライアントがアクセスできる範囲を制限する
- エラーメッセージをどう扱うか?
- ファイルのアップロードを制限する
- リクエストデータを受け取る変数の扱い
- マジッククオート機能には頼らない
- 安全を考えてPHPの実行時設定を調整する
- Apacheの設定ファイルでPHPの設定を変える
- PHPの設定ファイルを作って配置してみる
- PHPスクリプトを実行できるようにする準備
- PHPエクステンション組み込みの仕上げ
- 単純なデータを管理するDBMを使えるようにする
- エクステンションの組み込み状況を確認する
- PHPでデータベースを使う準備をする
- XMLを処理できるようにする
- エクステンションを有効にしてビルドに挑戦!
- PHPテスト失敗の原因を追究する
- 早速PHPをビルド! そしてテスト!
- PHP編に突入! まずはソースをダウンロード
- 設定ファイルを作成してApacheを動作させる
- 設定ファイルや公開ドキュメントの配置を考える
- 1つのサーバに複数の仮想サーバ?
- Apacheの設定ファイルを記述する前に
- サードパーティのApacheモジュールをビルドする
- 認証DBにアクセスするライブラリを組み込む
- Apache同梱ソフトウェアに引数を渡してビルド
- OpenSSLをビルドしてApacheで利用する
- proxyやsslのモジュールを使ってみる
- ライブラリが足りなくてビルドできないときは?
- Apache HTTP Serverのビルドを始めよう
- configureでソフトウェア固有の設定を変更してみる
- configureの設定を変更してみる
- 配布パッケージの中身と、configureの役目を知る
- ダウンロードファイルが真正なものであるかを確認
- Makefileをいろいろ書き換えながらビルドしてみよう
- makeを使ってソフトウェアをビルドしてみよう
- ダイナミックリンクとスタティックリンク
- 「ビルド」という作業は何を指しているのか
- 公開鍵認証でsshを安全に使う
- sshを便利にする公開鍵暗号
- アクセス制限の設定とCentOSのアップデート
- サーバに接続して、一般ユーザーのアカウントを作る
- LAMP環境、自分で作りませんか?
Copyright © ITmedia, Inc. All Rights Reserved.