OAuth - TECH PLAY - TECH PLAY

TECH PLAY

OAuth

イベント

該当するコンテンツが見つかりませんでした

マガジン

該当するコンテンツが見つかりませんでした

技術ブログ

Notebook Enterprise APIでできることの振り返り 詳しくは、前回の記事を参考いただくとして、Notebook Enterprise APIでできることは主に3つのリソースに対する操作です。
Google Workspace MCPとは 前章のおさらいですが、MCP(Model Context Protocol)は、AIアプリケーションと外部のデータやツールを接続するためのオープンな標準仕様です。AntigravityもMCPに対応しており、MCPサーバーを追加することで、Antigravityの外部にある情報を参照したり、外部サービスに対して操作を実行したりできます。
G-gen の三浦です。当記事では、Google SecOps の AI エージェントである Detection Engineering エージェント を使い、ある脅威を既存のルールで検出できるかを Antigravity CLI から評価した結果を紹介します。 概要 Google SecOps とは Detection Engineering エージェントとは 注意点 検証の手順 事前準備 必要な IAM ロール 対象ログのパーサー Application Default Credentials の構成 Antigravity CLI への SecOps MCP サーバーの登録 コンテキストの設定 カバレッジ評価スキルの導入 Detection Engineering エージェントの有効化 検証 カバレッジの評価 生成された脅威検出の機会 生成された合成イベント 生成されたルールのレビューとルールの作成 作成したルールのロジック確認 ルールの状態確認 概要 Google SecOps とは Google Security Operations (以下、Google SecOps)は、Google Cloud のセキュリティ運用プラットフォームです。SIEM、SOAR、脅威インテリジェンス、Gemini による AI 運用支援を1つのプラットフォームで提供します。 詳細は以下の記事を参照してください。 blog.g-gen.co.jp Detection Engineering エージェントとは Detection Engineering エージェント は、Google SecOps に組み込まれた AI 搭載のエンジニアリングアシスタントです。 MCP サーバー経由で Antigravity や Claude Code などの AI クライアントから使用でき、既存の検出ルールが脅威に対応できているかを評価します。検出できない範囲があれば、それを埋める YARA-L ルール(脅威を検出するルール)の案も生成します。 カバレッジ評価では、主に以下の 4 つのツールを使用します。 ツール名 できること generate_threat_detection_opportunity セキュリティブログや脅威レポートなどの文章から脅威の情報を抽出し、優先順位を付けた 脅威検出の機会 を作成する generate_synthetic_events 脅威検出の機会をもとに、その攻撃が起きたときに記録されるであろうログ( 合成イベント )を生成する evaluate_rule_coverage_long_running Google SecOps インスタンスの既存のルールが生成された合成イベントを検出するかを確認する generate_rules カバレッジ評価で見つかった検出の抜けを埋めるための YARA-L ルールの下書きを作成する 参考 : Evaluate threat coverage with the Detection Engineering Agent 参考 : Detecting and containing AI-powered threats with Google Security Operations agents 参考 : Google Security Operations によるエージェント型防御 注意点 Detection Engineering エージェントは、2026年9月現在、 Preview 版 です。当記事で解説する内容は一般提供(GA)の際に変更される可能性がある点に留意してください。Google SecOps サービス固有の規約の pre-GA サービス規約が適用され、サポートは制限されます。 参考 : プレビュー版の機能を管理する Preview 版のサービスや機能を使う際の注意点は、以下の記事も参考にしてください。 blog.g-gen.co.jp 検証の手順 当記事では、以下の流れで検証を行います。 同意フィッシング と呼ばれる不正な OAuth アプリの同意により Gmail などのデータを窃取する攻撃をテーマに、ルールの作成、検証、評価を実施します。 参考 : Protecting You Against Phishing 項番 項目 内容 1 事前準備 IAM ロールを付与し、Antigravity CLI に SecOps MCP サーバーとカバレッジ評価スキルを登録します。 2 Detection Engineering エージェントの有効化 Preview 機能が解放されているかを確認し、解放されていなければ有効化します。 3 カバレッジの評価 脅威を自然言語で入力し、脅威検出の機会と合成イベントの生成から既存ルールの評価までをエージェントに実行させます。 4 生成されたルールのレビューとルールの作成 検出できない場合に生成される YARA-L ルールをレビューして作成し、生成済みの合成イベントと条件式を突き合わせて意図した判定になるかを確認します。 事前準備 必要な IAM ロール Detection Engineering エージェントを呼び出すプリンシパル(Google アカウント/サービスアカウント)に、SecOps インスタンスが紐付くプロジェクトで以下の IAM ロールを付与します。 MCP ツールユーザー( roles/mcp.toolUser ) Chronicle API 閲覧者( roles/chronicle.viewer ) Chronicle API 編集者( roles/chronicle.editor ) Event Simulation の公式ドキュメントでは、この 3 つすべてが要件として挙げられています。 参考 : Use event simulation for detection coverage evaluation あわせて、後述する Preview 機能の有効化には、IAM ロールとは別に Google SecOps 内の 管理者 ロールが必要です。 参考 : Evaluate threat coverage with the Detection Engineering Agent 参考 : プレビュー版の機能を管理する 対象ログのパーサー パーサー は、取り込んだ生ログを Google SecOps 共通のデータ構造である Unified Data Model (以下、UDM)へ変換する仕組みです。主要なログタイプにはデフォルト パーサーが用意されており、Google SecOps 側で保守されます。 参考 : パーサーの概要 Detection Engineering エージェントは、評価したい脅威のログタイプに対応するパーサーが環境に存在することを前提としています。対応するパーサーがない場合、合成イベントの生成に失敗し、そのログタイプについてはカバレッジを評価できません。 参考 : Evaluate threat coverage with the Detection Engineering Agent Application Default Credentials の構成 Antigravity CLI から SecOps MCP サーバーへ接続する際に、Application Default Credentials(以下、ADC)を使用します。未構成の場合は、事前に以下を実行しておきます。 # ADC を構成する(ブラウザが開き、認証後に認証情報が保存される) gcloud auth application-default login Antigravity CLI への SecOps MCP サーバーの登録 Detection Engineering エージェントは MCP サーバー経由で操作します。当記事では AI クライアントとして Antigravity CLI を使います。Antigravity CLI のインストールと初期設定は、以下の記事で解説しています。 blog.g-gen.co.jp SecOps MCP サーバーの有効化と Customer ID の確認方法は、以下の記事をご参照ください。 blog.g-gen.co.jp Antigravity CLI の MCP 設定ファイル(当検証環境では ~/.gemini/config/mcp_config.json )に、SecOps MCP サーバーを登録します。 PROJECT_ID と URL のリージョン(例: asia-northeast1 )は環境に合わせて置き換えてください。 { " mcpServers ": { " secops ": { " serverUrl ": " https://chronicle.asia-northeast1.rep.googleapis.com/mcp ", " authProviderType ": " google_credentials ", " oauth ": { " scopes ": [ " https://www.googleapis.com/auth/chronicle " ] } , " headers ": { " x-goog-user-project ": " PROJECT_ID " } } } } agy コマンドで Antigravity CLI を起動し、 /mcp コマンドで MCP サーバーへの接続を確認します。ツール一覧が表示されれば、接続は成功です。   MCP Servers   Plugins ( ~/.gemini/config/plugins ) > ✓ secops Tools: get_case, list_case_comments, list_cases, update_case, get_case_alert, + 65 more   コンテキストの設定 SecOps MCP サーバーのツールは、リクエストごとに Customer ID・リージョン・プロジェクト ID を必要とします。毎回入力しなくて済むよう、公式ドキュメントは GEMINI.md にこれらを書いておくことを推奨しています。 # GEMINI.md   When using the GoogleSecOps MCP Server, use these parameters for EVERY request: Customer ID: CUSTOMER_ID Region: REGION Project ID: PROJECT_ID 参考 : Evaluate threat coverage with the Detection Engineering Agent - Set up a context file カバレッジ評価スキルの導入 公式ドキュメントは、Detection Engineering エージェントを detection-engineering-coverage-evaluation スキル 経由で操作することを強く推奨しています。 参考 : Evaluate threat coverage with the Detection Engineering Agent - Set up the skill to interact with the tools 参考 : SecOps Detection Coverage Skill 上記 skills は Google 公開のリポジトリに存在します。詳細は以下の記事を参照してください。 blog.g-gen.co.jp Antigravity CLI では、 ~/.gemini/skills/ 配下にスキル名のディレクトリを作り、 SKILL.md を配置すると読み込まれます。 # スキルを取得して配置する git clone https://github.com/google/skills.git mkdir -p ~/.gemini/skills cp -r skills/skills/cloud/detection-engineering-coverage-evaluation ~/.gemini/skills/ Antigravity CLI を起動して /skills を実行し、一覧に表示されれば読み込まれています。   Skills 11 skills   Create new skills Workspace: ~/work/develop/secops/dea-verification/.agents/skills/ { skill_name } /SKILL.md Global: ~/.gemini/antigravity-cli/skills/ { skill_name } /SKILL.md Shared: ~/.gemini/skills/ { skill_name } /SKILL.md   Shared skills · From ~/.gemini/skills detection-engineering-coverage-evaluation: Automates the end-to-end detection engineering workflow in Google SecOps using MCP tools. Use when fetching threat intelligence from blogs,...   Detection Engineering エージェントの有効化 2026年9月現在、Detection Engineering エージェントは Public Preview のため、先に機能の有効化が必要です。 Google SecOps のコンソールで [Settings] > [SIEM Settings] > [Public Preview] を選択します。テナントで使用できる Public Preview 機能が一覧表示されます。 パブリック プレビュー機能の一覧 以下の 2 つの機能が無効になっている場合は、[PREVIEW STATUS] をオンにして有効化します。 機能名 内容 Event Simulation Enabled (for DEA) 合成イベントを Google SecOps に取り込み、既存のルールで評価できるようにする機能。取り込まれた合成データと、そこから生成された検出結果は、本番のケースやアラートから隔離される Detection Engineering Agent Features Detection Engineering エージェントのツール群を使用できるようにする機能 機能の有効化 参考 : プレビュー版の機能を管理する 検証 カバレッジの評価 Antigravity CLI を起動し、以下のプロンプトを入力します。 /detection-engineering-coverage-evaluation で前手順で導入したスキルを使用します。 /detection-engineering-coverage-evaluation 悪意のある OAuth アプリへの同意により Google Workspace の情報を窃取される攻撃について、現在の環境で検出できる状態になっているかを評価してほしい。 エージェントは、使用するツールのスキーマを読み込んだうえで、脅威検出の機会の生成、合成イベントの生成、既存ルールの評価を順に実行します。評価は非同期処理で、当検証では完了まで約 35 分かかりました。   # 出力例   ### ワークフロー実行結果   #### 1. 脅威インテリジェンスの抽出 (Step 1)   • 入力ソース: ユーザー指定テキスト(プロンプトインジェクション等の問題なし) • 対象脅威: 悪意のある OAuth アプリケーションへのアクセス権限付与(同意)による Google Workspace 情報の窃取   #### 2. 脅威検出オポチュニティ (TDO) の生成 (Step 2)   • 生成数: 1 件 • TDO ( t01 ) : OAuth 同意フィッシング(Illicit Consent Grant)を通じて、悪意あるアプリに権限が付与され Google Workspace 内の情報を窃取される挙動を検出。 • MITRE ATT&CK: T1528 ( Steal Application Access Token ) / Credential Access ( TA0006 ) • 関連ログタイプ: WORKSPACE_ACTIVITY     #### 3. 擬似イベント (Synthetic Events) の生成 (Step 3)   • 生成イベント数: 4 件 • シミュレートされた挙動: • WORKSPACE_ACTIVITY(token アプリケーション)における不審な OAuth クライアントへの権限認可(authorize)および権限失効(revoke)イベント(Gmail・Google Drive・Directory 等への読み取りスコープ要求)。     #### 4. ルールカバレッジ評価 (Step 4 & 5)   • 評価対象イベント数: 4 件 • 検出結果: No rules matched ( 既存ルールでの検知なし ) • 現在の環境において、当該の OAuth アプリ同意イベントをトリガーとする検出ルールが存在しないカバレッジギャップが確認されました。     #### 5. ギャップ緩和・新規ルール生成 (Step 6)   • 未検出となった TDO に対して、新規 YARA-L 2 . 0 ルール(ttp_saas_oauth_consent_grant)を生成し、構文検証(validate_rule)にパスしました。 ────── ### 検出カバレッジ評価サマリー (Structured Output)   TDO: Detects the illicit granting of consent to malicious OAuth applications designed to access and exfiltrate Google Workspace information ( OAuth Consent Phishing ) .   Coverage Eval: [] ( No rules matched )   Missing Coverage:   • Summary: Google Workspace において悪意のある OAuth アプリケーションへの同意や権限付与(OAuth Consent Grant)を検知するルールが存在しませんでした。 • Generated Rule:   rule ttp_saas_oauth_consent_grant { ~省略~ }   Errors: [] ────── ### 次のステップ(ルールの作成確認)   生成された新規ルール ttp_saas_oauth_consent_grant を Google SecOps 環境に作成・登録しますか? 承認いただける場合は、環境へのルール作成(create_rule)を実行いたしますのでお知らせください。   既存のルールに一致するものがないと評価され、新規で YARA-L ルール案が提示されています。 生成された脅威検出の機会 脅威検出の機会 (Threat Detection Opportunity、以下 TDO)は、対象の攻撃を「どのログで探すか」「どの攻撃手口に当たるか」まで落とし込んだ定義です。当検証では 1 件生成されました。 { " id ": " t01 ", " logTypes ": [ " WORKSPACE_ACTIVITY " ] , " mitreInfo ": { " detectionStrategy ": " Cloud APIs ", " platform ": " SaaS ", " procedure ": " creation_oauth_consent_via_application ", " tactics ": [ " Credential Access " ] , " techniques ": [ " T1528 - Steal Application Access Token " ] } , " summary ": " Detects the illicit granting of consent to malicious OAuth applications designed to access and exfiltrate Google Workspace information (OAuth Consent Phishing). " } MITRE ATT&CK は、実際に観測された攻撃の手口を体系的にまとめたナレッジベースです。 T1528 のような技法番号で、個々の手口を識別します。各キーの内容は以下のとおりです。 キー 内容 生成された値 id TDO の識別子 t01 (後続の評価結果でも、この ID で対象を指します) logTypes 攻撃を探す対象のログ Google Workspace の監査ログ( WORKSPACE_ACTIVITY ) mitreInfo MITRE ATT&CK での分類 戦術は Credential Access、技法は T1528 (アプリケーションアクセストークンの窃取) summary 攻撃シナリオの要約 悪意のある OAuth アプリに同意させ、Google Workspace の情報を持ち出す 生成された合成イベント 合成イベント とは、攻撃が発生した場合に記録されるログを、攻撃を行わずに作成したものです。合成イベントは Google SecOps に実際に取り込まれ、取り込みクォータと検出クォータを消費します。TDO をもとに 4 件が生成されました。 # アプリ名 イベント 付与されたスコープ 検出の要否 1 O365 Mail Migration authorize gmail.readonly 、 drive 必要 2 O365 Mail Migration revoke 同上 不要 3 Zoom Integration for Google Workspace authorize admin.directory.user.readonly 、 contacts 不要 4 Zoom Integration for Google Workspace revoke 同上 不要 検出すべきログと、検出してはいけないログが混在しています。 4 件のうち 1 件目だけに一致するルール が、目指す状態です。 参考 : Use event simulation for detection coverage evaluation 生成されたルールのレビューとルールの作成 生成されたルールをそのまま作成すると、検出したい攻撃以外のログにも一致することがあります。公式ドキュメントも、生成されたルールは検出エンジニアがレビューしたうえでデプロイすることを前提としています。 内容を確認したらルールの作成を以下のように指示します。 確認したので、そのまま作成を進めてほしい。   # 出力例   Google SecOps 環境への新規ルール登録を完了しました。   ### 登録されたルール詳細   • Rule ID: ru_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx • Rule Name: google_workspace_malicious_oauth_consent_grant • Compilation State: SUCCEEDED • Severity: Medium • Run Frequency: LIVE   rule google_workspace_malicious_oauth_consent_grant { meta: author = " Detection Engineer " description = " Detects authorization/consent granting for OAuth applications requesting sensitive Google Workspace scopes (Gmail, Google Drive, Mail, or full mail access). " severity = " Medium " tactic = " TA0006 " technique = " T1528 "   events: $e .metadata.log_type = " WORKSPACE_ACTIVITY " $e .metadata.event_type = " USER_RESOURCE_ACCESS " $e .metadata.product_event_type = " authorize " $e .target.application = " OAuth Token "   // Sensitive scopes including full Gmail access ( mail.google.com ) and Google APIs scopes ( gmail, drive, mail ) re.regex ($e .target.resource.attribute.labels [" scope "] , ` ( https://mail \. google \. com/ | https://www \. googleapis \. com/auth/ ( gmail | drive | mail )) ` ) nocase   outcome: $app_name = $e .target.resource.name $granted_scopes = $e .target.resource.attribute.labels [" scope "] $principal_email = array_distinct ($e .principal.user.email_addresses ) $client_id = $e .principal.asset.attribute.labels [" client_id "] $client_type = $e .principal.asset.attribute.labels [" client_type "] $principal_ip = array_distinct ($e .principal.ip )   condition: $e }   Google SecOps 環境でルールが正常にデプロイされ、検出エンジニアリングのカバレッジ評価およびギャップ緩和のワークフローが完了しました。   作成したルールのロジック確認 作成したルールの条件式が前手順の合成イベントで意図した通りに検出できるかを確認します。各イベントとルールの条件式を 1 件ずつ突き合わせ、判定とその理由をエージェントに示させます。 作成したルールが、先ほどの合成イベント 4 件のうちどれに一致するかを確認してほしい。推測で答えず、生成した合成イベントを実際に参照すること。イベントごとに、一致・不一致とその理由を示してほしい。   # 出力例   生成された合成イベント 4 件の UDM データを実際に参照し、作成したルール google_workspace_malicious_oauth_consent_grant の各条件と照合しました。   ### ルール判定条件   1 . $e .metadata.log_type = " WORKSPACE_ACTIVITY " 2 . $e .metadata.event_type = " USER_RESOURCE_ACCESS " 3 . $e .metadata.product_event_type = " authorize " 4 . $e .target.application = " OAuth Token " 5 . re.regex ($e .target.resource.attribute.labels[ " scope " ], ( https://mail.google.com/ | https://www.googleapis.com/auth/ ( gmail | drive | mail ))) nocase ────── ### 合成イベントごとの照合結果   #### イベント 1 (O365 Mail Migration への認可)   • 判定: 一致(Match) • UDM 参照値: • metadata.log_type: " WORKSPACE_ACTIVITY " ( 一致 ) • metadata.event_type: " USER_RESOURCE_ACCESS " ( 一致 ) • metadata.product_event_type: " authorize " ( 一致 ) • target.application: " OAuth Token " ( 一致 ) • target.resource.attribute.labels [" scope "] : " https://www.googleapis.com/auth/gmail.readonly , https://www.googleapis.com/auth/drive " ( 一致 ) • 理由: 悪意のある OAuth アプリへの認可イベントであり、機微スコープ(Gmail / Drive)が含まれているため、すべての条件に合致して検知されます。 ────── #### イベント 2 (O365 Mail Migration の権限失効)   • 判定: 不一致(Not Matched) • UDM 参照値: • metadata.event_type: " USER_RESOURCE_UPDATE_PERMISSIONS " ( 不一致 / ルールは USER_RESOURCE_ACCESS ) • metadata.product_event_type: " revoke " ( 不一致 / ルールは authorize ) • target.resource.attribute.labels [" scope "] : " https://www.googleapis.com/auth/gmail.readonly , https://www.googleapis.com/auth/drive " ( スコープ条件自体は合致 ) • 理由: スコープ条件には合致しますが、権限付与(authorize)ではなく権限の失効・取り消し(revoke)イベントであるため除外されます。 ────── #### イベント 3 (Zoom Integration への認可)   • 判定: 不一致(Not Matched) • UDM 参照値: • metadata.event_type: " USER_RESOURCE_ACCESS " ( 一致 ) • metadata.product_event_type: " authorize " ( 一致 ) • target.application: " OAuth Token " ( 一致 ) • target.resource.attribute.labels [" scope "] : " https://www.googleapis.com/auth/admin.directory.user.readonly , https://www.googleapis.com/auth/contacts " ( 不一致 ) • 理由: 権限認可イベント(authorize)ですが、付与されたスコープが連絡先(contacts)およびディレクトリ参照(admin.directory.user. readonly )のみであり、ルールで指定した機微スコープ(Gmail / Drive / Mail)を含まないため意図どおり除外されます。 ────── #### イベント 4 (Zoom Integration の権限失効)   • 判定: 不一致(Not Matched) • UDM 参照値: • metadata.event_type: " USER_RESOURCE_UPDATE_PERMISSIONS " ( 不一致 ) • metadata.product_event_type: " revoke " ( 不一致 ) • target.resource.attribute.labels [" scope "] : " https://www.googleapis.com/auth/admin.directory.user.readonly , https://www.googleapis.com/auth/contacts " ( 不一致 ) • 理由: 権限失効イベント(revoke)であり、かつ機微スコープにも該当しないため除外されます。 ──────   作成したルールは、 4 件の合成イベントのうち 「機微スコープ(Gmail / Drive)へのアクセス権限が付与されたイベント(イベント 1 )」のみに正確に一致し、通常のアプリ連携や失効イベントは誤検知することなく除外されています。   作成したルールが、今回生成した合成イベント 4 件に対して意図どおりの判定になることを確認しました。 なお、このルールは指定したスコープへの権限付与を検出するものであり、OAuth アプリ自体の悪性を判定するものではありません。本番環境で運用する場合は、許可済みアプリの除外など、環境に応じたチューニングが必要です。 参考 : YARA-L 2.0 で参照リストとデータテーブルを使用する ルールの状態確認 コンソールで [Detections] > [Rules & Detections] > [Rules Dashboard] を開き、作成したルールを確認します。 ルールの状態 作成したルールは、[LIVE STATUS] が Disabled、[ALERTING] が OFF でした。受信イベントに対する検出を開始するには [LIVE STATUS] を、検出結果をアラートとして扱う場合は [ALERTING] を、それぞれ有効にします。 参考 : ライブデータにルールを適用する 三浦 健斗 (記事一覧) クラウドソリューション部 2023年10月よりG-genにジョイン。元オンプレ中心のネットワークエンジニア。 ネットワーク・セキュリティ・唐揚げ・辛いものが好き。 Google Cloud Partner All Certification Holders 2025 / Google Cloud Partner Top Engineer 2026

動画

該当するコンテンツが見つかりませんでした

書籍