はじめに
Firebaseの定番データベースであるFirestore。お値段も手頃だし、リアルタイム同期が簡単にできるのでどんどん使いたいところですが、問題なのがセキュリティ。
サーバーサイドでRDB等に接続して使う場合は、そのハブになるプログラムの部分で権限制御していけばいいのですが、Firestoreを使う多くの場合は、クライアントから直接接続するため、Security ruleを使ったアクセス制限をしていかないとダメですよね。
ただ書くとしても、セキュリティルールも単純な場合はいいですが、少し複雑化するとちゃんとテストを書いておかないと、重大なセキュリティインシデントになりかねないものです。
むしろ、そこさえしっかりしていれば、かなり安全にFirestoreに使っていけるはずです。
そこで、専用のGitHubActionsを作りました!
使い方
GitHubActionsでセキュリティルールのテストを実行すでにしていたら簡単。
以下のステップを追加するだけです。
- name: coverage request
id: coverageRequest
uses: SonicGarden/firestore-rules-report-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
report-url: 'http://localhost:8080/emulator/v1/projects/project-test:ruleCoverage'
そうすると、プルリクのtriggerで動かしていた場合、プルリクコメントのところに、以下のような感じで全部テストが通ってることを表示してくれます。
Firestore rules coverage report!
🎉 Security rule test is covered!
もし、抜けてた場合は、以下のように行数とその行のセキュリティルールが表示されるようになっています。
Firestore rules coverage report!
😱 Lack of test rule lines!
6 allow write: if request.auth.token.admin == true;
8 allow write: if request.auth.token.admin == true;
13 allow read, write: if request.auth.token.admin == true;
注意点
何回か自分で使ってて引っかかったことを説明しておきます。
プルリクトリガーで動かして!
プルリクコメントに結果を出力します。
なので、commitのトリガーとかで作ってると何も起きてないように見えます。
emulatorとの接続、切断はテストで1回だけにして!
まず、これは、Firebase emulatorのテストレポートの仕組みを使っています。
https://firebase.google.com/docs/rules/emulator-reports?hl=ja
これが、テストのclearup直後のものしか保持されないようで、テストで毎回Firestoreの接続をクリアするような形になっていると、最後のテストの分しか判断してくれないので正常なカバレッジレポートを出力できません。
NGケースがあるかは検知できない
もう一つ、あくまでこれはカバレッジを見ているだけです。
なので、セキュリティルール上、NGになるケースは対象外になります。当たり前ですけどね。
ただ、セキュリティルールのテストという観点では、むしろNGになるケースの方が重要なことが多いです。
が、そのテストが書けているかどうかは判断できないということです。
まとめ
弊社SonicgardenのFirebaseを使ったプロジェクトではなるべく使うようにしていて、セキュリティルールのチェックにかなり役立っております。
プルリクに全部示されるので、いつかはやらなきゃ!が視覚化されるもの良いみたいです。。
間違っていたら、とんでもないことが起きかねないセキュリティルールだからこそ、手間でも少しでも状況を把握して悪いことはないはずです。
ぜひ、このGitHubActionsで、安心安全なFirestoreライフを送ってください!