機能 / 安全性
パスキー認証(WebAuthn / FIDO2)
rivio は、パスワード認証と並行して パスキー(WebAuthn / FIDO2) によるログインに対応しています。生体認証(Touch ID / Face ID / Windows Hello)や端末 PIN だけで、フィッシング耐性のあるサインインが可能です。
パスキーとは?
パスキーは、FIDO Alliance と W3C による国際標準(WebAuthn / FIDO2)に基づく認証方式です。パスワードを送信せず、ブラウザ・OS・端末上の認証器(Touch ID、Windows Hello、iCloud Keychain、YubiKey 等のセキュリティキー)が公開鍵暗号でサーバと認証を行います。
- フィッシングに強い: ドメイン(RP ID)に縛られるため、なりすましサイトに認証情報を渡せません
- パスワードを毎回入力せずにログイン可能: 生体認証・端末 PIN でサインインできます(rivio はパスワード認証も併存しています)
- サーバ漏洩耐性: 公開鍵のみが保存されるため、データベース流出時も認証情報そのものは漏れません
rivio が提供するパスキー機能
- パスキーの登録(1 ユーザーあたり最大 10 個まで、PC + スマホ等の併用に対応)
- パスキーでのログイン(パスワードログインと併用)
- 登録済みパスキーの一覧・端末名変更・削除(
/settings/passkeys) - 登録・削除前の recent-auth(直近 5 分以内のパスワード再入力)必須化
- パスワード認証は引き続き利用可能(併存方式)
テナント単位の分離(テナント独自 RP ID)
rivio はパスキーの RP ID をテナントサブドメイン全体 に設定します(例: tenant1.rivio.one)。これにより:
tenant1.rivio.oneで登録したパスキーはtenant2.rivio.oneでは使えません- ブラウザがクレデンシャルをドメイン単位で管理するため、別テナントへのクレデンシャル流用が 仕組みで不可能
- テナント分離(マルチテナント)の境界を WebAuthn の境界と一致させ、テナント間漏洩を防ぎます
セキュリティ仕様
- userVerification: required — 生体認証・PIN を必須化(UV なしの認証は受け付けません)
- recent-auth ガード — パスキーの登録・削除前に直近 5 分以内のパスワード再入力を要求
- Origin 厳密検証 —
{scheme}://{host}[:{port}]を完全一致で検証。X-Forwarded-Protoは信頼、X-Forwarded-Hostは信頼しない - challenge は Redis で 5 分 TTL + 一度きり消費(リプレイ防止)
- sign counter 異常を監査ログ記録 — クラウド同期パスキー(iCloud Keychain 等)の counter が 0 固定/不安定なケースを考慮し、初期は警告ログのみ
- 監査ログ — 登録 / 削除 / 認証成功 / 認証失敗を
activity_logsに記録(生 credential_id・challenge は保存せず、先頭 16byte の sha256 ハッシュのみ) - ユーザー列挙抑制 — 未登録 email / パスキー未登録 / 非 active ユーザーのいずれでも 200 + 同型のダミーオプションを返却。
allowCredentialsは最低 4 件まで padding - credential 重複防止 —
credential_id_hash(BINARY(32) UNIQUE)で二重登録をブロック
ロックアウト防止設計
- パスワード認証は併存。パスキーを「追加」するだけで、これまで通りパスワードでもログイン可能
- パスワード未設定(
password === null)かつパスキーが残り 1 個のときのみ削除を拒否(自分でログイン手段を完全に失わないようにガード) - Feature flag
AUTH_PASSKEY_ENABLEDで kill switch を確保。env 変更 + cache clear で即座にエンドポイント全停止可能
ブラウザ・デバイス対応
- Chrome / Edge / Safari / Firefox の最新版で動作
- iCloud Keychain(macOS / iOS / iPadOS)
- Windows Hello(Windows 10 / 11)
- Android(Google Password Manager 等)
- YubiKey などのセキュリティキー(FIDO2 対応モデル)
- 非対応ブラウザでは「パスキーに対応していません」を表示してパスワードログインへ誘導
運用上の補足
- パスキー登録時には事前にパスワード設定が必要です。招待初回フローではパスワード設定が必須のため、通常運用では問題になりません
- ユーザー削除(soft delete)時には、当該ユーザーのパスキーを物理削除します
- パスキーが異なる端末・OS にまたがって同期されるかは、利用するパスワードマネージャ・OS の仕様に依存します(rivio 側の制限ではありません)