NetBSD開発者のためのPGP鍵管理ガイド
このガイドの話題はPGP鍵の管理です。 あなたが、非対称暗号(秘密鍵と公開鍵を使う)を理解していること、 PGP鍵を作る方法と使う方法を知っていること、 お気に入りの電子メールクライアントにPGPサポートを組み込む方法を知っていること を前提とします。 あなたが、デジタルメッセージの署名と暗号化の概念を理解していることを前提とします。
PGP鍵を使うための情報は、以下で得ることができます。
The NetBSD Projectは、世界中のプロジェクトメンバーからの 要求やその他のコミュニケーションの出自を明らかにできる必要があります。 これを実行する最も単純な方法は、メンバー間でPGPの信頼の輪を構築することです。
信頼の輪を必要とする典型的な活動の例を示します。
-
例えばアカウントの詳細の変更に関連する管理者宛ての電子メールに署名できること
-
(プロジェクト全体の信頼の輪を構築するために)他の誰かの鍵に署名できること、 そして応募者の鍵に署名できること
-
外部に公開されないセキュリティーの問題についてのコミュニケーションを例とする 暗号化された電子メールを受信できること
PGP鍵を作り、管理し、使う、最も一般的なプログラムは、
おそらくgpg (GNU Privacy Guard)であり、
pkgsrcのsecurity/gnupg
から利用できます。
この文書中の例は、(pgpではなく)gnupgを使います。
誰でも任意の数の鍵を作ることができ、 どの鍵も任意の識別情報を持たせることができます。 持ち主の識別情報は本当のものでないかもしれません。 持ち主は、これらの鍵を任意の鍵サーバーにアップロードすることができます。 このことは、ある人物が本人でなくても(ユーザーIDとして与えられる)鍵の所有者の ふりをすることができることを意味します。
特定のPGP鍵が特定の人物の所有物であることに確証を持つための概念には 二つの根本的に異なるものがあります。
-
一般的には政府の管理下にある認証局(CA)が 特定の人物の識別情報を確認し、 特定の鍵が特定の人物(や組織)の所有物であることを証明する方法があります。 このサービスには一般的にはお金がかかります。
-
信頼の輪: 二人のPGP鍵の所有者が会ったとき、彼らが識別情報を確認し、 お互いの鍵に署名をする方法(後で他の誰かの鍵に署名することの重大さを 説明します)。 政府によって管理はされませんが、あなたの知っている多くの人に署名されていれば、 その信頼性に確証を持つことができます。 信頼の輪アプローチで重要なのは、多くの鍵の所有者が参加することです。
信頼の輪アプローチでは、AがBの鍵に署名し、BがCの鍵に署名したならば、 AはCの信頼性について確証を持つことができます。 これが成り立つには、AはBを「Bはいつも責任ある署名をする」と 信頼している必要があります AからCへの経路は「信頼の鎖」と呼ばれます。
しばしば以下に述べられているのを聞くことがあります。 「Fooの行動が気に食わないから彼の鍵には署名しない」とか 「Fooが強迫メールに私の署名した鍵で署名したら、法的な責任を取ることになる」 これらや似たような発言は、正しくありません。
誰かの鍵に自分の鍵で署名するということは、 「PGP鍵xは人物yの所有物であることを確認した」ということであり、 それ以上でもそれ以下でもありません。
注意深く本人であることを調査した人に対して、その人の鍵に署名しない 理由はありません。
最初に、長い期間に渡って最高のセキュリティーを保つには、 長い鍵長を選ぶのが良いです。 現在のDSA標準での最大1024ビットの鍵長の制限は、DSAのセキュリティーを 制限することになります。 最大のセキュリティーを確保するために、2048ビットのRSA鍵を暗号化と署名に 使うのが賢明です。
% gpg --gen-key gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 2048 Requested keysize is 2048 bits Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) 0 Key does not expire at all Is this correct? (y/N) y You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" Real name: Joe Doe Email address: joe@doe.org Comment: NetBSD You selected this USER-ID: "Joe Doe (NetBSD) <joe@doe.org>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o You need a Passphrase to protect your secret key. Enter passphrase: Repeat passphrase: gpg: /home/joe/.gnupg/trustdb.gpg: trustdb created gpg: key 7CEBFEBC marked as ultimately trusted public and secret key created and signed. gpg: checking the trustdb gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u pub 2048R/7CEBFEBC 2012-05-20 Key fingerprint = 67A7 FC80 8140 5F9B CE96 E19D E5B7 BF68 7CEB FEBC uid Joe Doe (NetBSD) <joe@doe.org> sub 2048R/6F64A1B1 2012-05-20
以上で完了です。
ほかの質問としては、最初に満了日を設定すべきか否かがあるでしょう。 満了日は(PGP 2.xの鍵と違って)後で変更することができます。 この質問は個人の選択にまかせる問題です。 鍵に満了日を設定する理由として、人はときどきパスフレーズを忘れたり、 秘密鍵を紛失するというものがあります。 満了日を設定すると、鍵が急に使えなくなる日が存在することになります。
鍵を作った後、あなたの使っている全ての電子メールアドレスをUIDとしてあなたの鍵に 追加すべきです。 @NetBSD.org UIDを第一のUIDにすることを検討してください。
PGP鍵ペアを作ったらすぐに、ブランクな無効鍵を作っておくのが良いでしょう。 そうすることで、セキュリティー上の危険があった場合や、秘密鍵を失なった場合 (ディスクがクラッシュした)や、パスフレーズを忘れた場合に、あなたの鍵を 無効化することができます。 無効鍵は安全な場所に保管しておいてください。 秘密鍵とは別に保管するのが望ましいです。 印刷して安全に保管しておくのは、良い考えです。
常に、あなたにPGP秘密鍵はあなただけが管理権限を持つマシンにだけ保管する ようにしてください。あるいは、秘密鍵を取り外し可能なUSBスティック (市販されているもののなかで最もちっぽけなので良い)に 保管するようにしてください。 そして、鍵を使わない時にはUSBスティックを取り外すようにしてください。
あなたのPGP秘密鍵を強いパスフレーズで守るようにしてください。
定期的に鍵のバックアップを取るようにしてください。
公開鍵秘密鍵モデルでは、秘密鍵は安全に守られている必要がありますが、 公開鍵はできるだけ広く配布されるものです。 あなたに暗号化されたメッセージを送りたい誰かや、あなたの署名を確認したい誰か は、あなたの公開鍵を必要としています。
よって、あなたは以下のことをすべきです。
-
あなたの公開鍵を公開鍵サーバーに登録する
-
あなたの鍵をlocalsrc/security/publickeys/developersにコミットする
標準的な鍵サーバーは、www.pgp.net、pgp.mit.edu、www.keyserver.netです。 デフォルトの鍵サーバーは、~/.gnupg/gpg.confに以下のように指定できます。
localsrc/security/publickeys/developers/READMEには、どのようにあなたのPGP公開鍵をNetBSDローカルソースリポジトリーにコミットするかが説明されています。 全ての開発者のPGP公開鍵をこのディレクトリーに収めておくことで、 全ての鍵(全ての署名付き)をただ一つのコマンドでインポートすることができます。
重要: 鍵の構成要素を確認することなく、信頼性を確認することなく、 鍵に署名しないでください。 鍵の所有者であると主張する人物の所有する鍵であることを確認してください。 あなただけではなく他人もあなたの署名を信頼することを忘れないでください!
お薦めの逐一の手順は以下のようです。
-
あなたのPGP鍵に関する以下の情報を記した「名刺」型の文書を用意してください。
鍵長
鍵のタイプ
鍵のID
作成日
満了日(もし設定していれば)
全てのUID
公開鍵の指紋
あなたの鍵の「gpg --fingerprint」の出力が、必要とされるものそのものです (「gpg --fingerprint」の出力をファイルにリダイレクトし、それを複数回 複製して、「a2ps -2 --borders no -B ...」で印刷し、短冊状に切って、ホチキスで とめておくのが良いでしょう)。
-
このPGP「名刺」と信頼できる写真付きの身分証明書(パスポート)を、 ほかの開発者(やPGP鍵所有者)と会う時には持って行くようにしてください。
-
ほかの開発者に実際に会ったとき、その人にあなたのPGP「名刺」を渡し、 あなたのパスポートを調べてもらうために手渡してください。 同じように、その人のPGP「名刺」をもらい、その人のパスポートを調べてください。 その人の識別情報を、パスポートで確認し、パスポートに記載の 名前とPGP「名刺」の名前を比較してください。
識別情報を確認するときには、極端にいろいろと話しをするように してください。本人確認を正しくすることが、PGP鍵にサインすることの全てです。
その人のPGP鍵UIDの名前が正確にはパスポートの名前と一致しない場合が あるかもしれません。 例としては、ファーストネームとして「William」の代わりに「Bill」が使われて いたり、「Richard」の代わりに「Dick」が使われていたりといった具合です。 あなたが、あなたの鍵でその人の識別情報を正しいと追認すべきか 迷った場合には、署名してはいけません。 署名しないのでなければ、写真付き身分証明書にあるのと同じ名前のUIDを追加する ように要求し、そのUIDに署名するようにしてください。
全てが一致したならば、PGP「名刺」に本人であることの確認が完了した ことを(日付と一緒に)記入してください。 一人の開発者と会った時には、これは奇妙なことに思えるかもしれません。 しかし、この方法は、 鍵署名パーティーで何をしたか信頼性をもって追跡できる唯一の方法であり、 良い習慣であるとされています。
-
コンピューターの前に戻ったら、他の人たちの公開鍵をインポートしてください (公開鍵サーバーからでもlocalsrcからでも可)。 gnupgでは、これは以下のように簡単にできます。
% gpg --import moe_pgp_key.asc
同じ鍵を複数回インポートしても問題は生じません。
公開鍵サーバーからインポートするには、以下のようにしてください。
% gpg --recv-key <keyid>
-
少なくとも以下の新しくインポートした鍵の構成要素を、もらったPGP「名刺」の 情報と照合してください。
鍵のタイプ
鍵長
鍵のID
鍵の指紋
任意の鍵のIDを持つ鍵を作成可能であり、 (設計の弱みにより)どんな指紋を持ったPGP鍵も作ることが可能です。 しかし、これらの鍵は、奇妙な鍵長を持つことになります。
現在のところ、任意の鍵長、鍵のID、鍵の指紋の組み合わせを持つ鍵を作成 することは不可能と考えられています。
PGP鍵の全ての構成要素が、PGP「名刺」のそれと一致しらならば、 その公開鍵は本当にPGP「名刺」をくれた人物の所有物であると確信して良いです。
-
署名する前の残りの仕事は、相手が提示された全てのUIDを管理下に置いているか を確認することです。 これを確認するためには、乱数を発生させ、 相手の鍵で暗号化してそれを送れば良いです。 相手のやるべき事は、この乱数を暗号化し、送り返すことです。 このときは、あなたの公開鍵で暗号化してもらいます (暗号化して返信してもらうのは、暗号解読攻撃を防止するためです)。 相手に送り返すメッセージに署名してもらうことが大切です。 そうすれば、7ステップで 相手の識別情報を確認することができます。
複数のUIDを持つPGP鍵を確認するならば、どの乱数をどの電子メールアドレスに 送ったかをメモしておくようにしてください。
gnupgを使ったこのステップの例を示します。
% cat >> moe@doe.org Hi Moe, please return this message to me. Please sign and encrypt it. Thanks, Joe ^D % dd if=/dev/urandom count=1 | md5 >> moe@doe.org % gpg --armor --encrypt moe@doe.org > moe@doe.org.asc
-
相手からの返信を受け取ったら、復号して署名を確認します。 これに成功したら、必要な試験は終了です。 相手の公開鍵に署名することができます。
GPGを使って、鍵に署名するのは以下のようです。
% gpg --edit-key <Key ID> sign
-
この手順の最後のステップは、署名したばかりのPGP鍵をエクスポートし、 所有者に送ることです。
注意: あなたがPGP鍵をそもそも鍵サーバーから入手したのではない限り、 他人のPGP鍵を直接、公開鍵サーバーに送るべきではありません。 あなたが署名し、「公開」鍵と呼ばれてはいますが、 どのように自分自身の鍵を配布したいかを決めるのは、鍵の所有者の役割です。 公開鍵サーバーに送るのではなく、署名した鍵は鍵の所有者に送り、 所有者が鍵を配布するようにします。
% gpg --armor --export <Key ID>
あるいは、muttを使っているのであれば、muttの「mail-key」機能を使うこと ができます。
% mutt <ESC>k To: moe@NetBSD.org Subject: Your signed PGP key Please enter the key ID: 4461CF46 <Select key> ...
最後に、あなたの鍵束にある公開鍵を新しい署名のあるものにアップデートしたい と思うかもしれません。これは、以下のコマンドで実行できます。
% gpg --refresh-keys [--keyserver ...]
これによって、あなたが鍵を受けとってから鍵サーバー上で公開された追加の署名を 取得しマージすることができます。
Executive Committee for Membershipは、メンバー資格を得ようとする者に、 現在NetBSD開発者である者に署名されたPGP鍵で署名された アカウント作成に関連する電子メールを送ることを要求しています。 これは必然的に、アカウントの作成の前には、 応募者は現在NetBSD開発者である者に会わなくてはならないということを 意味しています。 その時、@NetBSD.orgのUIDは署名されていないことになります。 もちろん、応募者の@NetBSD.orgのUIDに、アカウントが作成され次第すぐに、 再度会うことなく署名することには価値があります。 これは、簡単にできます。
応募者の鍵に署名する手順は、上に示した通りです。 もちろん、最初はNetBSDでないUIDだけが署名されています。 応募者の@NetBSD.orgアカウントが作成されたら、 6から 8までのステップの手順を @NetBSD.orgのUIDも実行してください。 再度、応募者と会う必要はありません。すでに以前に人物と鍵の関係性は 確認済みです。