テーマを切り替える

AI エージェントの権限モデル設計:ユーザーアイデンティティ、ツール権限、監査ログ、Secret 分離

Easton editorial illustration: production agent control room
3
アイデンティティタイプ
user identity、service account、delegated token。
4
制御面
scope、approval、sandbox、server-side authorization。
6
主要オブジェクト
actor、subject、tool、resource、secret、audit。
数据来源: この記事の構造化エンジニアリングモデル

"MCP Security Best Practices は token passthrough を anti-pattern とし、least-privilege scope、server-side authorization、監査可能な elevation flow を推奨しています。"

チームが同じ管理者 token をエージェントに渡し、「社内システムだから大丈夫」と考えます。するとユーザー A の検索リクエストに対して、エージェントが管理者アイデンティティでユーザー B の CRM レコードを読んでしまう。権限が崩れたエージェントは、エージェントがない状態より危険です。

これは仮の話ではありません。MCP Security Best Practices は token passthrough を明確に anti-pattern としています。セキュリティ制御を迂回し、audit trail を壊し、trust boundary を越えてしまうためです。OWASP AI Agent Security Cheat Sheet も、「ツールの悪用と権限昇格」を主要リスクの 1 つに挙げています。

問題は 3 つに分解できます。エージェントは誰を代表するのか。何を根拠に呼び出せるのか。何にアクセスできるのか。以下では、アイデンティティ対応表、ツール権限フィールド、Secret Vault の基本手順、監査ログ schema とマスク規則、権限判断表、トラブルシューティング、実装手順までをまとめます。

アイデンティティマッピング:エージェントは誰を代表するのか?

エージェントがツールを呼び出すとき、ログと権限システムが最初に答えるべき問いは 1 つです。誰が呼び出しを開始し、誰を代表して操作しているのか。この 2 つは同じ場合も、違う場合もあります。混同すると、権限が暴走し、監査も追えなくなります。

アイデンティティタイプ対照表

タイプactorsubject適用シーン権限境界
user identityユーザー Aユーザー Aユーザーの直接操作ユーザー権限を継承
service accountsystem_botnullバックグラウンドタスク、定期ジョブシステムレベル権限、ユーザーとは独立
delegated tokenworkflow_123ユーザー Aユーザーが承認した自動化 workflowworkflow scope、ユーザーの承認範囲に制限
tenant contextagent_456tenant_Bマルチテナントシステムテナント分離、テナント横断アクセスは禁止

フィールド定義:actor は呼び出しを開始したエンティティ(ユーザー、エージェント、workflow、システム)で、ログには actor の ID を記録します。subject は代表されるエンティティ(ユーザーまたは null)です。ユーザー本人の操作では actor=subject、システムアカウントがバックグラウンドタスクを実行するときは subject=null です。delegatedBy は委任元で、どのユーザーがこの workflow を承認したかを示します。tenantId はテナント識別子で、マルチテナントシステムのデータ分離に使います。

MCP Authorization 仕様では、MCP servers は access token が自分を intended audience として発行されたものかを検証しなければなりません。Token の audience フィールドは、その MCP server の resource identifier を指す必要があります。Token を URI query string に置くべきではありません。URI はログ、ブラウザ履歴、プロキシキャッシュに残るためです。

OWASP Access Control Cheat Sheet は deny by default、least privilege、すべてのリクエストでの権限チェックを強調しています。アイデンティティマッピングは権限チェックの最初のステップです。actor、subject、tenantId が、その後の権限判断を決めます。

ツール権限:エージェントは何を呼び出せるのか?

ツール登録は name、description、input_schema を定義して終わりではありません。OpenAI Agents SDK のツール reference には、権限と実行制御に関わるフィールドがあります。

ツール権限判断表

権限制御適用シーン実装方法リスク
per-tool permissionツールごとに個別認可するツール登録時に permission_level(read/write/admin)を設定権限設定が複雑になり、権限マトリクスの保守が必要
scope minimization段階的な最小権限初期 scope は低リスク操作だけにし、高権限操作は scope challenge で追加Scope 管理コストが高く、動的調整が必要
whitelistツール許可リストread_customer + summarize のように、特定のツール組み合わせだけ許可許可リストの保守コストがあり、柔軟性を制限しやすい
approval人の承認needs_approval=true のツールは実行前に一時停止し、承認を待つ承認に時間がかかり、ユーザー体験に影響する

OpenAI Agents SDK のツールフィールドには、実行時の有効化制御を行う is_enabled があります。ユーザー role、tenant、workflow context に応じてツールを動的に無効化できます。needs_approval は人の承認が必要かを示します。承認後も tool_input_guardrails は実行されます。tool_input_guardrails は PII 検出やパラメータ範囲チェックなどの入力検証を担当します。tool_output_guardrails はコンテンツフィルタリングなどの出力検証を担当します。

MCP Security Best Practices は、scope minimization について段階的な最小権限を推奨しています。初期 scope は read:metadata、list:resources のような低リスクの発見・読み取り操作だけにし、高権限操作は正確な scope challenge で追加します。wildcard/full-access scopes は避けます。

OWASP AI Agent Security Cheat Sheet は per-tool permission scoping を勧めています。trust level ごとに異なる tool sets を使い、機微な操作には明示的な承認を求め、権限チェックに失敗したら fail closed にします。

Secret 分離:エージェントはどう credential を取得するのか?

エージェントが長期の平文 API key を直接持つべきではありません。OWASP Secrets Management Cheat Sheet は、secret 管理の集中化と標準化を推奨しています。Secret 管理システム自体も、Authentication、Authorization、Accounting、lifecycle を備えるべきです。

Secret アクセスパターン対照表

パターンリスク適用シーン
直接保持(平文 .env)漏えいリスクが高く、追跡できず、失効も難しい非推奨ハードコードされた API key
環境変数ログ漏えいリスクがあり、追跡と失効も弱い単一マシンのデプロイprocess.env.API_KEY
secret vault集中管理、暗号化保存、監査追跡、失効が可能本番環境AWS Secrets Manager、HashiCorp Vault
secret referenceエージェントは reference を保持し、実行時に短期 token を必要に応じて取得マルチテナント、高セキュリティ環境vault.get(secretRef)

Secret の lifecycle は 4 段階です。creation では長期 key ではなく短期 token を生成します。rotation は定期的に行い(例:30 日ごと)、自動化プロセスで secret を更新し、関連システムへ通知します。revocation では緊急失効の仕組みを用意し、漏えいを見つけたらすぐに secret を無効化します。expiration では有効期限を設定し、期限切れ後に自動で失効させます。

MCP Security Best Practices は token passthrough を anti-pattern と明記しています。ユーザーの OAuth token をエージェントへ直接渡すと、セキュリティ制御を迂回し、audit trail を壊し、trust boundary を越えます。正しい設計では、ユーザーがエージェントに承認したタイミングで delegated token を発行します。短期で、scope が限定され、audience が明確な token です。

OWASP Secrets Management の基本原則は centralize、least privilege、automate、auditing です。Secret へのアクセスは最小権限に従います。手作業の保守は漏えいとミスを増やします。rotation、revocation、expiration は lifecycle の一部です。

監査ログ:誰がいつ何を呼び出したのか?

監査ログでは「誰が誰を代表してどのツールを呼び、どのオブジェクトへアクセスし、結果はどうだったか」を復元できる必要があります。同時に、引数と secret はマスクしなければなりません。

Audit Log Schema

フィールド説明マスク規則
traceId呼び出し chain ID(N156 の trace/runId 概念を再利用)マスクしない
timestamp呼び出し時刻(ISO 8601)マスクしない
actor呼び出しを開始したエンティティマスクしない
subject代表されるエンティティマスクしない
toolツール名マスクしない
action操作タイプ(read/write/delete)マスクしない
resource操作対象マスク:customer_id → cust_***
outcome結果(success/failure/denied)マスクしない

マスク規則:token、secret、password、email、phone、PII は記録しません。記録するのは who/what/when/where/outcome です。例:customer_id=12345 は cust_、email=user@example.com は e@***.com、token=Bearer xxx は Bearer ***、password=secret123 は記録しません。

OWASP Logging Cheat Sheet によれば、セキュリティログは調査、監査、監視を支えるべきですが、password、session id、access token、機微な個人データを記録してはいけません。who/what/when/where/outcome のような追跡可能な情報を記録します。

NIST SP 800-53 の audit and accountability control family は、監査ログが権限システムの最後の砦になることを示しています。権限チェックが失敗したときは、actor に権限がない、subject に target 権限がない、scope が足りない、といった理由をログへ残す必要があります。

権限モデル判断表:エージェントに必要な制御の組み合わせ

アイデンティティマッピング、ツール権限、Secret 分離、監査ログは独立した制御ではありません。組み合わせて効く制約です。以下はシーンごとの制御セットです。

シーンidentity typetool permissionsecret accessaudit log典型的な用途
低リスクの内部ツールservice accountwhitelist(read ツールのみ)環境変数actor/tool/outcome内部レポート生成、定期同期
マルチテナント SaaSdelegated token + tenantIdper-tool permission(tenant でフィルタ)secret vault(tenant 分離)full schema(tenantId を含む)CRM エージェント、メールアシスタント
金融取引user identity + approvalscope minimization + approvalsecret reference(短期 token)full schema + approvalId取引承認、資金操作
機微データ操作delegated token + approvalwhitelist + approval + guardrailssecret vault(緊急失効)full schema + マスクデータエクスポート、顧客照会

OWASP AI Agent Security Cheat Sheet は、trust level ごとに separate tool sets を使い、機微な操作には explicit authorization を求めることを勧めています。権限モデル判断表の要点は組み合わせです。高リスクなシーンでは、単一の制御ではなく、複数の制御を重ねます。

トラブルシューティング:権限問題でよく出る症状

以下は、権限問題でよく出る症状、考えられる原因、確認手順、解決策です。

症状考えられる原因確認手順解決策
エージェントがツール呼び出し時に 403 Forbidden を返すactor に tool permission がない、または subject に target permission がないactor の permission_level と subject の resource 権限を確認アイデンティティマッピングが正しいか確認し、権限マトリクスを調整
ログで actor が空、または subject が混乱しているアイデンティティマッピングフィールドが正しく渡されていないagent context に actor/subject/tenantId が入っているか確認呼び出し chain 全体でアイデンティティフィールドを正しく渡す
ツール呼び出しは成功するが、監査ログに必要フィールドがないAudit Log Schema が不完全ログ書き込み処理が全フィールドを含むか確認Schema を補完し、traceId/approvalId を追加
ユーザー A のリクエストでユーザー B のデータが読めるtenantId または subject が分離されておらず、管理者 token を共有しているdelegated token を使っているか、tenantId が正しいか確認delegated token に切り替え、tenantId 検証を強制
Secret rotation 後もエージェントが古い key を使うSecret reference が更新されていない、または rotation が効いていないvault が新しい secret を返すか、エージェントが再取得しているか確認rotation で reference を自動更新する
承認後もツール呼び出しが失敗するGuardrails が失敗している(パラメータ範囲外、PII 検出)tool_input_guardrails のログを確認パラメータまたは guardrails ルールを調整

実装チェックリスト:0 から Agent 権限モデルを作る

権限モデルを実装するための主要な 5 ステップです。

ステップ 1:アイデンティティマッピングルールを定義する

判断ポイント:マルチテナント分離が必要ですか(tenantId フィールドを追加)?バックグラウンドタスクがありますか(service account を定義)?自動化 workflow がありますか(delegated token を使う)?

擬似コード:

interface IdentityContext {
  actor: string;        // 呼び出しを開始したエンティティ
  subject: string | null;  // 代表されるエンティティ
  delegatedBy?: string;  // 委任元
  tenantId?: string;    // テナント識別子
}

ステップ 2:ツール権限マトリクスを設計する

判断ポイント:承認が必要ですか(needs_approval=true を設定)?動的フィルタリングが必要ですか(is_enabled の実行時判断を実装)?パラメータ検証が必要ですか(tool_input_guardrails を実装)?

コード例:

interface ToolPermission {
  name: string;
  permission_level: 'read' | 'write' | 'admin';
  required_scope: string[];
  needs_approval: boolean;
  is_enabled: (context: IdentityContext) => boolean;
}

ステップ 3:secret vault を接続する

判断ポイント:短期 credential が必要ですか(secret reference を使う)?緊急失効が必要ですか(vault が即時無効化に対応しているか確認)?

コード例:

async function getSecret(secretRef: string, context: IdentityContext): Promise<string> {
  // アイデンティティを検証
  await vault.authenticate(context.actor);
  // 権限を検証
  await vault.authorize(context.actor, secretRef);
  // 短期 token を取得
  const token = await vault.getToken(secretRef, expiresIn: '15m');
  // 監査を記録
  await auditLog.record({
    actor: context.actor,
    action: 'get_secret',
    resource: secretRef,
    outcome: 'success'
  });
  return token;
}

ステップ 4:監査ログを実装する

判断ポイント:マスクが必要ですか(redaction ルールを実装)?traceId が必要ですか(N156 の trace/runId を再利用)?

コード例:

interface AuditLogEntry {
  traceId: string;
  timestamp: Date;
  actor: string;
  subject: string | null;
  tool: string;
  action: 'read' | 'write' | 'delete';
  resource: string;  // マスク済み
  outcome: 'success' | 'failure' | 'denied';
}

ステップ 5:権限境界をテストする

判断ポイント:越権シナリオをテストしますか(ユーザー A がユーザー B のデータへアクセスするケース)?token 漏えいをテストしますか(secret 漏えい後の失効フローを再現)?監査追跡をテストしますか(traceId で chain 全体をたどる)?

テストチェックリスト:越権テスト(actor=user_A、resource=tenant_B → 403 を返すべき)。token 漏えいテスト(vault.revoke(secretRef) → エージェントは新しい token を取得できないべき)。Audit 追跡テスト(traceId で呼び出し chain 全体を検索 → actor/subject/tool/outcome を含むべき)。

次のステップ:関連する読み物

Agent 権限モデルは、アイデンティティ、ツール、Secret、監査など複数の層にまたがります。関連する記事もあわせて読むと整理しやすくなります。

公開済みの記事

  • Agent Sandbox ガイド:Sandbox は実行隔離(コンテナ/Docker)を扱います。この記事は権限と secret boundary を扱い、両者は補完関係にあります。
  • ツール呼び出し実践:ツール呼び出しの基礎。この記事では tool whitelist、per-tool permission、入力検証まで広げています。
  • AI Agent の監視と復旧:監視とアラートの基礎。この記事では audit fields と traceId を補っています。

AI エージェントの権限モデルを設計する

本番エージェントシステム向けに、ユーザーアイデンティティ、ツール権限、secret access、監査ログを設計します。

  1. 1

    ステップ 1: ツールと resource を列挙する

    エージェントが呼び出すツール、resource、action、外部システムを列挙します。読み取りだけの操作と、書き込み、送信、削除、資金操作を分けます。
  2. 2

    ステップ 2: identity context を明確にする

    各 run に actor、subject、tenant、workflow、traceId を持たせます。ユーザーアイデンティティ、service account、自動化 workflow を 1 つの管理者アイデンティティに押し込まないためです。
  3. 3

    ステップ 3: アイデンティティタイプを分ける

    delegated user identity、service account、system maintenance job を分け、それぞれに resource boundary と audit fields を定義します。
  4. 4

    ステップ 4: ツール権限マトリクスを作る

    各ツールに action、resource、scope、approval、secret、audit metadata を定義し、実行前に server-side authorization を必ず通します。
  5. 5

    ステップ 5: secret vault を接続する

    Secret は vault または credential service に保存し、実行層で必要なときだけ短期 credential に交換します。rotation、revocation、expiration も扱えるようにします。
  6. 6

    ステップ 6: fail closed にする

    Tool gateway が実行する前に actor、subject、resource、action、scope、approval を確認します。どれかが失敗したら明示的に拒否します。
  7. 7

    ステップ 7: マスク済み監査ログを書く

    who、what、when、where、outcome、traceId、approvalId、マスク済み resource summary を記録します。権限変更、scope elevation、secret access にはアラートを設定します。

FAQ

エージェントがツールを呼び出すとき、ユーザー、システムアカウント、workflow のどれを代表しますか?
actor/subject の組み合わせで判断します。ユーザー本人の操作なら actor=subject、バックグラウンドジョブなら actor=system_bot、subject=null、委任 workflow なら actor=workflow_123、subject=user_a です。ログと権限システムの両方で actor と subject を記録します。
OAuth 認可が通っているのに、なぜ per-tool permission が必要ですか?
OAuth scope はプロトコル層の権限で、per-tool permission は業務層の権限です。Scope だけでは業務上の認可は完結しません。サーバー側で actor、subject、resource、action を確認する必要があります。
1 つの管理者 token で、エージェントが全ユーザーのデータを検索してもよいですか?
できません。典型的な権限破綻です。エージェントが管理者アイデンティティで全ユーザーのデータを読み、ユーザー A のリクエストからユーザー B の CRM レコードが見えてしまいます。短期で、scope が限定され、audience が明確な delegated token を使います。
エージェントが .env やユーザーの API key を直接読んでもよいですか?
できません。Secret は vault に置き、エージェントは secret reference を通じて必要なときだけ取得します。.env を直接読む設計では、漏えい時の追跡と失効が難しくなります。
承認後、同じ高権限 token を長期間使い回してもよいですか?
おすすめしません。Token は short-lived にし、承認されたそのツール呼び出しだけに使うべきです。高権限 token の使い回しは漏えい時の影響範囲を広げ、どの承認がどの実行に対応したのかも追いにくくします。
監査ログに引数を記録すべきですか?token、メールアドレス、顧客データをログに入れないにはどうしますか?
引数は要約と対象 resource として記録しますが、機微情報はマスクします。password、session id、access token、完全な secret、個人情報は記録しません。たとえば customer_id は cust_***、email は e***@***.com、token は Bearer *** として保存します。

7分で読めます · 公開日: 2026年9月17日

コメント

GitHubアカウントでログインしてコメントできます

Easton BlogEaston Blog