本文へ移動
🔐

AIエージェントに調査、実装、PR作成、MCP操作を任せるとき、一番雑に扱われやすいのが秘密情報です。最初は「.env は貼らない」だけで始めても、private package を入れるための token、staging API key、GitHub token、MCP の OAuth token、ブラウザ cookie、CI secret がすぐに絡みます。

この記事では、AIエージェントの 秘密情報 / secret handling を扱います。組織全体の利用ルールは AIコーディングツールの社内ガイドライン、一度許可した権限の棚卸しは AIエージェント権限棚卸し設計ガイド、Codex cloud の setup script と secrets の境界は Codex cloud environment 設計ガイド、外部通信を開ける判断は Codex internet access 安全運用ガイド に分けています。

今回の論点は、秘密情報をどこに置くかではなく、AIエージェントの run に secret をどう入れないか、入れるならどう短命化して消すかです。

先に結論: secret は agent の文脈ではなく実行境界に置く

secret handling で最初に決めるべきことは、どの secret manager を使うかではありません。AIエージェントの文脈、tool、shell、MCP、ログ、成果物のどこから secret が見えるかです。

私なら、最初に次の4段階へ分けます。

段階決めること失敗例
pre-runそもそも secret が必要な task か調査だけなのに production token を渡す
runtimeどの process / tool だけが読めるかagent phase 全体の env に token を残す
outputログ、PR、final answer に出さないかbuild log の raw output に token が混ざる
post-run失効、rotation、証跡をどう扱うか一時 token が残り続ける

この4段階がないと、「AIにsecretを見せていないつもり」でも、実際には shell、MCP server、browser profile、CI log、artifact store のどこかに残ります。

secret handling と権限設計は似ているが同じではない

権限設計は「何ができるか」を決めます。secret handling は「何を知ってしまうか」を決めます。

たとえば、read-only の調査 task でも、環境変数に production credential が見えていれば危険です。逆に、write tool を持つ task でも、短命の staging token だけを専用 process に渡し、ログに出さず、run 後に失効できるならリスクは下げられます。

既存の権限ルールだけで secret を守ろうとすると、次の抜けが出ます。

ありがちな対策残る問題
.env を読ませないshell command や test output から値が出る
token を環境変数に入れるagent phase 全体から読める
PRにログを貼らないCI artifact や MCP result に残る
承認制にする承認画面に secret payload を載せてしまう
token を後で消すどの token が使われたか分からない

secret は「見えたら終わり」ではありません。見えた場所、用途、保存先、失効条件まで追えないと、事故時に切り分けられません。

まず secret inventory を作る

AIエージェントに渡る可能性がある secret は、API key だけではありません。

種類例注意点
API tokenGitHub token、SaaS API keyscope と owner を分ける
package credentialnpm / PyPI / private registry tokeninstall 時だけ必要なことが多い
cloud credentialAWS / GCP / Azure keyagent に直接渡さない前提から始める
database credentialstaging / production DB URLread-only でも顧客データに触れる
MCP credentialOAuth token、client secretserver と downstream API の token を混ぜない
browser statecookie、session storage、signed-in profile画面操作と credential 利用が一体化しやすい
local secret file.env、private key、credentials filedeny read だけでなく log 出力も見る

この inventory には、少なくとも owner、purpose、scope、runtime_visibility、expires_at を持たせます。

agent_secret:
  id: "sec-20260809-npm-read"
  owner: "platform-team"
  purpose: "install private packages in setup script"
  scope:
    registry: "npm-internal"
    permission: "read"
  runtime_visibility: "setup_only"
  allowed_tasks:
    - "dependency install"
  forbidden_tasks:
    - "agent reasoning"
    - "PR comment"
    - "MCP tool result"
  expires_at: "2026-08-16"

runtime_visibility が曖昧な secret は、AIエージェントへ渡す前に止めます。「必要そうだから入れておく」は、agent 運用では一番危ない置き方です。

pre-run で secret 不要の lane に落とす

多くの task は、secret なしで進められます。

tasksecret 不要にする方法
docs 調査public docs と local fixture だけで行う
PR reviewdiff と test result だけを渡す
設計相談本番ログではなく schema / anonymized sample を渡す
再現調査scrub 済み log と local mock を使う
依存確認lockfile と registry metadata の read-only view にする

pre-run の判断で大事なのは、「あれば便利」と「ないと完了しない」を分けることです。AIエージェントが secret を持つと、出力、ログ、tool call、記憶、artifact のすべてで取り扱いが重くなります。便利さだけなら、secret なし lane に落とした方がよいです。

runtime では setup-only と agent-visible を分ける

Codex cloud の公式ドキュメントでは、environment variables は task 全体に設定される一方、secrets は setup script で使われ、security reasons により agent phase 前に削除されると説明されています。これは実務上かなり重要です。

private package の install token は、setup script だけで使えれば十分なことが多いです。逆に、agent が後続の command で使う必要がある値を secret に入れると、agent phase では見えずに失敗します。

置き方向くもの避けるもの
setup-only secretprivate package install、bootstrap tokenagent が後で読む設定値
agent-visible envpublic endpoint、feature flag、non-secret configproduction token、cookie、private key
one-shot tokenstaging API の短時間 read長期運用 token
tool-scoped credential特定 MCP tool の read 操作複数 server で使い回す token

判断基準は単純です。agent が文章として reasoning するために必要な値なら、それは secret として渡すべきではありません。実行に必要な credential なら、できるだけ agent の文脈ではなく、限定された process や setup step に閉じます。

ログに出る前提で redaction を設計する

secret は「渡さない」が原則ですが、現実にはログに混ざります。

  • package manager が token 付き URL を出す
  • test が環境変数一覧を出す
  • SDK が request header を debug log に出す
  • MCP server が raw API response を返す
  • agent が error をそのまま PR に貼る

このため、redaction は後付けではなく run の条件にします。

secret_output_policy:
  block_patterns:
    - "AKIA[0-9A-Z]{16}"
    - "ghp_[A-Za-z0-9_]{30,}"
    - "-----BEGIN PRIVATE KEY-----"
  output_rules:
    final_answer: "summary_only"
    pr_body: "no_raw_logs"
    tool_result: "redact_before_store"
    ci_artifact: "short_retention"
  on_match:
    action: "stop_and_escalate"
    rotate_required: true

完璧な正規表現で全 secret を検出するのは無理です。それでも、代表的な token、private key、.env、cookie、Authorization header を止めるだけで、事故の大半は早く見つけられます。

MCP では token passthrough を禁止する

MCP を使う場合、secret handling はさらに難しくなります。MCP server は agent から tool として呼ばれますが、その背後には GitHub、Slack、Notion、DB、社内API がいます。

危ないのは、MCP server が下流 API の token をそのまま受け取り、別の API へ流用できる状態です。MCP の authorization / security best practices では token passthrough を避ける設計が重要になります。

MCP server には、最低限この境界を持たせます。

mcp_secret_boundary:
  server_id: "github-read"
  token_audience: "mcp-github-read"
  downstream_access:
    repositories:
      - "example/app"
    permissions:
      issues: "read"
      pull_requests: "read"
      contents: "read"
  forbidden:
    - "reuse_user_oauth_token_for_downstream_api"
    - "return_authorization_header_to_agent"
    - "include_raw_api_response_with_tokens"

server を許可するだけでは粗すぎます。token の audience、scope、tool result の redaction、監査ログの粒度まで一緒に決めます。

ブラウザ操作では signed-in profile を secret として扱う

AIエージェントにブラウザ操作を許すと、cookie や signed-in session が secret になります。

これは API key のように見えませんが、実質的には権限です。ログイン済みブラウザで操作できるなら、その agent はそのユーザーとして画面を読み、場合によっては書けます。

ブラウザ操作を許すなら、次を分けます。

項目判断
profile個人の普段使い profile か、agent 専用 profile か
site scopeどの domain だけ許すか
actionread、draft、submit を分ける
cookierun 後に残すか、専用 profile ごと破棄するか
screenshot顧客情報や token が映らないか

特に「モバイルで承認だけ返す」「remote host 上の Chrome profile を使う」ような運用では、操作端末ではなく host 側の session が副作用を持ちます。便利さだけで signed-in profile を渡さない方がよいです。

secret を含む task の PR には raw log を貼らない

secret が絡む task では、PR 本文や final answer の書き方も変えます。

良い報告は、secret を含まない確認事実だけを返します。

Verification:
- `pnpm run build` passed.
- Private registry install succeeded in setup step.
- No runtime env containing registry token was present in agent phase.
- Work log reviewed for token-like output; no match found.

Risks:
- Staging API token was issued for this run and expires at 2026-08-09T12:00:00Z.

悪い報告は、便利そうに見えて危険です。

The command failed with:
TOKEN=...
Authorization: Bearer ...
Full env:
...

reviewer に必要なのは、secret の値ではありません。どの secret が、どの用途で、どの期間、どの process にだけ見え、run 後にどう失効するかです。

失効と rotation を完了条件に入れる

secret handling は、task が成功した時点では終わりません。

次のいずれかに該当するなら、失効または rotation を完了条件に入れます。

  • one-shot token を発行した
  • staging / production API に触れた
  • MCP write scope を使った
  • browser session を使った
  • log に secret らしき値が出た
  • agent が secret file へアクセスしようとした
post_run_secret_closeout:
  run_id: "agent-run-20260809-004"
  secrets_used:
    - id: "sec-20260809-staging-api-read"
      action: "expired"
      evidence: "vault lease ended"
    - id: "sec-20260809-browser-profile"
      action: "profile_deleted"
      evidence: "agent profile removed"
  log_review:
    token_pattern_match: false
    raw_log_retention: "7d"
  incident_required: false

ここまでを完了条件にしないと、AIエージェントの作業は「実装は終わったが credential が残っている」状態になりがちです。

実務テンプレート

私なら、secret を使う可能性がある task には次のテンプレートを付けます。

Secret handling:
- Do not read `.env`, private keys, browser cookies, or credential files.
- If a credential is required, stop and ask for a task-scoped, short-lived token.
- Use setup-only secrets for package installation; do not expose them to the agent phase.
- Do not paste raw logs, headers, env values, or MCP raw responses into the PR or final answer.
- If token-like output appears, stop, report `secret_exposure_suspected`, and require rotation.

Allowed:
- public docs
- scrubbed logs
- staging fixtures
- read-only metadata

Forbidden:
- production credentials
- personal browser session
- customer data exports
- downstream token passthrough

短いですが、これだけでも agent の挙動は変わります。特に「必要なら止まる」と「値を貼らない」を明文化することが効きます。

まとめ

AIエージェントの secret handling は、秘密情報を隠す小技ではありません。task を始める前に secret 不要 lane へ落とし、必要な場合だけ短命・最小 scope・限定 process に閉じ、ログやPRに出さず、run 後に失効する設計です。

.env を貼らない、だけでは足りません。agent は shell、MCP、browser、CI、artifact store をまたいで動きます。secret がどこから見え、どこへ出力され、いつ消えるかを run 単位で固定してください。

最初の標準は、setup-only secret、agent-visible env の禁止、MCP token passthrough 禁止、raw log 非掲載、post-run rotation の5つで十分です。これを守れない task は、AIエージェントに任せる前に作業 lane を分けるべきです。

参考資料

WRITTEN BY nidoneko

Full-stack engineer with 8+ years of experience in TypeScript, React, Node.js, and cloud-native development across healthcare, finance, HR, and IoT domains.

View Profile →