settings.local.json とは何か
Claude Code は複数のファイルから設定を読み込みます。Anthropic の設定ドキュメントでは、プロジェクトローカルの設定ファイルを .claude/settings.local.json と説明しており、「このプロジェクトのみの、あなた専用の設定」としています。その意図された用途は、一つのプロジェクトに対する個人的な上書きや、共有前のテストです。
このファイルを自分で作成する必要はありません。ドキュメントによると、Claude Code は「許可プロンプトに対して永続的な承認を初めて与えたとき」に .claude/settings.local.json を書き出します。許可に関するドキュメントでは、シェルコマンドにおいてこれが何を意味するかを詳述しています。Claude Code に再確認させないオプションを選択し、承認が永続的に保存される場合(Bash コマンドや WebFetch ドメインなど)、「Claude Code は git リポジトリのルートにある .claude/settings.local.json にルールを保存します」。
同じページの 2 つの詳細が重要です。Bash の承認は「リポジトリおよびコマンドごとに永続的」に持続します。そして、そのルールは「サブディレクトリやワークツリーで開始されたセッションを含め、そのリポジトリ内のあらゆる場所での将来のセッション」に適用されます。一度与えた承認は、誰かが削除するまで機能し続け、ファイル内に残り続けます。
なぜ機密情報がファイルに含まれるのか
Apiiro のレポートはそのプロセスを説明しています。「Claude Code にデータベースの確認や API の呼び出しを依頼すると、提案されるコマンドには設定ファイルからの機密情報が含まれます。実行前に確認を求められます。」コマンドが機能するためには、機密情報がコマンド内に含まれている必要があるからです。
次に承認が行われます。「今後表示しない」オプションを選択すると、Apiiro は次のように記しています。「コマンドが実行され、プロジェクトフォルダ内の .claude/settings.local.json に許可ルールが追加されるため、二度と確認されません。そのルールはコマンド文字列そのものです」。
許可ルールは、Claude Code が何を実行してよいかを記述するためのものです。承認されたコマンドにパスワード、トークン、または接続文字列が直接入力されている場合、ルールはその値をプレーンテキストで保存します。
Apiiro は、これは特定のモデルの癖ではなく、ツールの動作であると述べています。「これはモデルではなく Claude Code 自身の動作です。Anthropic の最新モデルでも発生し、Opus 5.5 や Fable 5.1 でも再現されました。」
なぜ Claude Code 自身の保護が常に機能しないのか
Claude Code は、このファイルを git の管理外に置こうと試みます。設定ドキュメントには、「Claude Code が、まだこのファイルを無視していない git リポジトリに初めてファイルを書き込む際、グローバルな git excludes ファイルに **/.claude/settings.local.json を追加します。これにより、すべてのリポジトリでファイルがコミットに含まれないようになります」とあります。
キーワードは「グローバル」です。その除外設定はリポジトリ内ではなく、あなたのマシンの git 設定に存在します。Apiiro はその隙間をこう説明します。「それは一般的なケースをカバーしていますが、後からリポジトリになったフォルダ、別のマシンでのクローン、あるいは誰かが既にコミットしてしまったファイルはカバーしていません。」さらに、「ルールはリポジトリ自身の .gitignore には入らないため、プロジェクトを保護するための設定がプロジェクトと共に移動することはありません。」
また、自分で作成したファイルに関するドキュメント化された例外もあります。設定テーブルには、Claude Code は「ファイルを作成する際には git の対象外にしますが、手動で作成した場合は、自分で .gitignore に追加してください」と記されています。
一度ファイルが追跡対象(tracked)になると、Claude Code はその扱いを変えますが、書き込みは続けます。許可ドキュメントにはこうあります。「ファイルが git で追跡されているか、.claude がシンボリックリンクである場合、Claude Code はそれをリポジトリから提供されたものとして扱い、フォルダを信頼するまでルールを保留します。」Apiiro は、ユーザーにはこのことが知らされず、「次の承認は追跡されたファイルに追記される」と付け加えています。
Apiiro はまた、誰がファイルをコミットしたかも追跡しました。「機密情報が含まれていた 1,105 件のリポジトリのうち 539 件で、Claude が共同作成者(co-authored)となったコミットがファイルを変更していました。」その理由は、Claude Code のコミット指示には .env や credentials.json などのファイル名は挙げられていますが、「自身の設定ファイルはそのリストに含まれていない」ためです。
Apiiro が発見した内容
これらの数値は、2026年11月1日から3日にかけて実行された、デフォルトブランチの読み取り専用 GitHub コードおよびコミット検索に基づいています。Apiiro は、いかなる認証情報もテストしていないと述べています。「認証情報は一切使用もテストもされておらず、ホストへの接触も行っていません。」
主な統計:
- ファイル自体: 「GitHub 上の 104,185 件の公開コピーのうち、1,122 件に本物の機密情報が含まれていました。」
- 現在のコピーに含まれる個別の機密情報: 「合計で 1,379 件の個別の機密情報が保持されていました。636 件のプロバイダーキーと、公開ホスト用の 743 件のパスワードまたはトークンです。」
- データベースアクセス: Apiiro は 379 件のデータベースパスワード、122 件の Supabase サービスロールキー、および 103 件の Supabase アカウントトークンを確認しました。
- サーバーログイン: 「公開サーバー用の 43 件の SSH 認証情報があり、その中には sshpass コマンド内のルートパスワードも含まれていました。」
- 組織: 「63 の組織が公開許可リストに本物の機密情報を保持していました。」Apiiro によると、ほとんどの機密情報は個人の開発者に属するものでした。
2 つの発見が、今日ファイルを削除するだけでは不十分な理由を説明しています。第一に、ファイルは長期間放置される傾向があります。「機密情報を含むリポジトリの中央値では、ファイルが最初にコミットされたのはその 217 日前でした。」第二に、履歴がそれらを保持し続けます。「ファイルの以前のバージョンには 734 件の本物の機密情報が含まれており(509 リポジトリ)、それらは現在のコピーには現れません。通常、ファイルが削除されたためです。」
ファイルが大きいほど、より多くの情報が含まれます。Apiiro は次のように記しています。「8 KB を超えるファイルの 10 件に 1 件には本物の機密情報が含まれていましたが、500 バイト未満のファイルでは 500 件に 1 件未満でした。」
なぜ機密情報スキャナーがそれらの多くを見逃すのか
機密情報スキャナーがこれを検知すると期待するかもしれません。Apiiro はすべてのファイルに対して gitleaks と TruffleHog を実行しました。「本物の機密情報を含む 1,122 件のファイルのうち、gitleaks は 564 件、TruffleHog は 643 件をフラグ立てしましたが、215 件はいずれによってもフラグ立てされませんでした。」
その理由は機密情報の「形状」にあります。スキャナーは既知のキー形式を探します。PGPASSWORD=、sshpass -p、または mysql -p の後に入力されたパスワードは、通常のコマンドライン内の普通の単語のように見えます。Apiiro の要約はこうです。「ギャップは、コマンド内のパスワードにあります。」
一つのファイルだけではない
これは、許可設定の枠を超えて重要な調査結果の一部です。Apiiro は次のように記しています。「同じ『コマンド内のパスワード』パターンは、エージェントが実行内容を記録するあらゆる場所(トランスクリプト、メモリファイル、引き継ぎノートなど)に現れます。キー形式に調整されたスキャナーは、それらすべてにおいてこれを見逃します。」
他のファイルの表には以下が含まれます:
- 共有の
.claude/settings.json: チェックされた 76,011 件の公開コピーのうち、298 件に本物の機密情報がありました。チームが意図的にこのファイルをコミットすることがあります。 - リポジトリに保存されたエージェントのチャット履歴: 2,523 件をチェックし、87 リポジトリの 120 ファイル。
- エージェントのメモリファイル (MEMORY.md など): 1,200 件をチェックし、9 リポジトリ。
- 引き継ぎおよびデプロイノート: 2,095 件をチェックし、33 ファイル。Apiiro は「機密情報を含む引き継ぎノートの 3 分の 1 は、エージェント自身によって書かれていた」と付け加えています。
メモリファイルの数は少ないですが、パターンは同じです。エージェントが自分が行ったことについて書き留めるものは何でも、コマンドに含まれていたものを運ぶ可能性があります。エージェントが管理するファイルにプロジェクトのコンテキストを保持する場合、それらのファイルは設定ファイルと同じ注意を払う必要があります。
デフォルトでは、Claude Code はセッションのトランスクリプトをホームディレクトリの ~/.claude/projects に保存します。ガイド Claude Code のセッション履歴を見つける方法 では、それらがどこにあり、どのくらいの期間保持されるかを説明しています。Apiiro のトランスクリプトのカウントは、人々がリポジトリに保存したいくつかのツールからのエクスポートを対象としています。
あなたのマシン上でも
ほとんどのコピーは GitHub に到達することはありませんが、Apiiro はそれだけで安全だとは言えないと主張しています。「許可リストはすべてのプロジェクトで同じパスにあるプレーンな JSON であり、そこにある機密情報のほとんどは、それが開くホストのすぐ隣に置かれています。」また、git を介さずとも、「公開された npm パッケージ、コピーコマンドで構築された Docker イメージ、zip アーカイブ、同期されたフォルダ」などを通じてファイルが流出する可能性があると指摘しています。
一つのリポジトリの複数のチェックアウトで作業している場合、ファイルは一つの場所に置かれます。ドキュメントによると、ワークツリーでは Claude Code は「メインチェックアウトのルートにあるファイルを使用する」とのことです。ガイド Claude Code のワークツリーはメモリを共有するか では、ワークツリー間で他に何が共有されるかを説明しています。
Anthropic の見解
Apiiro は、公開前にこの調査結果を Anthropic と共有したと述べています。11月8日付の更新で、Apiiro は Claude Code の責任者が 11月7日に Hacker News で回答したと報告しています。
Apiiro の更新によると、彼はチームが「これを防ぐために何ができるかを検討している」と書き、プロトタイプを作成する予定のアプローチとして「オートモードでこれを確実にキャッチするようにする、基本的な機密情報スキャニングを組み込む」などを挙げました。また Apiiro は、彼の見解として、露出したコピーは手動で作成されチェックインされたものであり、許可ルールよりもオートモードを推奨し、GitHub や他のホストが提供する機密情報スキャニングの利用を勧めたと報告しています。
2026年11月10日までに公開された Claude Code のリリースノートでは、承認の保存方法に関する変更は記載されていません。これを未解決の問題として扱い、修正に頼る前にチェンジログを確認してください。
人々が最初に試してしまうこと
ファイルを削除して削除をコミットする。 これにより現在のコピーは削除されますが、履歴、フォーク、またはクローンは削除されません。Apiiro が現在のコピーには存在しない 734 件の機密情報を見つけたのはそこからです。
グローバルな除外設定がすべてのマシンを保護していると思い込む。 それは Claude Code がそれを書き込んだマシンのみを保護します。新しいクローン、CI ランナー、または後からリポジトリになったフォルダにはその設定はありません。
機密情報スキャナーだけに頼る。 Apiiro がテストした両方のスキャナーは、コマンド内のパスワードがキーのように見えないため、かなりの割合のファイルを見逃しました。
同じ長いコマンドを何度も承認する。 永続的な承認を行うたびにリテラルなルールが追加されます。Apiiro は、大きなファイルほど機密情報が含まれている可能性がはるかに高いことを発見しました。
解決策:確認、ローテーション、そしてクリーンアップ
ステップ 1: すべてのコピーを見つける
GitHub 組織内で .claude/settings.local.json と .claude/settings.json を検索します。次に、たとえ今日消えていたとしても、各リポジトリの git 履歴でそのファイルを確認します。自分のマシンでは、すべてのコピーを見つけてその許可リストを読みます。Claude Code 内では、/permissions でルールとそれぞれの設定ファイルのソースがリストされます。
ステップ 2: 削除する前にローテーションする
Apiiro の推奨順序は「まずローテーション、次にクリーンアップ」です。いかなるコミットであれ、一度でもファイルに含まれた認証情報は、露出したものとして扱うべきです。ファイルを削除しても、履歴、フォーク、クローンは消去されません。
ステップ 3: ファイルの追跡を解除しリポジトリを保護する
ファイルが追跡されている場合、Apiiro は git rm --cached .claude/settings.local.json で追跡を解除し、リポジトリ自身の .gitignore に追加することを推奨しています。そうすれば、保護設定はあなたのマシンだけでなく、プロジェクトと共に移動します。
ステップ 4: 承認方法を変える
コミットされていないファイルであっても、機密情報を含むすべてのルールを削除します。その後、コマンドに機密情報を直接入力するのをやめます。変数名で参照するようにすれば、ルールには値ではなく名前が記録されます。リテラルなコマンドではなくパターンを承認してください。ドキュメントの例 Bash(npm run *) は、npm run build や npm run test --watch にマッチします。パターンの広さには注意してください。ドキュメントには、最初の * より前のすべてがルールを制限するものになると記されています。
ステップ 5: エージェントのファイルを機密として扱う
.claude/、保存されたトランスクリプト、引き継ぎノート、エージェントのメモリファイルを、履歴を含めてプリコミットおよび CI の機密情報スキャニングに追加します。スキャナーがキー形式だけでなく、コマンド内のパスワードもチェックするようにしてください。
MemoryLake でのセットアップ
Apiiro の発見は一つの習慣に集約されます。エージェントは自分が行ったことを書き留め、コマンドに入力したものは何でもそれに付随するということです。設定ファイル、トランスクリプト、メモリファイルはすべて作業を記録します。それらのいずれにおいても、コマンドに含まれていたものは作業内容と共に記録される可能性があります。
MemoryLake は、サービスが使用するデータベース、ステージングの場所、チームが実行するコマンドなど、アシスタントに持たせたいプロジェクトコンテキストのためのメモリレイヤーです。ChatGPT、Claude Code、Codex など、接続したアシスタントで利用可能です。
エントリはあなた自身の言葉で自分で書きます。あなたの .claude フォルダ、設定ファイル、セッション履歴、auto memory、リポジトリ、またはベンダーのストレージから何かが読み取られたり、書き込まれたり、削除されたりすることはありません。Claude Code の許可ルールは Anthropic が説明している通りに機能するため、上記のように設定ファイルをクリーンアップする必要は依然としてあります。
ステップ 1: API キーを作成する
サインインしてダッシュボードからキーを生成します。他の認証情報と同様に、リポジトリの外に保存してください。

ステップ 2: 最初のメモリをアップロードする
認証情報ではなく、コンテキストを記述します。スクリプトが期待する環境変数名、サービスが実行されているホスト、チームがキーをローテーションする手順などです。1 エントリにつき 1 つの事実を記載し、パスワードやトークンは決して含めないでください。

ステップ 3: AI とエージェントを接続する
Claude Code やその他の使用しているアシスタントを接続します。機密情報はシークレットマネージャーに置いたまま、同じ記述されたコンテキストを利用できます。

実務で何が変わるか
第一の違いは、コンテキストと認証情報の明確な境界線です。プロジェクトの知識はあなたが書いたエントリに存在し、システムを開くための値はそれ専用に構築された場所に存在します。
第二に、セッションに機密情報を貼り付ける理由が減ります。アシスタントがどの変数に接続文字列が保持されているかを既に知っていれば、コマンドは変数を参照するだけで済みます。
Claude Code 許可設定のベストプラクティス
承認する前にコマンドを読む。 特にデータベースやサーバーに接続する場合は注意が必要です。
リテラルなコマンドではなくパターンを承認する。 Bash(npm run *) のようなルールは、一度入力した引数を保持しません。
機密情報は変数に保持する。 そうすれば、ルールには変数名が記録されます。
リポジトリ自身の .gitignore にファイルを追加する。 自分のマシンにしかないグローバルな除外設定に頼らないでください。
許可リストを定期的に確認する。 /permissions はすべてのルールとそのソースを表示します。
エージェントのファイルと履歴をスキャンする。 設定、トランスクリプト、引き継ぎノート、メモリファイルはすべてコマンドを保持する可能性があります。
疑わしい場合はローテーションする。 履歴やフォークは、削除したものを保持し続けます。
結論
シェルコマンドについて Claude Code が再確認しないようにするオプションを選択すると、Claude Code はそのコマンドを許可ルールとして .claude/settings.local.json に保存します。コマンドにパスワードやトークンが含まれていた場合、ルールにもそれが含まれます。Claude Code はファイル作成時にグローバルな git excludes に追加しますが、その保護はリポジトリと共に移動しません。Apiiro は、本物の機密情報を保持する 1,122 件の公開コピーを発見し、チェックしたすべてのエージェントファイル全体で 2,539 件の個別の機密情報を確認しました。
リポジトリと履歴でファイルを確認し、一度でも含まれたものはすべてローテーションし、追跡を解除してリポジトリの .gitignore に追加し、コマンドの承認方法を変更してください。そして、メモリファイルを含め、エージェントが書き込むすべてのファイルを、機密情報を運ぶ可能性のあるものとして扱ってください。