Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Firebase storageのセキュリティルールを理解したい

0. 前書き

 本記事は、拙作Firestoreセキュリティルールを読み解くのFirebase storage版みたいな位置づけです。
調べた事をつらつら書いていきます。どなたかの参考になれば幸いです。

1. Firebase storageとは

 例によって、Firebase storage(以下、storage)公式ドキュメントを参照します

Cloud Storage は、写真や動画など、ユーザーが作成したコンテンツを保管、提供する必要のあるアプリ デベロッパー向けに構築されています。

Cloud Storage for Firebase は、Google 規模で構築された、強力かつシンプルでコスト効果の高いオブジェクト ストレージ サービスです。Cloud Storage 用の Firebase SDK では、ネットワーク品質にかかわらず、Firebase アプリでのファイルのアップロードとダウンロードに Google のセキュリティが適用されます。この SDK は、画像、音声、動画、またはその他のユーザーが生成したコンテンツを格納する場合に使用できます。サーバーでは、Google Cloud Storage を使用して同じファイルにアクセスできます。
https://firebase.google.com/docs/storage

写真は保存できそうだと思っていましたが、動画もいけるんですね。。。凄い。。。

2. デフォルトルールの確認

 続いてstorageを見てみます(左の数字は行番号です)。
firestoreとは違い、storageのルールは認証済みユーザしか受け付けないようになっています。1

1 rules_version = '2';
2 service firebase.storage {
3   match /b/{bucket}/o {
4     match /{allPaths=**} {
5       allow read, write: if request.auth != null;
6     }
7   }
8 }

 1, 2行目は特に疑問はないでしょう。
3行目ですが、firestoreのルールの対応しそうな箇所(下記)と比較するとbbucketoobujectと類推できます。

match /databases/{database}/documents {

{bucket}の部分ですが、バケットが一つの場合は(default)が設定されているのでしょう。
また、firestoreだとデータベースが1プロジェクト1つですが、storageの場合は有料プランなら複数バケットを持てるため、場合によっては具体的なバケット名を指定する事に意味がありそうです。

4     match /{allPaths=**} {
5       allow read, write: if request.auth != null;
6     }

4行目が、バケットの全オブジェクトに対してルールを適用するよう記載しています。
バケットにフォルダを作成して、そのフォルダ配下にあるオブジェクトにルールを課す書き方もできます。ただし、storageのルールは制約が緩い方が適用されるため、全オブジェクトに対するルールを設定する場合は注意が必要です(参考2)。

3. 具体的なルールを設定してみる

ここまでを踏まえて、具体的にルール設定してみます。
要件は、
①ルート直下のファイルは認証無しで閲覧可
②ルート直下のファイルの編集は認証が必要
③ルート配下のユーザ毎のフォルダ配下の全ファイルはそのユーザ出ないと閲覧、編集できない

って感じにしてみましょう。
すると、設定すべきルールは以下のようになります。
②のルールを設定する際に、条件を関数化することもできます(参考3)。

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {

    function isAuthenticated() {
      return request.auth.uid != null;
    }

    match / {
      allow read: if true;
      allow write: if isAuthenticated();
    }

    match /{userId}/{allPaths=**} {
      allow read, write: if request.auth.uid == userId;
    }
  }
}

 
また、storageの構成は以下のようになっています。
ユーザIDをフォルダ名にして作成します(上記の{userId}の部分に対応)
Inkedimage_2020_11_22.jpg
 
ファイル名に指定したユーザIDはこちらで確認。
Inkedimage_2020_11_22_2_LI.jpg

参考

1.【公式ドキュメント】Cloud Storage
2.Firebase storageのセキュリティルールについて
3.【Firebase】Cloud Storage セキュリティルール条件の書き方


  1. リクエスト期限(storageを使用可能にしてから1ヶ月など)も設定されていないのも気になります。なにかあるのでしょうか。。。? 

hiroki-harada
macが欲しい(食べられない方の)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away