[2021.09.30 更新]
コメントにて2021年9月2日に再リリースが行われた旨ご指摘いただきました(ありがとうございます!)。
また監査ログを取得できるようになりました🙆♂️
[2021.07.26 更新]
パワーアップした監査ログですが再度Futureリリースになり利用できなくなりました🥲
サマリ
- 2021年7月16日、Firestore(ネイティブモード)の監査ログ機能が拡充されました1
Added DATA_READ and DATA_WRITE Data Access audit logs.
- 以前の監査ログでは、例えばインデックスの操作やドキュメントのImport/Exportといった管理者寄りの監査ログが取得できていました2
- 今回の機能拡充で、上記に加えFirestoreへのデータアクセスについてよりリッチな監査ログが残るようになりました
- 例:Firebase Webコンソールからデータを操作したログ、エンドユーザがモバイルアプリから直接ドキュメントを操作したログ etc.
- どんなログが取れるのか、注意すべき点はあるか等について調査を行いました
- 調査しながら帰納的に獲得した結論を多分に含みます(加えてまだPreview版なので今後更改される可能性アリ)
事前知識
- FirestoreにはネイティブモードとDatastoreモードがあり、今回はネイティブモードが対象です。ざっくり言えばアプリから直接アクセス可能なのがネイティブモードで、世間的にもFirestoreと言えばネイティブモードを指す場合が多いように思います3
- Google Cloudでは取得したいデータアクセス監査ログをサービス毎に有効化する必要があります
- Google Cloudコンソール > 監査ログ > Firestore/Datastore API > データ読み取り/データ書き込みをON4
- 以降ではデータアクセス監査ログを有効化した前提で話を進めます
##取得できるFirestore監査ログについて
下記3つの観点から説明します。
- 「どこ」でログを確認できるのか
- 「誰」のログが取れるのか
- 「どんな」ログが取れるのか
「どこ」でログを確認できるのか
Cloud Loggingで確認できます。
Google Cloudコンソール > Cloud Logging > クエリフィールドに下記を入力し実行します5。
resource.type="audited_resource" resource.labels.service="firestore.googleapis.com"
「誰」のログが取れるのか
Firestoreへのアクセス主体は大きく3つ考えられると思います。
- Googleアカウント(ユーザアカウント)
- FirebaseのWebコンソールから直接閲覧
- サーバアプリケーション
- サービスアカウントを付与したサーバがAdmin SDKを使ってバッチジョブを実行
- モバイル/Webアプリ
- モバイル/WebアプリがSDK越しに直接Firestoreにアクセス
これら全ての場合について監査ログを取得可能です。
Cloud Logging上のFirestore監査ログにはprotoPayload.authenticationInfo.principalEmail
フィールドがあります。
{
"protoPayload": {
...
"authenticationInfo": {
"principalEmail": "...",
...
},
...
}
}
このprincipalEmail
に、
- Googleアカウントの場合
- コンソールを操作したGoogleアカウントのメールアドレス
- 例:google-account-name@domain-name.com
- サーバアプリケーションの場合
- サーバが使用しているサービスアカウントのメールアドレス
- 例:service-account-name@project-id.iam.gserviceaccount.com
- モバイル/Webアプリの場合
- Firebaseセキュリティルールのサービスアカウントのメールアドレス6
- 例:service-project-number@firebase-rules.iam.gserviceaccount.com
が入ります。
モバイル/Webアプリからの直接アクセスもようやくロギングされるようになってステキですね!
「どんな」ログが取れるのか
これはドキュメントに詳しく記載されているので直接見た方が早いと思いますが一応転記いたします7。
- データアクセスログ(DATA_READ)
- GetDocument
- ListDocuments
- BatchGetDocuments
- BeginTransaction
- 書き込みのないCommit
- Rollback
- RunQuery
- PartitionQuery
- ListCollectionIds
- Listen(ストリーミング)
- データアクセスログ(DATA_WRITE)
- CreateDocument
- UpdateDocument
- DeleteDocument
- Commit(書き込みあり)
- BatchWrite
- Write(ストリーミング)
様々に取得できますが、FirestoreへのCRUDは基本的に全て取得できる理解で良いと思います。
加えて、Listen等のFirestoreらしい機能に関する監査ログも取得できます。
補足事項
監査ログに対して除外の設定をしなかった場合、エンドユーザ(モバイル/Webアプリ)からのデータアクセスも全てCloud Loggingに吐かれます。
Cloud Loggingは良心的な値段設定ではありますが、それでも不要な課金が発生するのは避けたい場合があるかもしれません。
また、要件によっては、エンドユーザのデータアクセスログはCloud Loggingに吐きたくない場合があるかもしれません。
その場合、
Google Cloudコンソール > 監査ログ > Firestore/Datastore API > 「除外ユーザー」
に前述の「Firebaseセキュリティルールのサービスアカウント」を追加してあげれば、エンドユーザのログがCloud Loggingに流れなくなります。
ケースバイケースで設定するようにすれば良いと思います8。
-
2021年7月20日現在まだプレビュー版 ↩
-
ADMIN_READ/ADMIN_WRITE ↩
-
DatastoreモードはDatastoreがFirestoreに統合された都合で生まれたモードだと認識しています ↩
-
あらゆる監査ログがCloud Loggingに吐かれるようになるため、料金が嵩む場合があります。後述しますが、大量のユーザアクセスがある場合等は「除外ユーザー」を設定してください ↩
-
⌘ + Enter ↩
-
余談ですが、Firebaseセキュリティルールのサービスアカウントは、Firebaseプロジェクトによって自動生成されるサービスアカウントです。こちらに記載されているように、普段はFirebaseセキュリティルールの管理を行うために用いられます ↩
-
2021年7月20日現在 ↩
-
更に細かくログを流したい場合は、ログバケットへの追加に関してのみ除外し、別のシンクでGCSに流す等の手段も考えられますがそれはまた別のお話 ↩