🔐

Firebaseのセキュリティルール問題

に公開

Firebaseの大きな利点は、クライアントから直接データベース(DB)にアクセスできることです。これは開発スピードを飛躍的に上げてくれますが、同時にセキュリティルールがアプリの要塞となるため、正しく設定しなければ情報漏洩につながるリスクを抱えています。

抽象度が高い

Firebase Security Rulesの構文自体はシンプルですが、すべてのクエリパターンを網羅しなければなりません。わずかな油断や抜け漏れが読み書き放題の状態を招きかねないため、複雑なアプリケーションに対して安全なルールを記述するのは決して容易ではないと思います。

シンタックスが分かりやすくても、実際に扱っているのは抽象度の高いセキュリティレイヤであり、誤設定のリスクは常に付きまといます。特にチーム開発では、担当者ごとの理解度の差やレビュー不足からルールの不整合が生じやすくなると思います。

類似サービスの一つであるSupabaseには「Row Level Security(RLS)」という仕組みがあり、SQLベースで柔軟にアクセス制御できます。ただし、SQLの知識が前提となるうえ、複雑な条件を書くと一気に難解になるため、こちらも強力である反面、誤設定しやすいという点ではFirebaseと構造的に似ています。

対策と考え方

誤設定のリスクを最小化するもっとも確実な方法は、権限管理をFirebaseのSecurity Rulesに依存させず、サーバー側で一元的に処理することです。つまり、クライアントやSecurity Rulesに直接的な権限判断を持たせず、アクセス制御はすべてサーバーで担保する設計が望ましいと思います。

この観点から見ると、Next.js(特にappルーター)や同様のフレームワークはサーバーでの処理を前提としているため、Firebaseとはアーキテクチャ思想が大きく異なります。

Firebaseは本来、Client SDKを通じてクライアントから直接DBへリクエストを送る設計思想に基づいているため、複雑なアプリケーションではセキュリティ設計と相性が悪くなりやすいです。したがって、場合によってはそもそもFirebaseを採用しないという判断も十分に検討すべきです。

Firebaseで完結させたい場合

大規模かつ複雑なアプリをFirebaseで完結させたい場合には、Firebase Admin SDKを利用するのが安全だと思います。このSDKはサーバー側での利用を前提としており、Security Rulesをバイパスして権限を持つ形でDBにアクセスできるため、ルール定義の抜け漏れによるリスクを回避できます。

https://firebase.google.com/docs/admin/setup?hl=ja

一方でどうしてもClient SDKを使わざるを得ない場合は、最小権限の原則に基づいて設計する必要があります。(例えば、ユーザーのプロフィールだけを取得できるような限定的なルールを書くなど。)それ以外のアクセスについては、Security Rulesは必ずデフォルトで拒否に設定し、API経由でサーバーにリクエストを送り、そこで権限チェックとDB操作を行うのが安全かつ妥当だと思います。

Discussion