🤖
Firebaseでサービスを公開するときに気を付けるセキュリティポイント
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 を使うのがよい
- Identity Platformを使うと、多要素認証,ブロッキング関数などが使える
- Firebase Authenticationと互換性がある
- Identity Platform と Firebase Authentication の違い
- 認証の仕組みとしては、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