セキュリティデバイス YubiKey を使ってみる(Linux / Ubuntu)

というわけで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使えなくなって詰み…という感じだったので、次のように対応した。

  1. 再起動する
  2. ブートメニューから、リカバリモードを選んで、root Drop to root shell promptメニューを選ぶ
  3. シングルユーザモードになったので、然るべきファイルを編集する
  4. 再起動する

要はシングルユーザモードであり何の認証もなされていないのだが、前提として物理セキュリティは守られている設定なのでひとまずよし。

ひとまずこれで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を使えるようになる。

「画像」

1Password アプリに初回サインイン後の表示
それで万事解決かといえばそうではなく、都度パスワード入力が必要になる。

「画像」

認証を求めるダイアログ

これをYubiKeyに対応させたい。指紋のマークが出ているだが…。

で、どうやらこれはpolkitによって制御されてるぽい。となれば、単に/etc/pam.d/polkit-1に今まで同様の設定を追加するだけで良い。

全く同じなので記載は割愛する。

これにより1Passwordのロック解除もYubiKeyで行えるようになった。めでたいめでたし。

追記(2023-06-18): ログイン後初回利用時はアカウントパスワード(1Passwordのパスワード)の入力が必要。システムアカウント認証(ローカルのパスワードやYubiKeyなど)はそれ以降に両可能になる。

できたこと&かんそう

全体的には便利になったんだとは思う。

  • sudo のパスワードレス化
    • とはいえ、パスワードが求められるシチュエーション(sudoとか)で特にプロンプトが出ないので、ちょっと注意しないと気づかない場合がある。YubiKey自体は点滅しているのだけど注意喚起力は高くないので、視野にい入れておかないとうっかりすることがあるかも。
      • sudoのタイミングくらい認識しておけって気もするが。
  • ログインのパスワードレス化
    • そもそも「パスワードなしでログインする」という設定があるのであんまり意味ないんだけど。
  • 1Password のアンロック対応

あと、ArchLinux の関連ページがいろいろ詳しい。

参考 :YubiKey - ArchWiki