背景
マシンにログインするのに毎回パスワードを打つのが面倒。
簡単なパスワードにするのも嫌。
手持ちの Yubikey を使ってログインできたら便利そうだと思い調べてみたところ、案外簡単そうだったので設定してみた。
(2023/09/06 追記) security.pam.u2f.cue = true
とすることで sudo 時にプロンプトが出ることがわかったので追加した。毎回何も表示されない画面を見て数秒佇んでいたので助かった。
構成
- NixOS マシン
- Yubikey 5 NFC
- 参考:NixOS Wiki
OTP を使う方法と FIDO U2F を使う方法があるらしい。
OTP の方法は Yubikey 向けのパッケージを使うもので、 FIDO U2F の方法は FIDO U2F に対応する認証方法の一つとして Yubikey を使う形。
より一般的な方がいい気がするので U2F の方で設定を行う。
手順
Wiki に書いてあるとおりに進める。
1. マッピングファイルの生成
Yubikey を挿入して以下コマンドを実行する。
nix-shell -p pam_u2f
mkdir -p ~/.config/Yubico
pamu2fcfg > ~/.config/Yubico/u2f_keys
3つ目のコマンドを実行すると PIN を聞かれるので入力する。
筆者の場合はすでに設定済みだったが、もしかすると Yubikey Manager を使って設定しないといけないかもしれない。
PIN を入力したあと、Yubikey のボタンをタッチするのを忘れないように。
2. システム設定の編集
vim /etc/nixos/configuration.nix
以下をどこかに追記。
security.pam.services = {
login.u2fAuth = true;
sudo.u2fAuth = true;
};
security.pam.u2f.cue = true;
sudo nixos-rebuild switch
3. 動作確認
nix-shell -p pamtester
pamtester login <username> authenticate
pamtester sudo <username> authenticate
Yubikey をタッチして pamtester: successfully authenticated
と表示されれば成功。
一応これで動作確認できているが、 Super+L でロックしたあとのログインや、 sudo が成功することも確認した。
4. (追記) Yubikey を抜いた時に自動でログアウトする
(2023/08/17 追記)
このままでは、 Yubikey を差しっぱのままログアウトする懸念がある。
注意する、だけではうまくいくとは思えないので、仕組みでどうにかしたい。
そこで、 Yubikey を抜くことをトリガーとしてログアウト(画面ロック)することにした。
画面ロックの習慣はあるので、キーボードショートカットの代わりに Yubikey を抜く習慣をつければうまくいくはず。
YubiKeyをLinuxの「鍵」にする のページを参考にさせていただき、 udev を使って実現できそうなことがわかった。
udev を使って USB デバイスの抜き差しイベントをフックし、デバイスが対象の Yubikey かつイベントが抜きだった場合に画面ロックをするような設定をする。
- 1, Yubikey の ID を調べる
-
udevadm monitor --environment --udev | grep -E 'ID_VENDOR_ID|ID_MODEL_ID
の結果で出てきた ID を控える - 筆者 (Yubikey 5 NFC) の場合は
ID_VENDOR_ID=1050
,ID_MODEL_ID=0407
だった
-
- 2,
configuration.nix
に udev のルールを追加する
services.udev.extraRules = ''
ACTION=="remove", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0407", RUN+="${pkgs.systemd}/bin/loginctl lock-sessions"
'';
- 31,
nixos-rebuild switch
- 4, 動作確認
- Yubikey を抜くと画面がロックされることを確認する
まとめ
詰まることもなくとても簡単にできて驚いた。
ただ、 PIN なしでログインできるのは不安なので今後どうにかしたい。
Mac で設定した際には U2F ではなく PIV? という機能を使ったが、 Smart Card mode というのがそれに当たるのかもしれない。
Wiki に詳しい情報がないので一旦このまま使い、なにかわかったら別の記事を作ろうと思う。
(2023/08/17 追記)
NixOS 以外の Linux 情報を探しても、 PIN によるログインは見当たらなかった。
ログアウトのために Yubikey を抜くような設定を追加したので、習慣がつくように頑張る。
-
コードブロックを挟むと順序付き箇条書きが 1. からにリセットされるのはどうにかできないものか……。 ↩