私はAI を使用してサイトの作成をすることが多く、cursorやClaude Codeを使ってコードを修正してもらったりしています。
Claude Codeは、AIがコードを読み書きしてくれるとても便利なツールです。
しかし便利すぎるがゆえに、データベースのパスワードやAPIキーなど、見せたくないファイルの中身まで読めてしまいます。
この記事では、.claude/settings.json の deny(拒否)設定 を使って、Claude Codeに機密ファイルを読ませないようにする方法を、初心者向けにわかりやすく解説します。
Claude Codeに関しての記事は他にも書いているので、興味ある方はご参照ください↓↓
・Claude Codeをターミナルで起動できない時の対処方法

・Claude CodeをVScodeで使う方法

・VScodeでのモデルの確認方法

・Claude Designの設定方法

・パスワード管理について

・GitHubのパスワード管理について

そもそもなぜ「見せない」設定が必要なの
Web開発では、データベースに接続するためのパスワードなど、外部に漏れてはいけない情報を扱います。
例えば、こんなファイルがあったとします。
<?php
$db_host = 'localhost';
$db_name = 'my_database';
$db_user = 'admin';
$db_pass = 'super_secret_password'; // ← これが漏れたら大問題
?>
Claude Codeはファイルを読む機能を持っているため、何も設定しなければ、このファイルの中身をそのまま読めてしまいます。
そこで 「このファイルだけは読まないでね」 とClaude Codeに伝える設定が必要になります。
設定ファイルの場所
プロジェクトのルートディレクトリに、以下のパスでファイルを作成します。
プロジェクトフォルダ/
├── .claude/
│ └── settings.json ← これを作る
├── src/
├── ...
設定の書き方
{
"deny": [
"Read(**/db_connect_pass.php)",
"Read(**/.env)",
"Bash(cat **/db_connect_pass.php)",
"Bash(cat **/.env)",
"Bash(less **/db_connect_pass.php)",
"Bash(less **/.env)",
"Bash(head **/db_connect_pass.php)",
"Bash(head **/.env)",
"Bash(tail **/db_connect_pass.php)",
"Bash(tail **/.env)",
"Bash(grep * **/db_connect_pass.php)",
"Bash(grep * **/.env)"
]
}
一見複雑に見えますが、やっていることはシンプルです。
「このファイルを、あらゆる方法で読むことを禁止する」
これだけです。
一つずつ見ていきましょう。
deny とは
{
"deny": [
...
]
}
deny = 「拒否する」 という意味です。
この配列の中に書かれた操作を、Claude Codeは実行できなくなります。
** とは
**/db_connect_pass.php
** は 「どのフォルダの中にあっても」 という意味のワイルドカードです。
**/db_connect_pass.php は、以下すべてに一致します:
/db_connect_pass.php
/maker/db_connect_pass.php
/aaa/bbb/ccc/db_connect_pass.php
こうすることで、プロジェクト内のどこにファイルを置いても、確実に保護できます。
各行の意味
Read ― Claude Codeの読み取り機能を禁止
"Read(**/db_connect_pass.php)"
Claude Codeには Read という、ファイルの中身を直接読むツールがあります。これを禁止します。
Bash(cat ...) ― ターミナルの表示コマンドを禁止
Claude Codeは Bash ツールを使ってターミナルコマンドも実行できます。ファイルの中身を表示できるコマンドは複数あるため、それぞれ禁止する必要があります。
| 設定 | 禁止するコマンド | コマンドの意味 |
|---|---|---|
Bash(cat ...) | cat | ファイルの中身を全部表示する |
Bash(less ...) | less | ファイルをスクロール表示する |
Bash(head ...) | head | ファイルの先頭だけ表示する |
Bash(tail ...) | tail | ファイルの末尾だけ表示する |
Bash(grep ...) | grep | ファイル内を検索して該当行を表示する |
なぜこんなに多くのコマンドを禁止するのか?
Read だけ禁止しても、Claude Codeが cat コマンドを使えば中身が見えてしまいます。
cat を禁止しても head で先頭だけ見えてしまいます。
つまり、「抜け道を全部塞ぐ」 ために、ファイルの中身を表示できるコマンドをすべてリストアップして禁止しているのです。
Read で直接見る → 禁止
cat で全部表示する → 禁止
less でスクロール表示 → 禁止
head で先頭だけ見る → 禁止
tail で末尾だけ見る → 禁止
grep で検索して見る → 禁止
.env も一緒に守ろう
上記の設定では db_connect_pass.php と .env の2ファイルを保護しています。
.env は多くのフレームワーク(Laravel、Next.js、Railsなど)で使われる環境変数ファイルで、パスワードやAPIキーが書かれることが多いファイルです。
プロジェクトに応じて、保護したいファイルを追加してください。
{
"deny": [
"Read(**/db_connect_pass.php)",
"Read(**/.env)",
"Read(**/credentials.json)",
...
]
}
さらに安全にするために
settings.json だけでなく、以下の3つも合わせて設定することをおすすめします。
1. .gitignore に追加する
機密ファイルがGitHub等にアップロードされないようにします。
# .gitignore
**/db_connect_pass.php
.env
2. CLAUDE.md にルールを明記する
プロジェクトルートに CLAUDE.md を作成し、Claude Codeへの指示を書きます。
# CLAUDE.md 例・・・
- `db_connect_pass.php` など機密情報が含まれるファイルの中身を確認しないこと。
CLAUDE.md はClaude Codeが会話の最初に自動的に読み込むファイルなので、ここに書いたルールは毎回適用されます。
3つの対策の役割
| 対策 | 守る対象 | 効果 |
|---|---|---|
.gitignore | GitHub・Git | 機密ファイルがリポジトリに上がらない |
.claude/settings.json | Claude Code | 機密ファイルを読み取れない |
CLAUDE.md | Claude Code | 「読もうとしない」というルールを認識させる |
まとめ
.claude/settings.jsonのdeny設定で、Claude Codeに特定のファイルを読ませないようにできるReadだけでなく、cat・less・head・tail・grepも禁止して抜け道を塞ぐ.gitignoreとCLAUDE.mdも合わせて設定すると、より安全になる
Claude Codeは非常に便利なツールですが、便利だからこそ 「見せていいもの」と「見せてはいけないもの」の線引き が大切です。
プロジェクトを始めるときに、まずこの設定をしておくことをおすすめします。


