yubikeyを買ったので色々セットアップのメモ
yubikeyで何ができるかは以下の2記事が詳しい。
WebAuthnの文脈でしか知らなかったが、色々できるっぽい。
まずは二段階認証のセットアップ。
Google Authenticatorとかのワンタイムパスワードを生成するアプリ相当の機能を担当する。Ubuntuでもコマンドで入る。
sudo apt install yubioauth-desktop
アプリもある。
普通のauthenticatorと同じようなセットアップ。ただしスマホではなくyubikeyにセキュア情報が保存されるのでスマホを買い替えたりしても大丈夫だし、スマホでセットアップしてデスクトップで利用することも可能。
正確な用語が分かってないけどFIDO U2Fも試した。
GitHubのAccount Securityの設定のところでsecurity keyと書かれているところ。
ポチポチしていくとセキュリティキーを刺すように言われるのでPCのUSBポートにyubikeyを挿してYのところに触るとコンフィグが完了する。以後ログインするときは二段階認証としてyubikeyをUSBに挿して触るだけでログインできるようになる。
今後試したいやつ: SSH key, PGP key
PGP keyについてはパスワードを管理してるDBの暗号化に使ってるのでちょっと運用を考えないといけない。
運用課題: yubikeyを普段どこに置いてどう運用するか
- デスクトップのUSBポートが微妙に遠いのでデスクトップからyubikeyを使うのがやや面倒
- 普段デスクトップで運用するとして、外出時に忘れないようにしないと出先で詰む。
- キーホルダーで家の鍵と一緒に運用…?
- むしろyubikeyが家の鍵になってくれたら楽なんだけどねー。
PGP keyについて
パスワードマネージャの暗号化にPGP keyを使うのは運用が微妙だしやめた方がよさそう(Androidでのキーの扱いが難しい)。普通に長めのmasterパスワードを設定して頑張って覚える。
それとは別に、今使ってるPGP keyはmaster keyとしてyubikeyの中に保管してしまって、普段はsubkeyを作ってそれを使った方がよさそう。
運用課題
デスクトップPCからUSB Type-Cのポートが1つ生えてるのでそこに延長ケーブルを挿せばよさそう。YubikeyのUSB Type-Aを買ったが、Type-Aメス-Type-Aオスの延長は規格違反らしいので使えない。Type-Aメス-Type-Cオスなら大丈夫らしい。
具体的にはこれを机の上に起きたい。
外出時の運用については未定。しばらくは外出する用事がないので不要そうだが、今のところキーホルダーで家の鍵と一緒に運用するとよさそうと思ってる。
色々試行錯誤して一旦ストップかけたので中途半端にメモ。
gpgのmaster keyをyubikeyに焼き込むのにscdaemonが必要になる。
$ sudo apt install scdaemon
admin pinは12345678だが、 gpg --change-pin
のchange Admin PINで変えられる。
$ gpg --change-pin
gpg: OpenPGPカードno. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxを検出
1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit
あなたの選択は? 3
1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit
あなたの選択は? q
admin pinを間違えまくってロックがかかったら yubikey-managerをインストールして ykman openpgp reset
で初期化できる(これが正しいのかは分からない)。なんかエンターが入力できないので yes
を経由しないといけない
$ sudo apt install yubikey-manager
$ yes | ykman openpgp reset
WARNING! This will delete all stored OpenPGP keys and data and restore factory settings? [y/N]: Resetting OpenPGP data, don't remove your YubiKey...
Success! All data has been cleared and default PINs are set.
PIN: 123456
Reset code: NOT SET
Admin PIN: 12345678
足踏みしてる理由はgpgの鍵の管理が思ったより複雑だったから。yubikeyに何個までgpg鍵を登録できるんだろう。
master keyをyubikeyと紙にのみ保存して、sub keyを使おうとしている。keyにはそれぞれ署名、認証、暗号化の役割を割り当てられる。デフォルトでは署名、認証をmaster keyで、暗号化をsub keyでやるっぽい。それを署名、認証をするsub keyも作ろうとしている。都合3つのkeyが登場する訳だけど、どれをyubikeyに保存すればいいんだ。
yubikeyのドキュメントがprimary keyっていったりsub keyっていったりしてて何を操作してるのかが分かりづらいのが混乱した原因。
ついでにいうとGitHubやGitLabにアップロードするGPG鍵の有効期限の管理がよく分からない。keybaseは keybase pgp update
でできる。
そもそも認証用の鍵を何に使うのか分かってなかったけどsshとかで使えるっぽい?
多分だけどprimary keyは署名だけあれば十分?であれば暗号化と認証はsubkeyを登録できそう?
混乱してるもう1つの理由はyubikeyのセキュリティレベルをデスクトップPCより上に置くか下に置くかが自分の中で定まってない点。
yubikeyを信頼する理由:
- yubikeyはインターネットからアクセスされない
- yubikeyから鍵を取り出すことはできない(多分)
yubikeyが不安な理由:
- yubikeyは持ち歩く
- yubikeyをなくすと多分鍵が危殆化する
その他:
- gitのコミットの署名とかにyubikeyを使ってるけどコミットの度にyubikeyの操作するの面倒じゃない?
半分くらいはyubikeyをなくしたときに何が起きるのか分かってない点、半分くらいはyubikeyに保存した鍵の運用がどうなるか分かっていない点が理由かな。両方を調べてハッキリさせれば解決できそう。
運用に関しては実験してみればよさそう。まずは鍵を作ってみる。
$ gpg --expert --full-gen-key
gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
ご希望の鍵の種類を選択してください:
(1) RSA と RSA (デフォルト)
(2) DSA と Elgamal
(3) DSA (署名のみ)
(4) RSA (署名のみ)
(7) DSA (機能をあなた自身で設定)
(8) RSA (機能をあなた自身で設定)
(9) ECC と ECC
(10) ECC (署名のみ)
(11) ECC (機能をあなた自身で設定)
(13) 既存の鍵
(14) カードに存在する鍵
あなたの選択は? 1
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (3072) 4096
要求された鍵長は4096ビット
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
副鍵の鍵長は? (3072) 4096
要求された鍵長は4096ビット
鍵の有効期限を指定してください。
0 = 鍵は無期限
<n> = 鍵は n 日間で期限切れ
<n>w = 鍵は n 週間で期限切れ
<n>m = 鍵は n か月間で期限切れ
<n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0) 0
鍵は無期限です
これで正しいですか? (y/N) y
GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。
本名: Peter George Phill
電子メール・アドレス: pgp@example.com
コメント:
次のユーザIDを選択しました:
"Peter George Phill <pgp@example.com>"
名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? o
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
gpg: 鍵29B9340D65C60646を究極的に信用するよう記録しました
gpg: 失効証明書を '/home/shun/.gnupg/openpgp-revocs.d/01FEF2424389F000BE9A7DA529B9340D65C60646.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。
pub rsa4096 2021-02-28 [SC]
01FEF2424389F000BE9A7DA529B9340D65C60646
uid Peter George Phill <pgp@example.com>
sub rsa4096 2021-02-28 [E]
認証、署名の主鍵と暗号化の副鍵が登録された。keyringからも確認できる。
仮の鍵なのでバックアップはexportせずにそのままyubikeyに登録してみる。主鍵を認証、署名に、副鍵を暗号化に登録す。
gpg --edit-key 01FEF2424389F000BE9A7DA529B9340D65C60646
gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
秘密鍵が利用できます。
sec rsa4096/29B9340D65C60646
作成: 2021-02-28 有効期限: 無期限 利用法: SC
信用: 究極 有効性: 究極
ssb rsa4096/A7F529BF0FCD8B54
作成: 2021-02-28 有効期限: 無期限 利用法: E
[ 究極 ] (1). Peter George Phill <pgp@example.com>
gpg> keytocard
この主鍵を本当に移動しますか? (y/N) y
鍵を保管する場所を選択してください:
(1) 署名鍵
(3) 認証鍵
あなたの選択は? 1
sec rsa4096/29B9340D65C60646
作成: 2021-02-28 有効期限: 無期限 利用法: SC
信用: 究極 有効性: 究極
ssb rsa4096/A7F529BF0FCD8B54
作成: 2021-02-28 有効期限: 無期限 利用法: E
[ 究極 ] (1). Peter George Phill <pgp@example.com>
gpg> keytocard
この主鍵を本当に移動しますか? (y/N) y
鍵を保管する場所を選択してください:
(1) 署名鍵
(3) 認証鍵
あなたの選択は? 3
sec rsa4096/29B9340D65C60646
作成: 2021-02-28 有効期限: 無期限 利用法: SC
信用: 究極 有効性: 究極
ssb rsa4096/A7F529BF0FCD8B54
作成: 2021-02-28 有効期限: 無期限 利用法: E
[ 究極 ] (1). Peter George Phill <pgp@example.com>
gpg> key 1
sec rsa4096/29B9340D65C60646
作成: 2021-02-28 有効期限: 無期限 利用法: SC
信用: 究極 有効性: 究極
ssb* rsa4096/A7F529BF0FCD8B54
作成: 2021-02-28 有効期限: 無期限 利用法: E
[ 究極 ] (1). Peter George Phill <pgp@example.com>
gpg> keytocard
鍵を保管する場所を選択してください:
(2) 暗号化鍵
あなたの選択は? 2
sec rsa4096/29B9340D65C60646
作成: 2021-02-28 有効期限: 無期限 利用法: SC
信用: 究極 有効性: 究極
ssb* rsa4096/A7F529BF0FCD8B54
作成: 2021-02-28 有効期限: 無期限 利用法: E
[ 究極 ] (1). Peter George Phill <pgp@example.com>
gpg> quit
変更を保存しますか? (y/N) y
gpg --card-status
などで実際に保存できていることを確認できる。
yubikeyを抜いて署名しようとするとカード挿せって言われるから多分鍵は完全にyubikeyに移行して、ローカルマシンには残ってない。多分。このガイドにもそう書いてある。
$ echo test > test.txt
$ gpg -u 'Peter George Phill <pgp@example.com>' --sign test.txt
そもそもこの秘密情報ってどこに保存されてるんでしょうね。 ~/.gnupg/private-keys-v1.d
に編集日が今日のファイルがあって、上記ガイドによるとスタブだけがPCに残るとあるので多分それかな?
普段使う署名はgitのコミットとメール(thunderbird)なのでgitで試せばいいかな。まずはGPG鍵の指紋を調べる。
$ gpg --fingerprint 'Peter George Phill <pgp@example.com>'
pub rsa4096 2021-02-28 [SC]
01FE F242 4389 F000 BE9A 7DA5 29B9 340D 65C6 0646
uid [ 究極 ] Peter George Phill <pgp@example.com>
sub rsa4096 2021-02-28 [E]
~/.gitconfig
にsigningkeyを追加する。まだの場合は多分seahorseの設定も必要。
[user]
#...
+ signingkey = 01FEF2424389F000BE9A7DA529B9340D65C60646
[credential]
helper = seahorse
gitの認証がどうなるか、PINは毎回入れなきゃいけないのかを調べる。まずはgitプロジェクトを用意。
$ mkdir git-gpg
$ cd git-gpg
$ git init .
コミットしてみる。
$ echo hoge > README
$ git add README
$ git commit -m'test'
yubikeyの挿入とPINの入力が求められた。
2回目がどうなるか調べる。
$ echo fuga > README
$ git add README
$ git commit -m'test'
今度はPINを求められなかった(yubikeyは挿しっぱなし)。ログには署名が入ってるので大丈夫そう。
$ git log --show-signature
commit 9b358baafbc20a3c179863ce5ad55a673879d76c (HEAD -> master)
gpg: 2021年02月28日 09時46分08秒 JSTに施された署名
gpg: RSA鍵01FEF2424389F000BE9A7DA529B9340D65C60646を使用
gpg: "Peter George Phill <pgp@example.com>"からの正しい署名 [究極]
Author: κeen <3han5chou7@gmail.com>
Date: Sun Feb 28 09:46:08 2021 +0900
test
commit 52c2ce1dd93c861ba18c6b47cb11835f66a64ec2
gpg: 2021年02月28日 09時43分27秒 JSTに施された署名
gpg: RSA鍵01FEF2424389F000BE9A7DA529B9340D65C60646を使用
gpg: "Peter George Phill <pgp@example.com>"からの正しい署名 [究極]
Author: κeen <3han5chou7@gmail.com>
Date: Sun Feb 28 09:43:27 2021 +0900
test
多分だけどアプリケーションが直接GPG鍵を触ることはなくて、fingerprintを指定してGPGに署名などなどを依頼する形になるから普段の運用ではyubikeyをUSBに挿しとくのと初回にPINを求められるの以外では変化ないのかな。
暗号化や認証も同じでしょうということで運用面は特に問題なさそう。
実験用の鍵なので削除しておく。
$ gpg --delete-secret-keys 01FEF2424389F000BE9A7DA529B9340D65C60646
gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
sec rsa4096/29B9340D65C60646 2021-02-28 Peter George Phill <pgp@example.com>
この鍵を鍵リングから削除しますか? (y/N) y
これは秘密鍵です! 本当に削除しますか? (y/N) y
$ gpg --delete-keys 01FEF2424389F000BE9A7DA529B9340D65C60646
gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
pub rsa4096/29B9340D65C60646 2021-02-28 Peter George Phill <pgp@example.com>
この鍵を鍵リングから削除しますか? (y/N) y
.gitconfig
からも消しておく
あー、待って、thunderbirdのPGPサポート、GPGエージェントを使って鍵を利用するオプションがない?秘密鍵を登録するしかできなそう。PGPサポートは最近入った機能だし仕方ないとして、しばらくはthunderbird用のsubkeyを生成して運用することになりそう.
いや、自分がアホだった。Thunderbirdには組み込みのOpenPG鍵管理ツールがあるのと、それとは別にメールの署名や暗号化に使う鍵設定がある。それを勘違いしていた。
鍵設定の方ではGnuPG管理の鍵を使うオプションがある。
ここで設定した鍵はメールを送るときに署名に使える。
多分だけど自分の公開鍵で暗号化されたメールの復号にも使ってくれるのかな?
OpenPGP向けの機能強化が昨秋入ったっぽい。
AndroidではOpenPGPの機能は使えないらしい。まあ、これはやむなし。
「ネイティブには」使えないであってアプリをインストールすれば使えはする。
とはいえAndroidでPGPを使いたいケースがあまりないので意味ないかな。
keepass2のプラグインでyubikeyをchalleng-responseに使うやつがあるらしい。
しかしAndroidで使えない(KeePassDroidがサポートしてない)気がするからやめておこう。
yubikeyを失くしたらどうなるかだけど、ドキュメントを読む限りキーは外部に取り出せないらしいので、脆弱性がみつかった場合を除いて失くしても鍵が漏洩することはなさそう。
ただ、PINをたまたま当てられて利用されるケースはあるだろうから失くしたあとも呑気にyubikeyに入っていた鍵を使うのはやめた方が良いと思われる。
yubikeyは「安全性を落とさずに可用性を上げるデバイス」と捉えるとよいのかな?
ぼくの考えたさいきょうのyubikey x OpenPGPの運用:
- 主鍵を無期限で作り、主鍵の失効証明書、暗号用、認証と署名用の期限つき副鍵を作る
- 副鍵をyubikeyに焼く
- 主鍵をexportしてUSBメモリなどに保存し、オフラインで大切に保管する。PCからは主鍵の秘密鍵を削除する。
- 普段は副鍵を使う。副鍵の有効期限がきたら主鍵を取り出し、有効期限を延長する。
- こうすることで主鍵がちゃんと使える状態にあることを確認できる。
open problems:
- 主鍵の失効証明書はどこに保存する?主鍵を保存したUSBメモリに一緒に保存してよい?それとも紙に書いて保存する?
- 失効証明書は主鍵以上に出番がないので紙に書いても困らないはず。
- 副鍵の失効証明書はどこに保存する?主鍵からいつでも生成できるから保存しなくてもよい?
yubikeyに全然関係ない問題として、自分のPGP鍵は一回クラウドストレージに保存したことがある点がある。念のため主鍵を作りなおしたいけど、どういうフローになるんだろう。新しい鍵を生成したあと元の鍵で署名して、失効証明書を発行すればいいのかな。keybaseとかのドキュメントに書いてそう。
主鍵の保管についてはもう1つ選択肢があって、2台目のyubikeyを買ってきてその中にPGP鍵を生成する手もある。
整理がついたのでyubikeyにpgp鍵を保存できそう。問題はgithubで鍵を失効させる方法が分からないこと。gitlabには失効のUIがある。
主鍵ごとyubikeyに移動するしかないっぽい。副鍵だけ移動しようとしたらエラーになった。
じゃあデフォルトで生成される鍵(認証、署名の主鍵、暗号化の副鍵それぞれ有効期限なし)をそのままyubikeyに移動させて、鍵と失効証明書だけバックアップとっとけばよさそう?
指紋認証のついたyubikeyが開発中らしい
Getting a biometric security key right - Yubico
メモ:gpg鍵の移行は今使ってる鍵の有効期限を3ヶ月とかにして新しい鍵と併用(GitHubに2つとも登録しておく)すればいいかな?
transition statementというのを発行することがあるらしい。
仕事用に署名のsubkeyを作ろうかと思ったけどuidはprimary keyにしか紐付かないっぽい。pgpはこういうprimary keyの変更を想定して作られてるけどGitHubとGitLabがそうでないからちょいとつらい。
読んどかないといけないかなー。
SP 800-57 Part 1 Rev. 5, Recommendation for Key Management: Part 1 – General | CSRC
yubikeyというよりpgpのスレになってきた。保管方法とか決めて新しい鍵を生成した。安全な場所にコピーを保管したあとyubikeyに焼き込んだ。これから鍵の移行作業に入る。
公開鍵をエクスポートしておく。
$ gpg --armor -o gpg_key.pub --export 2F3944FD72D3F1BD590C7309F88CE432DCC5FCBC
keybaseは複数の鍵を登録できる。
$ keybase pgp select --multi
新しい鍵を選択する
$ keybase pgp update --all
複数の鍵を全てアップロードする
GitHubとGitLabにも公開鍵を登録しておく。
gitの署名に使う鍵を変更しておく。
[user]
#...
- signingkey = 0DB75EDC93CA52CB
+ signingkey = 2F3944FD72D3F1BD590C7309F88CE432DCC5FCBC
thunderbirdの署名も更新する。仕事でのメールにもPGP署名をしたかったけど仕事が変わったときに更新が面倒なのでやらないことにする。
古い鍵はしばらく残しておく。今の鍵の運用でしばらく試してみて困らなそうなら古い鍵の有効期限を3ヶ月とかにして、transition statementを作って移行を宣言したい。
新しいマシンでyubikeyに保存したPGP鍵を使うにはscdaemonが起動した状態で公開鍵をインポートするとよさそう?多分先に公開鍵をインポートしてscdaemonを起動しても大丈夫だと思うけど実験してない。公開鍵をインポートするのは過去記事参照
Linuxログインにyubikeyを使うのを試してみようと思ったけどyubikey失くすとログインできなくなるっぽいので怖い。
pamの設定を調べる限りsufficientならyubikeyなくてもパスワードでログインするようにできそう。
そしてchallenge-response以外にもu2fでログインする方法もあるっぽい。
どっち使うのが正解なんだろう
両者の違いは
challenge-response: 挿しっぱなしでOK
u2f: 認証時に金属部分に触れる必要がある
かな。これは自分が何をしたいかによって決めればよさそう。
離席するときに強制ロックが掛かる仕組み面白い。
他にも離席するときにロックがかかる仕組みをやってる人がいた。udevでやるのは変わらないけどこっちはsystemdのサービスにしてる(なんでだろう)
このスクラップはPGP鍵管理編とWebサービスの認証設定編で2つの記事にするつもりだったけどLinuxのログイン設定編も誕生しそう。
因みに素のUbuntuで画面をロックするのは xdg-screensaver lock
を使うらしい。
これからやる:
- yubikeyによるu2fログインをオプショナルで導入
- yubikeyによるsudoのu2f認証をオプショナルで導入
- yubikeyを抜いたときに画面を自動でロックする
$ sudo apt install libpam-u2f
$ pamu2fcfg > ~/.config/Yubico/u2f_keys
pamu2fcfg
はyubikeyを挿した状態でやる。ピコピコ光るので触るとkeyが吐き出される。マニュアルには mkdir -p ~/.config/Yubico
のプロセスがあったけど既にディレクトリがあったのでやらなかった。恐らくYubico Authenticatorを使ってるのでそいつが初期化した。 -p
がついてるのでディレクトリがある状態でコマンドを打っても何も起きないけどね。
ここからはchallenge-responseの方の記事の方が筋が良さそうなのでそっちをベースに作業する。
まずはu2f認証用のファイルを作っておく。一旦デバッグonで。
$ sudo touch /var/log/pam_u2f.log
$ sudo vi /etc/pam.d/u2f-sufficient
$ cat /etc/pam.d/u2f-sufficient
auth sufficient pam_u2f.so debug debug_file=/var/log/pam_u2f.log
ログインは失敗してたときに取り返しがつかないのでまずsudoで試す。みた感じ、 @include common-auth
してるところがパスワード認証(など)を担当してるようなのでその直前に @include u2f-sufficient
を差し込めばいいかな。
$ sudo vi /etc/pam.d/sudo
$ tail -n 5 /etc/pam.d/sudo
session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
@include u2f-sufficient
@include common-auth
@include common-account
@include common-session-noninteractive
- 別ターミナルを開いて
sudo echo test
を試した結果、yubikeyに触って認証が通ることを確認 - さらに別のターミナルを開いてyubikeyを抜いた状態で
sudo echo test
を試した結果パスワード認証で通ることを確認
ただしyubikeyを挿した状態で触る前にめちゃくちゃデバッグログが出てきた。デバッグの設定間違ってたかも。
debug
を消せばコンソールには何も出てこないんじゃないかと予想。
$ sudo vi /etc/pam.d/u2f-sufficient
$ cat /etc/pam.d/u2f-sufficient
auth sufficient pam_u2f.so debug_file=/var/log/pam_u2f.log
実際そうだった。
ログインにyubikeyを使うのも設定してみる。デフォルトのUbuntuを使ってるので gdm-password
の設定を見ればいいっぽい。
$ sudo vi /etc/pam.d/gdm-password
$ head -n6 /etc/pam.d/gdm-password
#%PAM-1.0
auth requisite pam_nologin.so
auth required pam_succeed_if.so user != root quiet_success
@include u2f-sufficient
@include common-auth
auth optional pam_gnome_keyring.so
GDM以外のログインマネージャには効かない(はず)。一旦これで xdg-screensaver lock
してロックしたあとyubikeyでログインできるか試す。そのあともういっかいロックして今度はyubikeyなしでパスワードログインできるか試す。
両方ともできた。デバッグログはしばらくそのままにしておくか。
最後、画面のロックをudevでやるやつをやる。
udevadm monitor --environment --udev
で ID_VENDOR_ID
と ID_MODEL_ID
の値を調べたらそれぞれ 1050と0407だったので以下のように設定した。
$ sudo vi /etc/udev/rules.d/40-u2fkey.rules
$ cat /etc/udev/rules.d/40-u2fkey.rules
ACTION=="remove", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0407", RUN+="/usr/bin/xdg-screensaver lock"
ルールをロードする
$ udevadm control --reload-rules
この状態でyubikeyを抜いてみる。
何も起きなかった。syslog見る限り /usr/bin/xdg-screensaver lock
の実行でコケてるよう。
Mar 16 02:47:36 mini /usr/libexec/gdm-x-session[3807]: (II) config/udev: removing device Yubico YubiKey OTP+FIDO+CCID
Mar 16 02:47:36 mini systemd-udevd[240198]: input29: Process '/usr/bin/xdg-screensaver lock' failed with exit code 4.
xdg-screensaverのマニュアル見たらデスクトップセッション中に実行を推奨してて、rootでの実行は非推奨だった。
だめもとで gnome-screensaver-commandを試してみる。インストール
$ sudo apt install gnome-screensaver
udevの設定書き換え
$ sudo vi /etc/udev/rules.d/40-u2fkey.rules
$ cat /etc/udev/rules.d/40-u2fkey.rules
ACTION=="remove", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0407", RUN+="/usr/bin/gnome-screensaver-command -l"
$ sudo udevadm control --reload-rules
yubikey抜いても何も起きず、またしてもエラー。
Mar 16 02:59:13 mini /usr/libexec/gdm-x-session[3807]: (II) config/udev: removing device Yubico YubiKey OTP+FIDO+CCID
Mar 16 02:59:13 mini systemd-udevd[241688]: input30: Process '/usr/bin/gnome-screensaver-command -l' failed with exit code 1.
多分貼った記事のsystemd化をすると出来る気がするので試す。systemdで自分のユーザとしてコマンドが実行されるように設定する。
$ sudo vi /etc/systemd/system/screen-lock.service
$ cat /etc/systemd/system/screen-lock.service
[Unit]
Description=screen lock
[Service]
User=shun
Type=simple
Environment=DISPLAY=:0
ExecStart=/usr/bin/xdg-screensaver lock
[Install]
WantedBy=multi-user.target
$ sudo systemctl daemon-reload
udevルールも書き換える。
$ sudo vi /etc/udev/rules.d/40-u2fkey.rules
$ cat /etc/udev/rules.d/40-u2fkey.rules
ACTION=="remove", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0407", RUN+="/usr/bin/systemctl start screen-lock.service"
$ sudo udevadm control --reload-rules
そもそも systemctl start screen-lock
が動いてなかった。色々試したけど全部ダメだった。
多分だけどプロセスツリーで gnome-session
の下にあるプロセスで実行しないとダメ? ~/.config/autostart
あたりにロック専用のデーモンを起動するコマンド立てといて、udevでそのデーモンにロック依頼を出すとかでどうかな。
最近のUbuntuだと loginctl
というのがあるらしく、それで全セッションをロックできた。以下の設定で動く。
$ cat /etc/udev/rules.d/40-u2fkey.rules
ACTION=="remove", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0407", RUN+="/usr/bin/loginctl lock-sessions"
ただ、ログアウト後の挙動が微妙な気はする。U2F認証し失敗してパスワード認証にフォールバックしてる状態から始まってそうな雰囲気
最近のUbuntuだと loginctl
というのがあるらしく、それで全セッションをロックできた。以下の設定で動く。
$ cat /etc/udev/rules.d/40-u2fkey.rules
ACTION=="remove", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0407", RUN+="/usr/bin/loginctl lock-sessions"
ただ、ログアウト後の挙動が微妙な気はする。U2F認証し失敗してパスワード認証にフォールバックしてる状態から始まってそうな雰囲気
ロックしたときに画面の電源も切れるんだけど、そこから復帰するときにエンターキーを使ってたのが問題?先にyubikeyを挿入してからエンターを押すとu2fでログインできた。
多分諸々解決したはず。
↑の設定をしてるとyubico-authenticatorを起動したときにyubikeyが一旦抜けた判定になるのかPCがロックされた。絞り込み条件が甘いのかもしれないのでもうちょっと挙動を調べる必要がある。
yubikeyを抜いたときとyubico-authenticatorを起動したときに発生するイベントはほぼ一緒だった。恐らくyubico-authenticatorがはじめて起動するときに内部でyubikeyを挿し直すような挙動をしてるんだと思う。ただしこれは一回やるとその後はyubico-authenticatorを再起動してもしばらくはロックが発生しなかった。一定時間はウィンドウを閉じてもアプリが生きてるか何かかな
多分これどうしようもないやつだし、たまにしか発生しないし、我慢して生きていくタイプの不便だな。
メモ:git rebaseするときに元のコミットの署名に使った鍵が必要っぽい。
yubikey login、gnome-keyringが開錠されてないな。どのタイミングで開錠されるのか調べて設定しとかないと。
まさにな問答があった。
パスワードで暗号化しているならパスワードで開錠しないといけないのでyubikeyログインで開錠はできないらしい。代わりにyubikey内のPGP鍵で暗号化しとくとyubikeyで開錠できるらしい。そっちも調べてみる。
代わりにyubikey内のPGP鍵で暗号化しとくとyubikeyで開錠できるらしい。
あ、これはgnome-keyringのパスワードをyubikeyのPGP鍵で暗号化しておいて、yubikey挿したときに自動で復号、gnome-keyringの起動をするスクリプトを書けばできるんじゃないってことだった。
ブログにした
参考情報:最近GitHubがスマートカードのSSH鍵に対応したのでそれも試した。簡単だった。