わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

PGP再勉強

はじめに

某年月日に出席した会議で,ファイルのやりとりに関してPGPを積極的に活用しようということになりました.
PGPについては,担当科目で取り上げ,授業中に実演をしていますが,暗号化zipとの違いだとか,何が暗号化されて何は暗号化されないのかとか,細かいところまで理解しているとは言いがたいのが現状です.
それで,いろいろ調べてみました.

まず基本中の基本

…読み直してみたものの,本当に初めてという人には,おすすめできない文章です.自分の授業で教えているのを,ひっぱり出しますか.

  • 機能としては,PGPは,ファイルやメールに対して暗号化・復号・署名・署名文の検証をするもの*1
  • ソフトウェアとしては,PGPは商用*2.フリー(GPL)で利用可能なのはGnuPGで,「gpgコマンド」は同義.

他の暗号化手法と何が違うのか

1. サーバに接続するときの暗号化では,ダメなのか?

例えば,ThunderbirdGmailにアクセスし,メールを送受信するよう,IMAP を使用して他のメール クライアントで Gmail をチェックする - Gmail ヘルプをもとに設定すると,送信(SMTP)も,受信(IMAP)も,SSL/TLSで暗号化されることが分かります.
しかしそれらは,自分のPCからサーバに接続するまでの通信を暗号化するものであり,送信後のメールの配送や,サーバで保管されているメールについては,暗号化されません.それらに対して,悪意のある攻撃がなされると,秘密にすべき内容が知られてしまうかもしれません.
これはSSLが悪いのかというと,そうではなく,SSHのポート転送でも発生します.何を暗号化するのかに起因する注意点と言えるでしょう.

2. 暗号化zipでは,あかんのか?

Windowsで書庫ソフト(アーカイバ)と呼ばれるものには,たいてい,パスワードつきのZIPファイルを作る機能があります.コマンドラインだと,zipコマンドで-eまたは-Pのオプションをつけると*3,同様なZIPファイルが得られます.俗に「暗号化zip」と呼ばれます.
暗号化zipとPGPでは,パスワード*4の管理が大きく異なります.
暗号化zipでは,そのZIPファイルごとに異なるパスワードを指定できます.なのですが,いろいろなファイルに別々のパスワードを設定すると,混乱の元なので,この人々と共有するときはパスワードを共通にしましょう,なんて運用のしかたになりがちです.誰か一人からパスワードが漏洩すると,過去のも読まれてしまうことになります.パスワードがよくなさそうだから変更しようといっても,過去のファイルを取り替えるわけにもいきません.
一方,PGPでは,復号の際,秘密鍵を使うためにパスワードを入力します.秘密鍵のパスワードは,秘密鍵の所有者ごとに設定し,あとで変更することも可能です*5.何らかの理由で秘密鍵の漏洩*6があったときは,それをもとに,鍵に結びつけられている過去の暗号メールが読まれてしまうことになりますが,その人が責を負うことになります.
PGPで,一つの暗号化ファイルを複数人で共有できるかどうかについては,後述します.

3. S/MIMEとの違いは,何なのか

Thunderbirdでメールを作成しようとすると,メニューアイコンの中に「S/MIME」というのが出ます*7.あまり馴染みでないときには,wikipedia:S/MIMEから.
それで…

上記のアプリケーションでS/MIMEを使う前に、自身の組織内認証局(CA: Certificate Authority)から、または以下に挙げているような公的な認証局(パブリックCA)から、個別の鍵/証明書の両方を入手しインストールしなければならない。

S/MIMEは,PKI(公開鍵基盤)をベースとし,認証局(CA)を用いた鍵の管理が前提ということですね.
その一方で,PGPにおいては,そういった認証局が存在しません.鍵サーバは,公開鍵のやりとりの利便性を図るものであって,鍵そのものの正当性は保証しないのです.
そもそも,私のメールアドレスに結びつけられたPGP用の鍵は,私以外の人が,私のチェックを経ることなく作成できます.他の人が,私のものでない私のメールアドレスの鍵を公開鍵として,取り寄せて暗号化し,私の想定していない人がその暗号文の中身を知るということが起こらないよう,「自分の鍵はこれ!」と示して維持管理する必要があります

運用にあたっての注意

何人かで同意して運用していくにあたり,重要なのは,各人の鍵の管理です.みながみな,PGPに対して使いたいという意欲や,使うための知識を持っているわけではないでしょうから,よく使う人が持つノウハウを共有するなどして,快適な環境を維持したいところです.ただ,ある人のノウハウが(利用環境が違うといった理由で)他の人には使い物にならないとか,実はバッドノウハウだとかいった可能性には,気をつけたいものです.
メールの中身は暗号化できますが,誰宛てなのかは,メール配送の性質上,隠すことができません.対策としては,Bccで組織内にだけ送ることが考えられます(誰宛てかは,暗号化される本文の中で書きます).それでも,ある受信者がGmailなんかに転送していたら,そこだけは知られてしまうことになります.
一つの暗号化ファイルを複数人で共有することについて,言い換えると「複数の利用者が(異なる鍵で)ファイルを復号できるような,単一のファイルを作る」という方法は,調べた限り,見つかりませんでした
記述がないわけではなく,例えば

  • さらに、複数のメールアドレスがあればそれぞれの公開鍵で一つのメールを暗号化して複数の人の秘密鍵で開くことが出来るようにします。 これは大変便利な機能で、メールの同報性を十分活かすことが出来ます。
PGP‚ÌWindows‚Å‚ÌŽg‚¢•û

とあります.
これがgpgでできないか,-rオプションで悪戦苦闘し,manpageも読んだものの,うまくいきませんでした.またhttp://www.gnupg.org/faq/GnuPG-FAQ.htmlの中にも,関係しそうなものが見当たりませんでした.それでちょっと考えてみたのですが,もしこれができると,誰か一人でも秘密鍵の漏洩があったら中身が知られてしまうことになり,そういう作りにはしたくないものです….
ということから,暗号化して複数人に知らせたい場合,別々にメールを送るか,その複数人が決まっているのなら,その人々の間で共有するようなメールアドレスとPGP用鍵ペアを作って共有するか*8,せざるを得ないのかなと思います.
なお,Anonymous Receipient機能*9は,受信者の鍵IDを隠すだけであって,どの鍵IDでしか復号できないかの情報は,依然としてその暗号化ファイルの中に組み込まれています.

gpgカンペ

毎年,授業でPGPの説明をする際,gpgコマンドの実演をしていて,そのためのcheat sheetを作っていました.いちおう公開しているのですが,そのページは消すことも考えていますので,ここで記すことにします.参考になるURLを取り除いたほか,いくつか手を加えています.

■gpgコマンドの引数一覧

鍵ペア生成: gpg --gen-key
鍵の破棄(失効)証明書作成: gpg -a -o output.filename --gen-revoke Keyname
鍵をエクスポート: gpg -a -o output.filename --export Keyname
鍵を(鍵束に)インポート: gpg --import import.filename
鍵のフィンガープリント: gpg --fingerprint Keyname
鍵を(鍵束から)削除: gpg --delete-key Keyname
鍵を(公開鍵サーバへ)送る: gpg --keyserver Servername --send-keys Keyname
鍵を(公開鍵サーバで)検索: gpg --keyserver Servername --search-keys KeyID
鍵を(公開鍵サーバから)入手: gpg --keyserver Servername --recv-keys KeyID
(鍵束の中の)鍵に署名: gpg --sign-key Keyname
鍵の設定(信頼度,パスワードなど): gpg --edit-key Keyname
対称暗号による暗号化: gpg -o output.filename --symmetric input.filename
対称暗号による復号: gpg -o output.filename --decrypt encrypted.filename
公開鍵暗号による暗号化: gpg -o output.filename -r Keyname --encrypt input.filename
公開鍵暗号による復号: gpg -o output.filename --decrypt encrypted.filename
ファイルへの署名: gpg -o output.filename --sign input.filename
署名文の復元: gpg -o output.filename --decrypt signed.filename
鍵束の鍵一覧: gpg --list-keys
鍵束の秘密鍵一覧: gpg --list-secret-keys
鍵束の鍵編集: gpg --edit-key Keyname

KeyIDの例: 3BDCC722
Keynameの例: takehiko@sys.wakayama-u.ac.jp
Servernameの例: pgp.nic.ad.jp

*1:比較:SSLは,HTTPやSMTP,POPなどクライアントサーバモデルの通信を暗号化するもの.SSHは,リモートログイン(ログアウトするまで)を暗号化するもので,ついでに,ポート転送の機能で他の通信も暗号化できる.

*2:シマンテック製品: サイバーセキュリティと Web セキュリティ | Symantec JP

*3:zipコマンドの使い方: UNIX/Linuxの部屋

*4:パスフレーズ」と呼ばれることもありますが,簡単のため「パスワード」に統一します.

*5:秘密鍵のパスフレーズを変更する.そうすると,過去のメールは,過去に作った秘密鍵と新たに設定したパスワードを使って,復号することになります.

*6:~/.gnupg下の秘密鍵ファイルが流出したというのは,まあ解読される可能性もありますが,大きな被害とは言えません.秘密鍵を使うためのパスワードも知られてしまったという状況を指して「漏洩」としています.なお,そうなってからパスワードを変えるのは意味がなく,失効処理をして鍵サーバに送るなどして通知し,改めて,鍵を作り直す必要があります.

*7:翌日追記:Enigmailアドオンを入れておかない状態では,出ませんでした.

*8:翌日追記:これもまた,「誰か一人でも秘密鍵の漏洩があったら中身が知られてしまう」ので,安全性が向上していませんね.

*9:秘匿受信者機能とも.OpenPGPを使用したSNSセキュリティ