Auth — Leaked Password Protection 有効化手順

Supabase Auth に組み込まれている HaveIBeenPwned (HIBP) 連携を ON にして、 過去に漏洩した既知のパスワードを登録 / 変更時に拒否する設定。

状況 (2026-04-27): dev / prod 両 project ともデフォルト OFF のため、Supabase advisor が auth_leaked_password_protection warning を継続的に出している。本書の手順を 2 project に 適用すれば warning は解消する。

概要

  • HIBP の Pwned Passwords API (k-anonymity / SHA-1 prefix lookup) と連携。
  • ユーザーが入力したパスワードの SHA-1 ハッシュ先頭 5 文字だけが Supabase 経由で HIBP に送られ、 該当する漏洩済みハッシュ一覧を取得した後、Supabase 側で完全一致を判定する。
  • 漏洩済みと判定されたパスワードは sign-up / password update いずれも reject される。
  • パスワードそのものが外部に出ることはない。

適用手順 (dev project)

  1. ブラウザで dev project の Auth Policies 画面を開く:
  2. ページ内 Password Strength セクションまでスクロール。
  3. Prevent use of leaked passwords トグルを ON。
  4. Save クリック。
  5. 同セクションの Minimum password length (8) と Password requirements (lowercase + uppercase + digit 推奨) も同時に確認。

適用手順 (prod project)

dev と同じ手順を prod project に適用する:

  1. https://supabase.com/dashboard/project/{prod-ref}/auth/policies
  2. Password StrengthPrevent 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) と組み合わせて運用する。

関連

↗ Source markdown (auth-leaked-password-protection.md)