ADKとBigQueryで作るAIエージェントの安全な設計

記事タイトルとURLをコピーする

G-gen の min です。Agent Development Kit(ADK)と BigQuery を組み合わせた AI エージェントにおけるリスクを管理し、安全に運用するための設計アプローチを説明します。

はじめに

ADK と BigQuery

ADK と BigQuery を使ったエージェントの基本的な開発方法は以下の記事をご参照ください。

blog.g-gen.co.jp

AI エージェントに潜むリスク

AI エージェントにデータベースへのアクセス権限を付与することは、以下のようなリスクを伴います。

意図しないデータ操作
エージェントが誤って UPDATEDELETE といったデータ変更クエリを生成・実行し、重要なデータを破壊・改ざんしてしまう。

高額なクエリ実行
大規模なテーブルに対して非効率なクエリ(例: WHERE 句のない SELECT *)を実行し、想定外の高額な BigQuery 利用料金が発生する。

情報漏洩
本来アクセスが許可されていない機密データ(個人情報など)にアクセスし、その結果をユーザーに回答してしまう。

多層防御

これらのリスクに対処するため、単一の対策に頼るのではなく、複数の防御線を組み合わせる多層防御(Defense in Depth)を基本的な考え方として採用します。ここでは、ツール・アプリケーション・クラウド基盤という3つの階層で構成される設計手法を紹介します。

No. 名称
対策1 ツールセットによる静的制御
対策2 アプリケーションによる動的制御
対策3 クラウド基盤による防御

なお、当記事では AI のハルシネーション等による意図しないデータの改ざんや大容量のクエリを防ぐ意味での「防御」を紹介しています。外部からの意図的な攻撃による情報漏洩やデータ改ざん、各種インジェクションなどへの対策とは趣旨が異なりますが、多層防御の考えかたはそのような対策にも普遍的に使える考えかたです。

対策1. ツールセットによる静的制御

エージェントの基本的な振る舞いを、初期化時の設定で制限する静的な制御手法です。開発の初期段階で導入できる、最も基本的な防御線となります。

書き込み制御(WriteMode)

データへの意図しない変更を防ぐための最も基本的なガードレールです。ADK の BigQueryToolsetWriteModeBLOCKED に設定することで、エージェントが生成できる SQL を SELECT 文のみに強制します。

from google.adk.tools.bigquery import BigQueryToolConfig, WriteMode
  
# データの変更をブロックする読み取り専用モードに設定
tool_config = BigQueryToolConfig(write_mode=WriteMode.BLOCKED)
  
bigquery_toolset = BigQueryToolset(
    # ...
    tool_config=tool_config
)

WriteMode には以下の3つのモードがあります。

モード 説明
BLOCKED デフォルトSELECT 文のみが許可され、DML (Data Manipulation Language) や DDL (Data Definition Language) といったデータ変更・定義操作はすべてブロックされます。分析用途のエージェントでは、原則としてこのモードを使用します。
PROTECTED DML/DDL の実行を許可しますが、その操作対象は BigQuery セッション内で作成された一時テーブルに限定されます。永続的なテーブルへの変更は防がれるため、中間データの加工など、限定的な書き込みが必要な場合に使用できます。
ALLOWED すべての SQL 操作が許可されます。データの変更・削除も可能なため、使用には最大限の注意が必要です。このモードの採用は慎重に検討すべきです。

認証情報の分離(ADC)

アプリケーションコードからサービスアカウントキーなどの認証情報を分離し、実行環境に認証を委任する手法です。Google Cloud のアプリケーションのデフォルト認証情報(ADC)を利用することで、キー漏洩のリスクを大幅に低減します。

from google.adk.tools.bigquery import BigQueryCredentialsConfig
import google.auth
  
# アプリケーションのデフォルト認証情報を取得
application_default_credentials, _ = google.auth.default()
  
# 取得した認証情報を BigQuery ツールセットに設定
credentials_config = BigQueryCredentialsConfig(
    credentials=application_default_credentials
)

対策2. アプリケーションによる動的制御

エージェントの動作(実行時)に応じて、アプリケーションロジックでリアルタイムに制御を加える動的な手法です。静的制御だけでは防ぎきれない、より複雑なリスクに対応します。

指示による行動の制約(Instruction)

LLM へのプロンプト(instruction)を通じて、エージェントの思考や行動に制約を課す手法です。エージェントの役割、目的、そして「してはならないこと」を自然言語で明確に定義します。

instruction="""
あなたは `sales_data_jp` データセットを分析するデータ分析エージェントです。
ユーザーの質問に答えるため、BigQueryに対するSQLクエリを生成・実行します。
  
以下のガイドラインに厳密に従ってください:
- データ操作(DML): UPDATE, DELETE, INSERT といったDML操作は一切許可されていません。
- クエリの最適化: `SELECT *` は使用しないでください。必ず必要な列のみを指定してください。
- 結果のサイズ: `LIMIT` 句を必ず含め、返される行数を最大100行に制限してください。
"""

実行前の検証(Callback)

ツールが実行される直前に、その引数(生成されたSQLなど)をコードで検証し、危険な操作をブロックする手法です。ADK のコールバック機能を用いることで、プロンプトによる制約をさらに確実なものにします。

from typing import Dict, Any, Optional
from google.adk.runtime.tool_runner import ToolContext, BaseTool
  
def validate_sql_callback(tool: BaseTool, args: Dict[str, Any], tool_context: ToolContext) -> Optional[Dict]:
    """ 'execute_sql' ツールが実行される前に呼び出されるコールバック関数 """
    if tool.name == 'execute_sql':
        sql_query = args.get('sql_query', '').lower()
        forbidden_keywords = ['delete', 'update', 'drop', 'truncate', 'alter']
        
        if any(keyword in sql_query for keyword in forbidden_keywords):
            return {
                "result": "セキュリティポリシー違反のため、このクエリは実行できません。"
            }
    return None
  
root_agent = Agent(
    # ...
    before_tool_callback=validate_sql_callback
)

対策3. クラウド基盤による防御

アプリケーションの制御が万が一突破された場合でも、クラウド基盤レベルで被害を食い止める最後の砦となる対策です。

コストの保護

BigQuery の機能を利用して、意図しない高額課金を防ぐ手法です。これには2つのアプローチがあります。

Dry Runによる事前見積もり
dry_run オプションでクエリのスキャン量を見積もり、しきい値を超えたら実行を中止します。これは「実行前の検証」の中で実装できます。

最大課金バイト数の強制
maximum_bytes_billed パラメータを設定し、クエリのスキャン量に厳格な上限を設けます。上限を超えたクエリは BigQuery が自動的に失敗させます。

最小権限の原則(IAM)

情報セキュリティの基本原則である「最小権限の原則」を、Google Cloud の IAM を用いて適用します。エージェントが使用するサービスアカウントには、そのタスク遂行に必要最小限の権限のみを付与します。

ロール
データ閲覧のみであれば、「BigQuery データ閲覧者(roles/bigquery.dataViewer)」と「BigQuery ジョブユーザー(roles/bigquery.jobUser)」のみを付与します。

スコープ
権限をプロジェクト全体ではなく、特定のデータセットやテーブルに限定します。

アクセス制御
必要に応じて、列レベル・行レベルのアクセス制御を組み合わせることで、さらにきめ細やかなデータ保護を実現します。

BigQuery の権限管理については、以下の記事も参照してください。

blog.g-gen.co.jp

トレーサビリティの確保

問題発生時の原因究明を迅速化するため、エージェントの行動を追跡可能にする(トレーサビリティを確保する)仕組みも重要です。

ADK Web UI
ローカル開発時に、エージェントの思考プロセスやツール呼び出しを視覚的に追跡します。これにより、意図しない挙動を示した際のデバッグや、プロンプトチューニングが容易になります。

Cloud Logging / Cloud Trace
本番環境にデプロイされたエージェントの実行履歴を記録・分析します。アプリケーションのパフォーマンス監視や、エラー発生時の詳細なコンテキスト把握に役立ちます。

BigQuery 監査ログ
BigQuery で実行された全てのクエリを記録します。どのサービスアカウントが、いつ、どのようなクエリを実行したかを正確に把握できるため、不正な操作や情報漏洩インシデントの調査に不可欠です。

BigQuery の監査ログについては、以下の記事も参照してください。

blog.g-gen.co.jp

佐々木 愛美 (min) (記事一覧)

クラウドソリューション部 データアナリティクス課。2024年7月 G-gen にジョイン。G-gen 最南端、沖縄県在住。最近覚えた島言葉は、「マヤー(猫)」。