こんにちは、sanagiです。
Claude Codeは便利ですが、最近、Claude Codeを使った開発中に.envを読み込まれることで、認証情報が漏洩し、悪用されるという事例も発生しているそうです。
調べてみると、.claudeignoreファイルに読まれたくないファイルを記載する等、色々な対策方法があるらしいのですが、今回はDockerを使って.envを読み込まれないような環境は作れないか、考えてみました。
どんな対策方法があるのか
①settings.jsonに記載
allow(許可)とdeny(拒否)の操作を .claude/settings.json に記載することで、claudeの権限を設定することができます。
.envを読まれたくない場合は以下のように書くと読み込まれないようです。
{
"permissions": {
"allow": [
],
"deny": [
"Read(.env*)"
"Read(*.env)",
"Read(.env.*)",
]
}
}
②CLAUDE.mdに指示を入れる
CLAUDE.mdファイルとは、プロジェクトのルートディレクトリに置くマークダウンファイルのことで、Claude Codeがコードを操作する際に参照する「指示書」のような役割を果たします。
そのファイルに「.envファイルを読まないこと」をルールとして記載することで、読まれなくなるようです。
③その他
他には.claudeignore(.gitignoreのようなファイル)に記載するといった方法もあるようですが、公式ではないとの情報や、書いていてもclaudeに読まれたという事例もあるようなので、こちらの方法は少し微妙かもしれませんね。。
今回実施すること
今回は「claude-sandbox」というのを使って、Dockerコンテナ上でClaude Codeを使えるようにします。
その際に、読まれたくない.envファイルをclaude-sandbox コンテナ内には含めないようにすることで、Claude Codeに.envを読まれないようにします。
ディレクトリの構成
プロジェクトのディレクトリは以下のような構成です。backend、frontend、claude-sandboxの3つに分けています。
そして、各フォルダにDockerfile、プロジェクトフォルダ直下にdocker-compose.ymlファイルと.envを配置しています。
claude-docker/
├─ docker-compose.yml
├─ .env
├─ backend/
│ └─ Dockerfile
├─ frontend/
│ └─ Dockerfile
└─ claude-sandbox/
└─ Dockerfile
docker-compose.yml、Dockerfileの作成
./claude-docker/docker-compose.yml
backendコンテナには.envファイルを環境変数として設定していますが、claude-sandboxコンテナには/backend、/frontendのソースのみをマウントすることで、.envを含めない作りになっています。
services:
# ── Python Backend ───────────────────────────
backend:
build: ./backend
env_file: .env # DB_URL, API_KEY などはここだけ
volumes:
- ./backend:/app
ports:
- "8000:8000"
networks:
- app
# ── React Frontend ───────────────────────────
frontend:
build: ./frontend
volumes:
- ./frontend:/app
- /app/node_modules
ports:
- "5173:5173"
environment:
- VITE_API_URL=http://localhost:8000
networks:
- app
# ── Claude Code Sandbox ────────────────────────
build: ./claude-sandbox
working_dir: /workspace
volumes:
- ./backend:/workspace/backend:rw
- ./frontend:/workspace/frontend:rw
# .env はマウントしない
environment:
- NODE_ENV=development # 無害なものだけ
networks:
- app
cap_drop: [ALL]
security_opt:
- no-new-privileges:true
stdin_open: true
tty: true
command: bash
networks:
app:
driver: bridge
./claude-docker/backend/Dockerfile
backendは仮でPython(FastAPI)の想定で書いてます。
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
./claude-docker/frontend/Dockerfile
frontendは仮でnode(React)の想定で書いてます。
FROM node:22-slim
WORKDIR /app
COPY package*.json .
RUN npm install
COPY . .
CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"]
./claude-docker/claude-sandbox/Dockerfile
claudeをコンテナにインストールします。
FROM node:22-slim
RUN npm install -g @anthropic-ai/claude-code
WORKDIR /workspace
CMD ["bash"]
Claude Codeの実行
docker-compose.yml、Dockerfileが作れたら、「docker compose up」等でビルド+起動しましょう。
成功していたら、3つのコンテナが起動していると思います。
①claude-sandbox
②frontend
③backend
の3つのコンテナですね。
Claude Codeを起動するには①claude-sandboxのコンテナに入ってください。(VSCodeの拡張機能や「docker exec -it XXXXXX bash」コマンドなどで)
コンテナに入ったら、ターミナル上で「Claude」と打つと起動します。
claude-sandboxコンテナの/workspaceフォルダ内を見てもらうと、/backendと/frontendのソースは入っていますが、.envファイルは入っていないことが分かります。
なので、 claude-sandboxコンテナ内であれば、.envは読み込まれないというわけです。
おわり
今回、Claude Codeでの.envの扱いについて色々調べてみましたが、「settings.jsonのdenyに設定 + CLAUDE.mdに指示を入れる」の2つを合わせて実施しておけば、十分防げる可能性が高いようです。
上記の対策でも不安だなという方はぜひ試してみてください!

