Auth — Leaked Password Protection 有効化手順
Supabase Auth に組み込まれている HaveIBeenPwned (HIBP) 連携を ON にして、 過去に漏洩した既知のパスワードを登録 / 変更時に拒否する設定。
状況 (2026-04-27): dev / prod 両 project ともデフォルト OFF のため、Supabase advisor が
auth_leaked_password_protectionwarning を継続的に出している。本書の手順を 2 project に 適用すれば warning は解消する。
概要
- HIBP の
Pwned PasswordsAPI (k-anonymity / SHA-1 prefix lookup) と連携。 - ユーザーが入力したパスワードの SHA-1 ハッシュ先頭 5 文字だけが Supabase 経由で HIBP に送られ、 該当する漏洩済みハッシュ一覧を取得した後、Supabase 側で完全一致を判定する。
- 漏洩済みと判定されたパスワードは sign-up / password update いずれも reject される。
- パスワードそのものが外部に出ることはない。
適用手順 (dev project)
- ブラウザで dev project の Auth Policies 画面を開く:
- https://supabase.com/dashboard/project/{dev-ref}/auth/policies
- TODO:
{dev-ref}を.claude/context/env-values.mdの dev project ref に置換。
- ページ内 Password Strength セクションまでスクロール。
- Prevent use of leaked passwords トグルを ON。
- Save クリック。
- 同セクションの
Minimum password length(8) とPassword requirements(lowercase + uppercase + digit 推奨) も同時に確認。
適用手順 (prod project)
dev と同じ手順を prod project に適用する:
- https://supabase.com/dashboard/project/{prod-ref}/auth/policies
- Password Strength → Prevent use of leaked passwords = ON → Save.
prod 適用前に dev で 1 週間ほど運用して UX 影響 (登録失敗率) を観測してから本番に投入する。
動作確認
- ブラウザで Mobile App / Owner Portal の sign-up フローを開き、意図的に漏洩済みパスワードを入力:
- 例:
password123/qwerty123/letmein2023等の HIBP 既知パスワード - 期待: Supabase 側から
weak_password系のエラー (HTTP 422 /AuthApiError) が返る。
- 例:
- 通常の十分強度のパスワード (e.g.
Parky-Test-2026!XYZ) では従来どおり登録できることを確認。 - API 直叩きでの確認:
curl -X POST "https://{ref}.supabase.co/auth/v1/signup" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Content-Type: application/json" \ -d '{"email":"[email protected]","password":"password123"}' # 期待: 422 + "weak_password" / "leaked password" 系のエラーメッセージ
Limitations
- HIBP API レート: Supabase 側で k-anonymity bucket の応答をキャッシュしているため、
通常の sign-up トラフィック (parky 想定 < 100 req/sec) ではレート上限に当たらない。
急激なバースト時は
429で fallback (= weak チェックのみ) になる可能性あり。 - UX 影響: 登録 / パスワード変更時に外部 API 通信 1 hop 増えるため、応答時間が おおよそ +150〜250ms (region によって変動)。
- 既存ユーザーには遡及されない: ON にした時点で既に漏洩済みパスワードを使っているユーザーは ログインを継続できる。次回パスワード変更時に弾かれる仕様。
- ローカル辞書攻撃の防止には別途レート制限が必要: Supabase Auth の rate limit (現在 100 req/5min/IP) と組み合わせて運用する。
関連
- Supabase advisor:
auth_leaked_password_protection(本手順で resolved 化される) - Supabase Docs — Password Security
- parky/docs/ops/auth-cookie-policy.md — 認証 Cookie のスコープと有効期限
- parky/docs/ops/secret-rotation.md — Auth 関連 secret の rotation 手順