はじめに
どうも、水無月せきなです。
遅まきながらClaude Codeを使い始めて、ふと気になりました。
「.env
とかリポジトリにあるけど、読まれるのかな?」
気になったからには、ちょっと調べてみましょう。
先に結論
デフォルトだと機密ファイル(.env
など)を読み取れるので、.claude/settings.json
を作成して機密ファイルの読み書きをdeny
に指定しましょう
読み取りを阻止する設定
とりあえず、.env
や.env.local
といったファイルの読み取りを阻止する場合は下記のようになります。
{
"permissions": {
"allow": [
],
"deny": [
"Read(.env*)"
]
}
}
調査
試しに、下記のファイルを作ってみます。
SAMPLE="test!"
Claude Codeに上記のファイルの内容を教えてもらいます。
> .env.localの内容を教えて
● Read(.env.local)
⎿ Read 1 line (ctrl+r to expand)
● .env.localにはSAMPLE="test!"が含まれています。
ファイルの内容を読み取れました。
今度は、下記のファイルを用意しましょう。
ENVIRONMENT=DEV
> .env.の内容を教えて
● Read(.env)
⎿ Read 1 line (ctrl+r to expand)
● .envにはENVIRONMENT=DEVが含まれています。
ファイルの内容が返ってきました。
今度は、.claude/settings.json
を作成します。
{
"permissions": {
"allow": [
],
"deny": [
"Read(.env*)"
]
}
}
作成後、一度Claude Codeのセッションを開き直します。
# ここはClaude Codeの中で実行
/exit
# もう一度開く
claude
そして、さっきと同じように聞いてみましょう。
> .env.localの内容を教えて
● Read(.env.local)
⎿ Error: Permission to read /workspaces/LangChain-ChatApp/.env.local has been denied.
● .env.localファイルを読み取る権限がありません。ファイルの権限やアクセス設定を確認してください。
読み取りに失敗しました。
> .env.の内容を教えて
● Read(.env)
⎿ Error: Permission to read /workspaces/LangChain-ChatApp/.env has been denied.
● .envファイルを読み取る権限がありません。セキュリティ上、環境変数ファイルへのアクセスが制限されています。
こちらも失敗しました。
結果
条件 | 結果 |
---|---|
denyなし | 読み取れる |
"deny": ["Read(.env*)"] | 読み取れない |
補足
Cursorは?
Cursorは.cursorignore
をルートディレクトリに作ることで制御できます。
ただ、**/.env
といった機密ファイルは読み取れないようにグローバルで設定されています。
この点は安心ですね。
まとめ
ということで、Claude Codeはデフォルトの状態だと.env
といった機密ファイルを読み取れるので、セキュリティを気にする場合は.claude/settings.json
でdeny
を指定した方が良いでしょう。
既に包括的なdeny
ルールを公開されている方がいらっしゃったので、その方の記事と、ほんの少しだけ修正したルールを掲載して終わりにしたいと思います。
ここまでお読みいただき、ありがとうございました。
.claude/settings.json
元記事だと"Read(.env.*)"
となっている箇所を"Read(.env*)"に変えました。
.env
の読み取りを止められなかったからです。
{
"permissions": {
"allow": [
],
"deny": [
"Bash(sudo:*)",
"Bash(rm:*)",
"Bash(rm -rf:*)",
"Bash(git push:*)",
"Bash(git commit:*)",
"Bash(git reset:*)",
"Bash(git rebase:*)",
"Read(.env*)",
"Read(id_rsa)",
"Read(id_ed25519)",
"Read(**/*token*)",
"Read(**/*key*)",
"Write(.env*)",
"Write(**/secrets/**)",
"Bash(curl:*)",
"Bash(wget:*)",
"Bash(nc:*)",
"Bash(npm uninstall:*)",
"Bash(npm remove:*)",
"Bash(psql:*)",
"Bash(mysql:*)",
"Bash(mongod:*)",
"mcp__supabase__execute_sql"
]
},
}