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

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

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

Firebase Realtime Database にも、Firebase Realtime Database セキュリティ ルールと呼ばれる同様の機能があります。

認証

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

承認

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

Cloud Storage では Google のサーバー上にあるファイルやパスごとに承認ルールを指定して、アプリ内のファイルへのアクセスを決定できます。たとえば、デフォルトの Cloud 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/.*');
    }
  }
}

次のステップ