Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

安全でないルールを避ける

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

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

データが適切に保護されていないというアラートを受け取った場合は、これらの一般的なエラーを確認し、脆弱なルールを更新してください。

Firebase セキュリティ ルールにアクセスする

既存のルールを表示するには、Firebase CLI または Firebase コンソールを使用します。誤って更新を上書きしないように、一貫して同じ方法を使用してルールを編集してください。ローカルで定義されたルールが最新の更新を反映しているかどうかわからない場合、Firebase コンソールには、Firebase セキュリティ ルールの最近デプロイされたバージョンが常に表示されます。

Firebase コンソールからルールにアクセスするには、プロジェクトを選択し、 Realtime DatabaseCloud Firestore 、またはStorageに移動します。正しいデータベースまたはストレージ バケットに移動したら、[ルール]をクリックします。

Firebase CLI からルールにアクセスするには、 firebase.jsonファイルに記載されているルール ファイルに移動します。

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

Firebase セキュリティ ルールは、悪意のあるユーザーからデータを保護します。 Firebase コンソールでデータベース インスタンスまたは Cloud Storage バケットを作成する場合、すべてのユーザーへのアクセスを拒否するか(ロック モード)、すべてのユーザーにアクセスを許可するか(テスト モード)を選択できます。開発中はよりオープンな構成が必要になる場合がありますが、アプリをデプロイする前に、時間をかけてルールを適切に構成し、データを保護してください。

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

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

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

オープンアクセス

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

非推奨:すべてのユーザーの読み取りおよび書き込みアクセス。

クラウド ファイアストア

// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this ruleset in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

リアルタイム データベース

{
  // Allow read/write access to all users under any conditions
  // Warning: **NEVER** use this ruleset in production; it allows
  // anyone to overwrite your entire database.

  "rules": {
    ".read": true,
    ".write": true
  }
}
    

クラウドストレージ

// Anyone can read or write to the bucket, even non-users of your app.
// Because it is shared with App Engine, this will also make
// files uploaded via App Engine public.
// Warning: This rule makes every file in your Cloud Storage bucket accessible to any user.
// Apply caution before using it in production, since it means anyone
// can overwrite all your files.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}
    
解決策:読み取りおよび書き込みアクセスを制限するルール。

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

クラウド ファイアストア

リアルタイム データベース

クラウドストレージ

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

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

非推奨:ログインしているすべてのユーザーが、データベース全体への読み取りおよび書き込みアクセス権を持っています。

クラウド ファイアストア

service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

リアルタイム データベース

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

クラウドストレージ

// Only authenticated users can read or write to the bucket
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}
解決策:セキュリティ条件を使用してアクセスを絞り込みます。

認証を確認するときに、認証プロパティの 1 つを使用して、特定のデータ セットに対する特定のユーザーへのアクセスをさらに制限することもできます。さまざまな認証プロパティの詳細をご覧ください。

クラウド ファイアストア

リアルタイム データベース

クラウドストレージ

(Realtime Database) 不適切に継承されたルール

Realtime Database ルールはカスケードし、より浅い親パスのルールがより深い子ノードのルールをオーバーライドします。子ノードでルールを作成するときは、追加の権限しか付与できないことに注意してください。データベースのより深いパスにあるデータへのアクセスを絞り込んだり取り消したりすることはできません。

非推奨:子パスでのルールの
{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          /* ignored, since read was allowed already */
          ".read": false
        }
     }
  }
}
解決策:広範な親パスでルールを記述し、子パスでより具体的な権限を付与する データ アクセスのニーズにより細分性が必要な場合は、ルールを細分化してください。 Realtime Database ルールのカスケードの詳細については、データの保護 を参照してください

クローズドアクセス

アプリを開発している間、もう 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;
    }
  }
}

リアルタイム データベース

{
  "rules": {
    ".read": false,
    ".write": false
  }
}
    

クラウドストレージ

// Access to files through Cloud Storage is completely disallowed.
// Files may still be accessible through App Engine or Google Cloud Storage APIs.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

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

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

Cloud Firestore セキュリティ ルールをテストする

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

Firebase コンソールで Firebase Security Rules をすばやく検証するには、 Firebase Rules Simulatorを使用します。