Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

Firebaseセキュリティチェックリスト

Firebaseリソースとユーザーのデータを安全に保つには、次のガイドラインに従ってください。すべての項目が必ずしも要件に当てはまるわけではありませんが、アプリを開発する際にはそれらを念頭に置いてください。

乱用的なトラフィックを避ける

バックエンドサービスの監視とアラートを設定する

このような監視や警告のために設定し、サービス拒否(DoS)攻撃、など、不正なトラフィックを検出するためにクラウドFirestoreリアルタイムデータベースクラウドストレージ、およびホスティング

あなたのアプリケーションへの攻撃が疑われる場合は、サポートに手を差し伸べる彼らは何が起こっているか知っているようにできるだけ早く。

アプリチェックを有効にする

助けるためにだけあなたのアプリは、あなたのバックエンドサービスにアクセス可能にすることができます確保のAppチェックをサポートしていることを、すべてのサービスのために。

通常のトラフィックに合わせてスケーリングするようにCloudFunctionsを構成します

Cloud Functionsは、アプリの要求に合わせて自動的にスケーリングしますが、攻撃が発生した場合、これは多額の費用を意味する可能性があります。これを防ぐには、次のことが可能同時インスタンスの数に制限アプリの通常のトラフィックに基づいて機能のを。

制限に近づいたときに通知されるようにアラートを設定します

サービスにリクエストの急増がある場合、多くの場合、クォータが開始され、アプリケーションへのトラフィックが自動的に抑制されます。あなたの監視することを確認してください使用状況および課金ダッシュボードをしますが、できる予算のアラートを設定し、リソースの使用率が予想を超えているときに通知されるように、プロジェクトに。

自己DOSの防止:エミュレーターを使用してローカルで機能をテストします

クラウド関数の開発中に誤ってDOSを実行するのは簡単です。たとえば、無限のトリガー書き込みループを作成することによってです。あなたがあなたの開発を行うことで、ライブサービスに影響を与えることから、これらのミスを防ぐことができFirebaseエミュレータスイート

(そして、あなたはからそれを削除することによって、あなたの機能をアンデプロイ誤っDOS自分を、行う場合index.jsその後、実行中のfirebase deploy --only functions 。)

リアルタイムの応答性がそれほど重要でない場合、構造は防御的に機能します

あなたは、リアルタイムで関数の結果を提示する必要がない場合は、バッチで結果を処理することによって、不正なトラフィックを軽減することができますに結果を公開パブ/サブトピック、として定期的に結果を処理する予定の機能

APIキーを理解する

FirebaseサービスのAPIキーは秘密ではありません

FirebaseはFirebaseサービスへの、およびない使用して行われたデータベースやクラウドストレージのデータへのアクセスを制御し、にアプリのFirebaseプロジェクトを識別するために、APIキーを使用していますFirebaseセキュリティルールを。このため、FirebaseサービスのAPIキーをシークレットとして扱う必要はなく、クライアントコードに安全に埋め込むことができます。詳細情報FirebaseためのAPIキー

APIキースコープを設定する

なりすましリクエストにAPIキーを使用しようとする攻撃者に対する追加の抑止力として、あなたは、APIキーを作成することができますアプリのクライアントにスコープを

FCMサーバーのキーを秘密にしておく

FirebaseサービスのためのAPIキーとは異なり、(で使用されるFCMサーバキーレガシーFCM HTTP APIは)敏感であり、秘密にしなければなりません。

サービスアカウントキーを秘密にしておく

またFirebaseサービス用とは異なり、APIキー、(で使用されるサービスアカウントの秘密鍵管理SDKは)敏感であり、秘密にしなければなりません。

セキュリティルール

本番モードまたはロックモードでルールを初期化します

Cloud Firestore、Realtime Database、およびCloud Storageをセットアップするときは、セキュリティルールを初期化してデフォルトですべてのアクセスを拒否し、アプリの開発時に特定のリソースへのアクセスを許可するルールを追加します。

これは、Cloud Firestore(本番モード)およびRealtime Database(ロックモード)の新しいインスタンスのデフォルト設定の1つです。新しいデータベースインスタンスを設定するときにこのオプションを選択します。

Cloud Storageの場合、次のようなセキュリティルールの構成から始めます。

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

セキュリティルールはスキーマです。ドキュメントを追加するときにルールを追加する

起動前のタスクの一種として、アプリを作成した後にセキュリティルールを作成しないでください。代わりに、アプリを作成するときにセキュリティルールを作成し、データベーススキーマのように扱います。新しいドキュメントタイプまたはパス構造を使用する必要がある場合は、最初にセキュリティルールを作成します。

EmulatorSuiteを使用したユニットテストのセキュリティルール。 CIに追加する

ことを確認するために、セキュリティルールは、アプリケーションの開発、を使用して、ルールユニットテストに追いついているFirebaseエミュレータスイートとあなたのCIのパイプラインにこれらのテストを追加します。以下のためのこれらのガイドを参照してください。クラウドFirestoreリアルタイムデータベースを

認証

カスタム認証:信頼できる(サーバー側の)環境からのミントJWT

カスタムシステムであろうとサードパーティサービスであろうと、安全なサインインシステムがすでにある場合は、既存のシステムを使用してFirebaseサービスで認証できます。カスタムJWTsを作成し、その後認証するためにトークンを使用して、あなたのクライアントにトークンを渡し、信頼できる環境から( iOS版AndroidのウェブユニティC ++ )。

サードパーティのプロバイダとカスタム認証の使用例については、ブログ記事を参照してくださいFirebaseで認証がOktaを使用

管理された認証:OAuth2.0プロバイダーが最も安全です

Firebaseのマネージド認証機能を使用する場合、OAuth 2.0 / OpenID Connectプロバイダーオプション(Google、Facebookなど)が最も安全です。可能であれば、これらのプロバイダーの1つ以上をサポートする必要があります(ユーザーベースによって異なります)。

電子メール-パスワード認証:ブルートフォース攻撃を防ぐために、サインインエンドポイントに厳しい割り当てを設定します

あなたはFirebaseの管理、電子メール、パスワード認証サービスを使用する場合は、デフォルトのクォータ締めidentitytoolkit.googleapis.comブルートフォース攻撃を防ぐために、エンドポイントを。あなたはから行うことができますGoogleクラウドコンソールでAPIのページ

多要素認証のためにCloudIdentityPlatformにアップグレードする

サインインのセキュリティを強化するために、あなたはへのアップグレードにより、多要素認証のサポートを追加することができますクラウドアイデンティティプラットフォーム。アップグレード後も、既存のFirebase認証コードは引き続き機能します。

匿名認証

ウォームオンボーディングには匿名認証のみを使用してください

ユーザーが実際にサインインする前に、匿名認証のみを使用してユーザーの基本状態を保存します。匿名認証は、ユーザーサインインの代わりにはなりません。

スマートフォンを紛失したときにデータが必要な場合は、ユーザーを別のログイン方法に変換します

ユーザーがローカルストレージをクリアするか、デバイスを切り替えると、匿名認証データは保持されません。あなたは、単一のデバイス上のアプリの再起動を超えてデータを永続化する必要がある場合は、永久アカウントにユーザーを変換します

ユーザーがサインインプロバイダーに変換するか、電子メールを確認することを要求するセキュリティルールを使用する

誰でもプロジェクトに匿名アカウントを作成できます。このことを念頭に置いて、とすべての非公開データを保護する具体的な方法でのサインまたは電子メールアドレスを検証する必要がセキュリティルール

例えば:

allow write: if request.auth.token.firebase.sign_in_provider != "anonymous";
allow write: if request.auth.token.email_verified = true;

環境管理

開発およびステージングプロジェクトを設定する

開発、ステージング、本番用に個別のFirebaseプロジェクトを設定します。ステージングプロジェクトに対してテストされるまで、クライアントコードを本番環境にマージしないでください。

チームによる本番データへのアクセスを制限する

あなたは大きなチームで作業する場合は、いずれかを使用して生産データへのアクセスを制限することにより、ミスや違反の影響を緩和することができます定義済みのロールまたはカスタムIAMロールを。

チームが開発にエミュレータスイートを使用している場合は、本番プロジェクトへのより広いアクセスを許可する必要がない場合があります。

図書館管理

ライブラリのスペルミスや新しいメンテナに注意してください

プロジェクトにライブラリを追加するときは、ライブラリとそのメンテナの名前に細心の注意を払ってください。インストールしようとしているライブラリと同じ名前のライブラリに、悪意のあるコードが含まれている可能性があります。

変更を理解せずにライブラリを更新しないでください

アップグレードする前に、使用しているライブラリの変更ログを確認してください。アップグレードが付加価値をもたらすことを確認し、メンテナがまだ信頼できる当事者であることを確認してください。

ウォッチドッグライブラリを開発またはテストの依存関係としてインストールします

以下のようなライブラリを使用しSnykを安全でない依存関係のためのプロジェクトをスキャンします。

機能の監視を設定します。ライブラリの更新後に確認してください

あなたが使用している場合は、クラウド機能ロガーSDKを、あなたがすることができます監視し、警告され、ライブラリの更新によって引き起こされる行動を含め、異常な動作の。

クラウド機能の安全性

CloudFunctionの環境変数に機密情報を入れないでください

多くの場合、自己ホスト型のNode.jsアプリでは、環境変数を使用して秘密鍵などの機密情報を含めます。クラウド機能でこれをしないでください。 Cloud Functionsは関数の呼び出し間で環境を再利用するため、機密情報を環境に保存しないでください。

  • あるFirebase APIキー、保存するには秘密ではないが、コードだけでそれらを埋め込みます。
  • CloudFunctionでFirebaseAdmin SDKを使用している場合、SDKは初期化中に自動的に取得できるため、サービスアカウントの認証情報を明示的に提供する必要はありません。
  • サービスアカウントの資格情報を要求するGoogleやGoogleのクラウドAPIを呼び出している場合は、Node.jsのためのGoogleの認証ライブラリーから、これらの資格情報を取得することができ、アプリケーションのデフォルトの資格自動的にクラウド機能に移入され、。
  • あなたのクラウド機能が利用できるGoogle以外のサービスのために秘密鍵と認証情報を作成するには、使用してクラウド秘密マネージャを

機密情報を暗号化する

機密情報をCloudFunctionに渡すことを避けられない場合は、情報を暗号化するための独自のカスタムソリューションを考え出す必要があります。

単純な関数の方が安全です。複雑さが必要な場合は、CloudRunを検討してください

クラウド関数をできるだけシンプルで理解しやすいものに保つようにしてください。関数の複雑さは、多くの場合、見つけにくいバグや予期しない動作につながる可能性があります。

あなたは複雑なロジックや環境設定が必要な場合は、使用を検討してクラウドの実行をクラウド機能の代わりに。