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