5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「FirestoreやCloud Storage for Firebaseのセキュリティルールには気をつけよう」って話

Last updated at Posted at 2019-07-03

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を用いてテストを書きながらセキュリティルールを構築していくのがおすすめです。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?