Firebase Summit のすべての発表内容に目を通し、Firebase を活用してアプリ開発を加速し、自信を持ってアプリを実行できる方法をご確認ください。 詳細

安全でないルールを修正する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このガイドを使用して、Cloud Firestore セキュリティ ルール構成の一般的な脆弱性を理解し、独自のルールを確認してより安全に保護し、変更をデプロイする前にテストします。

Cloud Firestore データベースが適切に保護されていないというアラートを受け取った場合は、Cloud Firestore セキュリティ ルールを変更してテストすることで脆弱性を解決できます。

既存のセキュリティ ルールを表示するには、Firebase コンソールの[ルール] タブに移動します。

Cloud Firestore セキュリティ ルールを理解する

Cloud Firestore セキュリティ ルールは、悪意のあるユーザーからデータを保護します。 Firebase コンソールで作成された Cloud Firestore インスタンスのデフォルト ルールは、すべてのユーザーへのアクセスを拒否します。アプリを開発してデータベースにアクセスするには、これらのルールを変更する必要があり、開発環境ですべてのユーザーに一括アクセスを許可することを検討してください。ただし、アプリを運用環境にデプロイする前に、時間をかけてルールを適切に構成し、データを保護してください。

アプリを開発し、ルールのさまざまな構成をテストしているときは、 Cloud Firestore エミュレータを使用してローカル開発環境でアプリを実行します。

安全でないルールを使用する一般的なシナリオ

デフォルトで、または Cloud Firestore を使用したアプリの開発に最初に取り組んだときに設定した Cloud Firestore セキュリティ ルールは、アプリをデプロイする前に確認して更新する必要があります。次の一般的な落とし穴を回避して、ユーザーのデータを適切に保護してください。

オープンアクセス

Cloud Firestore をセットアップする際に、開発中にオープン アクセスを許可するルールを設定している場合があります。アプリを使用しているのは自分だけだと思う​​かもしれませんが、展開したアプリはインターネット上で利用できます。ユーザーの認証とセキュリティ ルールの構成を行っていない場合、プロジェクト ID を推測した人は誰でもデータを盗んだり、変更したり、削除したりできます。

非推奨:すべてのユーザーへの読み取りおよび書き込みアクセス。
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
解決策:読み取りおよび書き込みアクセスを制限するルール。

データ階層に適したルールを構築します。この不安に対する一般的な解決策の 1 つは、Firebase Authentication を使用したユーザーベースのセキュリティです。ルールによるユーザー認証の詳細については、こちらをご覧ください。

コンテンツ所有者のみ

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      allow read, write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

パブリック アクセスとプライベート アクセスの混在

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

認証済みユーザーのアクセス

Cloud Firestore セキュリティ ルールは、ユーザーがログインしていることを確認することがありますが、その認証に基づいてアクセスをさらに制限することはありません。ルールの 1 つにauth != nullが含まれている場合は、ログインしているすべてのユーザーがデータにアクセスできるようにすることを確認してください。

非推奨:ログインしているすべてのユーザーが、データベース全体への読み取りおよび書き込みアクセス権を持っています。
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
解決策:セキュリティ条件を使用してアクセスを絞り込みます。

認証を確認するときに、認証プロパティの 1 つを使用して、特定のデータ セットに対する特定のユーザーへのアクセスをさらに制限することもできます。セキュリティ条件役割ベースのアクセスを追加する方法については、こちらをご覧ください。

役割ベースのアクセス

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

属性ベースのアクセス

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

パブリック アクセスとプライベート アクセスの混在

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

クローズドアクセス

アプリを開発している間、もう 1 つの一般的なアプローチは、データをロックダウンしておくことです。通常、これは、次のように、すべてのユーザーへの読み取りおよび書き込みアクセスを閉じたことを意味します。

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Firebase Admin SDK と Cloud Functions は引き続きデータベースにアクセスできます。 Cloud Firestore を Firebase Admin SDK と組み合わせてサーバーのみのバックエンドとして使用する場合は、これらのルールを使用してください。安全ですが、アプリのクライアントがデータを適切に取得できることをテストする必要があります。

Cloud Firestore セキュリティ ルールとその仕組みの詳細については、Cloud Firestore セキュリティ ルールの使用を開始する をご覧ください。

Cloud Firestore セキュリティ ルールを確認する

アプリの動作を確認し、Cloud Firestore セキュリティ ルールの構成を確認するには、 Cloud Firestore エミュレータを使用します。変更をデプロイする前に、Cloud Firestore エミュレータを使用して、ローカル環境で単体テストを実行および自動化します。

更新された Cloud Firestore セキュリティ ルールを Firebase コンソールですばやくテストするには、Rules Playground ツールを使用します。

  1. ルール プレイグラウンドを開くには、[ルール] タブから [ルールプレイグラウンド] をクリックします。
  2. ルール プレイグラウンドの設定で、次のようなテストのオプションを選択します。
    • 読み取りまたは書き込みのテスト
    • パスとしてのデータベース内の特定の場所
    • 認証タイプ — 認証されていない、認証された匿名ユーザー、または特定のユーザー ID
    • ルールが明確に参照するドキュメント固有のデータ (たとえば、ルールが書き込みを許可する前に特定のフィールドの存在を必要とする場合)
  3. [実行]をクリックし、ルール ウィンドウの上のバナーで結果を探します。