Upload2Door

役員・情シス・監査向け技術解説

宣言的アクセス制御による
多層防御アーキテクチャ

Firestore Security Rules の設計思想と適用範囲

短い = 弱い ではない。短い = 本質だけ である。

1行ルールのインパクト

クライアントSDK経由のアクセスを制御

ルール例1: 未認証は全拒否
allow read, write: if request.auth != null;
100%
クライアントSDK経由の未認証アクセス拒否
集約
認証チェックロジックを1箇所に
即時
デプロイ後すぐ適用
ルール例2: 本人のデータのみアクセス可能
allow read, write: if request.auth.uid == resource.data.userId;
自動
ユーザーIDマッチング
DB層で
他人データへのアクセス拒否
証明可能
監査人に論理的に説明

適用範囲について

Security RulesはクライアントSDK(Web、iOS、Android)からのアクセスに適用されます。 Admin SDK(サーバーサイド)はルールをバイパスする設計です。 これは意図された動作であり、サーバーサイドのセキュリティは別途対策が必要です。

なぜ「短い = 弱い」ではないのか

宣言的記述の設計思想

よくある誤解

「セキュリティコードは複雑であるべき」

  • ×コード行数が多いほど安全
  • ×複雑なロジックで防御力が上がる
  • ×セキュリティは専門家しか理解できない
宣言的アプローチの利点

「本質だけを記述し、基盤が強制」

  • 短いからこそレビュー・監査が容易
  • 宣言的記述で曖昧さがない
  • 非エンジニアでも意図を理解可能

法律の条文は短いが、国全体を拘束する。

Firestoreセキュリティルールも同様。数行の宣言が、クライアントからの全データアクセスを強制的に制御する。

クライアントアプリのバグがあっても、DBが拒否する

多層防御の一つとして機能

RLS未実装の従来型アーキテクチャ

  クライアント
     │
     ▼
  アプリサーバー ←── ここにバグがあると...
     │
     ▼
  DB (RLS未実装) ←── 素通りで不正アクセス成立
                    

問題: アプリ層の権限チェックのみに依存

Firestore + Security Rules

  クライアント
     │
     ▼
  クライアントSDK ←── ここにバグがあっても...
     │
     ▼
  Firestore ←──────── ルールが強制拒否
  [Security Rules]
                    

効果: DB層で追加の防御ラインを確保

他のDB層セキュリティ技術との比較
技術提供元特徴
Firestore Security RulesGoogleクライアントSDK直接アクセスに最適化、宣言的記述
PostgreSQL RLSPostgreSQL行レベルセキュリティ、SQL内で定義
SQL Server RLSMicrosoft行レベルセキュリティ、述語ベース
Cosmos DB RBACMicrosoft AzureAzure AD統合、きめ細かいアクセス制御

※ DB層でのアクセス制御はFirestore固有ではなく、エンタープライズDBでは一般的な機能です。 Firestoreの特徴は、クライアントSDKからの直接アクセスを前提とした設計にあります。

役員・監査向け説明

「クライアントアプリケーションに脆弱性があっても、
データベース層で追加の防御ラインとして機能します。

これは多層防御(Defense in Depth)の考え方に基づいています。」

宣言的ルール = 仕様そのもの

コードが仕様書、仕様書がコード

従来: 手続き的記述
// アプリケーションコード(Java/Python等)
public Document getProject(String projectId) {
  User user = getCurrentUser();  // 認証取得
  if (user == null) {
    throw new AuthException();   // 認証チェック
  }
  Project project = db.get(projectId);
  if (!project.orgId.equals(user.orgId)) {
    throw new ForbiddenException(); // 権限チェック
  }
  if (user.role != "admin" && ...) {
    // 複雑な条件分岐...
  }
  return project;
}
  • ・ビジネスロジックと権限ロジックが混在
  • ・全エンドポイントに重複コード
  • ・実装漏れのリスク
  • ・監査には全コードレビューが必要
Firestore: 宣言的記述
// firestore.rules
match /projects/{projectId} {
  // 認証済み かつ 同じ組織のユーザーのみ
  allow read: if request.auth != null &&
    getUserOrg() == resource.data.orgId;

  // 削除は管理者のみ
  allow delete: if getRole() == 'admin';
}
  • クライアントアクセスの権限ルールが1ファイルに集約
  • 「誰が何をできるか」が一目瞭然
  • ルール=クライアントアクセスの仕様書
  • ユニットテストで検証可能

「このルールファイルがクライアントアクセスの仕様書です。
権限設計の一部を監査人に論理的に説明できます。」

クライアントSDKからはバイパス不可

ただしAdmin SDKは設計上バイパスする

クライアントSDK経由

SQLインジェクション相当

→ クエリ言語が異なり、構造的に防御

認証情報の偽装

→ request.auth はFirebaseが検証済み

ルールの迂回

→ 構造的に不可能

クライアントSDK経由ではSecurity Rulesを必ず通過

Admin SDK経由(サーバーサイド)

Security Rules

→ 設計上バイパスする(意図された動作)

使用場所

→ Cloud Functions, Cloud Run等

セキュリティ

→ サーバーサイドで別途実装が必要

Admin SDKを使う場合は追加のセキュリティ対策が必須

Admin SDK使用時の注意

多くのエンタープライズアプリケーションでは、複雑なビジネスロジックをCloud Functionsで実装します。 この場合、Security Rulesはバイパスされるため、 サーバーサイドコードで権限チェックを実装する必要があります。

クライアント → Cloud Functions → Firestore (Admin SDK)
                      ↑
              ここでの権限チェックが重要
              Security Rulesは適用されない

役員・監査向け説明

「クライアントアプリからの直接アクセスは、
Security Rulesで確実に制御されます。

サーバーサイド処理(Admin SDK)を使用する場合は、
別途セキュリティ対策を実装しています。」

権限データの変更は即時反映

ルール自体の変更はデプロイが必要

即時反映されるもの

Firestoreに保存された権限データ

  • ユーザーのロール(users/uid/role)
  • 組織の所属情報(users/uid/orgId)
  • アクセス許可フラグ等

効果:退職処理でroleを削除すれば、次のリクエストから即座に拒否

デプロイが必要なもの

Security Rules自体の変更

  • ・新しいコレクションのルール追加
  • ・ルールロジックの変更
  • ・新しい条件の追加

Custom Claims(JWTトークン)

  • ・変更後、再認証まで反映されない
  • ・トークンの有効期限(最大1時間)に依存
運用タスクの比較
運用タスク従来(RLS未実装)Firestore
クライアントアクセスの権限ルール管理各エンドポイントに分散1ファイルに集約
ルール変更のデプロイサーバー再起動が必要な場合ありfirebase deploy(数秒)
ルールのテストE2Eテストが必要な場合が多いルール単体でユニットテスト可能
担当者の引き継ぎコード全体の理解が必要ルールファイルから理解開始可能

「Firestoreに保存された権限データは即座に反映されます。
ルール自体の変更はデプロイが必要ですが、数秒で完了します。」

監査で説明できる

ただし、ルールファイルだけでは不十分

監査での想定Q&A

Q: 「他社のデータを見られないことを証明してください」

A: クライアントSDK経由のアクセスは、resource.data.orgId == getUserOrg() のルールにより自組織のデータのみアクセス可能です。Admin SDK経由のアクセスは、サーバーサイドコードで同等のチェックを実装しています。

Q: 「このルールが確実に適用されていることをどう保証しますか?」

A: クライアントSDK経由のアクセスには、Security RulesがFirebase基盤レベルで強制されます。ルールのユニットテストをCI/CDで実行し、デプロイ前に検証しています。

Q: 「ルールを変更できるのは誰ですか?」

A: Firebaseプロジェクトの管理者権限を持つメンバーのみです。変更履歴はGitで管理され、デプロイはCI/CDパイプラインを通じて行われます。

監査対応に必要な資料一覧
資料説明Firestoreでの対応
権限仕様書誰が何にアクセスできるかSecurity Rulesファイル + サーバーサイドコード
変更履歴ルールの変更履歴Gitバージョン管理
デプロイ権限管理誰がルールを変更できるかFirebase IAM + CI/CD設定
監査ログアクセスログFirebase / Cloud Logging
テスト結果ルールの検証証跡CI/CDテスト結果
Admin SDK管理サーバーサイドのアクセス制御Cloud Functions/Runのコードレビュー

監査人への説明

「クライアントアクセスの権限管理は、Security Rulesファイルに集約されています。
サーバーサイド処理の権限管理は、対応するコードと合わせてご説明します。

変更履歴、デプロイ権限、監査ログもすべて提出可能です。」

制限事項と考慮点

適切な期待値設定のために

ルールサイズ制限

Security Rulesは64KBまで。非常に複雑なルールセットでは制約になる可能性があります。

関数呼び出し制限

1リクエストあたりget() / exists()は合計20回まで。複雑な権限チェックでは設計の工夫が必要です。

パフォーマンス影響

get() / exists()を多用するルールはレイテンシに影響します。シンプルなルール設計が推奨されます。

ベンダーロックイン

Firestore Security RulesはGoogle独自仕様です。他のDBへの移行時にはルールの再実装が必要です。

これらの制限を理解した上で、適切なユースケースで活用することが重要です。

まとめ

Firestore Security Rulesの位置づけ

宣言的で簡潔

本質だけを記述。レビューが容易。

多層防御の一部

クライアントアクセスの防御ライン。

仕様としても機能

クライアントアクセスの権限仕様書。

クライアントからはバイパス不可

SDK経由では確実に適用。

データ参照は即時反映

権限データの変更は即座に反映。

Admin SDKは別対策

サーバーサイドは追加実装が必要。

Security Rulesは
「多層防御の重要な一層」です

Firestore Security Rulesは、クライアントSDKからの直接アクセスを宣言的かつ強制的に制御する仕組みです。

短いからこそレビューが容易であり、 宣言的だからこそ監査で説明しやすいです。

ただし、Admin SDKを使用するサーバーサイド処理や、その他のセキュリティ対策と組み合わせてはじめて、 包括的なセキュリティが実現します。

本システムでは、Security Rulesを多層防御の一部として活用し、
サーバーサイドセキュリティと組み合わせた設計としています。