というわけでYubiKey 5 nanoをUbuntu 2022.04 LTS で使うことにする。
基本的な前提としては、PC本体は安全な環境にあり物理セキュリティは担保されている、という設定だ。
基本的な設定
ひとまず、諸々の認証で使われるモジュール(PAM/Linux Pluggable Authentication Modules)に、YubiKeyのFIDO U2Fを設定する。
まあ、公式ドキュメントに全部書いてあるんだけど…。
最初にFIDO U2F用のモジュール libpam-u2f
をインストールする。
sudo apt install libpam-u2f
で、次に設定ファイルをつくる。
mkdir -p ~/.config/Yubico pamu2fcfg > ~/.config/Yubico/u2f_keys # PINの入力とタッチが求められる
PIN入力後、YubiKeyがピカピカするので慌てずタッチする。 これにより、鍵っぽいやつが吐かれる(リダイレクトされているので表示されない)。
つぎにPAMの設定をする。
直接ファイルを編集してもいいのだけど、κeenさんに倣ってファイルを分けることにする。
まず/etc/pam.d/u2f-sufficient
というファイルをつくる。
sudo vi /etc/pam.d/u2f-sufficient
そして下記のような内容を書く。
auth sufficient pam_u2f.so debug_file=/var/log/pam_u2f.log
sufficient
(十分条件)は、いずれかの認証が通ったら認可するという設定。
2要素認証にする場合はrequired
(必要条件)と書くが今回は採用しない。
PAMの設定に関しては、下記の記事などを読むと良い。man pam.conf
でもいいけど。
debug_file
はYubiKey認証に関するログを吐く設定。忘れずファイルも作っておこう。
sudo touch /var/log/pam_u2f.log
sudo の設定
で、sudo
実行時のパスワード入力の代わりに、YubiKeyを使う設定を行う。
/etc/pam.d/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
コマンドを実行してみる。
sudo ls
これで、YubiKeyが点滅するのでタッチすればOK。とくにプロンプトは出ないので注意。
ちなみに設定が間違っているとこんな感じのエラーが出る。
sudo ls sudo: PAM を初期化できません: 致命的エラー - 直ちに中止してください
別ターミナルで操作していてもsudoセッションが破棄されていたようで回復できなかった。もう単にsudo
使えなくなって詰み…という感じだったので、次のように対応した。
- 再起動する
- ブートメニューから、リカバリモードを選んで、
root Drop to root shell prompt
メニューを選ぶ - シングルユーザモードになったので、然るべきファイルを編集する
- 再起動する
要はシングルユーザモードであり何の認証もなされていないのだが、前提として物理セキュリティは守られている設定なのでひとまずよし。
ひとまずこれでsudo
のパスワードレス化(物理トークン認証)ができた。
sufficient
なので、YubiKeyが刺さっていなかったり、リモート接続のときなどは従前同様のパスワード入力が求められる。
ので、本件はセキュリティの強化ではなく、セキュリティレベルを落とさずに利便性を向上させる、という目的になっている(単にroot
のパスワードを空にするとかだと問題がある)。
ログインの設定
「パスワードなしでログインする」という設定を有効にしているのであんまり恩恵がないのだが、スリープやロックからの復帰の際は必要になるので、一応設定しておく。
すでにPAMの設定がなされているので、単に/etc/pam.d/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
これで、ログイン画面でもYubiKeyのタッチで行けるようになった。
1password
1Passowrdユーザなのでこれを多用しているのだが、利用する際に認証が求められる。まあ、アプリケーションの性質上そういうものだろう。
ここを少し変更して、YubiKey認証できるようにしたい。
参考 :1Password のロック解除をYubiKeyでやる - 宇宙行きたい
そもそも1Passowrdアプリはレポジトリにないので、ちょっと作業が必要になる。
参考 :Get the 1Password for Linux app
上記から.deb
パッケージを取得するか、レポジトリを追加してapt-get
でインストールするか、好きな対応をする。
そして、アプリケーションを実行(してサインイン)すると、次のようなダイアログが出る。これを有効にすると、システムアカウントの認証で1passwordを使えるようになる。
「画像」
それで万事解決かといえばそうではなく、都度パスワード入力が必要になる。
「画像」
これをYubiKeyに対応させたい。指紋のマークが出ているだが…。
で、どうやらこれはpolkit
によって制御されてるぽい。となれば、単に/etc/pam.d/polkit-1
に今まで同様の設定を追加するだけで良い。
全く同じなので記載は割愛する。
これにより1Passwordのロック解除もYubiKeyで行えるようになった。めでたいめでたし。
追記(2023-06-18): ログイン後初回利用時はアカウントパスワード(1Passwordのパスワード)の入力が必要。システムアカウント認証(ローカルのパスワードやYubiKeyなど)はそれ以降に両可能になる。
できたこと&かんそう
全体的には便利になったんだとは思う。
- sudo のパスワードレス化
- とはいえ、パスワードが求められるシチュエーション(
sudo
とか)で特にプロンプトが出ないので、ちょっと注意しないと気づかない場合がある。YubiKey自体は点滅しているのだけど注意喚起力は高くないので、視野にい入れておかないとうっかりすることがあるかも。sudo
のタイミングくらい認識しておけって気もするが。
- とはいえ、パスワードが求められるシチュエーション(
- ログインのパスワードレス化
- そもそも「パスワードなしでログインする」という設定があるのであんまり意味ないんだけど。
- 1Password のアンロック対応
あと、ArchLinux の関連ページがいろいろ詳しい。