supabase-audit-buckets-public について
Supabase の公開バケット設定と機微ファイルの露出を調べるセキュリティ監査スキルです。デプロイ前やストレージの重点検査に適しており、内容とリスクに応じてバケットを分類し、結果を逐次記録します。
主な機能
- 01設定に問題のある公開バケットの検出
- 02ファイル内容に基づく露出リスクの分類
- 03非公開設定とアクセス制限の提案
- 04バケットごとのコンテキストとログの更新
- 05公開 URL テスト証拠の収集
活用シーン
- 01デプロイ前に意図しない公開バケットを確認
- 02公開ストレージ内のバックアップや秘密情報を調査
- 03設定変更後のストレージセキュリティ確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ yoanbernabeu/ supabase-pentest-skills --skill supabase-audit-buckets-publicインストール後、Claude Code で/supabase-audit-buckets-publicを入力して読み込まれたか確認します。
詳細
公開バケット監査
🔴 重大:進行に合わせたファイル更新が必須です
コンテキストファイルには、最後にまとめてではなく、作業を進めながら書き込む必要があります。
- 各バケットの分析直後に、
.sb-pentest-context.jsonに直ちに書き込んでください- 各テストの前後に、
.sb-pentest-audit.logに記録してください- スキルの完了までファイルの更新を待たないでください
- スキルがクラッシュしたり中断されたりした場合でも、これまでの調査結果がすべて保存されている必要があります
これは必須です。逐次書き込まないことは重大なエラーです。
このスキルでは、設定が誤っている公開バケットと、公開されている機密コンテンツの特定に重点を置きます。
このスキルを使用する場面
- 公開バケットの設定ミスを素早く確認するとき
- 公開ストレージに機密データがあると疑われるとき
- ストレージに焦点を絞ったセキュリティチェックとして
- 本番環境にデプロイする前
前提条件
- Supabase の URL と anon key が利用可能であること
公開バケットが危険な理由
公開バケットでは、次のことが可能になります。
| アクセスの種類 | 説明 |
|---|---|
| 直接 URL | URL を知っている人なら誰でもダウンロードできます |
| 列挙 | ファイル一覧を取得できる可能性があります |
| 認証なし | 認証は不要です |
| キャッシュ | CDN が機密ファイルをキャッシュする可能性があります |
よくある設定ミスのパターン
- 開発時のミス — 開発中にバケットを公開設定にした
- 誤ったバケット — 機密ファイルを公開バケットにアップロードした
- レガシー設定 — RLS が存在する前からバケットが公開されていた
- 意図的だが誤り — 「URL を知る人はいない」と思い込んでいた
使用方法
公開バケットのクイックチェック
Check for misconfigured public buckets
詳細スキャン
Deep scan public buckets for sensitive content
出力形式
═══════════════════════════════════════════════════════════
PUBLIC BUCKET SECURITY AUDIT
═══════════════════════════════════════════════════════════
Project: abc123def.supabase.co
─────────────────────────────────────────────────────────
Public Bucket Discovery
─────────────────────────────────────────────────────────
Public Buckets Found: 3/5
─────────────────────────────────────────────────────────
1. avatars ✅ APPROPRIATE
─────────────────────────────────────────────────────────
Status: Public (Expected)
Purpose: User profile pictures
Content Analysis:
├── All files are images (jpg, png, webp)
├── No sensitive filenames detected
├── File sizes appropriate for avatars (< 1MB)
└── No metadata concerns
Assessment: This bucket appropriately contains only
public user-facing content.
─────────────────────────────────────────────────────────
2. uploads 🟠 P1 - NEEDS REVIEW
─────────────────────────────────────────────────────────
Status: Public (Unexpected for this content)
Purpose: User file uploads
Content Analysis:
├── Mixed file types (PDF, DOC, images)
├── Some sensitive filenames detected
└── Should likely be private with RLS
Sensitive Content Indicators:
├── 12 files with 'invoice' in name
├── 8 files with 'contract' in name
├── 3 files with 'passport' in name
└── 156 PDF files (may contain sensitive data)
Risk Assessment:
└── 🟠 User-uploaded content publicly accessible
Anyone with filename can access any user's files
Recommendation:
```sql
-- Make bucket private
UPDATE storage.buckets
SET public = false
WHERE name = 'uploads';
-- Add user-specific RLS
CREATE POLICY "Users access own uploads"
ON storage.objects FOR ALL
USING (
bucket_id = 'uploads'
AND auth.uid()::text = (storage.foldername(name))[1]
);
───────────────────────────────────────────────────────── 3. backups 🔴 P0 - 重大な設定ミス ─────────────────────────────────────────────────────────
状態:公開(決して公開してはなりません) 用途:データベースのバックアップ
⚠️ 重大:バックアップファイルに誰でもアクセスできます!
公開されているコンテンツ: ├── 🔴 db-backup-2025-01-30.sql (125MB) │ └── すべてのユーザーデータを含むデータベースの完全なダンプ ├── 🔴 db-backup-2025-01-29.sql (124MB) │ └── 前日のバックアップ ├── 🔴 users-export.csv (2.3MB) │ └── メールアドレスと名前を含むユーザーデータのエクスポート ├── 🔴 secrets.env (1KB) │ └── API キーとパスワードが含まれています! └── 🔴 .env.production (1KB) └── 本番環境のシークレット!
公開 URL(現在アクセス可能): https://abc123def.supabase.co/storage/v1/object/public/backups/db-backup-2025-01-30.sql https://abc123def.supabase.co/storage/v1/object/public/backups/secrets.env
影響: ├── データベース全体がダウンロード可能 ├── すべてのユーザーの個人を特定できる情報が公開されている ├── すべての API シークレットが公開されている └── アプリケーション全体が侵害される可能性がある
═══════════════════════════════════════════════════════════ 🚨 直ちに対応してください 🚨 ═══════════════════════════════════════════════════════════
-
バケットを今すぐ非公開にする:
UPDATE storage.buckets SET public = false WHERE name = 'backups'; -
公開ファイルを削除する: すべての機密ファイルを削除するか、公開アクセスできない場所に移動してください
-
公開されたシークレットをすべてローテーションする:
- Stripe API キー
- データベースのパスワード
- JWT シークレット
- 公開されたファイルに含まれるその他すべてのキー
-
アクセスログを監査する: ファイルが権限のない第三者にアクセスされたか確認してください
-
インシデント対応: データ侵害として扱い、インシデント対応手順に従ってください
───────────────────────────────────────────────────────── 概要 ─────────────────────────────────────────────────────────
公開バケット:3 ├── ✅ 適切:1(avatars) ├── 🟠 P1 要確認:1(uploads) └── 🔴 P0 重大:1(backups)
公開された機密ファイル:47 公開されたシークレットファイル:2
重大な発見:データベースのバックアップとシークレットが 直接 URL から公開アクセス可能
═══════════════════════════════════════════════════════════
## Bucket Classification
The skill classifies buckets by content:
| Classification | Criteria | Action |
|----------------|----------|--------|
| **Appropriate Public** | Profile images, public assets | None needed |
| **Needs Review** | User uploads, mixed content | Consider making private |
| **Critical Misconfiguration** | Backups, secrets, exports | Immediate remediation |
## Sensitive Content Patterns
### P0 - Critical (Never Public)
- `*.sql` - Database dumps
- `*.env*` - Environment files
- `*secret*`, `*credential*` - Secrets
- `*backup*` - Backup files
- `*export*` - Data exports
### P1 - High (Usually Private)
- `*invoice*`, `*payment*` - Financial
- `*contract*`, `*agreement*` - Legal
- `*passport*`, `*id*`, `*license*` - Identity
- User-uploaded documents
### P2 - Medium (Review Needed)
- Configuration files
- Log files
- Debug exports
## Context Output
```json
{
"public_bucket_audit": {
"timestamp": "2025-01-31T12:00:00Z",
"public_buckets": 3,
"findings": [
{
"bucket": "backups",
"severity": "P0",
"issue": "Database backups and secrets publicly accessible",
"exposed_files": 45,
"critical_files": [
"db-backup-2025-01-30.sql",
"secrets.env",
".env.production"
],
"remediation": "Make bucket private immediately, rotate secrets"
}
]
}
}
防止チェックリスト
問題を修正した後、次の対策を実施してください。
1. バケットをデフォルトで非公開にする
-- Supabase creates buckets public by default in UI
-- Always verify and change to private if needed
UPDATE storage.buckets
SET public = false
WHERE name = 'new-bucket';
2. バケットの作成を制限する
-- Only allow admin to create buckets
REVOKE INSERT ON storage.buckets FROM authenticated;
REVOKE INSERT ON storage.buckets FROM anon;
3. ファイルアップロードの検証
// Validate file type before upload
const allowedTypes = ['image/jpeg', 'image/png'];
if (!allowedTypes.includes(file.type)) {
throw new Error('Invalid file type');
}
// Use user-specific paths
const path = `${user.id}/${file.name}`;
await supabase.storage.from('uploads').upload(path, file);
4. 定期監査
このスキルを定期的に実行してください。
- 本番環境へのデプロイ前
- 毎週の自動スキャン
- ストレージ設定を変更した後
必須:コンテキストファイルの段階的な更新
⚠️ このスキルでは、実行中にトラッキングファイルを段階的に更新する必要があります。最後にまとめて更新するだけでは不十分です。
重要なルール:作業しながら記録する
最後にすべての書き込みをまとめて行わないでください。 代わりに、次の手順を実行してください。
- 各バケットの分析前 → 操作を
.sb-pentest-audit.logに記録する - 設定ミスが見つかるたびに →
.sb-pentest-context.jsonを直ちに更新する - 機密ファイルが検出されるたびに → 検出結果を直ちに記録する
これにより、スキルが中断、クラッシュ、またはタイムアウトした場合でも、その時点までの検出結果がすべて保持されます。
必須の操作(段階的に実施)
-
.sb-pentest-context.jsonを検出結果で更新する:{ "public_bucket_audit": { "timestamp": "...", "public_buckets": 3, "findings": [ ... ] } } -
.sb-pentest-audit.logに記録する:[TIMESTAMP] [supabase-audit-buckets-public] [START] Auditing public buckets [TIMESTAMP] [supabase-audit-buckets-public] [FINDING] P0: backups bucket is public [TIMESTAMP] [supabase-audit-buckets-public] [CONTEXT_UPDATED] .sb-pentest-context.json updated -
ファイルが存在しない場合は、書き込み前に作成する。
コンテキストファイルの更新漏れは許容されません。
必須:証拠の収集
📁 証拠ディレクトリ: .sb-pentest-evidence/04-storage-audit/public-url-tests/
作成する証拠ファイル
| ファイル | 内容 |
|---|---|
public-url-tests/[bucket]-access.json | 公開 URL アクセステストの結果 |
public-url-tests/sensitive-content.json | 検出された機密コンテンツ |
証拠の形式
{
"evidence_id": "STG-PUB-001",
"timestamp": "2025-01-31T10:45:00Z",
"category": "storage-audit",
"type": "public_bucket_audit",
"severity": "P0",
"bucket": "backups",
"public_url_test": {
"url": "https://abc123def.supabase.co/storage/v1/object/public/backups/secrets.env",
"curl_command": "curl -I 'https://abc123def.supabase.co/storage/v1/object/public/backups/secrets.env'",
"response_status": 200,
"content_type": "text/plain",
"accessible": true
},
"assessment": {
"classification": "critical_misconfiguration",
"should_be_public": false,
"contains_sensitive_data": true,
"file_types_exposed": ["sql", "env", "csv"]
},
"remediation": {
"immediate": "UPDATE storage.buckets SET public = false WHERE name = 'backups';",
"secrets_to_rotate": ["All keys in secrets.env"],
"incident_response": "Consider this a data breach"
}
}
関連スキル
supabase-audit-buckets-list— すべてのバケットを一覧表示するsupabase-audit-buckets-read— ファイルへのアクセスをテストするsupabase-report— 包括的なレポートを生成する