Tips 2026.04.24

Claude CodeのHooks機能でAWS本番環境を守るガードレールの作り方

タグ:ClaudeCode / AWS / セキュリティ / 生成AI / 開発ツール

TL;DR

  • Claude CodeにはHooks(フック)という仕組みがあり、AIがツールを呼び出す前後に独自のスクリプトを割り込ませられる
  • この仕組みを使うと、AWS本番環境のプロファイルへの操作を検知・ブロックするガードレールが作れる
  • ただし「PreToolUseフック」は完全な防御にはならないバイパス経路が存在するため、複数の対策を組み合わせる必要がある

Claude CodeのHooksとは何か

Claude Code(Anthropicが提供するCLIベースの開発支援ツール)には、**Hooks(フック)**と呼ばれる機能がある。これは、Claude CodeがBashコマンドやファイル操作などのツールを実行する直前(PreToolUse)や直後(PostToolUse)に、ユーザーが用意したスクリプトを自動で走らせる仕組みだ。

dev.toのGabriele Mariotti氏の記事(Guardrails with hooks: how I protect AWS production profiles in Claude Code)では、この仕組みを使ってAWSの本番プロファイルへの誤操作を防ぐ具体的な方法が紹介されている。

フックが動くタイミング

  • PreToolUse: Claudeがツールを呼び出す直前。ここでブロック判定ができる
  • PostToolUse: ツール呼び出しが終わった直後。ログ記録や後処理に使う

AWSガードレールの仕組みと設定例

やりたいこと

開発中にClaude Codeへ「S3バケットの一覧を見せて」と頼んだとき、うっかり本番用AWSプロファイル(productionprodという名前のもの)でコマンドが走ってしまうのを防ぎたい。これは開発現場で実際によく起きる事故の一つだ。

hooks設定ファイルの書き方

Claude Codeのフックは、.claude/hooks.json(またはclaude_hooks.json)のような設定ファイルに定義する。Mariotti氏が紹介している構成では、PreToolUseフックでBashコマンドの中身を検査し、本番プロファイルへの操作が含まれていれば処理を止める。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.claude/hooks/check_aws_profile.py"
          }
        ]
      }
    ]
  }
}

検査スクリプトの例

import sys
import json

def main():
    # Claude Codeからツール呼び出しの情報が標準入力で渡される
    data = json.load(sys.stdin)
    tool_input = data.get("tool_input", {})
    command = tool_input.get("command", "")

    # 本番プロファイルへの操作を検知
    blocked_profiles = ["production", "prod", "prd"]
    for profile in blocked_profiles:
        if f"--profile {profile}" in command or f"AWS_PROFILE={profile}" in command:
            # 終了コード2でブロック(Claude Codeへエラーを返す)
            print(f"[BLOCKED] AWS本番プロファイル '{profile}' への操作はブロックされました", file=sys.stderr)
            sys.exit(2)

    sys.exit(0)

if __name__ == "__main__":
    main()

このスクリプトは、Claudeが実行しようとしているBashコマンドの中に--profile productionAWS_PROFILE=prodといった文字列が含まれていれば、終了コード2を返してブロックする。

PostToolUseでのログ記録

実行後に記録だけ残す使い方も有効だ。

import sys
import json
from datetime import datetime

data = json.load(sys.stdin)
command = data.get("tool_input", {}).get("command", "")

with open("/tmp/claude_aws_audit.log", "a") as f:
    f.write(f"{datetime.now().isoformat()} CMD: {command}\n")

sys.exit(0)

PreToolUseフックは完全には防げない

dev.toのSahil Kat氏の記事(Why Claude Code PreToolUse Hooks Can Still Be Bypassed)では、PreToolUseフックだけでは防御が完全ではない理由が指摘されている。

バイパスされる可能性のある経路

  • Claudeがコマンドを複数ステップに分割して実行したとき、フックが各ステップの文脈を把握しきれない場合がある
  • スクリプトや一時ファイルに操作内容を書き出して実行するような間接的な方法だと、フックが単純な文字列マッチングしかしていない場合は検知できないことがある
  • フックはあくまでClaude Codeが提供するレイヤーであり、OS側の権限設定(IAMポリシー等)とは別物

だから多層防御が必要

フックによるガードレールはあくまで「最初の砦」であり、以下のような対策と組み合わせるのが現実的だ(一般的なセキュリティ対策として):

  • AWSのIAMポリシーで本番プロファイルの権限を最小化する
  • 本番環境へのアクセスにはMFA(多要素認証)を必須にする
  • CloudTrailでAPIコールのログを取っておく

MCP Tool Hooksとの違い

同じくdev.toで紹介されているMCP Tool Hooks in Claude Codeは、MCP(Model Context Protocol)サーバー経由でのツール呼び出しに対してフックを設定する方法を扱っている。MCP経由のツールも同様にPreToolUse/PostToolUseフックの対象になるため、外部サービスへの連携を含む構成でも同じ考え方が使える。


既存ユーザーへの影響と対応

すでにClaude Codeを使っている場合、今すぐHooksを追加してもこれまでの使い方は変わらない。フックはオプトイン(自分で設定した場合だけ動く)の仕組みなので、設定しない限り既存の動作には影響しない。

AWS以外にも、たとえば「本番データベースへの書き込みコマンドをブロック」「特定ディレクトリへのファイル削除を記録」といった用途にも応用できる。


試し方(手順)

1. フック用ディレクトリを作る

mkdir -p ~/.claude/hooks

2. 検査スクリプトを配置する

上記のcheck_aws_profile.py~/.claude/hooks/check_aws_profile.pyとして保存する。

3. フック設定ファイルを作る

Claude Codeのプロジェクトルートに.claude/hooks.jsonを作り、上記のJSON設定を記述する。

4. 動作確認

# 本番プロファイル指定のコマンドを試す(ブロックされるはず)
# Claude Codeのチャット内で以下を依頼する
# 「aws s3 ls --profile production を実行して」

フックが正常に動いていれば、Claude Codeがエラーを返し実行が止まる。


関連リンク

参考ソース