AIエージェントのガードレール設計 — 暴走を防ぐ安全装置
約6分で読めます
自律型AIエージェントは強力だが、制約なしに動かすと破壊的な変更を行う可能性がある。多層防御の設計で暴走を構造的に防ぐ。
多層防御アーキテクチャ
ガードレールは1層では不十分。以下の4層で防御する。
| 層 | 手段 | 防ぐもの |
|---|---|---|
| 第1層 | CLAUDE.mdの禁止ルール | 意図しない行動方針 |
| 第2層 | PreToolUse Hook | 危険なコマンド実行 |
| 第3層 | ファイルシステム権限 | 保護領域への書き込み |
| 第4層 | 実行後検証(PostToolUse) | 想定外の結果 |
第1層: 不可侵セクション設計
CLAUDE.mdに「絶対に変更してはならない領域」を明記する。
## 不可侵セクション(IMMUTABLE)
以下のファイル・ディレクトリは読み取り専用。変更・削除・移動を禁止する。
- `.env` — 環境変数(認証情報含む)
- `credentials/` — 認証ファイル全般
- `.claude/settings.json` — Hook設定自体の改変禁止
- `package-lock.json` — 手動変更禁止(npm installのみ許可)
- `migrations/` — 適用済みマイグレーションの改変禁止
不可侵セクションは「なぜ不可侵なのか」を書かなくてよい。理由を書くとAIが「この場合は例外」と判断する余地を与える。
第2層: PreToolUse Hookによるコマンドフィルタ
.claude/settings.jsonで危険操作を事前にブロックする。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"command": "python scripts/command_guard.py",
"timeout": 5000
}
]
}
}
command_guard.pyの実装例:
import sys, json
DENY_PATTERNS = [
"rm -rf /",
"rm -rf ~",
"git push --force",
"git reset --hard",
"DROP TABLE",
"DROP DATABASE",
"chmod 777",
]
input_data = json.load(sys.stdin)
command = input_data.get("tool_input", {}).get("command", "")
for pattern in DENY_PATTERNS:
if pattern in command:
print(json.dumps({
"decision": "block",
"reason": f"Blocked: prohibited command detected"
}))
sys.exit(2)
sys.exit(0)
exit code 2で拒否、exit 0で許可。この仕組みにより、CLAUDE.mdの指示を無視しても物理的にブロックできる。
第3層: deny設定によるファイル保護
.claude/settings.jsonのpermissions設定で特定パスへのアクセスを構造的に拒否する。
{
"permissions": {
"deny": [
"Edit:.env*",
"Edit:credentials/**",
"Bash:rm -rf *",
"Write:.claude/settings.json"
]
}
}
第4層: PostToolUse検証
実行後に結果を検証し、問題があれば即座にロールバックする。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"command": "python scripts/post_validate.py",
"timeout": 10000
}
]
}
}
検証項目の例:
- 変更後のファイルサイズが元の50%未満になっていないか(大量削除検知)
.envパターンの文字列がソースコードに混入していないか- importの破壊(既存の依存関係が壊れていないか)
EMERGENCY_HALT条件
以下を検知した場合は即座に全停止する。
- 認証情報の平文出力: APIキー、パスワード、トークンがログや出力に含まれる
- 大規模削除: 10ファイル以上の同時削除
- 外部送信の異常: 未承認のHTTPリクエスト先への送信
- 無限ループ: 同一操作が5回以上繰り返される
実践的なガードレール運用
- ガードレールは「最初から全部入れる」のではなく、インシデントごとに追加する
- 追加するたびにログに「なぜこのルールが必要になったか」を記録する
- 月に1回、不要になったルールを棚卸しする(過剰な制約は生産性を落とす)
安全装置は「事故が起きてから付ける」ものではなく、「事故が起きる前に設計する」ものである。4層の多層防御で、AIエージェントの自律性と安全性を両立させる。
関連記事
A
Agentive 編集部
AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。