それは誰が保証するか?〔GnuPG(GPG)/電子署名〕〜ごまかせない署名〜
『そのファイルは本物か?〔MD5 / SHA〕〜ごまかせないハッシュ値〜』の兄弟記事です。
【そもそもそれは正しいものなのか?】
以前、「MD5チェックサム」や「SHAチェックサム」については「ファイルの同一性」を確認するのに使われていたりすると説明しましたが、そもそもその公開されている「MD5ハッシュ値」や「SHAハッシュ値」は本当に正しいものなのか?という問題が発生することがあります。
一般的には公開元の公式サイトに出されている情報を見て正しいなと判断するかと思います。しかしそれが絶対的に正しいかというと、その保証はありません。
というのも、その公開元の公式サイトが不正アクセス等により改ざんされ、サイトに表示されている情報が書き換えられている可能性もゼロではないからです。
「ScanNetSecurity:Webサイト改ざん」などを覗くと、思いのほか、サイトの改ざんはそれなりに発生しています。
ということで、公開されているその情報は本当に正しいものなのかを確認できる方法はないか・・・その解決方法の1つが「電子署名」となります。
【電子署名の仕組みを支える公開鍵暗号】
電子署名は原理的には公開鍵暗号の仕組みを利用しています。
流れ的には下図のように、署名したいデータやファイルを「秘密鍵」で「署名」し、そのペア鍵である「公開鍵」でその署名が正しいか「検証」します。
この「電子署名」はちらほらと触れる機会もあったりします。ということで、今回は実際の電子署名の話をば。
なお、ここでの署名の話は「GPG」による電子署名がメインとなります。(「GNU Privacy Guard (GnuPG)」、いわゆる「GPG」は暗号化のみならず、電子署名においても様々な場面で利用されているソフトです。)
さて、GPGを使ってのデータ(文書)に対する電子署名の仕方として、以下のようにいくつかあったりします。
(なお、以下のgpgを使っての作業は、すべてDebian10になります。また、gpgはDebianでは標準で入ってます。)
【1:クリア署名】
-----BEGIN PGP SIGNED MESSAGE----- ポールウィンナーと魚肉ソーセージはどちらがお好きですか?
iQGzBAEBCgAdFiEER4tBxJ9hGP+zcv8D4RHsEEF8SnoFAl5sLrIACgkQ4RHsEEF8 |
「BEGIN PGP SIGNED MESSAGE」のところが平文で読める文書(本文)の部分。
「PGP SIGNATURE」のところが本文に対する電子署名の部分。
この2つが上記のような形でセットになっているものが「クリア署名」と呼ばれるものになります。
署名者の公開鍵を利用することで、署名の検証を行い、その検証の結果次第で「この署名者によって確かに作成されたもの」なのか「この署名者によって作成されたものではない」のかを(※1)判断することになります。
【2:PGP MESSAGE】
-----BEGIN PGP MESSAGE----- owGbwMvMwMX4UPCNgGONVxXjmr1JXLmJRaUZmXolFSVxOfrqj5vnPm7e87h59eOm |
クリア署名とは違い、文書部分が平文で読めません。ちなみに中身についてはいくつかパターンがあって、
・「電子署名が付加」されただけのPGP MESSAGE
・「ファイルを暗号化」しただけのPGP MESSAGE
・「電子署名 + 暗号化」がファイルに施されたPGP MESSAGE
などと、いろいろあります。
なお、暗号化されていない、署名のみの場合、署名者の公開鍵を持っていなくても
$ gpg --decrypt <file>
だけで、無条件で元の文書が読めます。
(ただし、署名者の公開鍵が無いと署名の検証はできない。)
【3:分離署名】
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEER4tBxJ9hGP+zcv8D4RHsEEF8SnoFAl5sL10ACgkQ4RHsEEF8 |
クリア署名は「文書(本文)」と「署名部」がセットになっていましたが、「署名部」の部分のみ分離したものが「分離署名」となります。
元ファイル(データ)は完全にそのままの状態に残したまま、署名は別ファイルにしたい場合に利用されたりします。ソフトウェアプロジェクトなどでファイルを配布するときによく用いられる模様。
ちなみに、Debianのisoファイル配布ページの「MD5SUMS.sign」や「SHA512SUMS.sign」なんかも分離署名になってたりします。
さて、これらの署名、公開鍵を利用して検証する方法を知らなければ、全くの無用の産物となってしまうので、以下「署名の検証」のやり方をば。
なお、順番は前後しますが、説明上の手前「分離署名」の検証のやり方から説明します。
【③ 分離署名検証 実践例/Debianのチェックサムファイルの署名の検証】
Debianのisoファイルのチェックサムファイルの信頼性の確認について、公式では一応「Debian CD の信頼性の検証」というページがあるのですが、具体的にどうやったら検証できるのかまでは書かれていません。
ということで、以下実践♪
まずは「https://cdimage.debian.org/debian-cd/current/amd64/bt-dvd/」にアクセス。
今回は「SHA」ではなく、「MD5」の方で試してみます。
「MD5SUMS」の方がMD5チェックサムが記述されたもの。
「MD5SUMS.sign」の方は、「MD5SUMS」に対する分離署名。
この「MD5SUMS」と「MD5SUMS.sign」の2つのファイルをダウンロードします。
なお、左クリックでは、ブラウザ上でそのまま表示されるだけなので、右クリックから「名前を付けてリンク先を保存」で保存。
今回の例では、下図のように2つのファイルをホームディレクトリ上に保存しました。
では、検証作業です。
まずは端末(今回はkonsole)を起動して、
$ gpg --verify <署名ファイル>
と入力します。(「$」の部分は入力しない。これは一般ユーザであることを示しているだけ。)
すると、
gpg: 署名を検査できません: No public key
と署名の検証に失敗します。
これは「MD5SUMS.sign」の分離署名を検証するために必要な署名者の公開鍵を、今現在持っていないがために失敗するわけです。
ということで、その公開鍵をDebian公開鍵サーバーの「keyring.debian.org」からダウンロードします。
(keyring.debian.org については『Debian Public Key Server』に情報があります。)
以下のコマンドを打って、公開鍵をダウンロードします。
$ gpg --keyserver <公開鍵サーバ> --recv-keys <公開鍵のID>
なお、「公開鍵のID」の部分はユーザIDや鍵ID、指紋(fingerprint)などを入れます。今回は「指紋」をそのままぶちこんでます。
以上で公開鍵をサーバからダウンロード&インポートが終了。もし、公開鍵がインポートされたかどうかを確認したければ、
$ gpg --list-key
とすれば、インポートされている公開鍵のリストを確認できます。
さて、公開鍵のインポート作業が済んだので、「MD5SUMS」が正当なものか、検証作業を開始できます。再度、以下のコマンド打ちます。
$ gpg --verify <署名ファイル>
または
$ gpg --verify <分離署名ファイル> <署名対象のファイル>
(↑ 2つのファイルが同一ディレクトリに無かったり、ファイル名が違う場合に使う。)
で、結果を見ると、
gpg: "Debian CD signing key <debian-cd@lists.debian.org>"からの正しい署名 [不明の]
と出るかと思います。これは「正当な署名」であることを示しています。なお、これが署名が正しくない・改組されている・間違っている・ファイルが違う場合は、
gpg: "Debian CD signing key <debian-cd@lists.debian.org>"からの*不正な*署名 [不明の]
とか
gpg: 署名を検査できません: No public key
などといった感じで出たりします。
ちなみに、[不明の]や「この鍵は信用できる署名で証明されていません」「この署名が所有者のものかどうかの検証手段がありません。」は不安を感じる部分になるかと思いますが、今回は気にしなくていいです。
これが出る原因は「このMD5ハッシュファイル(データ)は、サーバからインポートした公開鍵で署名を検証した結果、確かなものであるということが確認できたんだけど、そもそもこの公開鍵は信用できるんですかね?」という状況になっているため。ちなみに、[不明の]というのは「公開鍵に対する信用度が不明」という意味。
本来であれば、この公開鍵の所有者(署名者)に直接会って、「この公開鍵は確かに間違いが無いですよね」と確認するのがベストなんですが、さすがに世界各地のisoダウンロードユーザが署名者に会いに行くのは現実的には無理な話なので、「とりあえず信用することにしましょ。」ということになる。
ちなみに「Debian CD の信頼性の検証」のページに、この公開鍵の指紋情報が載っているので、とりあえずここで信頼性を判断して良いかと。
(まぁ、公式サイトがクラックされて「改組された指紋」と「改組されたハッシュファイル」「改組されたiso」がアップされていたらどうしようも無いですが、そこまで考えるとキリが無いですね。)
とりあえず、[不明の]や「この鍵は信用できる署名で証明されていません」、「この署名が所有者のものかどうかの検証手段がありません。」といった表記はあるものの、これを無視すれば、Debianのisoハッシュファイルは正しいということが判断できます。
ちなみに、この表記がされるのが嫌な人は、この公開鍵に対して「信用度を変更する」または「自分のGPG鍵を作って、その秘密鍵でインポートした公開鍵をローカルな署名で署名する」といったことをすれば良いです。
ちなみにやり方は以下。
【信用度を変更する場合】
まずは端末で以下のコマンドを打ちます。
$ gpg --edit-key <鍵ID>
すると、
gpg>
と表示されるので、そこに「trust」を打ってEnter。
信用度「5」を入力して、Enterの後、「y」を入力。
最後に保存(save)すれば終了。(信用度の変更のみなら「quit」でも良い。)
(これで [不明の]や「この鍵は信用できる署名で証明されていません」「この署名が所有者のものかどうかの検証手段がありません。」の表記は無くなる。)
【自分のGPG鍵で公開鍵を(ローカルな署名で)署名する場合】
これに関してはまず、自分のGPG鍵ペアを作成してからとなる。
まず、端末から以下を入力。
$ gpg --full-gen-key
(または、簡易の「$ gpg --gen-key」、さらに細かく指定する場合は「$ gpg --full-gen-key --expert」)
すると、必要な情報を聞かれますので、選択していきます。
なお、GPG鍵ペア作成後、公開鍵の一覧を確認したい場合は、
$ gpg --list-key
(または、「$ gpg -k」)
秘密鍵の一覧を確認したい場合は、
$ gpg --list-secret-keys
(または、「$ gpg -K」)
とすると良い。
(pub で始まる行はプライムキーの公開鍵)
(sub で始まる行はサブキーの公開鍵)(sec で始まる行はプライムキーの秘密鍵)
(ssb で始まる行はサブキーの秘密鍵)なお、「利用法」の「E」や「S」などは、
E:encryption(暗号化に使用できる)
S:signing(署名に使用できる)
C:certification(三者間認証・鍵への署名?:他のキーの認証に使用できる)
A:authentication(二者間認証:認証に使用できる)という感じ。
※ E,S,C,Aについては「githubで使うGPG鍵の作成」や「はじめてのGPG 〜第2回 主鍵と副鍵〜」「日経クロステック:認証には2種類ある」「Kernel Maintainer PGP guide」が参考になりました。ただし、gpgにおいて、三者間認証・二者間認証という表現が適切かはわかりませんが・・・。
以上で自分のGPG鍵ができたので、Debianの公開鍵サーバからダウンロードしてきた公開鍵を自分のGPG鍵で署名します。
なお、公開鍵への署名には2パターンあって、一般的な署名と、ローカルな署名があります。
一般的な署名の場合は、
$ gpg --sign-key <鍵のID>
ローカルな署名の場合は、
$ gpg --lsign-key <鍵のID>
とします。
このように自分の鍵で署名すれば、その公開鍵に対する信用度は上がることになるんですが、ここで、1つ注意点。
公開鍵サーバから入手した公開鍵に対する署名は、特別な条件(例えば信頼のおける相手に直接会い、公開鍵の指紋等もそこで確認し、かつ署名する必要性が生じているなど)を満たす場合を除いて、「一般的な署名は避けるべき」だと思います。よく意味がわからない状態で公開鍵に署名し、それが外部に漏れて拡散した場合、トラブルが起きる可能性があります。ある程度は信用できるであろう公開鍵で、その公開鍵を利用したい場合、先に述べた「鍵の信用度を変更する」か、「ローカルな署名」で対応すると良いです。「ローカルな署名」はエックスポート不可としてマークされているため、そもそも直接他人に渡すことはできません。自分の署名情報を外に拡散させることのない、そんな署名です。
※ 「鍵の信用度の変更」と「公開鍵への署名」は別物です。「鍵の信用度の変更」は「自分はこの鍵を信用している・していない」を外部へ公言するわけではなく、あくまで「信用する・しない」が自分の中(個人)で完結するものです。ところが、「公開鍵へ署名」し、これが外部に出た場合、「この公開鍵は確かなものであることを私は署名した!」と高らかに公言しているようなもので、「信頼の綱・信用の輪」への影響が出るものです。鍵への署名を行う際は、その点をしっかりと理解しておく必要があり、安易な鍵への署名は避けるべきです。(その点では、「ローカルな署名」は安心です。)
※ 鍵への署名は慎重にならなければいけないことについては「Debian:鍵署名 (Keysigning)」の「やってはいけないこと」などに載っています。
端末にて「lsign」の方を入力。
(万が一、GPG秘密鍵を複数所持している場合は、「$ gpg –-local-user <自分の秘密鍵ID> –-sign-key <相手の公開鍵ID>」とすると良い。)
うむ、すっきり♪(終)
【おまけ】
せっかくなので、本ページの例にある「1:クリア署名」を個人的健忘録の「公開鍵」を使って検証してみよう。
まず、今回個人的健忘録が作成した公開鍵は以下になります。
-----BEGIN PGP PUBLIC KEY BLOCK----- mQGNBF5sJSYBDACofHSCvwofZd7NdWaUSz0FspRg91uKR/pKVfTkf0PxUjNWUTYL |
なお、この公開鍵の指紋は「478B41C49F6118FFB372FF03E111EC10417C4A7A」です。
今回は、上枠内のようにテキスト化されている公開鍵をエディタにコピペして公開鍵のファイルを自分で作ってみることにします。(ちなみに、バイナリ形式の公開鍵も存在する。)
上枠内の文字列を適当なエディタにコピペしてファイルとして保存。
(鍵の拡張子は「〜.key」とついたり、何もつかなかったりといろいろ。一般的に利用されるjpgとかmp4などを避ければとりあえず適当で問題なさげ。今回は「kojiken_pubkey.txt」とした。)
次に、この公開鍵ファイルをインポート。
$ gpg --import <公開鍵ファイル>
とします。
なお、指紋の下8桁や下16桁は鍵IDとなります。また、鍵IDや指紋は「$gpg --list-key」や「$ gpg --fingerprint」などで確認が可能です。
鍵IDや指紋情報を見て、目的の公開鍵だったのかが確認できます。
以上で公開鍵のインポート作業は終了です。
※ ダウンロードした公開鍵ファイルについて、インポートする前に指紋等を確認したい場合は、「pgpdump」や「gpgpdump」などが利用できます。
(上図は pgpdump での確認例)
では、検証作業に入ります。
【クリア署名 検証】
まず、先のクリア署名の文字列(枠内の文字列)を適当なエディタにコピペしてファイルとして保存。
-----BEGIN PGP SIGNED MESSAGE----- ポールウィンナーと魚肉ソーセージはどちらがお好きですか?
iQGzBAEBCgAdFiEER4tBxJ9hGP+zcv8D4RHsEEF8SnoFAl5sLrIACgkQ4RHsEEF8 |
なお、「-----BEGIN PGP SIGNED MESSAGE-----」から「PGP SIGNATURE の最後の行」までの間は、改行含めて一切変更してはいけない。変更すると、検証時に「不正な署名」と返ってくる。
公開鍵を保存したときのように、上枠内の文字列を、適当なファイル名で保存し、
$ gpg --verify <検証したいファイル>
とすれば検証が終了。
問題が無ければ「正しい署名」と出ます。
なお、[不明の]や「この鍵は信用できる署名で証明されていません」「この署名が所有者のものかどうかの検証手段がありません。」が気になる人は、分離署名のところで話をした「公開鍵の信用度を変更する」か「公開鍵へのローカルな署名」で対応してください。(終)
※1 ある公開鍵で検証し、「正しい署名」と結果が出たとしても、それだけでは「署名者が正しいかどうか」までは判断できない。(その鍵ペアで署名された、ということは保証される)。というのも「署名者の名前を偽って作成されたGPG鍵である可能性」も捨てられないからである。だからこそ「相手から公開鍵を直接もらう」とか「認証局」とか「信頼の網」などの仕組みを使って、「署名者が正しいかどうかを判断」するわけである。
※2 インポートした公開鍵を削除したい場合は、
$ gpg --delete-keys <公開鍵のID>
とすると良いです。
※3 その公開鍵は正しいのか問題(GPGの枠組みから外れた内容も含まれます。)
例えば本ページにて公開している『個人的健忘録の公開鍵』、サイトが不正アクセス等にてすでに書き換えられている可能性はゼロではありません。では公開鍵が正しいかどうかを確認するにはどうしたら良いのか?
解決策の1つは、直接相手に会って確認をする方法です。本人に直接会うわけですから、その公開鍵については真正性は確認できます。
ちなみに、そのAさんによって署名された他の公開鍵の信用度もある程度図れます。(その人をどれほど信用するかにもよりますが。)
これを発展させると、いわゆる「信頼の綱・信用の輪」に繋がります。(原理上、次に述べる「認証局」は不要。)しかしこの方法は基本、個人対個人ベースの方法であり、多くの一般人にとって普段使いには利用しにくいところがあります。
ということで、他の解決策として認証局(公開鍵証明書認証局)を利用する方法があります。公開鍵を公開している者(個人・組織・団体・企業等)が、自分の公開鍵(公開鍵証明書)を認証局に(認証局の秘密鍵で)署名してもらうことにより、公開鍵の真正性を担保します。
ちなみに勘が鋭い人は「じゃあ、認証局の公開鍵はどうやって真正性を確認するんだよ」って話になるんですが、有名所の認証局の公開鍵(証明書)はすでにあなたのPCに入っているハズ♪
SSL証明書の例ですが、こんな感じで世の中回ってるんですね。
まぁ、認証局を通しているから安心というわけでもないんですが。
【SSL証明書は安全なのか?~Comodo/DigiNotar事件を振り返って】
【不正が発覚した中国の認証局、Microsoftも無効化を通告】
なので、直接会っての確認が最強なわけです。(笑)
ちなみに、当方の公開鍵はどうなっているかというと、誰に署名されているわけでもないし、認証局に出しているわけでもありません。というか、そんな私的な公開鍵なぞ世の中たくさんありますし。なので、当方の公開鍵の真正性は確認しようがありません。
まぁ、たぶん本物だと思いますよ♪
番外編「GnuPG(GPG)で署名ファイルを作る【CUI編】」に【2:PGP MESSAGE】の検証方法を簡単に載せてあります。
興味のある方は参考にどうぞ。
【参考サイト】
・GNU Privacy Guard講座:GnuPGの使い方
・はじめてのGPG 〜第2回 主鍵と副鍵〜
・gpg (GNU Privacy Guard)の使い方
・電子署名による認証(身分証明)
・githubで使うGPG鍵の作成
・情報セキュリティ大学院大学 有田正剛氏:電子署名入門
・【図解】初心者も分かる”公開鍵/秘密鍵”の仕組み~公開鍵暗号方式の身近で具体的な利用例やメリット〜
・OpenPGP パケットを可視化する gpgpdump
・Windows 環境で作った GnuPG の鍵束を Ubuntu に移行する
・OpenPGP 鍵管理に関する考察
・DebianWiki:Subkeys
WindowsやMacによる検証方法については、国税庁にマニュアルが置いてあったりします。
・OpenPGPを使用した署名検証方法の解説
内容的には本ページとは変わりませんが、説明としてはかなり大雑把な気もしないでもない。
まぁ、技術的な説明を目的としたものでは無いですからね。
Mutt Japanese Edition Linux Japan 誌掲載記事 の第4回「PGP」の記事は、PGPの概要やGnuPGのことが図入りでわかりやすく書かれているかと思います。
・Mutt Japanese Edition Linux Japan 誌掲載記事
・デジタル証明書の仕組み
・認証局と電子証明書
・Debian 管理者ハンドブック:6.5. パッケージ信頼性の確認
・ubuntu manuals:apt-key
・Kernel Maintainer PGP guide
〔セキュリティ関連ページ〕
<SSH関連>
・SSH でリモートアクセス! in 2018(その1)【パスワード認証】
・SSH でリモートアクセス! in 2018(その2)【公開鍵認証】
・セカンドPCに秘密鍵を突っ込んでSSH接続(公開鍵認証)
・パスワード認証禁止 & 公開鍵認証でsshfsを使う
・virt-manager でリモートアクセス(SSH-一般ユーザ接続:公開鍵認証)
<暗号化関連>
・Linuxでファイル暗号化(1)〜 USBメモリをgocryptfsで守る♪
・Linuxでファイル暗号化(2)〜 USBメモリをgocryptfsで守る♪ SiriKali編
・Linuxでファイル暗号化(3)〜 Dropboxをgocryptfsで守る♪
<その他>
・そのファイルは本物か?〔MD5 / SHA〕〜ごまかせないハッシュ値〜
・Debian GNU/Linux インストールディスクの作成(2018年度)
« iOS 13 とバグの話 | トップページ | GnuPG(GPG)で署名ファイルを作る【CUI編】 »
「セキュリティ」カテゴリの記事
- こういった話に、どれだけ危機感を持って動いているのだろうか(2021.04.04)
- Lineのサーバの話って…(2021.04.03)
- セキュリティ情報:「Ripple20」TCP/IPライブラリ・ゼロデイ脆弱性(2020.06.23)
- セキュリティ:スマートスピーカー・ハッキング 〜Light Commands〜(2020.06.23)
- テレワークが広がる現況での危険な話〜マルウェア45%(2020.06.02)
「Debian GNU/Linux」カテゴリの記事
- それは誰が保証するか?〔GnuPG(GPG)/電子署名〕〜ごまかせない署名〜(2020.03.14)
- Debian で Debian の「インストールUSB」を作る(2018.08.19)
この記事へのコメントは終了しました。
コメント