🤖

Firebaseでサービスを公開するときに気を付けるセキュリティポイント

2022/04/05に公開約2,700字

Firebaseでサービスを公開するときに、最低限必要なセキュリティーのポイントをまとめています。

GCPインフラ

  • Firebaseで使うGoogle Accountは個人のアカウントを使わないでcloud identityのものを使う
  • Google Accountの2FA(MFA)は、必ず有効にする
  • パスワードなども制限できるなら、ランダムな文字列の組み合わせで推測できないようにする
    • 定期的な更新は推奨しない
    • 他のパスワードの使いまわしは厳禁。
    • 複数のユーザでアカウント共有禁止。
  • Firebaseの管理権限をもったユーザは最小限に保つ。与える権限は必要最小に。
    • 不要になったユーザは定期的に無効にする
  • IAM, Service keyの権限
  • Firebaseへのアクセス(ログイン)したときに通知が来るように設定をする
    • Cloud Run + triggerで通知をするなど
  • cloud identityのログインは定期的にaudit logで確認する

Firebase

Firestore

  • Firestoreはsecurity rulesをしっかり設定する
    • 全世界に読み書き権限を与えない。使わない場合は、全部読み書きできないようにしておく。
    • ユーザの権限ごとに読み書きをしっかり設定する
    • ユーザが更新すべきでない、参照すべきでないデータは、Functionsで読み書きすることも考える
      • Firebaseは基本的にはクライアントで読み書きするが、必要なときにはFunctionsを使う
  • 1つのdocumentに、ユーザが書き換え可能なものと、システムが更新するものは極力混ぜない
    • 混ざった場合には security ruleでユーザがその項目を更新したり、create時にその項目を勝手に設定できないように気を付ける
    • create時にdefault値が必要な場合には、Triggerを使ってcreate時にsetするなど。
  • 定期的に攻撃者目線で、問題ないか確認する
    • 自社システムをアタックするハックデイを開催してもよい。
  • 個人情報は特に注意
    • 読み書き権限は特に。
    • 公開可能な情報と、documentレベルでしっかり分ける
    • collectionGroupでうっかりとれないように注意する
    • 基本は不要なデータは取らないようにする
    • 不要になった個人情報は定期的に削除する
  • Firestore全体のバックアップを設定する

Authentication

  • AuthenticationはFirebaseのものではなく、GCPのIdentity Platform を使うのがよい
  • 認証の仕組みとしては、OAuth2.0プロバイダーが最も安全
    • Google, Appleの認証を使えないか検討をする
    • email/password認証を使う場合は、ブルートフォース攻撃を防ぐために、サインインエンドポイントの割り当ての制限をする

Storage

  • Storage.rulesでwrite権限やファイルサイズ、ファイル種別の制限をして、ユーザが不法なファイルをアップロードできないようにする。
  • uploadされた画像は、resizeなどをして、そのときにexifを削除して他のユーザへ表示するようにして、オリジナルの画像は表示させない

Hosting

  • 必要なら開発系にアクセス制限(IPや認証)を設定する
    • express経由等の設定が必要。簡易ならweb層で

Function

  • 一般的なバックエンドのセキュリティ対策をする
    • 変数チェック、権限チェック、インジェクション
  • rate limitを導入する
  • Functionsのログに秘匿情報を出さないようにする
  • 環境変数に機密情報を入れない
    • Cloud Functionsは関数の呼び出し間で環境を再利用するため、機密情報を環境に保存しない
    • Cloud SecretManagerを使う
  • 必要ならFunctionsの操作ログを自前で実装する
  • DoS攻撃で課金が増える可能性があるので、インスタンスの最大数の上限を設定しておく

API Key

  • API Keyは公開可能なものと、そうでないものは区別して厳重に管理
  • 公開可能なものは、設定を確認しておく(アクセス可能な範囲等)
  • 秘匿な鍵は厳重に管理。仕組みとしてGitに登録できないようにするなど。

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

  • Firestore, Hosting, Storageは監視とアラートの設定を追加

その他

  • NodeやPackageなどは、なるべく最新のバージョンに上げる
  • audit logで取れるものはとっておく。
  • オープンソースであればCodeQLを利用する
  • FirestoreやStorageのTriggerでFunctionsを呼び出すときは、Loopしていないか確認をする

Firebaseへの要望

  • HostingやfuncitonsにWAFが欲しい
  • もっと詳細なAudit logが欲しい
  • クラウドレベルで、各種サービスへのにIP制限などの機能がほしい

Discussion

ログインするとコメントできます