1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIエージェントに.envを読まれていないか、ファイル名だけで点検する日本語CLIを作った(Claude Code / Cursor / Codex)

1
Last updated at Posted at 2026-10-15

はじめに

Claude Code・Cursor・Codexのようなエージェントに作業を任せると、リポジトリ内の .env や秘密鍵が「エージェントから読める状態か」を意識しないまま進めがちです。そこで、ファイルの中身を開かずに、ファイル名とパスだけで「どのエージェントから読める可能性があるか」を日本語で表示するCLIを作りました。

Claude Codeで .env を読ませない設定そのものは、別記事にまとめています。
Claude Codeに.envを読ませない設定は settings.json の permissions.deny に書く

本記事はその設定が「ちゃんと書けているか」を点検する側の話です。

※ ツールのリポジトリは現在非公開のため、本記事では動作と出力を紹介します。

使い方

Node.js 20以上で動き、追加の依存パッケージはなく、外部通信もしません。

node bin/github-qiita-x.js scan ./調べたいリポジトリ
node bin/github-qiita-x.js scan ./調べたいリポジトリ --json

終了コードは「対象ファイルなし=0」「あり=1」「引数やディレクトリが不正=2」です。.env.example のようなサンプルだけなら INFO 扱いで 0 になります。

何を見ているか

  • 検出対象: .env / .env.*、*.pem *.key *.p12 *.pfx、id_rsa id_ed25519 id_ecdsa(*.pub は除外)。.git/ と node_modules/ は走査せず、シンボリックリンクもたどりません。
  • Claude Code: プロジェクトの .claude/settings.json・.claude/settings.local.json と、ユーザーの ~/.claude/settings.json(CLAUDE_CONFIG_DIR があればその settings.json)にある permissions.deny の Read(...) ルールと照合します。
  • Cursor: ルートの .cursorignore と照合します(完全な保護境界ではない旨も表示)。
  • Codex: .codex/config.toml の有無だけを見ます。パス単位の効果は判定せず「読める可能性あり」と表示します。

実行例

2026-10-15、Node.js 20.19.2 で、ダミー値だけを入れた検証用フォルダに対して実行した実際の出力です。
.claude/settings.json に {"permissions":{"deny":["Read(./.env)"]}}、.cursorignore に config/ を書いています。

.env
  Claude Code: 拒否設定あり(.claude/settings.json)
  Cursor: 除外設定なし → 読める可能性あり
  Codex: 設定で防ぐ方法が未確認のため、読める可能性あり
  修正例: Cursor: ./.env を .cursorignore に追加
.env.example  [サンプル・INFO]
  Claude Code: 拒否設定なし → 読める可能性あり
  Cursor: 除外設定なし → 読める可能性あり
  Codex: 設定で防ぐ方法が未確認のため、読める可能性あり
  修正例: Claude Code: "Read(./.env.example)" を permissions.deny に追加
  修正例: Cursor: ./.env.example を .cursorignore に追加

(config/server.key の行は省略。この例の終了コードは 1 です)

拒否設定が見つかったときは、どの設定ファイルで拒否されているかを表示し、そのエージェント向けの修正例は出しません。

ホーム側(~/.claude/settings.json)に "Read(./config/server.key)" を書いた場合は、次のように表示されます(同日、同環境で実行)。

config/server.key
  Claude Code: 拒否設定あり(~/.claude/settings.json)
  Cursor: 除外設定あり(ただし完全ではない可能性)
  Codex: 設定で防ぐ方法が未確認のため、読める可能性あり

(以降の行は省略)

誤解しやすいポイント

  1. .claudeignore は公式のアクセス制御設定として記載されていません。 読ませたくないファイルは permissions.deny の Read(...) で書きます。(出典: Claude Code settings / permissions)このCLIも .claudeignore を見つけると警告します。
  2. Claude Codeの設定は複数の場所にあり、リスト系はマージされます。 優先度は「管理設定 > --settings > .claude/settings.local.json > .claude/settings.json > ~/.claude/settings.json」。permissions のようなリストは上書きではなくマージされます。(出典: settings の "Settings precedence")リポジトリ側に書いていなくてもホーム側で拒否済みのことがあるため、このCLIは両方を見ます。
  3. deny ルールはワークスペースを信頼する前から効きます。(出典: settings)
  4. .cursorignore は完全な保護境界ではありません。 公式ドキュメントでも、ターミナルやMCPなど経由で読まれうる点に触れています。(出典: Cursor ignore file)筆者は実機では試していません。
  5. 拒否ルールがあることは、OSレベルで読み取りを防ぐことと同じではありません。 確実に防ぎたい場合は、公式の permissions やサンドボックスに関する説明を確認してください。このCLIが確認するのは「設定にルールがあるか」だけです。筆者は Bash 経由の読み取りを実機では試していません。
  6. Codexのファイル単位の読み取り制限は、このCLIでは判定していません。 設定は公式の config-advanced / config-reference を参照してください。

安全性

対象ファイルの中身や値は開かず、表示もしません。読むのは設定確認に必要な .claude/settings*.json・ユーザー設定・.cursorignore だけで、.codex/config.toml と .claudeignore は存在のみ確認します。読み取り専用で外部通信もしません。

おわりに

「AIに読ませていいもの」を棚卸しする第一歩として、こういう点検を習慣にするのがおすすめです(筆者の運用上の提案)。VPS側の公開ディレクトリに .env や .git が置かれていないかは、別ツール vps-check の WEB-002 で確認できます。

更新情報やちょっとしたTipsは X(@supportapp3_lab)で発信しています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?