Supabase アプリの公開データベースとストレージ露出を自動スキャンする方法
問題
Supabase を使って短期間でプロトタイプや MVP を構築すると、以下のようなセキュリティリスクが見落とされがちです。
- 公開テーブル: RLS(Row‑Level Security)を設定し忘れたテーブルが外部から読み取れる
- ストレージバケット: 認証なしでオブジェクトが取得できる
- 公開鍵漏洩: クライアントバンドルに埋め込まれた秘密鍵や API キーがそのまま配布される
これらは実装時に手作業で確認すると抜けが出やすく、脆弱性が本番環境に持ち込まれるリスクがあります。
メカニズム
自動スキャンツールは次の三点をチェックします。
-
公開サーフェスの列挙
-
information_schema.tablesから全テーブルを取得し、pg_catalog系を除外 -
pg_policyを参照し、RLS が無効または未設定のテーブルを抽出
-
-
ストレージ公開設定の検証
- Supabase Storage のメタデータ API (
/storage/v1/object) を呼び出し、publicフラグが立っているオブジェクトをリスト化
- Supabase Storage のメタデータ API (
-
キー・シークレットのパターンマッチ
- ビルドされたクライアントバンドル(例:
dist/*.js)を走査し、正規表現でpk_,sk_,Bearerなどのプレフィックスを持つ文字列を検出
- ビルドされたクライアントバンドル(例:
各チェックは 読み取り専用 の API キーで実行でき、実際に書き込みや復旧処理は行いません。結果は JSON 形式で出力され、CI パイプラインやローカル開発環境で簡単に取り込めます。
実装例
# 1. テーブルと RLS のスキャン
curl -s "https://YOUR-PROJECT.supabase.co/rest/v1/information_schema.tables?select=table_name" \
-H "apikey: PUBLIC_ANON_KEY" \
-H "Authorization: Bearer PUBLIC_ANON_KEY" |
jq -r '.[] | .table_name' |
while read tbl; do
rls=$(curl -s "https://YOUR-PROJECT.supabase.co/rest/v1/pg_policy?select=policyname&table_name=eq.${tbl}" \
-H "apikey: PUBLIC_ANON_KEY" \
-H "Authorization: Bearer PUBLIC_ANON_KEY")
if [ -z "$rls" ]; then
echo "⚠️ RLS 未設定テーブル: $tbl"
fi
done
# 2. ストレージ公開オブジェクトの列挙
curl -s "https://YOUR-PROJECT.supabase.co/storage/v1/object?bucket=public&limit=1000" \
-H "apikey: PUBLIC_ANON_KEY" |
jq -r '.[] | select(.public == true) | .name' |
while read obj; do
echo "⚠️ 公開ストレージオブジェクト: $obj"
done
# 3. バンドル内のキー漏洩チェック
grep -Eho '(pk_[A-Za-z0-9_-]{24,}|sk_[A-Za-z0-9_-]{24,}|Bearer [A-Za-z0-9._-]{20,})' dist/*.js |
sort -u |
while read secret; do
echo "⚠️ 可能性のあるシークレット: $secret"
done
CI での自動化例(GitHub Actions)
name: Supabase Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install jq
run: sudo apt-get install -y jq
- name: Run Scan
env:
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }}
run: |
./scripts/supabase-scan.sh
注意点
- 読み取り専用トークン を使用するため、スキャン自体がデータを書き換えることはありませんが、トークンが漏洩すると情報取得に利用され得ます。CI に保存する際は GitHub Secrets など安全な場所に保管してください。
- 正規表現ベースのキー検出は 偽陽性 が出やすいです。検出結果は手動でレビューし、実際に機密情報かどうかを確認してください。
- ストレージバケットの
publicフラグはバケット単位で設定されます。個別オブジェクトの公開設定は API で上書き可能なので、バケット設定だけで安全とは限りません。
Summary: This article shows how to automatically scan Supabase apps for public tables, storage exposure, and accidental key leaks.
Full write-up: https://rowshield.dev/audit?utm_source=qiita&utm_campaign=socialhat&utm_medium=social&vsr=a32c0dd3622ce53d5049