YubiKeyのOpenPGP SmartCard
はじめに
YubiKeyはOpenPGP SmartCardという規格に対応しているため、YubiKey上にPGP鍵を保管することが出来る。この鍵スロットはWrite Onlyであり、一度書き込むと二度と秘密鍵を読み出すことは出来ない。YubiKey上でPGP鍵を生成することもでき、PC上に保存するのに比べてよりセキュアに扱うことが出来る。署名や暗号化もYubiKey上で行われる。NFCからも使用可能。 参考
ほとんどこれを参考にしているのでこれを読むのが一番早い。
PINについて
PINには三種類あり、それぞれ利用用途が異なる。特にPINは高頻度で入力することになるため、打ちやすさとセキュリティを両立するようにしよう。
PIN
: 普段の暗号化・署名・認証時に使用される。設定した回数以上失敗するとロックされ、Admin PINかReset Codeでのアンロックが必要。初期PINは123456。
Admin PIN
: YubiKey自体に関わる設定や鍵の転送などに必要。設定した試行回数以上失敗するとロックされ、ファクトリーリセットが必要(データが全て吹き飛ぶ)。初期Admin PINは12345678。
Reset Code
: PINのアンロックのみに使用可能。初期状態では未設定。
セットアップ
コマンドラインから行う。GnuPGとykmanが必要。
code:sh
# YubiKeyの編集をする
gpg --edit-card
code:gpg
# 使えるコマンドを見る
# 初めは使えるコマンドはほとんどないはず
gpg/card> help
# adminモードに入る
# adminモードに入ると管理系のコマンドが使えるようになる
gpg/card> admin
# もう一度使えるコマンドを見る
# adminモードに入ったので使えるコマンドが増えてるはず
gpg/card> help
KDF有効化
Key Derived Function (KDF)を有効にすると、YubiKeyへのPINの保存形式が平文からハッシュになる。平文が保存されないので万が一YubiKey内のデータが漏れた場合に安全。
参考:
NOTE: PINをデフォルトから変更した後にここを有効にすると正しいPINを打っても失敗してしまい、リセットする羽目になったのでPINを変更する前にやっておいたほうがいいかも。公式の文章で明言されていないけど、似たような事例は見つけたのでおま環では無いと思う。 code:gpg
gpg/card> kdf-setup
PIN変更
PINとAdmin PINを変更する。PINの変更は1、Admin PINの変更は3で出来る。なお、どちらも既存のPIN入力→新しいPIN入力→再入力の順番になる。変更に失敗した場合はきちんとその旨が表示されるのでよく確認すること。
Recet Codeはファクトリーリセット時に必要になるコード。忘れると二度とリセットできなくなるので注意。
code:gpg
gpg/card> passwd
gpg: OpenPGP card no. <CARD NO> detected
1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit
Your selection?
名前/呼び方/言語/アカウント名(メールアドレス)設定
YubiKeyに各種情報を設定する。別に設定しなくても支障はない。
code:gpg
# 名前の設定(姓、名の順)
gpg/card> name
# 呼び方(性別)の設定(Mr., Ms., 無しにすることも可能)
gpg/card> salutation
# 言語の設定(英語の場合はen、日本語の場合はja)
gpg/card> lang
# アカウント名(メールアドレス)の設定
gpg/card> login
# 確認
gpg/card> list
公開鍵URL設定
YubiKeyにYubiKeyに入れてある鍵ペアの公開鍵が置いてある場所を指定しておくと、新たなPCにて、YubiKey指してgpg --edit-cardからのfetchで一式セットアップが完了するので設定しておくことをおすすめする。
code:gpg
gpg/card> url
鍵転送
いよいよ鍵をYubiKeyに転送する。一度カード編集用のプロンプトは終了させる(quitで可能)。
なお、鍵を転送するとPC上からは自動的に削除され、YubiKeyからは二度と取り出せなくなるので注意。困る場合は事前にバックアップを取っておく。
鍵編集プロンプトではkey <番号>で鍵を選択することが出来る。選択した鍵はssb*となるので、その状態でkeytocardすると鍵がYubiKeyに転送される。
code:sh
gpg --edit-key <鍵ID>
code:gpg
sec ed25519/<KEYID>
created: <ISSUEDATE> expires: never usage: C
trust: ultimate validity: ultimate
ssb ed25519/<KEYID>
created: <ISSUDATE> expires: <EXPIRESDATE> usage: S
ssb ed25519/<KEYID>
created: <ISSUDATE> expires: <EXPIRESDATE> usage: E
ssb ed25519/<KEYID>
created: <ISSUDATE> expires: <EXPIRESDATE> usage: A
# 鍵を選択(この場合はusage: Sの鍵が選択される)
gpg> key 1
# 鍵を転送
gpg> keytocard
# YubiKeyの中のどのスロットに転送するか聞かれるので鍵の用途に合わせて選択する
# 転送時には主鍵のパスフレーズとYubiKeyのAdmin PINが聞かれる
# 先に選択していた1番の選択を解除する
gpg> key 1
# 新しく鍵を選択する
gpg> key 2
# 後は同様に鍵転送を繰り返す
終わったらsaveして抜ける。ちなみにsaveせず抜けると本来PCから削除されるはずの鍵が残ったままになる。複数のYubiKeyに転送する場合はその方がよい。
gpg -Kで秘密鍵一覧を見てみると、ssb>になっていることがわかる。これは鍵のポインタのみが残っており、鍵自体は別の場所(YubiKey)にあることを意味している。
PINの試行回数設定
ykmanを使ってPINの試行回数を設定する。ここで設定した回数、PIN入力に失敗すると、ロックがかかるので注意。
数字は左から、PINの試行回数、Reset Codeの試行回数、Admin PINの試行回数となる。設定する際にAdmin PINが必要。またデフォルトは3 0 3となっている。
code:sh
ykman openpgp access set-retries 5 10 10
タッチ機能設定
署名・暗号化・認証など、YubiKey内の鍵を使用する際にYubiKeyについている金属のボタン部分を触れないと使用できないように変更することが出来る。本来PINを入力すれば鍵は使用可能だが、YubiKeyを挿しっぱなしにしている場合、PINがキャッシュされるため、タッチ機能を使うことでより安全に使用が可能。
タッチ機能の有効・無効の設定はYubiKey内の鍵スロットごとに設定が可能。
sig
: 署名
enc
: 暗号化
aut
: 認証
また、タッチ機能の設定オプションも複数ある。
Off
: タッチ機能を無効にする。
On
: タッチ機能を有効にする。
Cached
: タッチ機能を有効にする。タッチは15秒間キャッシュされる。
Fixed
: タッチ機能を有効にする。この設定にすると、ファクトリーリセットするまで変更できなくなる。
Cached-Fixed
: タッチ機能を有効にする。タッチは15秒間キャッシュされる。この設定にすると、ファクトリーリセットするまで変更できなくなる。
code:sh
ykman openpgp keys set-touch <sig|enc|aut> Cached
ファクトリーリセット
YubiKeyのOpenPGP関連の設定を全てリセットし、工場出荷状態に戻す。GnuPG側にもファクトリーリセットの機能があるが、ykmanを使って行ったほうが確実。何かしらの理由でykmanが使用できない場合は、必ず指定の手順に従ってリセットすること。なお、このファクトリーリセットはYubiKeyの中のOpenPGP関連の設定のみであり、他のPIVやFIDO U2F/FIDO2などの機能には一切影響を与えない。 code:sh
ykman openpgp reset