Cloud Storage 用の Firebase セキュリティ ルールを理解する

これまで、セキュリティはアプリ開発において最も複雑な部分の 1 つでした。ほとんどのアプリケーションでは、認証(ユーザーは誰なのか)と承認(ユーザーは何を実行できるのか)を行うサーバーをデベロッパーが構築して実行する必要があります。認証と承認は設定が難しく、特に、正確に設定することはとても困難ですが、プロジェクトの成功に欠かせない重要な要素です。

Firebase Authentication によってユーザーの認証が簡単になるように、Cloud Storage 用の Firebase Storage セキュリティ ルールによってユーザーの承認とリクエストの検証も簡単になります。Storage セキュリティ ルールで複雑な構造に対応できるのは、パスベースのアクセス許可を指定できるためです。Cloud Storage リクエストを特定のユーザーに限定したり、アップロード サイズを制限したりする承認ルールを、わずか数行のコードで作成することができます。

Firebase Realtime Database にも、Firebase Realtime データベース ルールと呼ばれる同様の機能があります。

認証

ユーザーが誰なのかを把握することは、アプリケーション構築の重要な部分です。Firebase Authentication には、簡単に操作でき、しかも安全なクライアント側専用の認証ソリューションがあります。Cloud Storage 用の Firebase Storage セキュリティ ルールは Firebase Authentication と連携してユーザーベースのセキュリティを実現します。ユーザーが Firebase Authentication で認証されると、Storage セキュリティ ルールの request.auth 変数は、そのユーザーに固有の ID(request.auth.uid)とトークン内の他のすべてのユーザー情報(request.auth.token)を含むオブジェクトになります。ユーザーが認証されない場合、request.authnull になります。これにより、データアクセスをユーザー単位で安全に制御することができます。詳しくは、ユーザー セキュリティのセクションをご覧ください。

承認

ユーザーの識別はセキュリティの一部にすぎません。ユーザーが誰なのか把握できたら、Cloud Storage 内のファイルに対するユーザーのアクセス権限を管理する方法が必要です。

Cloud Storage では Google のサーバー上にあるファイルやパスごとに認証ルールを指定して、アプリ内のファイルへのアクセスを決定することができます。たとえば、デフォルトの Storage セキュリティ ルールでは、すべてのファイルに対して read または write 操作を行うために Firebase Authentication が必要です。

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

セキュリティ ルールは、Firebase コンソールで Firebase アプリを選択し、[Storage] セクションの [Rules] タブを表示して編集することができます。

データの検証

Cloud Storage 用の Firebase セキュリティ ルールは、データ検証にも使用できます。たとえば、ファイルとパス名の検証、contentTypesize などのファイル メタデータ プロパティの検証に使用できます。

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

Storage セキュリティ ルールで行うことのできる基本的な内容を学習しました。さっそく使ってみましょう

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。