はじめに

最近個人的にCloudFirestoreを使っているのですが、
Firestoreはセキュリティルールによってデータの読み込み/書き込みを制限することができます。

デフォルトでは下記のようにdocuments配下が全許可で、
Firestoreの読み込み/書き込みが誰でもできる状態です。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}

セキュリティルールの指定がよくわかっておらずしばらくこのままだったのですが、
さすがにまずいなと思い修正したので記録を残しておきます。



セキュリティルールの種類

デフォルトのread/write以外に、get/list/create/update/deleteの5つがあります。

read
|-get
|-list
write
|-create
|-update
|-delete

read/writeで記載してもいいですが、
create/updateとdeleteは区別して定義しても良いと思います。

FirebaseAuthenticationで認証した人しかcreate/updateできないように制御してみました。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow create,update :if request.auth != null;
    }
  }
}

ワイルドカード

デフォルトだと、Firestoreのすべてのdocumentにアクセスできてしまいます。

    match /{document=**} {

document毎にルールを分けるには下記のように表現します。
ネストもできるので階層が深くなってもOKです。

service cloud.firestore {
  match /databases/{database}/documents {
    match /books/{bookId} {
      allow read;
      allow create,update :if request.auth != null;
    }
  }
}



自分のユーザ情報だけ編集できるようにする

URLで渡されたuserIdで認証されている場合のみ、更新が可能です。

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read;
      allow update :if request.auth.uid == userId;
    }
  }
}

セキュリティルールが弱いとメールが送られてきます

ちなみにセキュリティルールをデフォルトのままにしていると、警告メールが送られてきます。

[Firebase] Cloud Firestore データベースに安全でないルールがあります

プロジェクトには強力なセキュリティ ルールがないため、誰でもデータベース全体にアクセスできます。
攻撃者はデータを窃取、変更、削除でき、また請求額を増やすことが可能です。

セキュリティルールがガバガバなので仕方ないのですが、
なかなかおっかない表現のメールです。(笑)

終わりに

もっと複雑な指定もできるのですが、
とりあえずはこのあたりだけでも把握しておくと警告メールは来なくなります。

下記でとても丁寧に説明してくれているので、複雑なルール指定をしたい場合は参考にしてください。

スポンサーリンク