G-gen の杉村です。当記事では、Google Cloud のセキュリティサービスである Security Command Center の機能の1つ、Event Threat Detection のカスタムモジュールについて解説します。また、あわせてミュートルールの作成方法についても触れます。
概要
Event Threat Detection とは
Event Threat Detection は、Google Cloud の Cloud Logging に記録されるログを分析し、脅威を検出するサービスです。Event Threat Detection は Security Command Center のプレミアムティアおよびエンタープライズティアで利用可能な機能です。
- 参考 : Security Command Centerを徹底解説。Google Cloud(GCP)の脆弱性を自動検知 - G-gen Tech Blog - Event Threat Detection
- 参考 : Event Threat Detection の概要
Event Threat Detection は、マルウェア、クリプトマイニング、不正な権限昇格、データ抜き取りの試みなど、さまざまな脅威を検出するための組み込みモジュール(プリセットの検知事項)を提供しています。これらのモジュールは Google の脅威インテリジェンスに基づいて継続的に更新されます。
カスタムモジュールとは
全ての組織のセキュリティ要件が組み込みモジュールだけで満たされるわけではありません。組織固有のポリシーや、特殊な利用パターンに対する脅威を検出したい場合、標準の脅威検出ルールでは不十分な場合があります。
そこで役立つのが、Event Threat Detection のカスタムモジュール機能です。カスタムモジュール(Custom modules)は、ユーザーが独自の脅威検出ロジックを定義し、Event Threat Detection に組み込むことができる機能です。
これにより、組織固有のセキュリティポリシー違反や、組み込みモジュールでカバーしきれないニッチな脅威シナリオに対応できます。カスタムモジュールは、Cloud Logging に集約されるさまざまなログソース、例として Cloud Audit Logs(監査ログ)、Cloud DNS ログ、VPC フローログなどを分析対象とすることができます。
カスタムモジュールを作成することで、以下のようなメリットがあります。
- 組織固有の脅威やコンプライアンス違反を検出できる
- 検知事項は Security Command Center と統合される
カスタムモジュールを使用しなくても、Cloud Logging のログアラート機能を用いることで、特定の監査ログが出力された際にメールや Slack 等へ発報することができます。しかし、カスタムモジュールを使うと、検知事項は Event Threat Detection の検知事項としてリストアップされるため、他の脆弱性や脅威と共通の管理ができます。無効化やミュート、ミュートルールなどを用いたり、Pub/Sub 経由で SIEM へ所定のフォーマットで通知するなどの設定が可能なため、セキュリティ運用を統一化できます。
料金
Event Threat Detection のカスタムモジュール機能の利用は、Security Command Center プレミアムティアやエンタープライズティアの料金に含まれており、追加料金はありません。
カスタムモジュールの定義
テンプレート
Event Threat Detection カスタムモジュールは、Security Command Center のコンソール画面、もしくは gcloud コマンドと JSON 形式の定義ファイルを使って定義します。
テンプレートが Google によってあらかじめ用意されており、これらを編集してカスタムモジュールを作成します。以下は、用意されているテンプレートの例です。
テンプレート名 | 説明 |
---|---|
予期しない Cloud API 呼び出し | 指定したメソッド、プリンシパル、リソースで API リクエストが行われたら検知 |
想定外のロールの付与 | 指定されたロールがユーザーに付与されたら検知 |
禁止されている権限があるカスタムロール | 指定された IAM 権限を含むカスタムロールが作成または更新されたら検知 |
ブレークグラス アカウントの使用 | 指定したブレークグラスアカウント(緊急アクセス用アカウント)が使用されたら検知。 |
想定外の Compute Engine インスタンス タイプ | 指定していないインスタンスタイプや CPU、GPU、RAM 構成の VM が起動されたら検知 |
構成可能な不正ドメイン | 指定されたドメイン名への接続を検知 |
構成可能な不正 IP | 指定された IP アドレスへの接続を検知 |
モジュールのレベル
Event Threat Detection カスタムモジュールは、組織、フォルダ、またはプロジェクトのレベルで作成できます。
親リソースで作成したモジュールは、子リソースへ継承されます。組織全体で検知を有効化したい場合は、組織の最上位ノードでカスタムモジュールを作成します。
カスタムモジュールの実装
特定の API 呼び出しの検知
当記事では、例としてテンプレート「予期しない Cloud API 呼び出し」を使った実装を紹介します。組織内にプロジェクトが作成された場合に、検知されるようにします。会社や組織によっては、情報システム部や CCoE にあたる部署が Google Cloud プロジェクトの払い出しを統合管理しており、ユーザーが独自にプロジェクトを作成することを禁止していますが、ユーザーが意図せずプロジェクト作成権限を持ってしまい、このルールに違反したような場合に検知することを想定しています。
当記事では、テンプレート「予期しない Cloud API 呼び出し」を使い、メソッド CreateProject
を検知することで実現します。なお当記事では設定しませんが、同様の方法でメソッド名を DeleteProject
とすることで、プロジェクトが削除された場合の検知も設定できます。
モジュールの定義
当記事では、Google Cloud コンソールを用いてモジュールを定義します。当記事に掲載されているスクリーンショットは、Security Command Center のエンタープライズティアのものです。プレミアムティアでは画面の体裁が異なる場合がありますので、ご注意ください。
まず、Google Cloud コンソールにログインし、Security Command Center 画面へ遷移します。操作する Google アカウントには、モジュールを作成する組織・フォルダまたはプロジェクトのレベルでセキュリティセンター管理者(roles/securitycenter.admin
)ロールなどが必要です。
画面左上部のプロジェクトセレクタで、モジュールを作りたいリソース(組織、フォルダ、プロジェクト)が選択されていることを確認したら、左部ペインの「設定」ブロックにある「SCC の設定」をクリックします。

「Event Threat Detection」のカードの中の「設定を管理」をクリックします。

「モジュール」タブをクリックします。この画面では、規定の組み込みモジュールのほか、カスタムモジュールが一覧表示されています。「モジュールを作成」をクリックします。

テンプレートを選択します。今回は「API 呼び出し」をクリックし、表示された「選択」ボタンをクリックします。

次の画面で、モジュールの設定を定義します。

モジュール名は、検知一覧で検出カテゴリとして表示されます。先頭は英小文字である必要があり、記号はアンダースコアのみが使用できます。検知事項一覧では、アンダースコアがスペースに置き換わり、google_cloud といった単語は Google Cloud と表示されます。モジュール名を例のように google_cloud_project_created
とすると、検知一覧では Unexpected cloud API call: Google Cloud project created
と表記されます。
「プリンシパルに関するアラート」では、どのプリンシパルによって行われた API リクエストを検知するかを定義します。定義は、RE2 正規表現で記述します。正規表現に慣れていない方は、Gemini アプリ(https://gemini.google.com/)などを利用してもよいでしょう。ここでは、.*
として、すべてのプリンシパルによるプロジェクト作成を検知します。
「メソッドに関するアラート」では、検知対象の API メソッドを定義します。ここでは CreateProject
を指定します。
「リソースに関するアラート」では、検知対象のリソースを定義します。ここでは正規表現で .*
として、プロジェクトがどのような ID で作成されても検知されるようにします。
「次へ」を押下して、次の設定に移ります。

「重大度」「説明」「次のステップ」を定義します。
重大度は、検知事項のフィルタリングなどに用いる重大度の設定です。「説明」「次のステップ」は、検知事項の詳細画面に表示されます。セキュリティ運用者が適切な対処を取れるよう、わかりやすい説明や対処方法を入力しておきます。
動作確認
プロジェクトを実際に作成して、検知されるかどうかを確認します。組織に detect-me-0001
という ID のプロジェクトを作成しました。作成後、Security Command Center コンソール画面の「検出結果」画面へ遷移します。
カスタムモジュールによる検知事項だけを表示するには、「検出結果」画面の左下部分のフィルタで、「ソースの表示名」ブロックのフィルタで「Event Threat Detection Custom Modules」だけにチェックマークを入れます。ソース名が省略されている場合は、マウスオーバーすることで確認できます。

なお、以下のスクリーンショットのように検知事項の一覧表のカラム名部分が縦に引き伸ばされてしまい表が見づらい場合、「Affected runtime resources > Count」「Attack exposure > Score」「有害な組み合わせ > 有害な組み合わせスコア」などのチェックを外せば、カラムが省略され、テーブルが正しく見えるようになります(2025年5月現在、エンタープライズティア)。

今回は、以下の4つの検知事項が確認されました。リソースの表示名が「detect-me-0001」となっているのが、今回検知したかったプロジェクトです。

検知事項の詳細
検知された項目名をクリックすると、詳細が表示されます。カスタムモジュールで定義された重大度、説明、次のステップなどが表示されています。

また、JSON タブを選択すると、検知事項の詳細を JSON 形式で確認できます。この中に含まれている sourceProperties.properties
という要素には、カスタムモジュールにより検査される値が含まれています。この値が正規表現に当てはまると、検知が行われます。

ミュートルールの作成
ミュートすべき検知事項
先の検証結果では、目的のプロジェクト以外にも3つの検知が行われていました。リソースの表示名が「sugimura_fld」となっているのは、新規作成した「detect-me-0001」プロジェクトを格納するフォルダ名です。
これは、プロジェクトの作成操作を行って CreateProject メソッドが実行される際、「プロジェクト ID をリソース名とする監査ログ」と「フォルダ ID をリソース名とする監査ログ」の2つが必ず出力されてしまう仕様に起因します。1つのプロジェクトの作成に対して2つのログが出力されてしまうため、検知事項も2つ生成されてしまいます。このとき、後者のログはノイズとなり得ますので、抑止することが望ましいです。
また、リソースの表示名が「sys-82688xxx」「apps-script」となっている検知事項は、Google Apps Script(GAS)スクリプトを作成した際に自動作成されるプロジェクト、およびそれを格納するフォルダの検知です。検証の前後で、組織内の誰かが GAS スクリプトを作成したために検知されたものです。これらのプロジェクトの作成時も、先と同じ理由で2つの検知事項が生成されてしまいます。これらの GAS による自動作成プロジェクトの検知も、ノイズとなり得ます。
これらのノイズを抑止するため、ミュートルール を利用することができます。ミュートルールを作成することで、所定のルールに基づいて、自動的に検知事項をミュートできます。
フォルダの CreateProject 検知の抑止
検知事項の詳細画面を開き、「ミュートオプション」メニューから「これに類似する検出結果をミュート」を選択します。

ミュートルール ID を命名し、説明を追加します。重要なのは、検出クエリです。ミュート対象とする検知結果の条件を Cloud Logging クエリ言語で記述することができるほか、「フィルタを追加」ボタンから GUI で選択できます。

今回は、検知結果のリソースタイプがフォルダである場合に検知結果をミュートするよう定義します。検出クエリは以下のようになります。
category="Unexpected Cloud API Call: google_cloud_project_created" AND resource.type="google.cloud.resourcemanager.Folder"
また、別のミュートルールを新規作成し、GAS による自動作成プロジェクトも検知対象外とします。GAS のプロジェクトは、Google の管理するサービスアカウント appsdev-apps-dev-script-auth@system.gserviceaccount.com
によって作成されるため、このサービスアカウントによって作成された場合はミュート対象とします。なお、先ほどと同じミュートルールの中に、以下の access.principal_email
条件を OR でつなげて記載しても構いません。
category="Unexpected Cloud API Call: google_cloud_project_created" AND access.principal_email="appsdev-apps-dev-script-auth@system.gserviceaccount.com"
動作確認のため、プロジェクト「detect-me-0002」を作成します。以下のように、新たに検知されたリソース表示名がフォルダの検知事項は表示されなくなりました。なおフィルタでミュートステータスが MUTED
のものを表示させることで、ミュート済みの検知事項を再表示することができます。

ミュートルール作成前に検知された検知事項は新たにルールを作ってもミュートされないため、手動でミュートします。検知事項を選択し、「ミュートのオーバーライドを適用」をクリックすることで、検知事項を手動でミュートできます。
杉村 勇馬 (記事一覧)
執行役員 CTO / クラウドソリューション部 部長
元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 認定資格および Google Cloud 認定資格はすべて取得。X(旧 Twitter)では Google Cloud や Google Workspace のアップデート情報をつぶやいています。
Follow @y_sugi_it