☰AboutBlogSlideAtomSearchAboutBlogSlideAtomSearchYubikeyでOpenPGP鍵をセキュアに使う2021-03-23YubikeyOpenPGPGPGκeenです。最近Yubikeyを買ったので色々試しています。今回はそのうちのPGP回です。YubikeyについてYubikeyは米瑞企業のYubico社が販売している認証デバイスです。FIDOやらWebAuthnやらの文脈で耳にした方も多いんじゃないしょうか。Yubikeyは日本ではソフト技研社が販売代理店をしています。Yubikeyでできることは色々あります。Qiitaこのうち今回はOpenPGPサポートの機能を使います。OpenPGPについてOpenPGPはデータの完全性を提供するためのプロトコルです。RFC4880で標準化されています。主な用途は電子署名や暗号化などでしょうか。その他頑張ればSSHの認証にも使えるようです。私は以下の用途に使っています。窓の杜keybaseでの紐付けGitのコミットの署名について補足しておきましょう。Gitに設定するユーザ名やメールアドレスは自己申告なので簡単に詐称可能です。GitLabやGitHubはそのメールアドレスでコミットをアカウントに紐付けるので偽装コミットが簡単に作れます。署名をしておけばそういう偽装を防げます。GitLabやGitHubもOpenPGPの公開鍵を登録しておけばコミットが本人により署名されたものかを確認してくれる機能がついています。OpenPGPの用途は他にも私が公開している鍵を使って他の人が私に暗号化したファイルを送ったり(現実的には暗号化メールかな)できるのですが、まだ暗号化ファイルを受け取った経験はありません。Guard(GPG)を使うことになるでしょう。この記事でもGPGを前提として紹介していきます。YubikeyとOpenPGPについてOpenPGPでは公開鍵暗号を使うので公開鍵と秘密鍵があります。公開鍵はインターネットに公開し、秘密鍵を自分しか知らないように大切に保管します。SSHと雰囲気が似てますね。OpenPGPの鍵は所有者本人に結びつくのでSSHの秘密鍵以上に扱いに注意が必要です。OpenPGPの鍵はそれが本人と結び付いていることを周りに信用してもらってはじめて意味を持ちます。そのためには利用実績の積み重ねと本人による適切な秘密鍵の管理が不可欠です。秘密鍵は電脳空間で本人そのものになるので秘密鍵が流出すると自身の人格が乗っ取られることに等しいです。いった点で流出したら接続先マシンから公開鍵を削除して鍵ペアを作り直せばいいSSH鍵とは扱いが異なります。OpenPGPの秘密鍵を安全に保管したいというモチベーションがあり、そのための機能を実際に提供するのがYubikeyのOpenPGPサポートです。Yubikeyのデバイス内にOpenPGPの鍵を焼き込み、二度と外に出さない運用が可能です。いうことでYubikeyにOpenPGPの鍵を焼き込みましょう。鍵を焼く前にOpenPGPにどんな鍵があり、どう使うのか押えましょう。OpenPGPを使うときにはいくつかの種類の公開暗号鍵対を使い分けます。鍵の機能OpenPGPでは鍵に機能を割り当てることができます。失効と有効期限もし万が一秘密鍵が流出したときのために鍵を失効することができます。そのときは秘密鍵で失効証明書というのを発行し、それを配ることで周りの人に以前公開した公開鍵を失効させることを宣言できます。鍵には有効期限が設定できます。万が一秘密鍵を紛失した場合には失効証明書が発行できないので既に発行した公開鍵をどうすることもできなくなります。いうときに有効期限があれば勝手に失効してくれるので知らずに意味のない鍵を使われる可能性が減ります。有効期限はあとから延長することもできるので、1年くらいに設定して毎年延長する運用するスタイルもあるようです。私も最初混乱したのですが、OpenPGPには主鍵と副鍵があるようです。副鍵は主鍵からいくらでも作ることができます。副鍵は主鍵に紐付いていて、主鍵とは独立して鍵の有効期限を設定したり失効したりできます。主鍵も副鍵も公開暗号鍵対です。厳密には主鍵"対"、副鍵"対"ですし、主鍵の公開鍵、主鍵の秘密鍵、副鍵1の公開鍵、副鍵1の秘密鍵、副鍵2の...と色々な鍵が登場します。鍵の実際の運用よくある運用としては主鍵に認証と署名の機能を持たせて有効期限を無期限にし、副鍵に暗号化の機能を持たせて有効期限を設定することが多いようです。認証と署名は本人に紐付くため一生に一つあれば十分なので有効期限は無期限で問題ありません。主鍵の失効証明書を事前に発行して保管しておきます。鍵が流出したときは気付いた時点で失効証明書をみんなに配れば被害は最小限で済みます。秘密鍵が流出しても、流出前に行った署名が無効になったり偽造されるようになったりましませんからね。暗号化は前方秘匿性の観点から流出した時点で被害が最大になります。秘密鍵を手にした人は過去に自分向けに暗号化されたデータ全てを復号できるようになってしまいます。そこで鍵の有効期限は1年程度にして毎年鍵を交換することで被害を小さくできます。副鍵は主鍵に紐付いていて、鍵の信用は主鍵が担保してくれるので副鍵はある程度頻繁に替えても問題ないという寸法です。鍵は盗まれてはならないし失くしてもならないけど普段気軽に使えるようにしないといけません。この辺の匙加減は個々人に任されるころではあります。ローカルマシン内は安全としてそのまま保存してしまう場合もあります(そのままとはいってもパスワードで保護されていますが)。インターネットに繋ったマシンは全て危険として主鍵の秘密鍵を紙、あるいはUSBメモリなどに書いて家の中で大切に保管し、ローカルマシンには副鍵のみ置く場合もあります。CDとか)の上でOpenPGP鍵を生成するようです。今回の我々にはYubikeyがあるので考えることが少なくて済みます。インターネットに繋っているマシンは安全でないとして、普段使いにはYubikeyに保存した主鍵と副鍵(の秘密鍵)を、バックアップとしてUSBメモリに主鍵と副鍵の秘密鍵のコピーを保存します。これでインターネットから秘密鍵がアクセスされることはなく安全に使えるようになります。作業は普段使ってるインターネットにバリバリで繋がってるマシンでやるので徹底はしてませんけどね。気になる方は上手いことやって下さい。秘密鍵を保存したUSBメモリはインターネットでの自身の人格に相当するので門外不出に安全に管理し、火事で焼け出されるときも通帳や印鑑よりも優先して持ち出します。鍵の生成からYubikeyへの焼き込みまでちょっと前置きが長かったのでやることをおさらいしておきましょう。(事前準備)署名・認証の主鍵と暗号化の副鍵を生成するこのとき副鍵の有効期限を1年にする主鍵、副鍵のバックアップをUSBメモリに置く主鍵、副鍵をYubikeyに焼き込むこれらの作業をやっていきます。Yubicoの公式ドキュメントも併読しながら進んで下さい。Yubico事前準備YubikeyをOpenPGP鍵のストアとして使うためにscdaemonをインストールしておきます。scdaemonどうやらOpenPGP鍵を安全に保管できるデバイスはスマートカードと呼称されるらしいです。コマンドで作成できます。このとき生成する鍵のアルゴリズムはYubikeyに保存できるものを選ばないといけません。サポートしている他、楕円曲線暗号も使えます。以下のようにダイアログを進めていきます。鍵のパスワードは長いものを設定しておきましょう。コンソールではこうなります。5鍵の有効期限を指定してください。yGnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。taro@tanaka.townコメント:あなたは文字集合'utf-8'を使っています。<taro@tanaka.town>"名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)?たくさんのランダム・バイトの生成が必要です。成器に十分なエントロピーを供給する機会を与えることができます。たくさんのランダム・バイトの生成が必要です。成器に十分なエントロピーを供給する機会を与えることができます。公開鍵と秘密鍵を作成し、署名しました。[E]これで署名・認証の主鍵と暗号化の副鍵が生成されました。有効期限は両方とも無期限です。副鍵を編集して有効期限を1年にします。これを指定して編集します。編集を保存コンソールではこうなります。law.秘密鍵が利用できます。expire副鍵の有効期限を変更します。鍵の有効期限を指定してください。save有効期限の編集くらいならGUIクライアントからでもできます。そっちが好みの方はseahorseとかで編集してみて下さい。ユーザ情報は複数登録できます。プライベートと仕事などで複数のメールアドレスを使い分けたいケースなどで有用ですね。GUIからやるならseahorseでポチポチと追加できます。これで鍵の生成は完了です。鍵のバックアップをとるOpenPGP鍵をYubikeyに焼くと二度とYubikeyの外に取り出せなくなります。バックアップをとっておきましょう。この作業は一時的に鍵が書き出されるので細心の注意を払いながら進めます。念のためにtmpfsを用意します。見た目上ファイルを消してもディスクにはデータが残っていることがあります。コマンドなどで消しても実際にはディスクに残ります。すると安全な場所に保管しているはずの秘密鍵が実は安全でない場所に残り続けていたという事態になりかねません。いった問題を避けるためにtmpfs上で作業してデータをディスク上に残さないようにします。tmpfsをマウントします。workspacetmpfs上で秘密鍵をエクスポートします。secret_key.gpg一旦この鍵をインポートできるか確認しておきます。1よさそうなら手持ちのUSBメモリに保存しておいて下さい。鍵はパスワードで保護されているのでこのまま保管して大丈夫でしょう。USBメモリの不良セクタとかが怖ければ同じファイルをUSB内の2箇所に保存しておけばリスクヘッジできるんじゃないですかね。これは他人が触れない場所に大切に保管します。終わったら後片づけをします。workspaceこれで鍵のバックアップは完了です秘密鍵をYubikeyに焼くそれでは秘密鍵をYubikeyに焼きます。その前にYubikeyのPINを変更しておきましょう。PINがデフォルトのままだと危ないですからね。PINはデフォルトで123456、管理者PINはデフォルトで12345678だそうです。