Nov 15, 2006

拡張機能に電子署名って「必要」なの?

Firefoxで拡張機能のインストール時に「この拡張機能は署名されていません」という警告が表示されるけれども、これについて、署名くらい付けろよという話がたまに出る。利用者の安全性を確保するという観点では確かに重要な事だ。けど、現実には、署名付きの拡張機能というのはほとんど無い。それは何故なのか。

  • 署名を付けるには何が必要なんだ?
  • 署名を付けることで何が変わるんだ? どう状況が良くなるんだ?
  • 署名が無いと絶対にいけないのか? 署名さえあれば後は問題ナッシングなのか?

このあたりのモヤモヤしてわからんかった事を、自分に理解できた範囲でまとめてみた。

……んだけど、このエントリの内容は嘘まみれであったことが分かった。訂正を含む、続きのエントリを書いたので、そっちを見てください。いちおう、以下の内容は自分の理解できた範囲で正確な情報を提供するように書き直したものです。

前知識:電子署名って何なのよ

電子署名は、公開鍵暗号という方式に基づいた仕組みだ。公開鍵暗号とは、本人だけが知っている「秘密鍵」によって暗号化されたファイルを、誰もが知ることができる「公開鍵」を使って復号化するという、2つの鍵を使った暗号方式のこと。

施錠と開錠を1つだけの鍵でこなす、1つの鍵を使って暗号化と復号化を両方ともこなす「共通鍵暗号」方式では、「たった一つしかない鍵を他人に知られる」と、もう暗号が暗号として役に立たなくなる。そのため、鍵をどうやって他人に見られずに相手に渡すか、また、鍵をどうやって他人に知られないよう守り抜くか、というのが重要になる。

「公開鍵暗号」では、秘密鍵と公開鍵という2つの鍵を使うことでこれらの問題をクリアする。暗号化専用の「秘密鍵」と、復号化専用の「公開鍵」のそれぞれに役割を分けて、それらが正しい組み合わせで使われなければ機能しないようにしてしまうことで、本人は安心してファイルを暗号化して送ることができるし、また、相手はそのファイルを「本人が本物の秘密鍵で暗号化した物」と確認した上で、安心して復号化することができる。

あとの問題は、「その公開鍵が本当に本物の公開鍵なのかどうか」をどうやって保証するかという点。信頼できる相手から、第三者を介さず直接渡してもらえればそれでいい。しかし、インターネットという「情報のバケツリレー」が前提の世界では、「第三者を介さず」というのは非常に難しい。だからせめて、「信頼できる第三者機関を介して」公開鍵を手に入れることが出来るようにはなっている。その第三者機関というのが、Verisignなどの、認証局とかCAとか呼ばれる機関である。そしてこういったCAによって「この公開鍵は本物ですよ」と認証・保証された公開鍵が、いわゆる「証明書」と呼ばれるものである。

このような、公開鍵暗号を使った暗号化と復号化、そして本物の公開鍵を信頼できる第三者機関を介して入手する仕組みまでの全体をひっくるめて、「電子署名」と呼ぶ。あるいは、先の証明書のことを単に「電子署名」とか「署名」とか呼ぶ場合もある。

いかなるCAによっても認証されていない公開鍵は、証明書を配っている者が「この証明書は本物ですよー」と自分で言っているに過ぎず、究極的には「信用できない証明書」ということになる。こういう証明書は、「自己証明」とか「オレオレ証明書」とか呼ばれたりもする。

これを踏まえた上で、以下、本題。

署名を付けるのに必要なもの

ファイルに署名を付けるには、「署名を付ける対象のファイル」「署名を付けるためのツール」「付ける署名」の3つが必要だ。

署名を付ける対象の拡張機能のファイルは、まあ、好きに作ってください。

拡張機能に署名を付けるツールとしては、NSS Security Toolsを使うらしい。FTPサイトからリリース版のソースやバイナリを入手できるようだけれども、なんかNSS 3.11だとエラーが出てうまくいかんらしいので、NSS 3.10を使う必要があるとかないとか。

あとは、付ける署名をどうやって入手するかなんだけど。この「署名」というのは、「VerisignやThawteなどのRSA証明書発行局(CA)から発行されたNetscape Object Signing Certificate(Netscapeオブジェクト署名証明書)」のことを言うらしい。

このNetscape Object Signing Certificateを使って署名しようと思ったら、事実上、個人では拡張機能に署名できない。電子署名を付けるにはベリサインのObject Signing対応Digital IDというのを買う必要があるが、これは個人では買えないからだ。

  • 年間約10万円かかる(証明書を毎年買い直さないといけない)
  • 法人の登記簿謄本が必要(その法人が帝国データバンクに登録されている場合は不要)

個人で趣味で拡張機能作ってる人には、重すぎる負担だと思う。

……と書いてたんだけど、ベリサインより安く証明書を売ってくれる所もあるのね。すんまそ。例えばthawteでは年間約4万円、GlobalSignだと3万円。探せばもっと安い所が他にもあるんだろうか。

署名の意味

ともかく、金を払ったりとか書類を送ったりとかそれなりの苦労をして電子署名を買ったとして、その電子署名には何の意味があるのか。電子署名からはどんな意味合いが読み取れるのか。これは、Netscape署名ツールとは何なのかという文書で簡単に述べられている。

  1. その拡張機能のファイルが確かに署名の持ち主本人によって作成された物そのものであることを証明する。通信経路や配布の場において、ファイルの内容が改竄されていないこと(通信中にパケットを盗み取られて改竄されたり、サーバをクラックしてファイルを改竄されたりは、していない、ということ)を証明する。
  2. その拡張機能の作者(一次配布元)が実在していることを証明する。これは同時に、その作者が証明書を買う資格(法人格)と財力を持っていて、電子署名を施すための諸々の知識を持っている、ということの証明になるとも言える。

前者が本来の電子署名の役割で、後者は電子署名を実現する上で副次的にもたらされるもの。電子署名の主な意味は、結局はこの2点に集約される、らしい。

ということは、電子署名を使ってもこの2点しか保証されない、という言い方ができるし、この2点が保証できるのなら電子署名以外の方法でも構わない、という言い方もできるだろう。

ファイルが確かにその作者によって作られた物であることの証明(ファイルが改竄されていないことの証明)

ファイルは、作者が作成してユーザが利用するまでの間に何度か、改竄される可能性のあるポイントがある。

  1. 作者が作成したファイルが、作者のコンピュータ上にある時。
  2. 作者がファイルのアップロードを指示して、作者のコンピュータからサーバまでファイルが転送される時。
  3. 作者が作成したファイルが、配布用のサーバに置かれて、ユーザによってダウンロードされるのを待っている時。
  4. ユーザがファイルのダウンロードを指示して、サーバからユーザのコンピュータまでファイルが転送される時。
  5. 実際に利用されるまで、ユーザのコンピュータ上でファイルが保管されている時。

このどこかのステップでファイルを改竄したり、あるいは、どこかの時点までのステップをまるごと偽装してしまうことによって、攻撃者は攻撃を行うことができる。

これらの中には、改竄をしやすいポイントとしにくいポイントがある。

「通信の最中」、上記5つの段階のうち「2」と「4」は、情報が最も無防備な状態にある。無線LANや携帯電話の通信などの無線通信は、侵入も盗聴も非常にやりやすい。有線での通信でも、中継器などに盗聴のための仕組みを挟み込むことはできる。そのために考え出されたのが、暗号化通信である。SSLにはこれを実現する技術としての性質がある。

「3」の段階もまた、比較的危険なポイントである。公開されているWebサーバは一般的に、IPアドレスが固定されており、攻撃者による攻撃の的となりやすい。サーバに導入しているソフトウェアの脆弱性や、サーバの設定ミスなどを突くことで、ファイルの改竄は可能となる。「1」と「5」は、動的にIPアドレスが変化することが多い一般ユーザの場合は比較的攻撃に晒されにくいけれども、これもまた、絶対とは言えない。遠隔操作で攻撃を受ける可能性も、目を離した隙にコンピュータを操作されて攻撃される可能性も、ゼロではない。これらの攻撃による被害を防ぐのが、電子署名の働きと言える。電子署名は、通信中というごく短期間だけの情報の暗号化ではなく、それに比べて長期に渡って保管されるファイルそのものの暗号化を、実現するものである。

ただし、電子署名が保護できるのは上記のステップの間だけに限られていることは、留意しなければならない。電子署名は、暗号化の前後でファイルが改竄されていないことまでは保証してくれない。作者がファイルに電子署名を施して暗号化するまでの間にファイルが改竄される可能性もあるし、実際に利用するためにユーザの手元で暗号化を解かれたファイル、メモリ上に展開された情報が改竄される可能性もある。電子署名は これらの攻撃を防ぐことはできない。

結局のところ、これらの技術は情報が正確に伝達されていることの保証を相対的に高めるものでしかなく、絶対の保証を与えてくれるものではない。そのため、どこまで信頼性を求めるか、「ここまでのレベルで信頼性が保証されているのなら、そこから先全ての情報も信頼できると見なす」という基準は、自分で決める他ない。

多くの一般人は、(意味があってもなくても)暗号化通信だけで満足している。期限切れの証明書やオレオレ証明書が横行していることが、その証拠である。不誠実な態度であることを承知の上で乱暴な言い方をすれば、そのような一般人を信用させるということを目標に置けば、オレオレ証明書を使った(不完全な)SSLによる通信でWebサイトからファイルをダウンロードさせるだけでもよいと言えるだろう。

また、信頼性の高い暗号化通信を使う代わりに別の方法で通信経路上でのファイルの改竄の可能性を排除するものとして、Mozilla Add-onsに拡張機能を登録するという手もある。詳しくはこのエントリに付けられたコメントを見てもらいたいのだけれども、Mozilla Add-onsではSSLとは別の仕組みを使って、通信中のファイルの改竄を防いでいるからだ。

作者が確かに実在していることの証明

作者の実在の証明は、電子署名以外にも色々な方法が考えられる。乱暴な話だけれども、いわゆる「公式サイト」の正式なコンテンツとして拡張機能をダウンロードできるようになっているのであれば、そのサイトの作者・管理者が存在しているかどうかの証明が、すなわち拡張機能の作者の存在証明と言うこともできるだろう。

ただ、独自ドメインの取得にせよ「公式サイト」を名乗ることにせよ、電子署名の購入のような厳格なプロセスを経ないものである限りは、全く見たことも聞いたこともない人間が、本当にそれを開発したり配布したりしているのかどうかの証明としては、弱い。でも、サイトの管理者・作者と実際に顔を会わせたことがあったり、社会的に知名度の高い人であったりするなら、認証機関での証明が無くても、相手を信用することはできるだろう。

また、忘れてはいけないことだけれども、証明書は、条件を満たした上で一定の手続きを経れば、誰でも手に入れることができる。署名をした者が本当に信頼に足る者であるかどうかは、ユーザの判断に一任されている。「電子署名があること」と「相手を信用できること」とはイコールではない。この点は次のエントリで詳述している。

結論

以上のことから、僕はこう結論付けた。

  • 電子署名されているファイルの方が、そうでないファイルに比べて信頼できる、というのは事実である。
  • しかし、電子署名の役割の一部は、他の事で代替することができる。そのような、代替可能なレベルでの信頼性(もしくは、そのように見えるもの)しか求められていないのなら、電子署名を使う必要は無い。
  • 電子署名が付いてれば即絶対安心、と判断するのは間違いであり、危険である。
  • 年間何万円も払ってたったそれだけの安全性しか保証できないのであれば、個人で苦労して署名を付ける価値は無い、と考えることはできる。

あと、こういうことも言える。

  • AMOへの登録をないがしろにして野良拡張機能をありがたがりながら電子署名を求める、という態度を取っている人がもしいるとしたら、それって姿勢として矛盾してね?
  • AMOに登録できるようならまずはそっからやった方が、署名の付け方が分からんと言ってうんうんうなって具体的に何もしないでいるよりは、まだマシなんじゃね?
  • AMOだと、アップロードしたファイルが一般向けに公開されるまでの間に、ボランティアの人柱によるチェックが入るけど、これは、電子署名には無いAMOならではの「信頼性を相対的に高める要素の一つ」だよね(少なくとも、作者以外にもう一人、テスターの環境でも動作するということ、電子署名では証明できない「ソフトウェアのクオリティ」は一定の高さがあることは、証明される)。

ま、そんなとこちゃいますか。

以下、全面改稿前の内容。一応残しておく。

署名の意味

ともかく、金を払ったりとか書類を送ったりとかそれなりの苦労をして電子署名を買ったとして、その電子署名には何の意味があるのか。電子署名からはどんな意味合いが読み取れるのか。これは、Netscape署名ツールとは何なのかという文書で簡単に述べられている。

  • その拡張機能の作者(一次配布元)が実在していることを証明する。これは同時に、その作者がベリサインの証明書を買える(=法人で、金を持っている)ということの証明になるとも言える。
  • 通信経路や配布の場において、ファイルの内容が改竄されていないことを証明する。そのファイルが確かに署名の持ち主本人によって作成された物そのものであることを証明する。

電子署名の主な意味は、結局はこの2点に集約される、らしい。ということは、電子署名を使ってもこの2点しか保証されない、という言い方ができるし、この2点が保証できるのなら電子署名以外の方法でも構わない、という言い方もできるだろう。

作者が確かに実在していることの証明

これは、電子署名以外にも色々な方法が考えられる。乱暴な話だけれども、いわゆる「公式サイト」の正式なコンテンツとして拡張機能をダウンロードできるようになっているのであれば、そのサイトの作者・管理者が存在しているかどうかの証明が、すなわち拡張機能の作者の存在証明と言うこともできるだろう。

ただ、独自ドメインの取得にせよ「公式サイト」を名乗ることにせよ、電子署名の購入のような厳格なプロセスを経ないものである限りは、全く見たことも聞いたこともない人間が、本当にそれを開発したり配布したりしているのかどうかの証明としては、弱い。でも、サイトの管理者・作者と実際に顔を会わせたことがあったり、社会的に知名度の高い人であったりするなら、認証機関での証明が無くても、相手を信用することはできる。と、僕は思う。

また、詐欺師が休眠会社の登記簿謄本を使うようなケースも想定すると、認証機関の証明であっても確実な証明であるとは言いきれないだろう。署名は、手続きをした人の存在と、手続きが様式通りに行われた事の証明にはなるけれども、本当にその作者本人が署名を取得したかどうかの証明や、その作者が善意の人であるかどうかの証明にはならないと、僕は思っている。……そこまで疑い始めたらキリが無いって?

ファイルが確かにその作者によって作られた物であることの証明(ファイルが改竄されていないことの証明)

ファイルが改竄されていないことの証明は、SSLを使った通信でWebサイトからファイルをダウンロードさせることでカバーできる。これは、Mozilla Add-onsに拡張機能を登録すれば自動的に達成される。

Mozilla Add-ons(AMO)は、サイト全体がSSLによって保護された通信を使ってアクセスするようにできている。なので、少なくとも、AMOからダウンロードしたファイルは、AMOのサーバから自分の手元までの間で改竄されていないことが(ほぼ)保証されている。拡張機能のパッケージ自体に電子署名があってもなくても、これは変わらない。

オレオレ証明書でも、SSLでの通信はできる。この場合、認証機関が関わっていないので、SSLだけでは「そのサイトの作者が実在するかどうか」や「そのサイトが本物かどうか」は証明できない。しかしそれでも、通信が暗号化されていて通信経路上でファイルが改竄されていないことの証明にはなる。作者が実在していることや、サイトが本物であることを、SSLとは別の方法で確認できているのなら、それで必要充分と言うことは出来ると僕は思う。

……と書いてたけどこれは穴がある。詳しくは文末を参照。

結論

以上のことから、僕はこう結論付けた。

  • 拡張機能の電子署名の主な役割は、他の事で代替することができる。それらに限って言えば、電子署名は必ずしも必要ではない。拡張機能の電子署名の役割のいくつかは、他の事で代替することができる。しかし、電子署名でなければ証明できない内容もあるので、電子署名されているファイルの方がより信頼できる、というのは事実。
  • 電子署名の証明する内容の信頼性は、絶対ではない。電子署名は信頼性を相対的に高める手段の一つであり、それ以上でもそれ以下でもない。電子署名が付いてれば即絶対安心、と判断するのは危険。

てなことを書いていたら、ブクマコメントに「これはひどい」タグが付いていた。どうやらこのエントリの内容は間違ってるらしいですよ、奥さん! でもどこがおかしいのかは僕には分かりませんでした。

さらに少し調べてみたけれども、結局、僕の言いたいことの結論(「絶対に電子署名でなくてはならない、とは言いきれない」「電子署名でありさえすれば信用できる、とは言いきれない」)を否定する材料を見付けられなかったので、僕には、大筋を書き換えることなく細部を直すことしかできなかった。

ということで、僕の頭と技術ではこれ以上の事は分かりませんでした。しかし、いつかの嘘まみれの豆知識コンテンツと違って、ここにはコメントが付けられますし、トラックバックもできます。検索等でこのエントリに直接辿り着いた人にも役に立つように、根本的に間違ってる所にはどうぞ容赦なくハンドアックスを投げてください。

サーバ上のファイルの改竄の問題

オレオレ証明書では、通信経路上の改竄は防げても、通信する前のサーバ上にあるファイルの改竄は防げないぞ、という指摘があったことに今気付いた。

なるほど確かに、上記の文章では、サーバがクラッキングの被害に遭ってファイルが書き換えられてしまった場合の事を想定していませんでした。「電子署名の役割」を勝手に誤解してました。重ねてすんまそ。ということで結論を訂正。

でもサーバのファイルが改竄されていないことを証明できたからといって、「悪意ある拡張機能ではないこと」、「作者に悪意が無いこと」は証明できないですよねっ。ねっ。……と、往生際の悪い食い下がり方をしてみる僕なのでした。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能