Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Firebase Security Rules

k2wanko
July 02, 2018
4.4k

Firebase Security Rules

k2wanko

July 02, 2018
Tweet

More Decks by k2wanko

Transcript

  1. Security Rules
    @k2wanko

    View Slide

  2. コキチーズ @k2wanko
    - GCPとFirebaseが好きな人
    - 最近はPUBGとSplatoonで遊んでる
    - Firebase Japan User GroupのOrganizerやってます
    - 本職はセキュリティエンジニア、サラリーマン

    View Slide

  3. 最近、Firebase盛り上がってますね

    View Slide

  4. それと、
    「合計1億件以上の個人情報がFirebaseの
    脆弱性によって公開状態に」
    って記事が話題ですね
    原文: 62% of Enterprises Exposed to Sensitive Data Loss via Improperly Secured Firebase Databases

    View Slide

  5. どういう記事かというと

    View Slide

  6. セキュリティ会社の調査によって、
    Firebase利用企業の62%が
    データベースのセキュリティルールに問題があり
    機密情報が公開状態になっているとのこと

    View Slide

  7. たぶんこういうこと

    View Slide

  8. もしくは、こう

    View Slide

  9. これを踏まえて考える

    View Slide

  10. (俺の考えた)
    最強のセキュリティルール

    View Slide

  11. View Slide

  12. つまり、クライアントで
    書き込みも読み出しも
    しない!!!!!!!!!!

    View Slide

  13. 以上!

    View Slide

  14. ありがとうございました!

    View Slide

  15. というわけには、いかないので
    ちゃんとやります。

    View Slide

  16. そもそも、セキュリティルールとは?

    View Slide

  17. クライアントからの読み書きを制御するためのルール
    セキュリティルールがあるのは3つのサービス
    Realtime Database Cloud Firestore Cloud Storage

    View Slide

  18. この3つのサービスはSDKから直接読み書きが可能
    Realtime Database Firestore Storage

    View Slide

  19. Realtime Databaseのセキュリティルール

    View Slide

  20. Realtime Databaseとは
    - 書き込んだ内容をリアルタイムに同期してくれるデータベース
    - オフライン時でも書き込めるのでデベロッパーはネットワークを意識せず
    オンラインアプリが作れる。
    - ゲームやチャットを作成するのに向いている
    - 以降、Realtime DBと呼ぶ

    View Slide

  21. Realtime DBのルールはJSONで書いていく

    View Slide

  22. 全体公開

    View Slide

  23. 条件式を使ったデータの検証

    View Slide

  24. 上層でmatchすると下階層も同じルールが適用される

    View Slide

  25. $otherを使ったKeyの制御
    意図しないプロパティを書き込まれないために利用

    View Slide

  26. Queryの制限
    取得できる件数を制限できる。
    例は100件まで

    View Slide

  27. まぁぶっちゃけJSONで書くの辛い

    View Slide

  28. 辛いポイント
    - コメントが書けない
    - 関数がない
    - 型がない
    - 条件式部分にハイライトがない

    View Slide

  29. そのための Bolt

    View Slide

  30. Boltとは
    - Realtime DBのセキュリティルールを生成するための独自の言語
    - コメントを書いたり関数の定義ができる
    - TypeScriptの様な型が定義ができる
    - https://github.com/firebase/bolt

    View Slide

  31. View Slide

  32. Cloud Storageのセキュリティルール

    View Slide

  33. Cloud Storage とは
    - 画像、動画などサイズの大きいデータを保存するためのストレージ
    - SDKを通してクライアントから直接アップロードできる
    - セキュリティルールはJSONじゃなくて独自言語で記述できる
    - コメントもあるし関数も定義できる
    - readはgetとlistに分割できる
    - writeはcreate,update,deleteに分割できる

    View Slide

  34. View Slide

  35. 注意点

    View Slide

  36. GCSのアクセス制御と同期はしない
    resource.data.visibility == 'public'
    だと read: if false; でもURL経由から読み
    取れる。
    GCSの機能のため 詳しくは アクセス制御オプション 参照

    View Slide

  37. Cloud Firestoreのセキュリティルール

    View Slide

  38. Cloud Firestoreとは
    - Realtime DBの次世代のドキュメント指向データーベース
    - 基本Realtime DBと同じことができる
    - クエリーが強化されてたり、バックエンドはSpannerで作られているので
    インフラ面の安定感もある

    View Slide

  39. Realtime DBとの違い (セキュリティ)
    - JSONじゃなくてStorageと同じ独自言語
    - セキュリティルールとIndexの設定が分離
    - IAMの設定もできる
    - ワイルドカードを除きルールがサブコレクションに適用されない
    - readはgetとlistに分割できる
    - writeはcreate,update,deleteに分割できる

    View Slide

  40. View Slide

  41. Queryの制限
    取得できる件数を10件に制限する
    allow list: if request.query.limit <= 10

    View Slide

  42. 現在データベースにあるドキュメントの評価
    allow write: if
    get(/databases/$(database)/documents/games/$(
    game)).data.referee == request.auth.uid;
    アクセスしようとしてるところのはresourceで取得できるが、
    それ以外のところはget()で取得する。
    get()やexists()は呼び出し回数に制限やreadの費用が掛かる。

    View Slide

  43. protobuf-rules-gen

    View Slide

  44. protobuf-rules-gen
    https://github.com/firebase/protobuf-rules-gen
    protocol bufferの定義から型検査をしてくれる
    セキュリティルールを生成するprotocのプラグイン

    View Slide

  45. まとめ
    - セキュリティルールは必ず設定しよう
    - シミュレータやE2E Testを活用して十分にテストしよう

    View Slide

  46. Enjoy
    @k2wanko

    View Slide

  47. 参考
    https://firebase.google.com/docs/database/security/
    https://firebase.google.com/docs/storage/security
    https://firebase.google.com/docs/firestore/security/overview
    https://firebase.google.com/docs/firestore/security/secure-data

    View Slide