Security
PII完全分離。暗号化必須。最小権限の原則。
データ3層分離
機密度に応じた適切な保管場所
- 氏名
- 住所
- 電話番号
- メールアドレス
- 顧客アップロード写真
- 処理済み画像
- サムネイル
- 注文ステータス
- 商品マスタ
- ログ
なぜこの構成は「証明可能に安全」か
運用が頑張らなくても安全な設計
ユーザー
│
▼
Firebase Auth ─────── 本人確認(認証情報を自社で持たない)
│
▼
Firestore ─────────── PII(住所・連絡先等)
│
▼
Cloudflare Workers ── 毎回認可チェック(条件付きアクセス)
│
├─▶ D1 ─────────── 業務データ(非PII:注文・原本メタ等)
│
└─▶ R2 ─────────── 完全非公開(直接URL不可)
認証・権限・データが分離
1か所が破られても全体は破られない。単一障害点がない設計。
URLだけでは絶対にアクセス不可
R2は完全非公開。Workers経由で毎回認可チェックが必須。
毎回機械的に認可チェック
アクセス時に必ずサーバー側で検証。人の判断に依存しない。
ヒューマンエラー耐性
URLは短期署名。ロール削除で即時アクセス不可。誤送信しても事故にならない。
役員・監査向け説明
「認証・権限・データを、それぞれ独立した専門基盤に分離しています。
単一障害点がなく、一部が侵害されても全体は破られません。」
暗号化レイヤー
| レイヤー | 方式 | 管理 |
|---|---|---|
| 通信 | TLS 1.3(Cloudflare自動) | Cloudflare |
| ストレージ(R2) | AES-256 Server-Side Encryption | Cloudflare |
| ストレージ(Firestore) | AES-256 + エンベロープ暗号化 | Google Cloud |
| アプリケーション | PII項目の追加暗号化(検討中) | Application |
Firestore セキュリティルールの凄さ
アプリにバグがあってもDBが拒否する
アプリバグでもDBが拒否
アプリケーションコードにバグがあっても、Firestore側で不正アクセスをブロック。多層防御の最終ライン。
宣言的で監査説明可能
ルールはコードとして記述。「なぜ許可/拒否されるか」を監査人に論理的に説明できる。
権限変更は即時反映
ロール変更・退職処理が即座に反映。「次回ログイン時」ではなく「今すぐ」アクセス不可に。
バイパス不可
Firebase Admin SDK以外ではルールを迂回できない。Admin SDKはサーバーサイドのみ。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// 自分の組織のデータのみアクセス可能
match /projects/{projectId} {
allow read: if request.auth != null &&
get(/databases/$(database)/documents/users/$(request.auth.uid))
.data.orgId == resource.data.orgId;
// 削除は管理者のみ
allow delete: if request.auth != null &&
get(/databases/$(database)/documents/users/$(request.auth.uid))
.data.role == 'admin';
}
}
}| 観点 | 従来型(アプリ層で制御) | Firestore Security Rules |
|---|---|---|
| アプリバグ時 | 不正アクセス成立の可能性 | DBが拒否(多層防御) |
| 権限変更の反映 | キャッシュ次第で遅延 | 即時反映 |
| 監査への説明 | コード全体を見せる必要 | ルールファイル1つで説明可能 |
| バイパス | SQLインジェクション等のリスク | 構造的に不可能 |
| テスト | E2Eテストが必要 | ルール単体でテスト可能 |
役員・監査向け説明(そのまま使用可)
「アプリケーションにバグがあっても、データベース自体が不正アクセスを拒否します。
これは従来のシステムにはない、設計段階で保証された安全性です。
権限ルールはコードとして記述されており、
監査人に論理的に説明可能です。」
RBAC(ロールベースアクセス制御)
| ロール | 注文作成 | 注文閲覧 | PII閲覧 | 画像DL | 管理機能 |
|---|---|---|---|---|---|
| customer | ✓ | 自分のみ | 自分のみ | 自分のみ | − |
| studio_staff | ✓ | 事務所内 | 事務所内 | 事務所内 | − |
| factory_operator | − | 全注文 | − | 全注文 | − |
| admin | ✓ | 全注文 | 全注文 | 全注文 | ✓ |
工場オペレーターはPIIにアクセス不可
工場では画像データのみダウンロード可能。配送先情報は印刷ラベル出力時にのみ参照され、 画面上では表示されない設計。
認証フロー
- メールリンク認証(パスワード不要)
- Google OAuth連携
- SMS認証(オプション)
- 組織IDによるテナント分離
- ロールベースの権限管理
- 管理画面からの招待制
追加セキュリティ対策
WAF
Cloudflare WAF(OWASP Top10対応)
Rate Limiting
IPベース・ユーザーベースの制限
DDoS Protection
Cloudflare Unmetered DDoS保護
バックアップ
Firestore(7日)+ D1スナップショット(30日)
監査ログ
全API操作のログ記録
脆弱性スキャン
Dependabotによる依存関係監視
コンプライアンス
| 項目 | 対応状況 |
|---|---|
| 個人情報保護法 | 対応済み(PII分離設計) |
| GDPR | 対応可能(データ削除API実装予定) |
| PCI DSS | Stripe/Paidy委託(Level 1準拠) |
| SOC 2 Type II | Cloudflare/Firebase/GCPが取得済み |
| ISO 27001 | インフラプロバイダが取得済み |