はじめに

基本的にウェブブラウザはセキュリティが理由でFlatpak版を使っている。(但し、verifiedなパッケージのみ)
ところが、ホスト版ウェブブラウザで使えていた物理キー(Google Titan Key)がFlatpak版ウェブブラウザだと使えない。パスワードマネージャーでなんとかなる場合もあるが、ここは物理キーが使えるように頑張ってみる。

動作環境

ステップ1:ホストOS(NixOS)側の「門」を開ける

まず、OSが「このUSBデバイスは、ログインしているユーザーが触っていいよ」と認識してくれないと始まらない。 NixOSの場合は、udev ルールに書く必要がある。

SOURCE_CODE
# configuration.nix
services.udev.extraRules = ''
  # Google Titan Security Key v2 用の設定
  KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="18d1|096e", ATTRS{idProduct}=="9470|5026|0858|085b", TAG+="uaccess"
'';
(※注:具体的なIDリストについては、Linuxの標準ライブラリであるlibfido2の公式ルール(70-u2f.rules,commit:a94e52c)を参照。上記設定ではTitanキーとOEMであるFeitianの各モデルを網羅している。)

idVendoridProduct 実機の lsusb で確認することができる。私の環境ではidVendor=="18d1"idProduct=="9470"であった。

このあとnixos-rebuild switchを実行。

ステップ2:Flatpakのサンドボックスに穴をあける

Flatpak側からTitanキーのようなHIDデバイスを認識させるには、必要な権限を与える必要があるのでFlatpak側の設定を行う。設定と言ってもコマンドラインオプションの指定である。flatsealでも設定可能だが、複数のプロファイルを使っている場合でプロファイルごとに設定を行いたい場合は、コマンドラインオプションを指定するしかない。

必要な権限

ステップ3:Flatpak版braveを起動

ここで最大の注意点。他のプロファイルを含め、すべてのBraveを完全に終了させておくこと。これをしていないと、古い権限のままのBraveが立ち上がってしまい、いつまでも設定が反映されない。

起動コマンド

SOURCE_CODE
flatpak run \
  --device=all \
  --filesystem=/run/udev:ro \
  com.brave.Browser \
  --profile-directory="Default"

ステップ4:動作確認

この状態で、WebAuthnのテストサイト(WebAuthn.io)などで適当にユーザ名を入力後、Registerを押すと、PINの入力を求められる。PIN入力後、Titanキーに触れると無事に登録される。その後、Authenticateを押すと、再びPINの入力を求められるので、同様に入力、Titanキーに触れると無事に認証されることを確認する。

まとめ