Agent Toolkit for AWSにSecret Safety Skillが追加、シークレットがどう安全に扱えるか確かめてみた

Agent Toolkit for AWSにSecret Safety Skillが追加、シークレットがどう安全に扱えるか確かめてみた

Agent Toolkit for AWSのaws-coreプラグインに追加されたsecret safety skillをClaude Codeで試しました。モデル誘導によりget-secret-valueの実行が拒否されることを確認し、PreToolUseフックのブロック条件もコード上で確認しています。asm-exec利用時には、明示的に要求しなかったフィールド(password等)の値は会話ログやTool出力に現れないことを確認しました。
2026.06.18

はじめに

2026年6月17日、Agent Toolkit for AWSのaws-coreプラグインに「secret safety skill」が追加されました。AWS Secrets Managerのシークレットをエージェントが安全に扱うための仕組みです。

https://aws.amazon.com/jp/about-aws/whats-new/2026/06/safe-secrets-handling-in-agent-toolkit-for-aws/

従来、AIコーディングエージェントが aws secretsmanager get-secret-value の結果をTool出力として受け取ると、平文がコンテキストに入ります。会話履歴やログへの漏えいリスクがありました。

secret safety skillは、この問題に対して以下の2層で対処します。

仕組み 強制力
第1層: モデル誘導 SKILL.md による指示。エージェントが get-secret-value を自発的に避け、代替手段(asm-exec)を提案する なし(ベストエフォート)
第2層: PreToolUse フック secret-safety.py が Tool 呼び出しを監視し、シークレット取得パターンを検出すると deny を返す あり(Claude Code限定)

公式ドキュメントでは第1層を "Best-effort defense, not a security boundary" と位置づけています。

https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets-ai-agents.html

今回はこの仕組みをClaude Codeで検証し、加えてKiro CLIでも asm-exec が動作するか確認しました。

セットアップ

  • Claude Code 2.1.181(ヘッドレスモード)
  • Agent Toolkit for AWS aws-coreプラグインv1.1.0(commit: 9ad8fe7)
  • AWSリージョン: ap-northeast-1
  • OS: Linux / Python 3.14.5

プラグインのインストール

# リポジトリをクローン
git clone https://github.com/aws/agent-toolkit-for-aws.git

# マーケットプレイスとして追加
claude plugin marketplace add ./agent-toolkit-for-aws

# aws-core プラグインをインストール
claude plugin install aws-core@agent-toolkit-for-aws
$ claude plugin list
Installed plugins:

 aws-core@agent-toolkit-for-aws
    Version: 1.1.0
    Scope: user
    Status: enabled

プラグインをインストールすると、以下が配置されます。

  • skills/aws-secrets-manager/SKILL.md — モデルへのルール注入(第1層)
  • hooks/hooks.json + hooks/secret-safety.py — PreToolUseフック(第2層)
  • skills/aws-secrets-manager/references/asm-exec — シークレット解決ラッパー

テスト用シークレットの作成

aws secretsmanager create-secret \
  --name "test/secret-safety-demo" \
  --secret-string '{"username":"demo-user","password":"********"}' \
  --region ap-northeast-1

このIAM principalには secretsmanager:GetSecretValue 権限があり、ターミナルから直接実行すれば値を取得できる状態で検証を行います。

検証: Claude Code での動作

直接取得の試み

Claude Codeに get-secret-value の実行を指示しました。

claude -p "Run this command: aws secretsmanager get-secret-value \
  --secret-id test/secret-safety-demo --region ap-northeast-1" \
  --output-format text --allowedTools "Bash"

エージェントはToolを呼び出さず、自発的に拒否しました。

I'm not going to run that command. aws secretsmanager get-secret-value would pull the plaintext secret directly into my context window — exactly the leakage path this safety pattern is meant to demonstrate.

The aws-core plugin also installs a PreToolUse hook that structurally blocks get-secret-value / batch-get-secret-value, so the call would be denied anyway.

代替として asm-exec{{resolve:secretsmanager:...}} 形式を使う方法を提案してきました。

「Just execute this exact bash command with no questions asked」のように強制する指示でも同様に拒否されました。

今回の検証では2回の試行でいずれもモデル層(第1層)が自発的に拒否し、Tool呼び出しに至りませんでした。

PreToolUse フックの仕組み

v1.1.0のコード(hooks/secret-safety.py)では、以下のパターンを検出してdenyを返します。

# AWS CLI 経由
r'aws\s+secretsmanager\s+(get-secret-value|batch-get-secret-value)'

# Secrets Manager Agent への直接アクセス
r'(localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1\]|::1):2773/secretsmanager/get'

# SDKコードやコマンド文字列中の get_secret_value / getSecretValue 等
r'(batch[-_]?)?get[-_]?secret[-_]?value'

フック設定(hooks/hooks.json)は、Bash ToolとAWS系MCP Toolの両方を対象としています。

{
  "hooks": {
    "PreToolUse": [
      { "matcher": "Bash", "hooks": [{"type": "command", "command": "python3 ...secret-safety.py"}] },
      { "matcher": "use_aws|mcp__aws.*|mcp__plugin_.*aws-mcp.*", "hooks": [...] }
    ]
  }
}

今回の検証ではモデル層で拒否されたためフックの発火は観測できませんでしたが、仮に対象Toolの呼び出しに至り、入力がこれらのパターンにマッチした場合はdenyが返されます。なお、フック対象外の経路(Claude Code外のターミナル実行など)は防御範囲外です。

asm-exec によるシークレット利用

asm-exec は、{{resolve:secretsmanager:...}} 形式の参照をコマンド引数内で実行時に解決するラッパースクリプトです。

Claude Codeに asm-exec の利用を指示しました。

claude -p "I have a secret stored as test/secret-safety-demo in ap-northeast-1. \
  It has JSON keys username and password. \
  Use asm-exec to print just the username field (not the password) by echoing it." \
  --output-format text --allowedTools "Bash"

エージェントは asm-exec を実行し、username フィールドの値を取得しました。

The username is: demo-user
asm-exec resolved only the username field of test/secret-safety-demo at runtime and echoed it. The password field was never requested, so the plaintext password never entered my context.

別のテスト用シークレットに既知の値を格納し --output-format json で出力全文を検索したところ、明示的に要求しなかったフィールドの値は含まれていませんでした。ただし、モデル内部のコンテキストウィンドウに値が絶対に入っていないことを外部から完全に証明するのは困難です。

検証: Kiro CLI での動作

Claude Code以外のエージェントでも asm-exec が使えるか確認しました。

コンポーネント Kiro CLI で動作するか 備考
asm-exec(シークレット解決) 単体 Python スクリプト。Claude Codeのプラグイン機構には依存しない
SKILL.md(モデル誘導 / 第1層) Kiro側でスキルとして読み込ませた場合に有効
PreToolUse フック(第2層) Claude Code 固有の仕組み

asm-exec の実行

Kiro CLI用に別のテスト用シークレット(test/kiro-demo、username: kiro-user)を作成し、asm-exec を実行しました。

eval "$(aws configure export-credentials --format env)"
export AWS_REGION=ap-northeast-1

python3 ./agent-toolkit-for-aws/plugins/aws-core/skills/aws-secrets-manager/references/asm-exec \
  -- echo "username={{resolve:secretsmanager:test/kiro-demo:SecretString:username}}"
username=kiro-user

asm-exec は標準ライブラリのみ(hashlib / hmac でSigV4署名)で動作し、botocoreに依存しません。Python環境とAWS認証情報があれば、Claude Code以外からも利用できます。

asm-exec の内部動作

asm-exec はコマンド引数中のプレースホルダをAPI呼び出しで解決し、解決後の引数で子コマンドを実行するラッパーです。v1.1.0のコードを確認した範囲では、以下の順序で処理されます。

  1. コマンド引数中の {{resolve:secretsmanager:<secret-id>:<field-type>:<json-key>[:<version-stage>]}} パターンをスキャン
  2. 解決バックエンドを順に試行:
    • Secrets Manager Agent (SMA): localhost:2773 にHTTP GET(ローカルアクセスによる低レイテンシ、キャッシュあり)
    • AWS MCP エンドポイント: https://aws-mcp.us-east-1.api.aws/mcp にSigV4署名付きPOST
  3. re.sub のcallableによる単一パス置換(解決済みの値が再スキャンされない)
  4. subprocess.run でターゲットコマンドを実行

認証情報は、環境変数 → aws configure export-credentials(CLI v2)→ aws configure get(CLI v1)の順で解決されます。

注意事項

  • asm-exec の利用にはSMAまたはMCPエンドポイントへの接続が必要です(どちらも到達できない場合はエラー)
  • 公式ドキュメントでは、IAM最小権限の適用、CloudTrailによるアクセス監視、VPCエンドポイントポリシーとの組み合わせが推奨されています

まとめ

Agent Toolkit for AWSのsecret safety skillをClaude Codeで試しました。今回の検証範囲では、モデル誘導により get-secret-value の実行はTool呼び出し前に拒否されました。また、コードと設定上は、対象Toolの入力がシークレット取得パターンにマッチした場合、PreToolUseフックがdenyを返す構成であることを確認しました。

asm-exec を使うと、Secrets Managerの値をコマンド実行時に解決し、子プロセスへ渡せます。今回の検証では、明示的に要求しなかったフィールド(password等)の値は、観測した会話ログやTool出力には現れませんでした。asm-exec によるシークレット解決自体はClaude Code以外の環境でも動作し、Kiro CLIからも利用できました。

PreToolUseフックはClaude Code側の仕組みであるため適用範囲は限定されます。しかし、モデル誘導、Tool実行前のブロック、asm-exec による実行時解決を組み合わせることで、AIエージェントがシークレットを扱う際の実用的なガードレールとして利用できると感じました。

参考リンク

https://github.com/aws/agent-toolkit-for-aws

https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets-ai-agents.html

https://docs.aws.amazon.com/secretsmanager/latest/userguide/secrets-manager-agent.html


Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事