はじめに
今回のテーマはGoogle Audit Logsです。
いわゆる証跡ログと呼ばれるもので、クラウド上のありとあらゆる操作や変更が記されているものです。
クラウド上の真実と言っても過言では無い証跡ですが、そのためには絶対に考えないといけない点があります。
それが完全性です。
完全性とは第三者やウイルスによって改ざんされたり、虚偽のデータが作成されたりせず、正しい情報のまま維持・保管されている状態のことです。
もし第三者や開発者、管理者が悪意ある行動を取りこの証跡を削除・改竄を出来てしまうと証拠を握りつぶされてしまいます。別の人に罪を被せる事も可能かもしれません。
この削除・改竄を抑制する対策はいくつかありますが今回は以下の3つを取り上げます。
-
プロジェクトの分離
- ログ保存用プロジェクトを作成
- サービス(アプリ)開発者・管理者はログ保存用プロジェクトにアクセスさせない
- ログ保存用プロジェクト保守人員への責任分担が容易
-
Cloud Storageのロック
- バケット保持ポリシーの所要時間(ログファイルが削除不可能な時間)の設定
- バケット保持ポリシー自体の変更ロック
-
ログルーターの作成
- 証跡ログを別のログ保存用プロジェクトにあるCloud Storageへ隔離する
※組織を活用し、組織全体のAudit Logを単一のプロジェクト(バケット)に集約する「集約シンク」もありますが、今回は組織的な管理がされていない小中規模のシステムを想定しています。
https://docs.cloud.google.com/logging/docs/export/aggregated_sinks_overview?hl=ja
前提条件
- プロジェクトはログ用プロジェクトとサービス用プロジェクトの二つを作成済み
- 解説においては両プロジェクト管理者相当のIAM権限を有しているとする
- 本来の運用は職務分掌したIAM運用をして下さい
- コンソールでの操作で解説
ログバケット用Cloud Storageの作成
ログ用プロジェクトにてバケットを作成します
- ログ用プロジェクトのコンソールにアクセス
- 「Cloud Storage」→「バケット」→「作成」をクリック
- 画面に従って任意のバケット名やリージョンなどを入力
- 「オブジェクト データを保護する方法を選択する」の項目にある「保持(コンプライアンス用)」にチェックを入れる
- 「バケット保持ポリシー」にチェックを入れ、「所用時間」を入力
- 初めての場合は、10秒など取り返しのつく数字から初めて下さい
- バケットを作成する
バケット保持ポリシーのロック
この設定はログ用プロジェクトの管理者でさえもバケットポリシーを変更不可になる為、実施可否を良く考えてから実行して下さい
- 上記で作成したバケットをクリック
- 「保護」タブをクリック
- 画面をスクロールし、「保持(コンプライアンス用)」→「バケット保持ポリシー」の項目を探す
- 該当項目にある「ロック」アイコンをクリック
- 以降、誰もバケット保持ポリシーを変更出来なくなる
- 何らかの事情でログが不要になった場合、「プロジェクトの削除」でのみ保持ポリシーを無視して削除可能
ログルーターの作成
- サービス用プロジェクトのコンソールにアクセス
- 「Cloud Logging」→「ログルーター」→「作成」の順にクリック
- 「シンク名」に任意の名前を入力→「次へ」をクリック
- 「シンクサービスの選択」で「Cloud Storageバケット」を選択
- 「Cloud Storageバケット」の欄に先ほど作成したバケット名を入力する
- 「参照」は同プロジェクト内バケットのみ表示されるため、使用不可
- 「包含フィルタ」にフィルターを登録
- 最初はデフォルトで作成済みの「__Default」や「__Required」のフィルターを参考にすると良い
- __Default
NOT LOG_ID("cloudaudit.googleapis.com/activity") AND NOT LOG_ID("externalaudit.googleapis.com/activity") AND NOT LOG_ID("cloudaudit.googleapis.com/system_event") AND NOT LOG_ID("externalaudit.googleapis.com/system_event") AND NOT LOG_ID("cloudaudit.googleapis.com/access_transparency") AND NOT LOG_ID("externalaudit.googleapis.com/access_transparency")
- __Required
LOG_ID("cloudaudit.googleapis.com/activity") OR LOG_ID("externalaudit.googleapis.com/activity") OR LOG_ID("cloudaudit.googleapis.com/system_event") OR LOG_ID("externalaudit.googleapis.com/system_event") OR LOG_ID("cloudaudit.googleapis.com/access_transparency") OR LOG_ID("externalaudit.googleapis.com/access_transparency")
- __Default
- 最初はデフォルトで作成済みの「__Default」や「__Required」のフィルターを参考にすると良い
- 「シンクを作成」をクリック
- シンクの新規作成完了後、バケットへ初回ログが出力されるまで2〜3時間かかる
- それ以降は1時間に一回の頻度で継続的に出力される
おわりに
以上の設定で証跡ログを別プロジェクトのログバケットへ保存し、ログバケットの中身の編集も不可能にしています。
クラウド上の真実を守り、怪しい動きをしっかり保存・監視出来る様にしましょう。