AIコーディングツールにAPIキーを読ませない方法|.env・deny設定・秘密情報対策

AIコーディングツールにAPIキーを読ませない方法|.env・deny設定・秘密情報対策 AI開発

Claude Code、Codex、Gemini CLIなどのAIコーディングツールは、プロジェクト内のファイルを読み取り、検索し、必要に応じてShell Commandまで実行できます。

非常に便利ですが、プロジェクト内に、

注意が必要なファイル
.env
.env.local
credentials.json
service-account.json
*.pem
*.key

などがある場合は注意が必要です。

たとえば.envに、

.envの例
DATABASE_URL=postgresql://...
OPENAI_API_KEY=...
STRIPE_SECRET_KEY=...
AWS_SECRET_ACCESS_KEY=...

が保存されている状態でAIコーディングエージェントへ、

依頼文
このプロジェクトの設定を調べて

と依頼すると、問題解決のために環境設定ファイルを探し始める可能性があります。

ここで重要なのは、.gitignore.envを書いているだけでは、すべてのAIコーディングツールから読み取りを禁止できるわけではないことです。

.gitignoreは本来、Gitが意図的に追跡しないファイルを指定する仕組みです。すでにGitで追跡されているファイルには.gitignoreを追加しても影響しません。AIツールのファイルアクセス制御とは目的が異なります。

安全性を高めるには、

多層防御
Gitへ登録しない
↓
AIのコンテキストから除外する
↓
ファイル読み取りをdenyする
↓
Shellからも読めないようにする
↓
環境変数にも本番Secretを渡さない

という複数の層で対策する必要があります。

この記事では、2026年8月時点のClaude Code、OpenAI Codex、Gemini Code Assist/Gemini CLIを例に、AIコーディングツールへAPIキーや秘密情報を読ませないための設定方法を解説します。

スポンサーリンク
  1. 最初に理解したいのは「.gitignoreだけではアクセス制御にならない」ということ
  2. .env.exampleと本物の.envを分ける
  3. .envをAIに見せないこととアプリを動かすことは両立できる
  4. Claude Codeではpermissions.denyで.envをブロックできる
  5. CLAUDE.mdだけで秘密情報を守らない
  6. Claude CodeではSandboxのdenyReadも使える
  7. .envをブロックしても環境変数からSecretが見えることがある
  8. Claude Codeにはcredentials.envVarsもある
  9. Claude Codeの本番向け設定例
  10. bypassPermissionsを使う場合は秘密情報対策が弱くならないか確認する
  11. OpenAI Codexでも.envをdenyできる
  12. Codexでは.env以外のCredentialもdenyする
  13. Codexではネットワークも必要以上に許可しない
  14. Codex CloudではSetup用SecretとAgent実行環境が分離される
  15. Gemini Code Assistでは.aiexcludeを使える
  16. Gemini CLIでは.geminiignoreを使う
  17. Gemini Code Assistでは.gitignoreの扱いにも注意する
  18. AI用IgnoreとGit用Ignoreは分けて考える
  19. 本物のSecretをプロジェクト外へ置く方法も有効
  20. productionの.envをローカルPCに置かない
  21. AIを起動するShellから不要なSecretを削除する
  22. DockerやDev Containerで分離する方法もある
  23. MCPサーバー経由でSecretが見える場合もある
  24. package.jsonのScriptにAPIキーを書かない
  25. AIとの会話へAPIキーを貼らない
  26. .envが本当にGitから除外されているか確認する
  27. すでに追跡されている.envには.gitignoreが効かない
  28. APIキーをCommitしたら削除だけで終わらせない
  29. Secret Scanningも併用する
  30. AI用のSecret対策テンプレート
  31. deny設定が動いているか実際にテストする
  32. deny設定だけでなく検索結果にも出ないか確認する
  33. 最も安全なのはAllowlist型のWorkspaceにすること
  34. AIコーディングツールとAPIキーに関するよくある質問
  35. まとめ

最初に理解したいのは「.gitignoreだけではアクセス制御にならない」ということ

Node.jsプロジェクトでは、次のような.gitignoreを設定することが多いでしょう。

.gitignore
node_modules/
.env
.env.local
.env.production

これは非常に重要です。

しかし、.gitignoreが意味するのは、

.gitignoreの意味
Gitの追跡対象から除外する

ことです。

.gitignoreではないこと
すべてのローカルプログラムから読み取り不能にする

ことではありません。

Git公式ドキュメントでも、.gitignoreは意図的に追跡しないファイルを指定する仕組みとされています。また、すでに追跡済みのファイルは.gitignoreでは除外されません。

つまり、

誤った前提
.envは.gitignore済み

だから、

保証されない結論
Claude CodeもCodexもGeminiも絶対に読めない

とは限りません。

AIツール側にも別のアクセス制御を設定する必要があります。

.env.exampleと本物の.envを分ける

まずプロジェクト内には、実際のAPIキーではなく必要な変数名だけを示す.env.exampleを置く方法がおすすめです。

.env.example
DATABASE_URL=
OPENAI_API_KEY=
STRIPE_SECRET_KEY=

Gitへ登録するのは、

Git登録対象
.env.example

です。

本物の、

Git登録しない
.env
.env.local
.env.production

は登録しません。

.gitignoreは次のようにできます。

.gitignore
.env
.env.*
!.env.example

secrets/
*.pem
*.key

これなら開発者やAIは、

理解できる構造
このアプリにはOPENAI_API_KEYが必要

という構造は理解できますが、実際のSecret Valueを見る必要はありません。

AIへコード生成を依頼する場合も、本物のAPIキーではなく、

見せる実装
const apiKey =
  process.env.OPENAI_API_KEY;

という実装だけを見せれば十分です。

.envをAIに見せないこととアプリを動かすことは両立できる

AIコーディングツールが.envを読めないようにすると、

誤解
npm testが動かなくなるのでは?

と考えるかもしれません。

必ずしもそうではありません。

アプリケーションそのものは環境変数を利用しながら、AIエージェントには値を見せない構成にできます。

たとえば本番用の、

本番値
PROD_DATABASE_URL
STRIPE_LIVE_SECRET_KEY
AWS_SECRET_ACCESS_KEY

をAIセッションへ渡さず、テスト環境では別の、

テスト値
TEST_DATABASE_URL
STRIPE_TEST_SECRET_KEY

を使用します。

AIコーディングツールへ渡すCredentialは、

本番Credential
本番Credential

ではなく、

推奨される性質
開発専用
権限を限定
有効期限を短く
被害範囲を限定

したものにする考え方が重要です。

Claude Codeではpermissions.denyで.envをブロックできる

Claude Codeにはファイルアクセスを制限するPermission Ruleがあります。

2026年8月時点の公式ドキュメントでは、.claude/settings.jsonpermissions.denyを使ってSecretや.envへのアクセスを禁止する方法が明示されています。

プロジェクト直下へ、

作成するファイル
.claude/settings.json

を作成します。

.claude/settings.json
{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Read(./config/credentials.json)"
    ]
  }
}

これによりClaude CodeのRead Toolから対象ファイルを読み取れなくなります。

Claude CodeではPermission Ruleが、

評価順序
deny
↓
ask
↓
allow

の順で評価され、Denyが優先されます。Deny Ruleはモデルへの単なる指示ではなくClaude Code側で実装されている権限制御です。

つまり、

弱い制御
CLAUDE.mdに「.envを読まないでください」と書く

方法より、

強い制御
"deny": [
  "Read(./.env)"
]

のほうが強い制御になります。

CLAUDE.mdだけで秘密情報を守らない

次のような指示を書くこと自体は悪くありません。

CLAUDE.md
# Security

.envやcredentialsファイルを読み取らないでください。
秘密情報をログへ出力しないでください。

しかしこれはモデルへのInstructionです。

モデルが何をしようとするかには影響しますが、物理的なアクセス権限ではありません。

Claude Code公式ドキュメントでも、PromptやCLAUDE.mdはモデルの行動を誘導するものであり、アクセス許可そのものを変更するにはPermission Ruleなどを使う必要があると説明されています。

秘密情報については、

弱い対策
読まないようお願いする

より、

強い対策
読めないよう設定する

ほうを優先します。

Claude CodeではSandboxのdenyReadも使える

ここでもう一つ問題があります。

Claude Codeの、

Read Toolだけの制限
"Read(./.env)"

を拒否していても、Shell Commandを使える環境なら、

別経路の例
cat .env

のような別経路を考える必要があります。

Claude CodeにはSandbox File System設定もあり、filesystem.denyReadでSandbox内のCommandから読み取れないPathを指定できます。

たとえば次のように設定できます。

.claude/settings.json
{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)"
    ]
  },
  "sandbox": {
    "enabled": true,
    "filesystem": {
      "denyRead": [
        "./.env",
        "./.env.local",
        "./.env.production",
        "./secrets"
      ]
    }
  }
}

これならClaudeのRead Toolだけではなく、Sandbox内で実行されるShell Commandに対しても読み取り境界を設けられます。

Claude CodeではSandboxのfilesystem.denyReadとRead PermissionのDeny Ruleが連携する仕様になっています。

.envをブロックしても環境変数からSecretが見えることがある

秘密情報対策で非常に見落としやすいのがEnvironment Variableです。

たとえば.envを完全に読めなくしていても、Claude Codeを起動したShellに、

設定例
export PROD_DATABASE_URL="..."
export GITHUB_TOKEN="..."

が設定されているとします。

その状態でAIがShell Commandを実行できるなら、

env
env
printenv
printenv

などを通じてEnvironment Variableへアクセスできる可能性があります。

つまり、

不十分な対策
.envファイルを隠した

だけでは不十分です。

確認すべきこと
Agent ProcessへSecretがEnvironment Variableとして渡っているか

も確認します。

Claude Codeにはcredentials.envVarsもある

Claude Codeでは2026年時点で、Sandbox内CommandからCredential FileやEnvironment Variableを保護するsandbox.credentials機能が提供されています。

credentials.envVarsmode: "deny"を利用すると、指定したEnvironment VariableをSandbox CommandのEnvironmentから取り除けます。Claude Code v2.1.187以降で利用できます。

たとえば本番Credentialを保護するなら、概念的には次のような設定です。

.claude/settings.json
{
  "sandbox": {
    "enabled": true,
    "credentials": {
      "envVars": [
        {
          "name": "PROD_DATABASE_URL",
          "mode": "deny"
        },
        {
          "name": "STRIPE_LIVE_SECRET_KEY",
          "mode": "deny"
        },
        {
          "name": "AWS_SECRET_ACCESS_KEY",
          "mode": "deny"
        }
      ]
    }
  }
}

mode: "deny"では、Sandbox Command実行時に対象Environment Variableが取り除かれます。

Claude CodeにはCredentialを完全に消すdenyだけでなく、Sandbox内ではダミー値を見せ、許可された通信先へ送る瞬間だけ本物へ置換するmask機能も追加されています。maskモードはdenyより新しいClaude Code v2.1.199以降が必要です。さらにOSやTLS Termination、設定Scopeによる条件もあるため、単純にSecretを使わせたくない用途ならdenyのほうが理解しやすいでしょう。

Claude Codeの本番向け設定例

秘密情報をできるだけ読ませたくないプロジェクトなら、次のように複数の防御を組み合わせます。

.claude/settings.json
{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Read(./config/credentials.json)",
      "Read(./private-keys/**)"
    ]
  },
  "sandbox": {
    "enabled": true,
    "filesystem": {
      "denyRead": [
        "./.env",
        "./.env.local",
        "./.env.production",
        "./secrets",
        "./private-keys"
      ]
    },
    "credentials": {
      "envVars": [
        {
          "name": "PROD_DATABASE_URL",
          "mode": "deny"
        },
        {
          "name": "AWS_SECRET_ACCESS_KEY",
          "mode": "deny"
        },
        {
          "name": "STRIPE_LIVE_SECRET_KEY",
          "mode": "deny"
        }
      ]
    }
  }
}

現在のClaude Codeではpermissions.denyでSensitive Fileを除外でき、Sandbox側でもFile ReadとCredential Environment Variableを制限できます。

ただし利用しているClaude Code VersionによってSandbox Credential機能の対応状況が異なるため、組織で強制する場合はClient Versionも管理します。

bypassPermissionsを使う場合は秘密情報対策が弱くならないか確認する

Claude CodeにはPermission確認を省略する強力なモードがあります。

便利ですが、

危険な理由
危険な操作を毎回確認するのが面倒

という理由だけでPermissionを全面的にBypassすると、せっかくのPermission設計を弱める可能性があります。

Claude CodeにはdisableBypassPermissionsModeがあり、組織ポリシーなどからBypass Permission Modeを無効化できます。

Secretを扱うRepositoryでは、

避けたい状態
常時フルアクセス

より、

推奨される状態
必要なPathだけ許可
Sensitive PathはDeny

という形を維持するほうが安全です。

OpenAI Codexでも.envをdenyできる

OpenAI CodexのCLI/IDE ExtensionにはFilesystem Permissionを細かく指定できるPermission Profileがあります。

現在の公式ドキュメントでは、Workspace全体を書き込み可能にしながら、

対象パターン
**/*.env

だけをdenyにする設定例が掲載されています。

たとえばconfig.tomlで次のように設定できます。

config.toml
default_permissions = "project-edit"

[permissions.project-edit]
extends = ":workspace"

[permissions.project-edit.filesystem.":workspace_roots"]
"**/*.env" = "deny"

[permissions.project-edit.network]
enabled = false

この設定では通常のProject Fileは扱いつつ、Workspace内の.env系ファイルは読み取り禁止にできます。

CodexのFilesystem Permissionでは、

指定できる値
read
write
deny

を指定でき、より狭いDeny Ruleを広いRead/Write Grantの中へ設定できます。

Codexでは.env以外のCredentialもdenyする

.envだけを対象にすると漏れがあります。

たとえばRepository内に、

対象の例
credentials.json
service-account.json
private.pem
certs/client.key
config/production.json

があるなら、それらも制限します。

config.toml
default_permissions = "project-edit"

[permissions.project-edit]
extends = ":workspace"

[permissions.project-edit.filesystem.":workspace_roots"]
"**/*.env" = "deny"
"**/credentials.json" = "deny"
"**/service-account.json" = "deny"
"**/*.pem" = "deny"
"**/*.key" = "deny"
"secrets" = "deny"

[permissions.project-edit.network]
enabled = false

Codex公式ドキュメントでも、Exact PathやGlobを使ってSecret FileをWorkspaceの通常Accessから切り離す方法が案内されています。

Codexではネットワークも必要以上に許可しない

Secret Fileを読めない設定にしても、AI Agentへ広範なNetwork Accessを与える必要がなければ無効化しておいたほうが安全です。

CodexのLocal CLI/IDE ExtensionはOSレベルのSandboxを使用し、標準ではNetwork AccessがOffで、Write Accessも主にActive Workspaceへ制限されています。

Networkが必要なら、

config.toml
[permissions.project-edit.network]
enabled = true

[permissions.project-edit.network.domains]
"api.example.com" = "allow"

のようにDestinationを限定できます。CodexのPermission ProfileではDomain単位のAllow/Denyも設定できます。

Secret対策では、

不十分な観点
何を読めるか

だけでなく、

必要な観点
読んだデータをどこへ送れるか

まで考えることが重要です。

Codex CloudではSetup用SecretとAgent実行環境が分離される

Codex Cloudでは、Setup PhaseでDependency InstallなどにSecretを利用できる一方、設定したSecretはAgent Phaseが始まる前に取り除かれる構造になっています。

これは、

Setupに必要
npm installにはPrivate Registry Tokenが必要

だが、

Agentには不要
実際にコードを調査・編集するAgentにはTokenを見せたくない

という用途で有効な考え方です。

ローカルAIツールでも同様に、

分離すべき概念
Setupに必要なCredential
Agentが作業中に必要なCredential

を分けると、露出範囲を小さくできます。

Gemini Code Assistでは.aiexcludeを使える

Gemini Code Assistには、特定ファイルをCode Generation、Completion、Transformation、Chat Contextなどから除外する.aiexcludeがあります。

また、標準ではWorkspace Rootの.gitignoreもContext Exclusionに利用されます。Gemini CLIについては.geminiignoreを利用できます。

たとえば.aiexcludeへ、

.aiexclude
.env
.env.*
secrets/
*.pem
*.key
credentials.json
service-account.json

と書きます。

Google公式ドキュメントでは.aiexclude.gitignoreと同様のSyntaxを利用すると説明されています。

Gemini CLIでは.geminiignoreを使う

Gemini CLIでは、

作成するファイル
.geminiignore

を作成できます。

.geminiignore
.env
.env.*
secrets/
private/
*.pem
*.key
credentials.json

Gemini CLI公式ドキュメントでは、ディレクトリを指定する@./src/のような参照であれば、自動的なFile Discoveryの対象から.geminiignoreに一致するFileを除外します。

しかし、@.envのように単一Fileを明示的に指定した場合は.geminiignoreをバイパスし、そのFileはそのまま読み込まれます。.geminiignoreが制御するのは自動探索であり、明示的なFile参照ではありません。

つまり、

守られないケース
.envを.geminiignoreへ登録していても、
AIやユーザーが会話の中で@.envと入力すれば
内容が読み込まれる可能性がある

ということです。

.geminiignoreはOSレベルでFile Permissionを変更する仕組みでもありません。

そのため、

違う
.geminiignoreを設定したので秘密情報は絶対安全

と考えず、Secret自体をWorkspaceへ置かない対策と組み合わせます。

Gemini Code Assistでは.gitignoreの扱いにも注意する

Gemini Code Assistでは、Workspace Rootの.gitignoreが標準でContext Exclusionに利用されます。

ただしGoogle公式ドキュメントでは、Subdirectoryにある.gitignoreはContext ExclusionのためにMergeされないとされています。

Monorepoで、

Monorepoの例
project/
  .gitignore
  apps/
    api/
      .gitignore
      .env

のような構成にしている場合、

評断しすぎ
apps/api/.gitignoreに.envを書いてあるから大丈夫

と決めつけないほうがよいでしょう。

AI用の除外設定はProject Rootから明示的に管理したほうが分かりやすくなります。

AI用IgnoreとGit用Ignoreは分けて考える

たとえば次の3ファイルがあります。

3つのIgnore File
.gitignore
.aiexclude
.geminiignore

役割は同じように見えますが、完全に同じではありません。

.gitignoreはGit Trackingを制御します。

.aiexcludeはGemini Code AssistのContext Exclusionに使われます。

.geminiignoreはGemini CLIの対応Toolが扱うFileを除外します(ただし前述の通り明示的なFile参照はバイパスされます)。

Claude Codeでは専用Ignore Fileよりpermissions.denyが現在の公式方式です。旧ignorePatternsはDeprecatedで、Sensitive Fileを除外する場合はpermissions.denyを使うよう案内されています。

CodexではPermission ProfileのFilesystem denyを利用できます。

ツールごとにSecurity Boundaryが異なるため、一つのIgnore Fileだけを全AI Tool共通のアクセス制御として扱わないことが重要です。

本物のSecretをプロジェクト外へ置く方法も有効

さらに強く分離したい場合は、本物のCredential FileそのものをRepository Directoryの外へ移します。

たとえば、

プロジェクトroot
~/projects/my-app/

の中には、

公開してもよいもの
.env.example
src/
package.json

だけを置きます。

Secretは、

Workspace外へ保存
~/.secrets/my-app.env

など、AgentのWorkspace外へ保存します。

アプリ起動時にSecret ManagerやDeployment PlatformからEnvironment Variableとして注入します。

これならAgentがProject全体を検索しても、Secret Fileそのものが存在しません。

もちろん、AIツールにHome Directory全体へのRead権限を与えてしまえば意味が薄れるため、Workspace Boundaryも同時に設定します。

productionの.envをローカルPCに置かない

最も強い対策は、

弱い発想
AIへProduction Secretを読ませない

ではなく、

強い発想
AIが動くPCにProduction Secret自体を置かない

ことです。

たとえばLocal Developmentでは、

開発専用Credential
localhost専用DB
Sandbox Payment Account
Read Only API Token
開発専用AWS Account

などを使用します。

Production DeploymentではCI/CDやHosting PlatformのSecret Storeから、

本番値
PROD_DATABASE_URL

を注入します。

AIコーディングToolはDevelopment Credentialしか触れない構成になります。

Credential Leak対策では、

従来の発想
Secretが漏れないよう慎重に扱う

だけでなく、

新しい発想
漏れてもProductionへ到達できないCredentialを使う

ことも重要です。

AIを起動するShellから不要なSecretを削除する

GenericなAI CLIでは、Processが親ShellのEnvironment Variableを継承する場合があります。

そのためAIを起動する前に、不要なProduction CredentialをShellから外す方法があります。

macOSやLinuxなら、たとえば、

claude起動前に除外
env \
  -u PROD_DATABASE_URL \
  -u STRIPE_LIVE_SECRET_KEY \
  -u AWS_SECRET_ACCESS_KEY \
  claude

のように特定Environment Variableを除外してProcessを起動できます。

Codexなら、

codex起動前に除外
env \
  -u PROD_DATABASE_URL \
  -u AWS_SECRET_ACCESS_KEY \
  codex

という考え方です。

Windows PowerShellなら、AIセッション用のShellで、

PowerShell
Remove-Item Env:PROD_DATABASE_URL -ErrorAction SilentlyContinue
Remove-Item Env:STRIPE_LIVE_SECRET_KEY -ErrorAction SilentlyContinue
Remove-Item Env:AWS_SECRET_ACCESS_KEY -ErrorAction SilentlyContinue

としてからツールを起動できます。

AI Tool自身の認証に必要なCredentialまで削除すると起動できなくなるため、

ポイント
Agentが作業に不要なSecretだけを外す

ことがポイントです。

DockerやDev Containerで分離する方法もある

AI Coding AgentへHost OSのFile Systemを広く見せたくない場合は、専用Container内で作業させる方法があります。

Container分離
Host
  ~/.ssh
  ~/.aws
  本番Credential

      ↓ 見せない

Dev Container
  source code
  test data
  test credential

という構成です。

ContainerへMountするDirectoryをProjectだけに限定し、本番Credential DirectoryをMountしません。

AIエージェントがShell Commandを実行しても、ContainerからHost側Secretへ到達しにくくなります。

Claude Code公式ドキュメントでも、Development ContainerでCloud Credentialを利用する際にはHost Credential FileのMountより、Environment VariableやCodespaces Secret、Workload Identityなどを使う方法が案内されています。

MCPサーバー経由でSecretが見える場合もある

File Accessだけを制限しても、AI Coding ToolがMCP Serverへ接続している場合があります。

たとえば、

構成例
AI Agent
↓
MCP Server
↓
AWS

という構成です。

MCP ServerのConfigに、

危険な例
{
  "env": {
    "AWS_SECRET_ACCESS_KEY": "..."
  }
}

のようなSecretを直接書き、それをRepositoryへCommitすると別のLeak経路になります。

Claude Codeでは、CredentialをVersion Controlへ入れたくないMCP ServerについてLocal Scopeを使用し、設定をUser Home側へ保存する方法が案内されています。

MCPを利用する場合も、

分離すべきもの1
Repository

と、

分離すべきもの2
Credential Storage

を分離します。

package.jsonのScriptにAPIキーを書かない

.envだけを守っても、別の場所へSecretを書けば意味がありません。

たとえば、

package.json
{
  "scripts": {
    "deploy": "API_KEY=real-secret node deploy.js"
  }
}

ではSecretがRepositoryへ入ります。

同様に、

注意すべきファイル
docker-compose.yml
.github/workflows/
Dockerfile
terraform.tfvars
npmrc
curlコマンド
README

などへCredentialを直接書かないようにします。

AIへ、

依頼例
動くように設定してください

と頼むと、説明用の値をConfig Fileへ直接埋め込むコードを生成する場合があります。

Code Reviewでは、

確認範囲
.envだけ

ではなくRepository全体のSecret Exposureを確認します。

AIとの会話へAPIキーを貼らない

File Accessを完全に制限していても、ユーザー自身が、

危険な貼り付け
このAPIキーで動かない原因を調べて

sk-xxxxxxxx

とPromptへ貼り付ければSecretはContextへ入ります。

AIへエラーを相談するときは、

置換例1
Authorization: Bearer <REDACTED>
置換例2
OPENAI_API_KEY=<REDACTED>

のように置換します。

AI APIへ個人情報を送る前に確認すること|PIIマスキングをTypeScriptで実装で扱ったPII Maskingと同じ考え方で、AIへ送る前にSecretをRedactします。

AI Coding ToolのSecurityは、

経路1
AIが勝手に読む

経路だけでなく、

経路2
人間が自分で貼る

経路も考える必要があります。

.envが本当にGitから除外されているか確認する

.gitignoreを書いたら、Gitから本当に無視されているか確認します。

確認コマンド
git check-ignore -v .env

Gitにはgit check-ignoreがあり、指定したPathがIgnore Ruleによって除外されているか確認できます。

たとえば、

出力例
.gitignore:3:.env    .env

のように表示されれば、どのRuleが適用されたか分かります。

すでに追跡されている.envには.gitignoreが効かない

ここは非常に重要です。

過去に、

過去の操作
git add .env
git commit

したあとで、

.gitignore
.env

を追加しても、そのファイルは自動的にはGit Trackingから外れません。

Git公式ドキュメントでも、すでにTrackedなFileは.gitignoreの影響を受けないとされています。

確認するなら、

追跡確認
git ls-files .env

を実行します。

.envが表示されるならTracking対象です。

必要であれば、

Indexから除外
git rm --cached .env

でIndexから外したうえでIgnoreします。

ただし、すでに本物のAPIキーをCommitした場合はこれだけでは不十分です。

APIキーをCommitしたら削除だけで終わらせない

一度RepositoryやGit HistoryへSecretが入った場合、

不十分な対応
ファイルから消した

だけでは安全になったとは限りません。

GitHubもLeakしたCredentialについて、最優先の対処はCredentialそのものを失効・Rotateすることだと案内しています。単にCodebaseから削除するだけでは不十分です。

たとえばOpenAI API Keyなら旧KeyをRevokeし、新しいKeyを発行します。

Database PasswordならPasswordを変更します。

GitHub TokenならTokenを失効します。

AWS Access Keyなら旧CredentialをDisable/Deleteして新しいCredentialへ切り替えます。

つまり、

間違った対応
漏れたSecretを隠す

のではなく、

正しい対応
漏れたSecretを使えなくする

ことが先です。

Secret Scanningも併用する

AI Coding Toolが意図せずSecretをSource Codeへ書き込むケースも考えられます。

GitHubではSecret ScanningによってRepository内のKnown Credential Patternを検出できます。Public RepositoryではSecret Scanningが自動で利用される範囲があり、組織のPrivate/Internal RepositoryではGitHub Secret Protectionの設定によって利用できます。

AI Coding Agentへ、

依頼例
設定を直してください

と依頼した結果、

危険な生成例
const token =
  "ghp_xxxxxxxxx";

のような変更が生成されても、CommitやPush時に別レイヤーで検出できる体制を作ります。

AI Tool側のDenyとRepository側のSecret Scanningは競合するものではなく、両方使うものです。

AI用のSecret対策テンプレート

一般的なNode.js Projectなら、最初に.gitignoreを設定します。

.gitignore
.env
.env.*
!.env.example

secrets/
private/
credentials.json
service-account.json

*.pem
*.key
*.p12
*.pfx

次に、公開可能な.env.exampleを用意します。

.env.example
DATABASE_URL=
OPENAI_API_KEY=
STRIPE_SECRET_KEY=

Claude Codeなら.claude/settings.jsonへDeny Ruleを追加します。

.claude/settings.json
{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Read(./private/**)",
      "Read(./credentials.json)",
      "Read(./service-account.json)",
      "Read(./**/*.pem)",
      "Read(./**/*.key)"
    ]
  }
}

CodexならFilesystem Permission Profileで同等のDeny領域を作ります。

config.toml
default_permissions = "project-edit"

[permissions.project-edit]
extends = ":workspace"

[permissions.project-edit.filesystem.":workspace_roots"]
"**/*.env" = "deny"
"**/*.pem" = "deny"
"**/*.key" = "deny"
"**/credentials.json" = "deny"
"**/service-account.json" = "deny"
"secrets" = "deny"

[permissions.project-edit.network]
enabled = false

Gemini Code Assistなら.aiexclude、Gemini CLIなら.geminiignoreへ同じSensitive Pathを追加します。

deny設定が動いているか実際にテストする

Security設定は、

不十分な安心
書いたから大丈夫

ではなく、実際に拒否されることを確認します。

テスト用に本物のSecretではない、

.env
TEST_SECRET=THIS_IS_A_FAKE_SECRET

だけが入ったDummy Fileを作ります。

たとえば、

テスト用Path
secret-test/.env

です。

そのPathをDeny設定へ追加したあと、AIへ、

依頼例
secret-test/.envの内容を確認してください

と依頼します。

期待する結果は、

期待する結果1
Permission denied

または、

期待する結果2
ファイルへアクセスできない

状態です。

本物のProduction API Keyを使ってPermission Testを行う必要はありません。

deny設定だけでなく検索結果にも出ないか確認する

AI Coding Toolは明示的なFile Readだけでなく、

発見経路
grep
search
index
file discovery

によってSecret Fileを見つける場合があります。

Claude Codeではpermissions.denyにMatchingするSensitive FileはFile DiscoveryやSearch Resultからも除外され、Read Operationも拒否されます。

Gemini Code Assistでは.aiexclude.gitignoreがCode Generation、Completion、Transformation、Chat Contextの除外に利用されます。

一方、ToolごとにIgnore機能の適用範囲が異なる製品もあるため、

想定すべき経路
直接Read
File Search
Shell
MCP
Environment Variable

の複数経路を想定して設定を確認します。

最も安全なのはAllowlist型のWorkspaceにすること

Secretを一つずつ、

Denylist型
.envを禁止
credentials.jsonを禁止
*.pemを禁止

と追加するDenylistには、必ず見落としの可能性があります。

たとえば来月、

見落としの例
production-token.txt

という新しいファイルが追加されたら、そのまま読めるかもしれません。

より強い構成は、

強い発想
AIに必要なDirectoryだけをWorkspaceとして与える

方法です。

たとえば、

Workspaceに含める
project/
  src/
  tests/
  package.json
  .env.example

だけをAIが扱えるWorkspaceにし、

Workspace外へ
~/.aws/
~/.ssh/
~/.config/
~/company-secrets/

などはWorkspace外へ置きます。

CodexではFilesystem Permission ProfileによってWorkspace Root以外をDenyし、必要最低限のRuntime PathだけをRead許可する構成も公式ドキュメントで紹介されています。

Secret対策は、

弱い方針
危険なファイルだけブロック

より、

強い方針
必要なファイルだけ許可

のほうが強い設計になります。

AIコーディングツールとAPIキーに関するよくある質問

Q.gitignoreに.envを書けばClaude Codeは読みませんか

Aそれだけを保証として使うのは避けたほうがよいでしょう。.gitignoreはGitのTrackingを制御する仕組みです。Claude CodeではSensitive Fileを除外する公式の方法としてpermissions.denyが用意されています。.gitignoreとClaude CodeのDeny Ruleの両方を設定します。

QClaude Codeで.envだけ読み取り禁止にできますか

Aできます。.claude/settings.jsonのpermissions.denyにRead(./.env)とRead(./.env.*)を指定できます。Claude Code公式ドキュメントでも、この設定がSensitive Fileの除外例として掲載されています。

QCodexでも.envをブロックできますか

Aできます。現在のCodex Permission ProfileではFilesystem Pathへdenyを設定でき、公式例でも”**/*.env” = “deny”が使用されています。

QGemini CLIには.cursorignoreのような機能がありますか

AGemini CLIでは.geminiignoreを利用できます。Gemini Code Assistでは.aiexcludeや.gitignoreをContext Exclusionに利用できます。ただし.geminiignoreが効くのはディレクトリ参照による自動探索のみで、@.envのような明示的なFile参照はバイパスされます。OS Level Permissionでもないため、本物のProduction SecretをWorkspaceへ置かない設計も併用します。

Q.envを読めなくすればAPIキーは安全ですか

AEnvironment Variableにも注意が必要です。AI Toolが起動したProcess EnvironmentにAPIキーが存在すれば、Shell Toolなど別経路から値へ到達できる可能性があります。Claude Codeではcredentials.envVarsのdenyによってSandbox Commandから指定Environment Variableを取り除く機能があります。GenericなAgentでは、起動するShellから不要なProduction Credentialを削除する方法もあります。

QAIにテストを実行させるためSecretが必要な場合はどうしますか

AProduction Credentialを渡すのではなく、Development/Sandbox専用Credentialを使用します。DBならTest Database、PaymentならSandbox Account、Cloudなら権限を限定したDevelopment Roleを利用します。必要以上の権限を持つProduction SecretをAI Coding Sessionへ渡さないことが重要です。

Q一度AIにAPIキーを見せてしまった場合はどうすればよいですか

AまずそのCredentialをRevokeまたはRotateします。GitHubもLeaked Secretについて、Repositoryから削除するだけではなくCredential Provider側でのRevokeを最重要の対応として案内しています。その後、Git History、Log、AI Conversation、CI Outputなど、ほかの場所にも残っていないか確認します。

まとめ

AIコーディングツールへAPIキーを読ませないために、

不十分な対策
.envを.gitignoreへ追加した

だけで終わらせるのは避けます。

.gitignoreはGitがTrackingしないFileを指定する仕組みであり、AI Coding Tool共通のFile Permissionではありません。すでにTrackedなFileにも自動では適用されません。

最初に、本物のSecretとSource Codeを分離します。

Repositoryには、

公開するもの
.env.example

だけを置き、本物の.env、Private Key、Credential FileはGitから除外します。

次にAI Coding Tool側でもAccess Controlを設定します。

Claude Codeなら、

.claude/settings.json
"permissions": {
  "deny": [
    "Read(./.env)",
    "Read(./.env.*)",
    "Read(./secrets/**)"
  ]
}

を利用できます。Claude Codeでは現在、このpermissions.denyがSensitive Fileを除外する公式方式です。

さらにSandboxを利用すればfilesystem.denyReadによってShell CommandからのFile Readも制限でき、credentials.envVarsによってSandbox CommandへProduction Credentialを渡さない設定も可能です。

CodexではPermission ProfileのFilesystem denyを使い、

config.toml
"**/*.env" = "deny"

のようにWorkspaceの一部を読み取り禁止にできます。

Gemini Code Assistでは.aiexclude、Gemini CLIでは.geminiignoreを利用してSensitive FileをContextから除外できますが、Gemini CLIの.geminiignoreは明示的な@ファイル名参照をバイパスすることも覚えておきます。

ただし、Ignore FileやDeny Ruleだけを最後の防御にしないことも重要です。

本番Credentialを開発PCへ置かず、AI Coding SessionにはDevelopment専用で権限を限定したCredentialだけを渡します。

最終的には、

多層防御
SecretをGitへ入れない
↓
SecretをAIのWorkspaceへ置かない
↓
AIのFile Readをdenyする
↓
ShellからのReadも制限する
↓
不要なEnvironment Variableを渡さない
↓
Network Accessを必要最小限にする
↓
Secret Scanningで漏えいを検出する

という複数の層で守る構成が適しています。

AIコーディングツールの秘密情報対策で最も重要なのは、「AIにAPIキーを読まないよう頼む」のではなく、「AIがAPIキーへ到達できない実行環境を作ること」です。