ふわわあのへや競プロとか、好きなこと、いろいろ。

投稿 » 

YubiKey(OpenPGP card)には主鍵を入れよう

tl;dr

  • YubiKeyを電子的「人格」として考えるとよい。
  • YubiKey(などのセキュリティカード)に入れる鍵は
    • 主鍵、暗号復号鍵など唯一存在していてほしいもの
    • 仮環境用のSSH鍵、署名用副鍵など
  • SSH鍵や副鍵はマシンごとにも用意する

注意

YubiKeyの運用法は人それぞれです。求める要件によって最適解も異なります。
この記事で紹介するものは私の環境と使い方での最適解(と信じているもの)です。
完璧なセキュリティのことではありません。ひとつのおすすめとしてバランスの取れた手法を提案したまでです。

また、本記事ではOpenPGPとGPGをほぼ同等の意味として使っています。現状GnuPG以外のOpenPGP実装は利用が少なく、注意して使い分ける必要がないと判断しているためです。適宜読み分けてください。

環境はこんな感じ:

  • YubiKey 5 NFC
  • YubiKeyの用途:
    • GPG (OpenPGP) ←本記事の主眼
    • SSH smart card
    • TOTP
    • FIDO2 (WebAuthn)
  • ハードウェア
    • Linux PC x3
    • Androidスマホ x1

そもそも、何のためのYubiKey?

セキュリティキーとして知られるYubiKeyですが、これに数千円かけるからには何かしら得るものを期待しているはずです。
個人が購入するとき、それはロマンとか利便性だったと思います。絶対に秘匿・保護すべき情報のやりとりをしている人はそうそういないでしょう。

絶対的なセキュリティを求めていると言う人へ

「全ての情報端末の設定をセキュリティ全振りしている者のみが石を投げなさい。」
たとえばディスクは暗号化されていますか? (Windows使いであればBitLockerがあるのでそう難しくはないかも)
ssh/gpg agentは有効期限を設定し、意識して使っていますか?
スマホのロックは十分に強固な パスワード で設定されていますか? 生体認証はその強度を確認していますか?
プレーンな通信は絶対に避け、tls証明書を毎回確認していますか?
すべて「はい」なら是非頑張っていただきたいですが、多くの人は安全性は利便性とのバランスが取られていることと思います。

YubiKeyを使うにしても、QoLが上がる方向で活用しなければ勿体ないというものでしょう。

GPG鍵は主鍵を入れなさい

YubiKeyの設定についてネット上の記事では、主鍵を入れずに副鍵(S)を入れているものをよく見かけます(独自調査による)。この場合想定される運用はこのようになっていると思います:

  • 主鍵はオフラインで すやすや してもらう
  • デバイスには一切の鍵を入れない
    • Git commit 含めすべての署名操作はYubiKeyに入れた副鍵(S)を使用する
    • デバイスが盗難にあっても秘密鍵が漏洩するリスクはない
  • 暗号復号操作はYubiKeyに入れた副鍵(E)を使用する
  • 主鍵を用いた操作をするときは主鍵をPCにつなぐ(オフラインじゃないぞ、あれれ?)
    • もしくは、副鍵をコピーしてきて、閉じたオフライン環境内で作業する(コピーは安全なんだ?)

この運用の問題点は、署名操作にYubiKeyが必須であることです。つまり、使用中のデバイスにはYubiKeyを差している必要があり、またgit commitを打つたびにPINを求められます(agentはさておき)。
これは利便性を捨てて安全性に振ってしまっていますね。
また、GPG鍵が入っていなくともデバイスの紛失時には、他の情報(SSH鍵やブラウザのcookie, sessionなど)が漏洩しうる、ということを考えると過度な対策は無意味と言えます(たぶん)。

一方主鍵を入れる運用はこのようになります:

  • 主鍵は(バックアップはとるかもしれないが)YubiKeyに入れてしまって肌身離さず持ち歩く
  • 各デバイスには副鍵を入れておく
    • git commitなど普段はこれを使う
  • 新デバイスを設定するときにはYubiKeyの主鍵を用いて副鍵を作成できる。(このとき主鍵が「外気に晒される」ことがない!)
  • (万が一)仮の環境(他人のPCやネカフェなど)を使うときはYubiKeyの主鍵の署名機能が使える
  • 暗号復号操作はYubiKeyに入れた副鍵(E)を使用する

利便性を保ちつつ十分にセキュアな運用になっていると思います。
YubiKeyの特性として、入れた秘密鍵が漏洩することは(ほぼ)ありえません。加えて所有とPINという2要素の認証があるため、安心して持ち歩くことができます。
万が一個別のデバイスを紛失しても、その副鍵のみ無効化すれば、被害が大きく拡がることは避けられ、また再設定の手間も少なく済みます。

この運用ではYubiKeyはGPG主鍵と同等の価値、すなわち ネット上での人格 として機能しています。
古代の金印の扱いに似ていると思いませんか? つまりこれを肌身離さず持ち歩くのはわりと合理的な運用なのです(強引)

SSH

じつは、SSH鍵も似た運用が似合います。
接続先ごとに鍵ペアを用意する運用もありますが、私のおすすめは各デバイスごとに鍵ペアを1つ(場合によってはRSAのものを加えることもあるが)用意し、authoried_keysを共有してしまう方法です。
この「デバイス」にYubiKeyを加えると、たとえば仮環境からSSHするときなどに安全に活用できます。普段はYubiKeyを使わないのがミソです。

おわりに

議論は大歓迎なので、別の方法の提案や、論破をお待ちしています!