
Android スマートフォンの指紋認証で Linux ワークステーションの sudo を承認します。LAN 限定で動作し、ECDSA 鍵はスマートフォンの TEE から一切出ることなく、ssh-agent プロトコルを通じて pam_rssh と通信します。
Android スマートフォンの指紋センサーに触れるだけで、Linux マシンの sudo を承認できます。
sudo と入力するとスマートフォンが振動し、センサーに触れればコマンドが実行されます。パスワードの入力は不要で、クラウドには何も送信されません。スマートフォンは LAN 経由で応答し、指紋認証はアプリのコードではなくスマートフォンのセキュアハードウェア(TEE / StrongBox)によって強制されます。何か問題が起きた場合(スマートフォンの電源が切れている、圏外、拒否をタップ、60 秒経過など)は、sudo は単に通常のパスワードプロンプトにフォールバックします。sudo をより便利にすることはできますが、締め出すことはできません。
![]() 1. ホストで sudo 誰が要求しているかがスマートフォンに表示されます。拒否はここから直接行えます。 |
![]() 2. タップする カウントダウン、ホストと時刻、未確認ホストへの警告。その後にシステムの指紋認証プロンプトが表示されます。 |
![]() 3. センサーに触れる TEE が署名し、sudo が続行され、アプリは自動的に終了します。 |
![]() 初回起動 3 ステップと 1 つのボタン。スマートフォンに指紋が未登録の場合は登録を促します。 |
![]() セットアップ リアルタイムのチェックリスト: リスナー、通知、バッテリー、サイレントモード。すべて合格したときのみ「準備完了」になります。 |
![]() 拒否またはタイムアウト 署名はスマートフォンから送信されず、ホストはパスワードを要求します。 |
スクリーンショットは Pixel 7 エミュレーターによるものです(したがって 10.0.2.2 はエミュレーターのホストを指します)。ステップ 2 の上に表示されるシステムの指紋認証シートはセキュアウィンドウのため、スクリーンショットには写りません。
sudo on the host
-> PAM: pam_rssh (third-party) dials the phone over the LAN, as an ssh-agent
-> phone: "Approve sudo? From 192.168.1.10" (notification)
-> tap -> BiometricPrompt -> fingerprint
-> the phone's TEE signs pam_rssh's fresh 32-byte challenge
-> pam_rssh verifies against the pinned public key -> sudo proceeds
pam_rssh のものである。ここで書かれたコードが
認証時にホスト上で root として実行されることはない。setUserAuthenticationParameters(0, AUTH_BIOMETRIC_STRONG) で作成される。つまり
すべての署名に対して新たな強力な生体認証を要求し、それが TEE(または StrongBox)内で
強制される。スマートフォン上のマルウェアもあなたの指紋なしには署名できず、鍵は
エクスポートできない。SECURITY.md には、保護しない対象を含む完全な脅威モデルがある。 docs/DESIGN.md には設計とその根拠がある。
スマートフォン: Android 11 以降(API 30、使用ごとの生体認証鍵が表現可能になった バージョン)で、Class 3(「強力」)指紋センサーを搭載していること。
ホスト: 以下のいずれかのプラットフォーム。インストーラーは
pam_rssh を同梱する。パッケージが存在する場合は
そのパッケージを、存在しない場合は固定され検証済みのコミットからビルドする。
| プラットフォーム | ステータス |
|---|---|
| Arch、Manjaro、EndeavourOS | ✅ CI でエンドツーエンドでテスト済み |
| Debian 12 / 13、Ubuntu 24.04、Mint、Pop!_OS | ✅ CI でエンドツーエンドでテスト済み |
| Fedora、RHEL / Rocky / Alma 9 | ✅ CI でエンドツーエンドでテスト済み |
| openSUSE Tumbleweed | ✅ CI でエンドツーエンドでテスト済み |
| Windows(WSL 経由、上記いずれかのディストリビューション) | 🧪 動作するはずだが未テスト。WSL2 の NAT 越しでは検出がスマートフォンを見つけられない可能性があるため、--phone を渡すこと |
macOS 14 以降(/etc/pam.d/sudo_local 経由) | 🧪 実験的、未テスト |
FreeBSD(security/pam_rssh ポート) | 🧪 実験的、未テスト |
「エンドツーエンドでテスト済み」とは、プッシュのたびにそのディストリビューションの
新規コンテナ内で tools/test/e2e.sh が実行されることを意味する。
すなわちインストーラー、pam_rssh、そして実際の sudo を、モックのスマートフォンに
対して実行する。sudo はスマートフォンが承認している間はパスワードなしで成功し、
拒否した場合はパスワードにフォールバックし、ロールバックによってバイト単位で復元され
なければならない。
スマートフォンとホストが同じ LAN 上にあり、スマートフォンが安定したアドレス (DHCP 予約)を持つこと。
1. スマートフォン。 Releases
ページからアプリをインストールするか、Obtainium
にインストールと自動更新を任せる。https://gitlab.com/ritwick7/sudostamp をアプリとして
追加すればよい。アプリを開いて Get started をタップする。鍵はスマートフォンのセキュア
ハードウェア内で作成され、スマートフォンはあなたのコンピューターを待機する。
すべてのリリース APK は同じ鍵で署名されている。インストール前にダウンロードを検証するには:
sha256sum -c --ignore-missing SHA256SUMS # from the same release page
apksigner verify --print-certs sudostamp-v*.apk | grep SHA-256
# must be 7bcb0b51246197b9bb99779e09a3adcbbaeb2d59a0edecf8d2e8be67844d0657
2. コンピュータ。 2行、クローンは不要です:
curl -fsSLO https://gitlab.com/ritwick7/sudostamp/-/releases/permalink/latest/downloads/sudostamp-setup.sh
sudo bash sudostamp-setup.sh
Arch の場合: yay -S sudostamp を実行し、続いて sudo sudostamp setup を実行します(アップデートはシステムと一緒に提供されます)。
sudostamp-setup.sh は単一の自己完結型ファイルです。インストーラーとそのヘルパーが含まれており、隠されたものはありません。
root として実行する前に読んで、リリースページにあるものと SHA-256 を比較してください。これはタグ付けされたソース(scripts/bundle-host.sh)から決定的にビルドされているため、自分で再ビルドしてバイト単位で比較することもできます。
セットアップはこれだけです。ネットワーク上でスマートフォンを見つけ、スマートフォンに6桁のコードが表示されます: