FirestoreやCloud Storage for Firebaseのセキュリティルールをちゃんと書こうって話です(自戒)。
いくつかの前提が成立している場合に、どんな感じでドキュメントにアクセスできるかを書いていきます。
前提
・一部のユーザーのみがログインできるシステムを作ろうとしていたがセキュリティルールをちゃんと設定できてなかった。
・認証はFirebase AuthのEmailを使用していた。
脆弱なセキュリティルール
Firestoreの下記のセキュリティルールは、ログインユーザーのみが読み書きできるようにしてあります。
登録に関して制限された状態ではないため、当然画面が存在しなくともFirebase Auth REST APIを叩いてユーザー登録を行えば、誰でも認証されたユーザーとして読み書きができてしまいます。
service cloud.firestore {
match /hoges/{hogeId} {
allow read, write: if request.auth.uid != null;
}
}
}
Firebase Auth REST APIを用いてユーザー登録する
Eメールでの認証機能が行える状態の場合には、下記の様にすれば画面が存在しなくともユーザー登録を行うことができます。
curl 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=${API_KEY}' \
-H 'Content-Type: application/json' \
--data-binary '{"email":"${EMAIL}","password":"${PASSWORD}","returnSecureToken":true}'
上記の様なリクエストを送信した場合には下記のようなレスポンスが得られます。
{
"kind": "identitytoolkit#VerifyCustomTokenResponse",
"idToken": "[ID_TOKEN]",
"refreshToken": "[REFRESH_TOKEN]",
"expiresIn": "3600"
}
Cloud Firestore REST APIを用いてドキュメントにアクセスする
上記コマンド実行時に返却されたidTokenをAuthorizationヘッダーに付与して、下記のようにリクエストを送ると、上記のセキュリティルールに従っているので当然読み込みも書き込みも行うことができます。(下記の場合だとDOCUMENT_IDにhogesを入れるとhogesが取得できます)
curl https://firestore.googleapis.com/v1/projects/${PROJECT_ID}/databases/(default)/documents/${DOCUMENT_ID} -H "Authorization: Bearer ${ID_TOKEN}"
まとめ
上記のように仮に脆弱な設定がされている場合には、いくつかAPIを叩くだけでドキュメントにアクセスされてしまいます。
脆弱なセキュリティルールにならないように注意しましょう(自戒)。
Firestore Local Emulatorを用いてテストを書きながらセキュリティルールを構築していくのがおすすめです。