Closed63

yubikeyを買ったので色々セットアップのメモ

κeenκeen

まずは二段階認証のセットアップ。

https://www.yubico.com/products/services-software/download/yubico-authenticator/#download_here

Google Authenticatorとかのワンタイムパスワードを生成するアプリ相当の機能を担当する。Ubuntuでもコマンドで入る。

sudo apt install yubioauth-desktop

アプリもある。

https://play.google.com/store/apps/details?id=com.yubico.yubioath

普通のauthenticatorと同じようなセットアップ。ただしスマホではなくyubikeyにセキュア情報が保存されるのでスマホを買い替えたりしても大丈夫だし、スマホでセットアップしてデスクトップで利用することも可能。

κeenκeen

正確な用語が分かってないけどFIDO U2Fも試した。
GitHubのAccount Securityの設定のところでsecurity keyと書かれているところ。

ポチポチしていくとセキュリティキーを刺すように言われるのでPCのUSBポートにyubikeyを挿してYのところに触るとコンフィグが完了する。以後ログインするときは二段階認証としてyubikeyをUSBに挿して触るだけでログインできるようになる。

κeenκeen

今後試したいやつ: SSH key, PGP key

PGP keyについてはパスワードを管理してるDBの暗号化に使ってるのでちょっと運用を考えないといけない。

運用課題: yubikeyを普段どこに置いてどう運用するか

  • デスクトップのUSBポートが微妙に遠いのでデスクトップからyubikeyを使うのがやや面倒
  • 普段デスクトップで運用するとして、外出時に忘れないようにしないと出先で詰む。
    • キーホルダーで家の鍵と一緒に運用…?
    • むしろyubikeyが家の鍵になってくれたら楽なんだけどねー。
κeenκeen

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オスなら大丈夫らしい。

具体的にはこれを机の上に起きたい。

https://www.yodobashi.com/product/100000001004019325/

外出時の運用については未定。しばらくは外出する用事がないので不要そうだが、今のところキーホルダーで家の鍵と一緒に運用するとよさそうと思ってる。

κeenκeen

色々試行錯誤して一旦ストップかけたので中途半端にメモ。

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
κeenκeen

足踏みしてる理由はgpgの鍵の管理が思ったより複雑だったから。yubikeyに何個までgpg鍵を登録できるんだろう。

master keyをyubikeyと紙にのみ保存して、sub keyを使おうとしている。keyにはそれぞれ署名、認証、暗号化の役割を割り当てられる。デフォルトでは署名、認証をmaster keyで、暗号化をsub keyでやるっぽい。それを署名、認証をするsub keyも作ろうとしている。都合3つのkeyが登場する訳だけど、どれをyubikeyに保存すればいいんだ。

κeenκeen

ついでにいうとGitHubやGitLabにアップロードするGPG鍵の有効期限の管理がよく分からない。keybaseは keybase pgp update でできる。

κeenκeen

そもそも認証用の鍵を何に使うのか分かってなかったけどsshとかで使えるっぽい?

κeenκeen

多分だけどprimary keyは署名だけあれば十分?であれば暗号化と認証はsubkeyを登録できそう?

κeenκeen

混乱してるもう1つの理由はyubikeyのセキュリティレベルをデスクトップPCより上に置くか下に置くかが自分の中で定まってない点。

yubikeyを信頼する理由:

  • yubikeyはインターネットからアクセスされない
  • yubikeyから鍵を取り出すことはできない(多分)

yubikeyが不安な理由:

  • yubikeyは持ち歩く
  • yubikeyをなくすと多分鍵が危殆化する

その他:

  • gitのコミットの署名とかにyubikeyを使ってるけどコミットの度にyubikeyの操作するの面倒じゃない?

半分くらいはyubikeyをなくしたときに何が起きるのか分かってない点、半分くらいはyubikeyに保存した鍵の運用がどうなるか分かっていない点が理由かな。両方を調べてハッキリさせれば解決できそう。

κeenκeen

運用に関しては実験してみればよさそう。まずは鍵を作ってみる。

$ 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の設定も必要。

.gitconfig
 [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を求められるの以外では変化ないのかな。

暗号化や認証も同じでしょうということで運用面は特に問題なさそう。

κeenκeen

実験用の鍵なので削除しておく。

$ 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 からも消しておく

κeenκeen

あー、待って、thunderbirdのPGPサポート、GPGエージェントを使って鍵を利用するオプションがない?秘密鍵を登録するしかできなそう。PGPサポートは最近入った機能だし仕方ないとして、しばらくはthunderbird用のsubkeyを生成して運用することになりそう.

κeenκeen

いや、自分がアホだった。Thunderbirdには組み込みのOpenPG鍵管理ツールがあるのと、それとは別にメールの署名や暗号化に使う鍵設定がある。それを勘違いしていた。

鍵設定の方ではGnuPG管理の鍵を使うオプションがある。

ここで設定した鍵はメールを送るときに署名に使える。

多分だけど自分の公開鍵で暗号化されたメールの復号にも使ってくれるのかな?

κeenκeen

「ネイティブには」使えないであってアプリをインストールすれば使えはする。

https://www.openkeychain.org

とはいえAndroidでPGPを使いたいケースがあまりないので意味ないかな。

κeenκeen

yubikeyを失くしたらどうなるかだけど、ドキュメントを読む限りキーは外部に取り出せないらしいので、脆弱性がみつかった場合を除いて失くしても鍵が漏洩することはなさそう。
ただ、PINをたまたま当てられて利用されるケースはあるだろうから失くしたあとも呑気にyubikeyに入っていた鍵を使うのはやめた方が良いと思われる。

yubikeyは「安全性を落とさずに可用性を上げるデバイス」と捉えるとよいのかな?

ぼくの考えたさいきょうのyubikey x OpenPGPの運用:

  1. 主鍵を無期限で作り、主鍵の失効証明書、暗号用、認証と署名用の期限つき副鍵を作る
  2. 副鍵をyubikeyに焼く
  3. 主鍵をexportしてUSBメモリなどに保存し、オフラインで大切に保管する。PCからは主鍵の秘密鍵を削除する。
  4. 普段は副鍵を使う。副鍵の有効期限がきたら主鍵を取り出し、有効期限を延長する。
    • こうすることで主鍵がちゃんと使える状態にあることを確認できる。

open problems:

  • 主鍵の失効証明書はどこに保存する?主鍵を保存したUSBメモリに一緒に保存してよい?それとも紙に書いて保存する?
    • 失効証明書は主鍵以上に出番がないので紙に書いても困らないはず。
  • 副鍵の失効証明書はどこに保存する?主鍵からいつでも生成できるから保存しなくてもよい?
κeenκeen

yubikeyに全然関係ない問題として、自分のPGP鍵は一回クラウドストレージに保存したことがある点がある。念のため主鍵を作りなおしたいけど、どういうフローになるんだろう。新しい鍵を生成したあと元の鍵で署名して、失効証明書を発行すればいいのかな。keybaseとかのドキュメントに書いてそう。

κeenκeen

主鍵の保管についてはもう1つ選択肢があって、2台目のyubikeyを買ってきてその中にPGP鍵を生成する手もある。

κeenκeen

整理がついたのでyubikeyにpgp鍵を保存できそう。問題はgithubで鍵を失効させる方法が分からないこと。gitlabには失効のUIがある。

κeenκeen

主鍵ごとyubikeyに移動するしかないっぽい。副鍵だけ移動しようとしたらエラーになった。

じゃあデフォルトで生成される鍵(認証、署名の主鍵、暗号化の副鍵それぞれ有効期限なし)をそのままyubikeyに移動させて、鍵と失効証明書だけバックアップとっとけばよさそう?

κeenκeen

メモ:gpg鍵の移行は今使ってる鍵の有効期限を3ヶ月とかにして新しい鍵と併用(GitHubに2つとも登録しておく)すればいいかな?

κeenκeen

仕事用に署名のsubkeyを作ろうかと思ったけどuidはprimary keyにしか紐付かないっぽい。pgpはこういうprimary keyの変更を想定して作られてるけどGitHubとGitLabがそうでないからちょいとつらい。

κeenκeen

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を作って移行を宣言したい。

κeenκeen

新しいマシンでyubikeyに保存したPGP鍵を使うにはscdaemonが起動した状態で公開鍵をインポートするとよさそう?多分先に公開鍵をインポートしてscdaemonを起動しても大丈夫だと思うけど実験してない。公開鍵をインポートするのは過去記事参照

https://zenn.dev/blackenedgold/articles/b2b832c1b6e044dd0d9f

κeenκeen

両者の違いは
challenge-response: 挿しっぱなしでOK
u2f: 認証時に金属部分に触れる必要がある
かな。これは自分が何をしたいかによって決めればよさそう。

κeenκeen

このスクラップはPGP鍵管理編とWebサービスの認証設定編で2つの記事にするつもりだったけどLinuxのログイン設定編も誕生しそう。

κeenκeen

これからやる:

  • yubikeyによるu2fログインをオプショナルで導入
  • yubikeyによるsudoのu2f認証をオプショナルで導入
  • yubikeyを抜いたときに画面を自動でロックする
κeenκeen
$ sudo apt install libpam-u2f
$ pamu2fcfg > ~/.config/Yubico/u2f_keys

pamu2fcfg はyubikeyを挿した状態でやる。ピコピコ光るので触るとkeyが吐き出される。マニュアルには mkdir -p ~/.config/Yubico のプロセスがあったけど既にディレクトリがあったのでやらなかった。恐らくYubico Authenticatorを使ってるのでそいつが初期化した。 -p がついてるのでディレクトリがある状態でコマンドを打っても何も起きないけどね。

κeenκeen

ここからは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を挿した状態で触る前にめちゃくちゃデバッグログが出てきた。デバッグの設定間違ってたかも。

κeenκeen

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

実際そうだった。

κeenκeen

ログインに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なしでパスワードログインできるか試す。

κeenκeen

両方ともできた。デバッグログはしばらくそのままにしておくか。

最後、画面のロックをudevでやるやつをやる。

κeenκeen

udevadm monitor --environment --udevID_VENDOR_IDID_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を抜いてみる。

κeenκeen

何も起きなかった。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での実行は非推奨だった。

κeenκeen

だめもとで 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.
κeenκeen

多分貼った記事の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
κeenκeen

そもそも systemctl start screen-lock が動いてなかった。色々試したけど全部ダメだった。

多分だけどプロセスツリーで gnome-session の下にあるプロセスで実行しないとダメ? ~/.config/autostart あたりにロック専用のデーモンを起動するコマンド立てといて、udevでそのデーモンにロック依頼を出すとかでどうかな。

κeenκeen

最近の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認証し失敗してパスワード認証にフォールバックしてる状態から始まってそうな雰囲気

κeenκeen

最近の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認証し失敗してパスワード認証にフォールバックしてる状態から始まってそうな雰囲気

κeenκeen

ロックしたときに画面の電源も切れるんだけど、そこから復帰するときにエンターキーを使ってたのが問題?先にyubikeyを挿入してからエンターを押すとu2fでログインできた。

多分諸々解決したはず。

κeenκeen

↑の設定をしてるとyubico-authenticatorを起動したときにyubikeyが一旦抜けた判定になるのかPCがロックされた。絞り込み条件が甘いのかもしれないのでもうちょっと挙動を調べる必要がある。

κeenκeen

yubikeyを抜いたときとyubico-authenticatorを起動したときに発生するイベントはほぼ一緒だった。恐らくyubico-authenticatorがはじめて起動するときに内部でyubikeyを挿し直すような挙動をしてるんだと思う。ただしこれは一回やるとその後はyubico-authenticatorを再起動してもしばらくはロックが発生しなかった。一定時間はウィンドウを閉じてもアプリが生きてるか何かかな

κeenκeen

多分これどうしようもないやつだし、たまにしか発生しないし、我慢して生きていくタイプの不便だな。

κeenκeen

メモ:git rebaseするときに元のコミットの署名に使った鍵が必要っぽい。

κeenκeen

yubikey login、gnome-keyringが開錠されてないな。どのタイミングで開錠されるのか調べて設定しとかないと。

κeenκeen

代わりにyubikey内のPGP鍵で暗号化しとくとyubikeyで開錠できるらしい。

あ、これはgnome-keyringのパスワードをyubikeyのPGP鍵で暗号化しておいて、yubikey挿したときに自動で復号、gnome-keyringの起動をするスクリプトを書けばできるんじゃないってことだった。

このスクラップは2021/03/28にクローズされました