Firebase Security Rules
by
k2wanko
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Security Rules @k2wanko
Slide 2
Slide 2 text
コキチーズ @k2wanko - GCPとFirebaseが好きな人 - 最近はPUBGとSplatoonで遊んでる - Firebase Japan User GroupのOrganizerやってます - 本職はセキュリティエンジニア、サラリーマン
Slide 3
Slide 3 text
最近、Firebase盛り上がってますね
Slide 4
Slide 4 text
それと、 「合計1億件以上の個人情報がFirebaseの 脆弱性によって公開状態に」 って記事が話題ですね 原文: 62% of Enterprises Exposed to Sensitive Data Loss via Improperly Secured Firebase Databases
Slide 5
Slide 5 text
どういう記事かというと
Slide 6
Slide 6 text
セキュリティ会社の調査によって、 Firebase利用企業の62%が データベースのセキュリティルールに問題があり 機密情報が公開状態になっているとのこと
Slide 7
Slide 7 text
たぶんこういうこと
Slide 8
Slide 8 text
もしくは、こう
Slide 9
Slide 9 text
これを踏まえて考える
Slide 10
Slide 10 text
(俺の考えた) 最強のセキュリティルール
Slide 11
Slide 11 text
No content
Slide 12
Slide 12 text
つまり、クライアントで 書き込みも読み出しも しない!!!!!!!!!!
Slide 13
Slide 13 text
以上!
Slide 14
Slide 14 text
ありがとうございました!
Slide 15
Slide 15 text
というわけには、いかないので ちゃんとやります。
Slide 16
Slide 16 text
そもそも、セキュリティルールとは?
Slide 17
Slide 17 text
クライアントからの読み書きを制御するためのルール セキュリティルールがあるのは3つのサービス Realtime Database Cloud Firestore Cloud Storage
Slide 18
Slide 18 text
この3つのサービスはSDKから直接読み書きが可能 Realtime Database Firestore Storage
Slide 19
Slide 19 text
Realtime Databaseのセキュリティルール
Slide 20
Slide 20 text
Realtime Databaseとは - 書き込んだ内容をリアルタイムに同期してくれるデータベース - オフライン時でも書き込めるのでデベロッパーはネットワークを意識せず オンラインアプリが作れる。 - ゲームやチャットを作成するのに向いている - 以降、Realtime DBと呼ぶ
Slide 21
Slide 21 text
Realtime DBのルールはJSONで書いていく
Slide 22
Slide 22 text
全体公開
Slide 23
Slide 23 text
条件式を使ったデータの検証
Slide 24
Slide 24 text
上層でmatchすると下階層も同じルールが適用される
Slide 25
Slide 25 text
$otherを使ったKeyの制御 意図しないプロパティを書き込まれないために利用
Slide 26
Slide 26 text
Queryの制限 取得できる件数を制限できる。 例は100件まで
Slide 27
Slide 27 text
まぁぶっちゃけJSONで書くの辛い
Slide 28
Slide 28 text
辛いポイント - コメントが書けない - 関数がない - 型がない - 条件式部分にハイライトがない
Slide 29
Slide 29 text
そのための Bolt
Slide 30
Slide 30 text
Boltとは - Realtime DBのセキュリティルールを生成するための独自の言語 - コメントを書いたり関数の定義ができる - TypeScriptの様な型が定義ができる - https://github.com/firebase/bolt
Slide 31
Slide 31 text
No content
Slide 32
Slide 32 text
Cloud Storageのセキュリティルール
Slide 33
Slide 33 text
Cloud Storage とは - 画像、動画などサイズの大きいデータを保存するためのストレージ - SDKを通してクライアントから直接アップロードできる - セキュリティルールはJSONじゃなくて独自言語で記述できる - コメントもあるし関数も定義できる - readはgetとlistに分割できる - writeはcreate,update,deleteに分割できる
Slide 34
Slide 34 text
No content
Slide 35
Slide 35 text
注意点
Slide 36
Slide 36 text
GCSのアクセス制御と同期はしない resource.data.visibility == 'public' だと read: if false; でもURL経由から読み 取れる。 GCSの機能のため 詳しくは アクセス制御オプション 参照
Slide 37
Slide 37 text
Cloud Firestoreのセキュリティルール
Slide 38
Slide 38 text
Cloud Firestoreとは - Realtime DBの次世代のドキュメント指向データーベース - 基本Realtime DBと同じことができる - クエリーが強化されてたり、バックエンドはSpannerで作られているので インフラ面の安定感もある
Slide 39
Slide 39 text
Realtime DBとの違い (セキュリティ) - JSONじゃなくてStorageと同じ独自言語 - セキュリティルールとIndexの設定が分離 - IAMの設定もできる - ワイルドカードを除きルールがサブコレクションに適用されない - readはgetとlistに分割できる - writeはcreate,update,deleteに分割できる
Slide 40
Slide 40 text
No content
Slide 41
Slide 41 text
Queryの制限 取得できる件数を10件に制限する allow list: if request.query.limit <= 10
Slide 42
Slide 42 text
現在データベースにあるドキュメントの評価 allow write: if get(/databases/$(database)/documents/games/$( game)).data.referee == request.auth.uid; アクセスしようとしてるところのはresourceで取得できるが、 それ以外のところはget()で取得する。 get()やexists()は呼び出し回数に制限やreadの費用が掛かる。
Slide 43
Slide 43 text
protobuf-rules-gen
Slide 44
Slide 44 text
protobuf-rules-gen https://github.com/firebase/protobuf-rules-gen protocol bufferの定義から型検査をしてくれる セキュリティルールを生成するprotocのプラグイン
Slide 45
Slide 45 text
まとめ - セキュリティルールは必ず設定しよう - シミュレータやE2E Testを活用して十分にテストしよう
Slide 46
Slide 46 text
Enjoy @k2wanko
Slide 47
Slide 47 text
参考 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