.env を AI コーディングエージェントに読ませない(hooks・deny ルール)
.gitignore に入れていても Cursor や Claude Code は .env を普通に読む。エージェント側の deny ルールや PreToolUse フックで読み取り自体を遮断する。
何を解決するか
- エージェントが
.envを読む → 会話ログ・プロバイダのサーバー・プロンプトインジェクション経由の外部送信に平文のシークレットが流れる。
手順
- Claude Code の permissions で deny(
.claude/settings.json):json{ "permissions": { "deny": ["Read(./.env)", "Read(./.env.*)", "Read(**/*.env)"] } } - PreToolUse フックでブロック: Bash 経由の
cat .env等も止めたい場合はフックで判定する。ptuf init claude-codeでフック設定が一発で入るツールもある(@_watany の紹介)。 - 専用ツール:
brew install amuletでエージェントからシークレットを守るツール Amulet(@tsukasaartcom)。 - Codex の permission profiles: OS 強制のファイル読み書き拒否ルール(
**/*.envも可)を、ドメイン単位のネットワーク許可や Unix ソケットと組み合わせ、継承可能なプロファイルとして再利用できる(@thsottiaux)。 - そもそも平文 .env を置かない: 1Password Environments のマウントや実行時注入(別記事)に移行するのが根本対策。worktree を多用するなら
.envコピー運用自体をやめる動機にもなる(@MLBear2)。
注意点
- deny ルールはツールごとに書式が違い、Bash 経由の迂回(
grep,base64等)を完全には防げない。OS レベルのサンドボックスやシークレットを置かない構成と併用する。 - 「近い将来みんな hooks と言う」(@awakia)ほどフックが主流になりつつある。