Claude Codeにenvファイルを読まれないためのDocker環境を構築してみる

sanagi
2026-04-28
2026-04-28

こんにちは、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つを合わせて実施しておけば、十分防げる可能性が高いようです。

上記の対策でも不安だなという方はぜひ試してみてください!