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