Google Workspace CLIの--sanitizeフラグでModel Armorを使ってみた
はじめに
クラウド事業本部コンサルティング部の渡邉です。
Google Workspace CLI皆さん利用されていますか?
Google Workspace CLIとは、Drive、Gmail、Calendar、Sheets、Docsなど、すべてのWorkspace APIをコマンドラインから操作できるツールで、Claude Codeと連携した活用も可能です。
その中でも注目したいのが、--sanitizeフラグによるModel Armor連携です。AIエージェントがWorkspaceのデータを読み取る際、悪意のあるコンテンツ(プロンプトインジェクション等)がエージェントに到達する前にModel Armorでスクリーニングできます。Model ArmorはVertex AIでも利用可能で、アプリケーションからGeminiを呼び出す際に、Model Armorを間にかませて、悪意のあるコンテンツやプロンプトインジェクションなどをブロックさせることができます。
今回は、Model Armorの概要と主要なフィルター機能の解説、そしてGoogle Workspace CLIの--sanitizeフラグを使ったModel Armor連携の設定・動作確認までの流れを見ていきたいと思います。
Google Workspace CLIのインストールと基本的な使い方、最低限気を付けるべきポイントについては、以前のブログ記事をご参照ください。
Model Armorとは
Model Armorは、AIアプリケーションのセキュリティと安全性を強化するGoogle Cloudサービスです。LLMに送信されるプロンプト(入力)とLLMが生成するレスポンス(出力)をプロアクティブにスクリーニングし、さまざまなリスクからアプリケーションを保護します。
Google Cloudでは、Vertex AIをはじめ、Gemini EnterpriseやGKEでModel Armorを連携させることができます。
Google Cloud以外では、Model ArmorのREST APIを利用することで、マルチクラウド環境にも対応させることができ、AIの安全性・セキュリティポリシーを一貫して適用できます。
アーキテクチャ
Model Armorは、ユーザーとLLMの間に位置するセキュリティレイヤーとして機能します。データフローは以下の通りです。
- ユーザーがアプリケーションにプロンプトを送信
- Model Armorがプロンプトを検査(有害コンテンツ、プロンプトインジェクション等)
- プロンプト(またはサニタイズ済みプロンプト)がLLMに送信
- LLMがレスポンスを生成
- Model Armorがレスポンスを検査
- レスポンス(またはサニタイズ済みレスポンス)がユーザーに返却。トリガーされたフィルターとトリガーされなかったフィルターの詳細情報がレスポンスに含まれる

主要なフィルター
Model Armorは以下のフィルターカテゴリを提供しています。
| フィルター | 説明 |
|---|---|
| Responsible AI(RAI) | ヘイトスピーチ、ハラスメント、性的コンテンツ、危険なコンテンツを検出 |
| プロンプトインジェクション・ジェイルブレイク検出 | AIモデルの指示を無視させたり、安全プロトコルを回避させる悪意のあるプロンプトを検出 |
| 悪意のあるURL検出 | フィッシングやマルウェア配布に使用される悪意のあるURLを検出(プロンプト・レスポンス内の先頭40件をスキャン) |
| Sensitive Data Protection(SDP) | クレジットカード番号、SSN、Google Cloud認証情報等の機密データを検出・秘匿化 |
| CSAM | 児童性的虐待素材を検出(デフォルトで有効、無効化不可) |
信頼度レベル(Confidence Level)
RAIフィルターとプロンプトインジェクション・ジェイルブレイク検出フィルターには、検出の厳格さを制御する信頼度レベルを設定できます。
| レベル | 説明 |
|---|---|
| HIGH | 高い信頼度のコンテンツのみ検出。誤検知が最も少ない |
| MEDIUM_AND_ABOVE | 中程度以上の信頼度のコンテンツを検出。バランスの取れた設定 |
| LOW_AND_ABOVE | 低い信頼度以上のすべてのコンテンツを検出。最も厳格だが誤検知の可能性が高い |
テンプレートとエンフォースメントタイプ
Model Armorでは、テンプレートを使ってフィルターの構成を定義します。テンプレートは再利用可能な設定セットで、有効にするフィルター、各フィルターの信頼度レベル、エンフォースメントタイプを指定します。
エンフォースメントタイプには以下の2種類があります。
| タイプ | 説明 |
|---|---|
| Inspect only(検査のみ) | ポリシー違反を検出するが、リクエストをブロックしない。Cloud Loggingと組み合わせて利用 |
| Inspect and block(検査+ブロック) | ポリシー違反を検出し、該当リクエストをブロックする |
対応言語
RAIフィルターとプロンプトインジェクション・ジェイルブレイク検出フィルターは、以下の言語でテストされています。
- 英語
- スペイン語
- フランス語
- イタリア語
- ポルトガル語
- ドイツ語
- 中国語(北京語)
- 日本語
- 韓国語
日本語もサポートされているため、日本語の生成AIアプリケーションにも組み込むことができます。
これ以外の言語でも動作しますが、検出品質が異なる場合があります。多言語検出はテンプレート作成時、またはリクエスト単位で有効化できます。
ドキュメントスクリーニング
Model Armorはテキストだけでなく、以下のドキュメント形式のスクリーニングにも対応しています。
- PDF、CSV、TXTファイル
- Microsoft Word(DOCX、DOCM、DOTX、DOTM)
- Microsoft PowerPoint(PPTX、PPTM、POTX、POTM、POT)
- Microsoft Excel(XLSX、XLSM、XLTX、XLTM)
利用可能なリージョン
Model Armorは以下のリージョンで利用可能です。
| エリア | リージョン |
|---|---|
| アジア太平洋 | asia-southeast1(シンガポール)、asia-south1(ムンバイ) |
| 米国 | us-central1(アイオワ)、us-east1(サウスカロライナ)、us-east4(バージニア)、us-west1(オレゴン) |
| ヨーロッパ | europe-west1(ベルギー)、europe-west2(ロンドン)、europe-west3(フランクフルト)、europe-west4(オランダ) |
| マルチリージョン | eu、us |
2026年3月現在では、東京リージョン (asia-northeast1)での利用はサポートされていませんでした。
東京リージョンでの利用ニーズはあると思うので、早めにサポートされることを願います。
Google Workspace CLIとModel Armorの連携
AIエージェントがGoogle Workspace CLIを通じてGmailやDriveのデータを読み取る際、そのデータにプロンプトインジェクションが埋め込まれている可能性があります。たとえば、悪意のあるユーザーがDrive上のドキュメントにエージェントの動作を乗っ取るような内容を仕込むケースが考えられます。
Google Workspace CLIの--sanitizeフラグを使うと、Workspace APIのレスポンスがエージェントに渡される前にModel Armorでスクリーニングされ、こうした攻撃を防ぐことができます。
Google Workspace CLIでModel Armorを試してみる
前提条件
- Google Workspace CLIがインストール・認証済みであること
gcloudCLIがインストール・認証済みであること- Model Armor APIを有効化したGoogle Cloudプロジェクトに対して
gcloud auth application-default loginで認証済みであること(--sanitizeフラグによるModel Armor APIの呼び出しにGoogle Cloudの認証情報が使用されるため) gws auth loginでGoogle Workspace CLIの認証済みであることroles/modelarmor.adminロール(テンプレート作成用)およびroles/modelarmor.userロール(サニタイズ実行用)が付与されていること
Model ArmorのAPIの有効化
Model Armorを利用するためには、プロジェクト上でModel Armor APIを有効化する必要があります。
Google Cloudコンソールから、【セキュリティ】->【Model Armor】をクリックしてModel Armorへアクセスします。
初めてアクセスすると、Model Armor APIを有効にするをクリックします。

有効にするをクリックします。

gcloudコマンドで有効化することも可能です。
# Model Armor APIの有効化
gcloud services enable modelarmor.googleapis.com --project=${GOOGLE_CLOUD_PROJECT}
gcloud CLIでModel Armorを操作する場合は、APIエンドポイントの設定も必要です。Model Armorはグローバルエンドポイントを持たず、リージョナルエンドポイントのみで提供されているため、gcloud CLIのリクエスト先を明示的に指定する必要があります。
# Model Armorのリージョナルエンドポイントをgcloudに設定
gcloud config set api_endpoint_overrides/modelarmor \
"https://modelarmor.us-central1.rep.googleapis.com/"
この設定を行わないと、以下のようにgcloud model-armor templates list等のコマンド実行時にPERMISSION_DENIEDエラーが発生する場合があります。
$ gcloud model-armor templates list --location=us-central1 --project=XXXXXXXXXX
ERROR: (gcloud.model-armor.templates.list) PERMISSION_DENIED: Read access to project 'XXXXXXXXXX' was denied. This command is authenticated as XXXXXXXXXX@XXXXXXXXXX.XX which is the active account specified by the [core/account] property
Model Armorテンプレートの作成
Google Workspace CLIで--sanitizeフラグを利用するには、事前にGoogle Cloud側でModel Armorテンプレートを作成しておく必要があります。
- テンプレートID:gws-cli-sample-template
- ロケーションタイプ:リージョン(us-central1(アイオワ))
- 検出
- 悪意のあるURLの検出【チェック】
- プロンプトインジェクションとジェイルブレイクの検出【チェック】
- 機密データの保護【チェック】
- 基本
- 検出タイプ:基本
- 責任あるAI
- ヘイトスピーチ:中以上
- 危険:中以上
- 性的に露骨な表現:中以上
- 嫌がらせ:中以上
- ロギングの構成
- テンプレートオペレーション【チェック】
- プロンプトと回答【チェック】
- 多言語対応【チェック】
を入力し、【作成】をクリックする。

テンプレートが作成されたことを確認します。

テストデータの作成
今回は、Sensitive Data Protection(SDP)の検知・ブロックの確認を行いたいので、マイドライブにテストデータを記載したGoogleドキュメントを作成してみました。
=== SDP検出テスト用データ ===
【クレジットカード番号】
Visa: 4111-1111-1111-1111
Mastercard: 5500-0000-0000-0004
【米国社会保障番号(SSN)】※US リージョンのみ
SSN: 123-45-6789
【米国個人納税者番号(ITIN)】※US リージョンのみ
ITIN: 912-34-5678
【金融口座番号】
口座番号: 1234567890123456
【Google Cloud APIキー】
API Key: AIzaSyA1234567890abcdefghijklmnopqrstuvw
【パスワード】
password: MyS3cur3P@ssw0rd!
このファイルをGoogle Workspace CLIコマンドを利用して、読みだしてみたいと思います。
--sanitizeフラグなしで読みだしてみる
まずは、Google Workspace CLIから--sanitizeフラグなしでGoogleドキュメントを読みだしてみたいと思います。
gws drive files listコマンドで、マイドライブ上のSDP検出テスト用データのIdを取得します。
$ gws drive files list --params '{"q": "mimeType=\"application/vnd.google-apps.document\" and \"me\" in owners", "pageSize": 1}'
{
"files": [
{
"id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"kind": "drive#file",
"mimeType": "application/vnd.google-apps.document",
"name": "SDP検出テスト用データ"
}
],
"incompleteSearch": false,
"kind": "drive#fileList",
"nextPageToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
次に、取得したIdを利用してgws docs documents getコマンドでGoogleドキュメントの内容を確認してみます。
出力されるjsonファイルの内容が多いため、必要なデータのみ出力するようにjqコマンドで整形します。
gws docs documents get --params '{"documentId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}' | jq -r '.body.content[].paragraph?.elements[]?.textRun?.content // empty'
=== SDP検出テスト用データ ===
【クレジットカード番号】
Visa: 4111-1111-1111-1111
Mastercard: 5500-0000-0000-0004
【米国社会保障番号(SSN)】※US リージョンのみ
SSN: 123-45-6789
【米国個人納税者番号(ITIN)】※US リージョンのみ
ITIN: 912-34-5678
【金融口座番号】
口座番号: 1234567890123456
【Google Cloud APIキー】
API Key: AIzaSyA1234567890abcdefghijklmnopqrstuvw
【パスワード】
password: MyS3cur3P@ssw0rd!
--sanitizeフラグを設定していないため、特に問題なくデータが読み出せてしまっています。
--sanitizeフラグでModel Armorを利用する
次に、Model Armorテンプレートのリソース名を--sanitizeフラグに指定して、Workspace APIのレスポンスをスクリーニングしてみます。
$ gws docs documents get --params '{"documentId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}' --sanitize "projects/XXXXXXXXXX/locations/us-central1/templates/gws-cli-sample-template" | jq -r '.body.content[].paragraph?.elements[]?.textRun?.content'
⚠️ Model Armor: prompt injection detected (filterMatchState: MATCH_FOUND)
=== SDP検出テスト用データ ===
【クレジットカード番号】
Visa: 4111-1111-1111-1111
Mastercard: 5500-0000-0000-0004
【米国社会保障番号(SSN)】※USリージョンのみ
SSN: 123-45-6789
【米国個人納税者番号(ITIN)】※USリージョンのみ
ITIN: 912-34-5678
【金融口座番号】
口座番号: 1234567890123456
【Google Cloud APIキー】
API Key: AIzaSyA1234567890abcdefghijklmnopqrstuvw
【パスワード】
password: MyS3cur3P@ssw0rd!
今回は、--sanitizeフラグを設定しているため、Model Armorによるスクリーニングが実行され、Sensitive Data Protection(SDP)の検知に該当したことで以下の警告が出ています。
⚠️ Model Armor: prompt injection detected (filterMatchState: MATCH_FOUND)
しかし、テストデータ自体は読み取れてしまっています。あくまでも警告が表示されるのみです。
これは、gws CLIの環境変数GOOGLE_WORKSPACE_CLI_SANITIZE_MODEのデフォルト値がwarn(警告のみ)に設定されているためです。blockに変更することで、検出時にレスポンスをブロックできます。
export GOOGLE_WORKSPACE_CLI_SANITIZE_MODE="block"
環境変数GOOGLE_WORKSPACE_CLI_SANITIZE_MODEの値をblockに設定してみて、再度--sanitizeフラグを指定したコマンドを実行してみます。
$ gws docs documents get --params '{"documentId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}' --sanitize "projects/XXXXXXXXXX/locations/us-central1/templates/gws-cli-sample-template"
⚠️ Model Armor: prompt injection detected (filterMatchState: MATCH_FOUND)
{
"error": "Content blocked by Model Armor",
"sanitizationResult": {
"filterMatchState": "MATCH_FOUND",
"filterResults": {
"csam": {
"csamFilterFilterResult": {
"executionState": "EXECUTION_SUCCESS",
"matchState": "NO_MATCH_FOUND"
}
},
"malicious_uris": {
"maliciousUriFilterResult": {
"executionState": "EXECUTION_SUCCESS",
"matchState": "NO_MATCH_FOUND"
}
},
"pi_and_jailbreak": {
"piAndJailbreakFilterResult": {
"confidenceLevel": "MEDIUM_AND_ABOVE",
"executionState": "EXECUTION_SUCCESS",
"matchState": "MATCH_FOUND"
}
},
"rai": {
"raiFilterResult": {
"executionState": "EXECUTION_SUCCESS",
"matchState": "NO_MATCH_FOUND",
"raiFilterTypeResults": {
"dangerous": {
"matchState": "NO_MATCH_FOUND"
},
"harassment": {
"matchState": "NO_MATCH_FOUND"
},
"hate_speech": {
"matchState": "NO_MATCH_FOUND"
},
"sexually_explicit": {
"matchState": "NO_MATCH_FOUND"
}
}
}
},
"sdp": {
"sdpFilterResult": {
"inspectResult": {
"executionState": "EXECUTION_SUCCESS",
"findings": [
{
"infoType": "CREDIT_CARD_NUMBER",
"likelihood": "VERY_LIKELY",
"location": {
"byteRange": {
"end": "1372",
"start": "1353"
},
"codepointRange": {
"end": "1372",
"start": "1353"
}
}
},
{
"infoType": "CREDIT_CARD_NUMBER",
"likelihood": "VERY_LIKELY",
"location": {
"byteRange": {
"end": "1735",
"start": "1716"
},
"codepointRange": {
"end": "1735",
"start": "1716"
}
}
},
{
"infoType": "PASSWORD",
"likelihood": "LIKELY",
"location": {
"byteRange": {
"end": "6870",
"start": "6851"
},
"codepointRange": {
"end": "6870",
"start": "6851"
}
}
}
],
"matchState": "MATCH_FOUND"
}
}
}
},
"invocationResult": "SUCCESS"
}
}
{
"error": {
"code": 500,
"message": "Content blocked by Model Armor",
"reason": "internalError"
}
}
レスポンスにトリガーされたフィルターとトリガーされなかったフィルターの詳細情報とinternalErrorのContent blocked by Model Armorというメッセージが含まれたレスポンスが返されテストデータの読み取りがブロックされてできなくなりました。
環境変数によるデフォルト設定
毎回--sanitizeフラグを指定する代わりに、環境変数でデフォルトのModel Armorテンプレートとモードを設定できます。
# デフォルトのModel Armorテンプレートを設定
export GOOGLE_WORKSPACE_CLI_SANITIZE_TEMPLATE="projects/PROJECT_ID/locations/us-central1/templates/my-sanitize-template"
環境変数を設定すると、--sanitizeフラグなしでも自動的にModel Armorによるスクリーニングが適用されます。
まとめ
今回は、Model Armorの概要と主要なフィルター機能の解説、そしてGoogle Workspace CLIの--sanitizeフラグを使ったModel Armor連携の設定・動作確認までを実施してみました。
Google Workspace上の機密データにアクセスしてしまうリスクやプロンプトインジェクションのリスクなどに対応するためにModel Armorを設定しておくのはよいかなと思いました。
特に注目すべきポイントは以下の2点です。
- AIエージェントの保護により、Drive上のドキュメントやGmailのメッセージに埋め込まれたプロンプトインジェクションがエージェントに到達する前に検出できます。
--sanitizeフラグと環境変数による簡単な設定で、既存のgwsコマンドにModel Armorのスクリーニングを追加できます。
一方注意点として、以下が挙げられます。
- Model Armorのリージョン制限: 東京リージョン(asia-northeast1)は未対応であるため、東京リージョン以外を利用する必要があります。
- トークン数の制限: プロンプトインジェクション・ジェイルブレイク検出フィルターは10,000トークンまで。その他のフィルターは2,000トークンまで対応できます。
- ファイルサイズの制限: ドキュメントスクリーニングの入力サイズは4MBまで。50バイト以下のリッチテキストファイルはリジェクトされます。
AIエージェントにGoogle Workspaceのデータへのアクセスを許可する際は、Model Armorによるスクリーニングの導入を検討してみてはいかがでしょうか。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部コンサルティング部の渡邉でした!








