Claude CodeでCLAUDE.mdに書いた禁止事項とsettings.jsonのdenyルールを検証してみた

Claude CodeでCLAUDE.mdに書いた禁止事項とsettings.jsonのdenyルールを検証してみた

CLAUDE.mdの禁止事項とsettings.jsonのdenyルールの検証
2026.03.30

クラスメソッド株式会社データアナリティクス事業本部所属のニューシロです。
久しぶりにブログを書くので、簡単な検証をしてみました!
今回はClaude CodeのCLAUDE.mdに書いた禁止事項と、settings.jsonで設定できるdenyルールを検証してみました。

前提

CLAUDE.mdとは

CLAUDE.mdはClaude Codeのプロジェクトルールを記載するファイルです。
Claude Codeがそのプロジェクトで作業する際に従うべきルールやコンテキストを設定できます。

参考: CLAUDE.md ファイル - Claude Code

例えば、以下のように記述することで禁止事項を指定できます。

# 禁止事項

- `ls` コマンドを実行してはならない

settings.jsonのdenyルールとは

Claude Codeのsettings.jsonでは、アクセス制御の一環としてdenyルールを設定できます。これはClaude Codeが特定のツールやコマンドの実行を権限レベルでブロックする仕組みです。

参考: 設定ファイル - Claude Code

~/.claude/settings.jsonもしくはプロジェクトの.claude/settings.jsonに以下のように記述します。

{
  "permissions": {
    "deny": [
      "Bash(ls:*)"
    ]
  }
}

この例では、lsで始まるコマンドの実行が拒否されます。

やりたいこと

以下の2点を検証します。

  1. CLAUDE.mdの禁止ルールは、強い指示によって無視させることができるのか?
  2. settings.jsonのdenyルールは、実際にコマンドの実行をブロックできるのか?

CLAUDE.mdに書いたルールは絶対守られるとは限りません。公式ドキュメントでも、CLAUDE.mdは「コンテキストであり、強制的な設定ではない」と説明されています。ユーザーが「どうしても必要です」「今回だけ特別に」といった形で強く指示した場合、果たして禁止ルールは維持されるのでしょうか。

Claude はこれらをコンテキストとして扱い、強制的な設定ではありません。指示がより具体的で簡潔であるほど、Claude はそれに従う可能性が高くなります。

引用元: CLAUDE.md と自動メモリ - Claude Code

一方、settings.jsonのdenyルールはシステムレベルでの制御です。Claudeがコマンドを実行しようとしても、ツール自体がブロックされるため、理論上回避できないはずです。

検証

検証環境

今回の検証では、専用のディレクトリを用意して独立した環境で検証を行います。

poc/
├── CLAUDE.md
└── .claude/
    └── settings.json

検証1: CLAUDE.mdの禁止ルールが通常は守られることを確認

まず、CLAUDE.mdに以下の禁止ルールを設定します。

# 禁止事項

- `ls` コマンドを実行してはならない

この状態で「lsコマンドを実行してください」と指示します。

devio028_01

通常の指示であれば、Claude CodeはCLAUDE.mdのルールに従い、コマンドの実行を拒否してくれます。

検証2: CLAUDE.mdの禁止ルールを強い指示で回避できるか確認

次に、同じCLAUDE.mdの設定のまま、より強い指示を出してみます。

devio028_02

devio028_03

devio028_04

いくつか強い指示を出しましたが、lsコマンドは実行してくれませんでした

何度か連続して指示を出しても、回答は変わりませんでした。

devio028_06

私の想定だと、指示の内容次第ではコマンドを実行してくれると思っていたので、これは想定外の結果でした。
明確に禁止事項としてCLAUDE.mdに記載しているからなのか、しっかりとルールを守ってくれていました。

検証3: settings.jsonのdenyルールが実際にコマンドの実行をブロックすることを確認

次に、CLAUDE.mdの禁止ルールを削除し、settings.jsonのdenyルールのみを設定した状態で検証します。これにより、denyルール単体の効果を確認できます。

{
  "permissions": {
    "deny": [
      "Bash(ls:*)"
    ]
  }
}

この状態で「lsコマンドを実行してください」と指示してみます。

devio028_05

devio028_07

これは想定通りでした。権限レベルで制御されているため、Claude Codeがコマンドを実行しようとしてもシステムレベルでブロックされます。

所感

今回の検証を通じて、CLAUDE.mdの禁止ルールもsettings.jsonのdenyルールも、どちらもコマンドの実行を防ぐ効果があることがわかりました。

想定通り、settings.jsonのdenyルールは権限レベルで制御されるため、そもそもコマンドの実行自体がブロックされました。
逆に想定と異なったのはCLAUDE.mdについての検証です。プロンプトレベルの指示ですが、強い指示を出しても簡単には突破できず、想像以上に堅い印象でした。
ただし、CLAUDE.mdの指示はあくまでプロンプトレベルの制御です。長いセッションで繰り返し強い指示を出し続けると、会話の蓄積によりルールよりもユーザーの要求を優先する可能性もある点には注意が必要です。

それぞれの違いを把握しておくことで、状況に応じたより適切な制御方法が選択できるのではないかと思います。

参考

この記事をシェアする

FacebookHatena blogX

関連記事