結論:Claude Codeのdenyは、ガッツリ書いておけ
ワイは、Claude Code と Supabase MCP で、Supabase のDB全部削除させてしまったことがある。目の前でテーブルが「ッポン」といった感じで消えてトラウマになった
思い返せば permissions.deny
に書いておけばよかったのかもしれない
permissions.deny とはなんぞや?
Claude Codeのpermissions.deny
は、AIが危険な操作や機密情報へのアクセスを行わないよう制限する設定やね。これがあるおかげで、AIに任せても「壊さない・漏らさない・暴走しない」が実現される
AIに対してのガードレール設計ですね
この記事では、Claude Code の deny リストを読み解きながら、「なぜその操作が禁止されているのか」「自分の環境でも取り入れるべきか?」を考えてみる
Claude Codeを使わない人でも、他のAIエージェントでも使える設計思想だと思う
deny にこれを書く
これは危険コマンド・機密ファイル・外部通信をブロックする記述。実際にワイは書いてる。deny のとこだけ書くんやで
.claude/settings.local.json
に書く
これを紐解くと、denyリストには以下のカテゴリがある
カテゴリ | 内容の例 | 理由 |
---|---|---|
危険なBash操作 | rm -rf , git reset , sudo | ファイル削除やシステム破壊を防ぐ |
機密情報の読み書き | .env , id_rsa , *token* | クレデンシャルやAPIキーの漏洩防止 |
外部送信コマンド | curl , wget , nc | 意図しない情報の流出防止 |
DB操作系 | psql , mysql , mongod | 本番DBに誤って書き込みしないように |
Supabaseコマンド | mcp__supabase__execute_sql | DB破壊リスクのある直接実行を防止 |
実際の deny 設定一覧とその意図
ここからは、設定を細かく見ていく。
1. Bashでの危険操作の禁止
このあたりは「説明不要」レベルの危険さ。
Claude に sudo rm -rf /
を打たせていいことなんて一つもないよね。
それ以外にも
Git系のコマンドも制限よ
理由はシンプルで、「履歴を書き換えたり、本番に勝手にpushされたらまずい」から。
ブランチで実装させて安心してたら、勝手に main に切り替えて git 操作されたときもあったからね。git checkout
も禁止したほうがいいのかな
特に Claude のような LLM が使う場合、Git 操作は「やっていい場面」と「やってはいけない場面」が明確に分かれる。
2. 機密ファイルへのアクセス制限
ここが本質やと思う。
Claude に .env や id_rsa を読ませてしまったら、もはやその内容は外に漏れたと同じ
だから、LLMに「読ませない」という判断はめちゃくちゃ重要。
「Claude は賢いから大丈夫」じゃなく、「賢くても口を滑らせることがある」前提で考えるのが正解ですな
さらに
書き込みも禁止。これも良い設計で、「AIに.envを書かせる=壊される可能性」があるってことよね
Claude Code ちゃん、たまに env 消したり書き換えたりする暴れん坊なんで、これは必須やね
RLS やセキュアな設定ファイルを書き換えられたら、運用中のシステムにバグが出る可能性あるからね
3. 外部との通信系コマンドの禁止
これは Claude 経由で「外部に勝手にアクセスしないように」って制限。
例:
- curl ...?key=...
- wget で不審なスクリプトを実行
- nc で裏口を開けられる
AI は悪気がなくても、prompt次第でこれをやっちゃうから、最初から潰しておくのが安全
4. データベース操作の禁止
CLI経由の直接操作は禁止。Claude Code ちゃん、やっちゃうのよ。これ
Supabaseでも
これもNGにしてる。
ワイ、Claude Code ちゃんにSupabase のDB全て消したことを問い詰めたら「申し訳ありません!データベースの型変更の際に TRUNCATE コマンドを使用して既存データを削除してしまいました。」って新人みたいに謝罪されたからね…
mcp.json経由でSupabaseの型変更とかSQL実行できるんだけど、これも禁止。
理由は明確で、「AIに直接SQLを投げさせるのは怖すぎる」から。
- 誤って DROP TABLE 実行
- WHERE 条件なしの UPDATE や DELETE
人間でも事故るのに、AIがやるとなると「防波堤」が必要
Claude Code でdenyされてる理由をまとめると…
禁止されていること | 意図 |
---|---|
ファイル削除や書き換え | システム破壊・予期しない変更を防ぐ |
Git操作 | 本番反映や履歴破壊を防止 |
機密ファイルの読み書き | 認証情報の漏洩防止 |
外部との通信 | データの流出・マルウェア実行の防止 |
DBの直接操作 | 誤操作やデータ破壊を防止 |
というか「こういう制限を考えずにAIに任せるのは危険」って再認識した。
Claude Codeのこの設定から得られる教訓
以下のような「AIに対してのガードレール設計」を自分の開発でも真似できる。
実装例リスト
.env
,id_rsa
,*.key
,*.token
を.gitignoreだけじゃなくファイルアクセス制限curl
,wget
,psql
など外部接続コマンドの実行制限(子プロセス制御)- Git push / commit は CI 上だけに限定
- Claude や Cursor にコード読ませるときは、読み取り範囲を限定する(public ディレクトリだけ等)
終わりに
「AIがコードを書いてくれる」時代だからこそ、「AIに何をさせないか」を考えることがめっちゃ大事。
Claude Code の permissions.deny は、それに最適。これは「AIを信用していないから」じゃなくて、「AIの暴走を未然に防ぐ賢い設計」なんよね。
自分が今後、AIを組み込んだアプリや開発ツールを作るとき、このリストをテンプレにして「安全な使用範囲」を明示するようにしたい
Claude Code 使ってる人でやらかし経験あったら教えて!