0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Supabase アプリの公開データベースとストレージ露出を自動スキャンする方法

0
Posted at

Supabase アプリの公開データベースとストレージ露出を自動スキャンする方法

問題

Supabase を使って短期間でプロトタイプや MVP を構築すると、以下のようなセキュリティリスクが見落とされがちです。

  • 公開テーブル: RLS(Row‑Level Security)を設定し忘れたテーブルが外部から読み取れる
  • ストレージバケット: 認証なしでオブジェクトが取得できる
  • 公開鍵漏洩: クライアントバンドルに埋め込まれた秘密鍵や API キーがそのまま配布される

これらは実装時に手作業で確認すると抜けが出やすく、脆弱性が本番環境に持ち込まれるリスクがあります。

メカニズム

自動スキャンツールは次の三点をチェックします。

  1. 公開サーフェスの列挙

    • information_schema.tables から全テーブルを取得し、pg_catalog 系を除外
    • pg_policy を参照し、RLS が無効または未設定のテーブルを抽出
  2. ストレージ公開設定の検証

    • Supabase Storage のメタデータ API (/storage/v1/object) を呼び出し、public フラグが立っているオブジェクトをリスト化
  3. キー・シークレットのパターンマッチ

    • ビルドされたクライアントバンドル(例: 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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?