![見出し画像](https://assets.st-note.com/production/uploads/images/52722624/rectangle_large_type_2_2e85c1089e9c1c38487e7831aa71910d.png?width=1200)
【CloudFirebase】セキュリティルールを使ってFirestoreへのアクセスをコントロールする
CloudFiresbase上に置いてあるFirestoreに、そこそこ秘匿したい情報を載せるために、セキュリティルールを設定したのに、どうしてもアクセス出来ちゃう(ルールが反映されない)状態が続いてすったもんだした話です。
ちなみにFirebaseプロジェクト作ってそこから作ったFirestoreなので「Firebaseに置いてあるFirestore」という認識ですが、Firestoreプロジェクトと紐付いてるGCPプロジェクトの管理画面からでも同じDBにアクセスできるし、セキュリティルールも同じように使えます。
つまり、「Firebase上にある気分になってるけど、実体はGCP上にある」と、思っていて良さそうです。(ここが結構、今回のキモでした)
やりたかったこと
チームのメンバーだけがデータベースの中身を見られるようにしたい
チームのメンバー以外からは見られないようにしたい
システムの構成
・スプレッドシートに組み込んであるGASがFirestoreからデータをGETする
・GASがFirestoreにドキュメントをCREATEする
・GASがpub/subメッセージを公開する
・pub/subメッセージを受け取ったCloudFunctionがFirestoreのデータをUPDATEする
Firestore、Pub/Subのトピック・サブスクリプション、CloudFunctionは全て同一プロジェクト内に作成してあります。
GASとGCPプロジェクトの連携のため、サービスアカウントを発行して、GASのコードにサービスアカウントキーを入れてあります。
やりたいことを実現した方法
・Firestoreルールで全てのアクセスを遮断する
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
こう!
それでいいのか
「全てのアクセスを遮断」という設定じゃ、必要なアクセスも出来なくなってしまうのでは……と、思ったのですが、
注: サーバー クライアント ライブラリは、すべての Cloud Firestore セキュリティ ルールをバイパスし、代わりに Google アプリケーションのデフォルト認証情報を使用して認証を行います。REST API または RPC API 用のサーバー クライアント ライブラリを使用する場合は、Cloud Firestore 用の Identity and Access Management(IAM)を設定してください。
サーバー クライアント ライブラリは、すべての Cloud Firestore セキュリティ ルールをバイパスし
すべての Cloud Firestore セキュリティ ルールをバイパスし
セキュリティ ルールをバイパス
するんだそうです。そんなまさか!
もちろん「代わりに Google アプリケーションのデフォルト認証情報を使用して認証を行います」とのことなので、ノー認証でアクセスできる、ということではないので、その辺は安心です。
でも、一生懸命テスト接続アプリを作ってみたりして「まだ繋がる……」「まだ見れちゃう……」と丸一日あたまを抱えていたので、その辺もうちょっとわかりやすくして欲しい。
GASからFirestoreにアクセスするモジュールも「サーバークライアントライブラリ」扱いになるようなので、GASに紐付けてあるサービスアカウントにFirestore編集者権限を与えてあげればOK。CloudFunctionは元々同じプロジェクトに置いてあるのでデフォルトの権限でアクセスが可能になります。
と言うわけで、セキュリティルールではまさかの「全部遮断」が正解だったという話でした。
この記事が気に入ったらサポートをしてみませんか?