Firebaseの技術情報サイト

Firebaseの技術情報サイト

Firebase活用の為の技術情報サイトです

知らないと損をするFirebaseストレージのセキュリティルール

知らないと損をする Firebase ストレージのセキュリティルール

Firebase のストレージのセキュリティルールは、Firebase のストレージのバケット(bucket)にアクセスするためのルールです。Firebase のストレージのファイルに割り当てられている URL を取得する事ができますが、この URL のアクセスには適用されません。 Firebase のファイルの URL へのアクセスは、セキュリティルールでは管理できません。この記事ではその詳細について紹介しています。

目次
セキュリティルールでカバーされない URL アクセス
セキュリティルールで管理できること
何が問題か?
解決策はあるのか?
まとめ

セキュリティルールでカバーされない URL アクセス

知らないと損をするというのは、Firebase のストレージにあるファイルに URL を使ってアクセスする場合です。 実は、このアクセスには、Firebase のセキュリティルールが適用されません。これを知らないと、会員のみに公開している内容が誰でもみる事ができる状態になっていると言うことが起こってしまいます。

とは言った物の Firebase のストレージのファイルにアクセスするための URL を取得するには、セキュリティールールでアクセスの権限を持っていないと取得はできません。従って、あるレベルのセキュリティは存在します。

セキュリティルールで管理できること

では、セキュリティルールで管理できるのは何かという事になると思いますが、それは Firebase ストレージのバケット(bucket)に対するアクセスです。Firebase のストレージのバケットにファイルを保存したり、バケットにあるフォルダやファイルの一覧を取得したり、個別のファイルの情報を取得したりするアクセスにはセキュリティルールが適用できます。

ファイルにアクセスするための URL を取得するための処理も、この Firebase のストレージのバケットの情報にアクセスして取得します。従って、アクセス出来ない設定になっている利用者が取得しようとしても、URL の取得はできません。

何が問題か?

URL の取得ができなければ問題がないように見えますよね?実は問題は、URL の取得ではありません。URL を知っていると Firebase のストレージにあるファイルにアクセスできるのが問題です。この URL を利用したアクセスは、Firebase ストレージのバケットを経由しなくてもファイルにアクセスできるので、「URL を知っていれば誰でもアクセス可能」になってしまうのが問題です。

もう一つの問題は、この URL は固定になっています。つまり、同じファイルの場合は、毎回同じ URL が発行されます。毎回異なる URL が割り当てられる場合には、大きな問題ではありませんが、毎回同じなのが問題です。例えば、アクセスの権限がある人がファイルにアクセスする URL を取得して、その URL を SNS の投稿に貼り付けた場合などです。

SNS の投稿は設定にもよりますが、その情報のアクセス権がない人もみる事が可能です。従って、その投稿のリンクをクリックすると、本来はその情報にアクセスできない人でも、ファイルの中身を参照できるという事が起きてしまいます。 有料の情報のファイルの場合、最初の人は実際に購入して URL を取得しないとそのファイルにアクセスはできません。しかし、その購入者がそのダウンロード先の URL を公開してしまうと、その URL を知っている人全てが無料でそのファイルをダウンロードできるという問題が起きます。

解決策はあるのか?

Firebase のストレージのファイルに割り当てられるダウンロードのための URL は基本的に固定です。 これは、Firebase の仕様なので Firebase のストレージにフロントエンドからアクセスする場合には、ほぼ避けようがないのが実情です。URL を利用者に直接は見せずに、Web ブラウザの Javascript で処理して、ブラウザに表示する仕組みにすると、「誰でも」アクセスできるという状態はある程度避ける事は可能です。しかし、Javascript のコードは Web ブラウザで閲覧可能です。フロントエンドでファイルの中身を取得して処理する場合でも、Web ブラウザの開発用の機能を使うと、アクセスした URL を追跡するのは比較的簡単にできます。フロントエンドで表示するには、Web ブラウザでファイルの中身をダウンロードする事は必須になるので、このアクセスを隠す事はできません。従って、ある程度 Firebase と Javascript の知識がある人の不正なアクセスを防ぐ方法は限られていると言えます。

一つの方法として、ファイルのアクセスをフロントエンドではなく、バックエンドで行う仕組みを作ればある程度、ファイルにアクセスするための URL の情報は隠す事が可能です。その場合は、バックエンドの仕組みを Google Cloud Storage の仕組みを利用して作成する事になります。

まとめ

Firebase のストレージのセキュリティルールは、「バケット(bucket)」のアクセスに関するルールです。セキュリティルールで「場所」を特定するのに、このバケット(bucket)の情報を使っているのが大きな理由です。従って、バケット(bucket)の場所ではなく、URL でファイルの場所を指定した場合には、セキュリティルールの適用外になってしまうというわけです。

ブログなどのサービスの場合は、読み込みのアクセスは一般の利用者に許可しているアクセスなので、こうした制限が問題になることは殆どありません。しかし、Firebase のストレージを利用して、有料コンテンツの配信などを考えている場合には、問題になってきます。そうした場合には、有料コンテンツへのアクセスは、フロントエンドからではなく、バックエンドの処理で、Google Cloud Storage の仕組みを使って処理する必要があります。

Firebase の殆どの機能は、バックエンドのサービスなしで利用できるのが大きな魅力ですが、利用の目的によっては、バックエンドのサービスが必要になる場面も出てきます。Firebase のストレージのセキュリティルールの制限事項はその一つの例です。