学習(7/18)
2025-07-18
- 学習
-
- RLSは優れたテナント分離を提供しますが、誤って壊してしまう可能性があります。
- マイグレーション、クロンジョブ、バックグラウンドワーカー、スーパーユーザーを介して実行されるすべてのクエリが、同じポリシーを通過することを確認してください。「サービス」ユーザーが
set_config('tenant_id', …)を実行し忘れると、ガードがバイパスされます。
pg_policiesをスキャンし、テーブルにテナントポリシーがない場合にマージをブロックするCIテストを追加してください。
PERMISSIVEポリシーと"USING (org_id = current_setting('tenant.id')::uuid)"を好み、BYPASS RLSを禁止してください。
- アプリの接続で
SET ROLEを無効にし、RLSが誤って無効にされないようにしてください。
-
- 接続プーラー内でリクエストごとに
set_config('tenant.id', …, true)を使用してください。
asyncpg/SQLAlchemy + pgbouncerを「transaction」プーリングモードで使用している場合、pgbouncerがセッション状態をDISCARDすることに注意してください。set_configを「pre-statement」フックでラップするか、「session」プーリングに切り替えてください。
- プレーンテキストではなく、
tenant.idをUUIDに設定して、整数IDとの混同を避けてください。
-
2. 認証 (Clerk) とセッションセキュリティ
- クッキー認証は問題ありませんが、以下の点を確認してください:
- 埋め込みウィジェットに応じて
SameSite=Strict/Laxを設定。
- 短期間のセッションクッキーと
httpOnly + secureなリフレッシュクッキーを分離。
- トークンリプレイを妨げるために、リフレッシュトークンにデバイスバインディングを追加。
- Reactビルドに厳格なCSPとサブソース整合性(SRI)を適用する。
- RLSポリシーにUSING句とWITH CHECK句の両方が必要
- 検索のためにtrigram GINインデックスを持つ生成列
lower(name)を追加
- RLS検証のためにpgTAPテストまたはpytest-postgresフィクスチャを追加
- トランザクション管理のためのユニットオブワークパターンが不足
- ユニットオブワーク (PoEAA) - Martin Fowl