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