記事一覧スパルタClaude Code塾AI研修法人研修導入支援研修プランよくある質問
セキュリティClaude Code研究所 オリジナル解説

Claude Codeのsettings.local.jsonにパスワードは残る?「次回から確認しない」を18形式で実測

Claude Codeの「次回から確認しない」で承認したコマンドは何が残るのか。18形式を実測すると7形式でパスワードがsettings.local.jsonに残り、gitに入る3条件も見つかりました。確認と防止の方法も説明します。

Claude Codeのsettings.local.jsonにパスワードは残る?「次回から確認しない」を18形式で実測

この記事の結論

  • Claude Codeで「Yes, and don't ask again」を選ぶと、承認したコマンドが.claude/settings.local.jsonに平文の許可ルールとして残ります。
  • 単独のコマンドならmysql *のように一般化されますが、環境変数付き・パイプ付き・cd &&付きなど18形式中7形式でパスワードがそのまま保存されました(v2.1.319ほか)。
  • gitリポジトリ内で初めて書くと自動でグローバル除外が入りますが、git管理外で作った後のgit init、コミット済み、相対パスの除外設定では git add -A で入りました。
  • Claudeは未追跡のファイルを30回中0回しかコミットしませんでしたが、追跡済みの変更を「全部まとめて」と頼むとSonnet 5.5が5回中4回含めました。
  • Apiiroは公開GitHubのsettings.local.json 104,185件中1,122件に本物の秘密を確認し、Claude Codeチームは2026年11月7日に対策の検討を表明しました。

Claude Code(クロードコード)の承認ダイアログで「Yes, and don't ask again(次回から確認しない)」を選ぶと、承認したコマンドが .claude/settings.local.json に許可ルールとして残ります。セキュリティ企業Apiiroは2026年11月5日、公開GitHubにあるこのファイル104,185件のうち1,122件に本物のパスワードやAPIキーが入っていたと発表し、AnthropicのClaude Codeチームも対策を検討すると答えました。そこで、パスワード入りのコマンド18形式を手元で承認してみました。単独のコマンドなら mysql * のように一般化されてパスワードは残りませんが、環境変数付きやパイプ付きなど7形式ではパスワードがそのまま保存されました。この記事では、残る形と残らない形、gitに入ってしまう3つの条件、確認方法と防ぎ方を順に説明します。

目次

  1. 「次回から確認しない」を押すと何が保存されるのか?
  2. パスワードが残るのはどんなコマンドのときか?
  3. settings.local.jsonはgitignoreされるのか?
  4. Claude自身がこのファイルをコミットすることはあるか?
  5. 自分の環境に残っていないか確かめる方法は?
  6. パスワードを残さないためには何をすればよいのか?
  7. まとめ
  8. よくある質問
  9. 参考資料・出典

「次回から確認しない」を押すと何が保存されるのか?

保存されるのは、承認したコマンドに対応する許可ルールです。置き場所はリポジトリ直下の .claude/settings.local.json で、中身は平文のJSONです。ルールがコマンドの一部をそのまま写すとき、コマンドに書かれたパスワードも一緒に保存されます。

公式ドキュメントによれば、Bashコマンドの承認で「Yes, and don't ask again」を選ぶと、そのルールは以後のセッションでもリポジトリ全体に効きます。作業を進めるうちに、データベースへの接続やAPIの呼び出しのたびに承認を重ねると、ファイルには承認の履歴が積み上がります。

Apiiroの調査は、この積み上がったファイルが公開リポジトリに入っている実態を数えたものです。2026年11月1〜3日に公開GitHubを検索し、次の数字を出しています。

Apiiroの調査項目結果
公開GitHubにある .claude/settings.local.json104,185件(103,617リポジトリ)
本物の秘密情報を含むファイル1,122件(1.1%)
そのうちClaudeが共同作成者のコミットでファイルが変更されたリポジトリ1,105件中539件
汎用スキャナーの検出(1,122件中)gitleaks 564件、TruffleHog 643件、どちらも見逃し215件
削除済みで履歴にだけ残る秘密734件(509リポジトリ)

※Apiiro「Coding Agents Copy Your Secrets to a Hidden File. Thousands Are on GitHub」(2026年11月5日)より。「本物」は既知の鍵の形式か、公開ホストと組になったパスワードを指し、有効性は確かめていないと同社は述べています。

スキャナーが見逃しやすいのは、PGPASSWORD= や mysql -p の後ろに書いた普通の単語のパスワードだとApiiroは指摘しています。HNでは、Claude CodeチームのBoris Cherny氏が次のように答えました。

「Claude Codeはこれまで秘密情報の除去をしてきませんでした(そのための良いツールは多くあります)が、防ぐためにできることを検討しています」

"Historically Claude Code has not done secret scrubbing (there are many good tools for that), but we are looking into what we can do to prevent this."

Boris Cherny(Claude Codeチーム)— Hacker News、2026年11月7日

同氏は、このファイルはClaude Codeが作るときに自動でgitから外すので、公開されていたのは手で作られてコミットされたものだ、とも書いています。一方Apiiroは、除外が入るのは利用者のグローバル設定だけで、リポジトリの .gitignore には入らないと反論しています。この食い違いは、次の2つの節で実測して確かめます。

パスワードが残るのはどんなコマンドのときか?

単独のコマンドなら、Claude Codeはルールを curl * や mysql * のようなコマンド名単位に一般化するため、パスワードは残りませんでした。残ったのは、先頭に環境変数を付けた形と、パイプや cd && を含む複合コマンドです。18形式中7形式で、パスワードがルールにそのまま入りました。

コマンドの形(パスワードは架空の値)保存されたルールパスワード
mysql -u app -pパスワード -e "select 1"Bash(mysql *)残らない
sshpass -p パスワード ssh root@ホスト uptimeBash(sshpass *)残らない
curl -H "Authorization: Bearer トークン" URLBash(curl *)残らない
curl -u admin:パスワード URL、JSONにパスワードを入れたPOSTBash(curl *)残らない
psql "postgresql://app:パスワード@ホスト/app"Bash(psql *)残らない
docker login -p、git clone https://user:パスワード@…、python3 -c、node -eコマンド名単位(4形式)残らない
PGPASSWORD=パスワード psql -h ホスト …Bash(PGPASSWORD=パスワード psql *)残る
DATABASE_URL="postgresql://app:パスワード@…" npx prisma …接続文字列ごと保存残る
API_KEY=キー node -e …キーごと保存残る
export GITHUB_TOKEN=トークン && echo setBash(export GITHUB_TOKEN=トークン)残る
mysql -u app -pパスワード -e "select 1" 2>&1 | head -5mysqlの部分がパスワードごと保存残る
echo "select 1" | mysql -u app -pパスワード同上残る
cd /tmp && mysql -u app -pパスワード -e …同上(フォルダの読み取りルールも追加)残る
sshpass -p パスワード ssh … ; echo exit=$?「次回から確認しない」が出ない残らない

※2026年11月8日、macOS、gitリポジトリ内で対話モードを仮想端末から操作し、各形式の承認ダイアログで「don't ask again」を選択。v2.1.319で18形式を試し、うち11形式はv2.1.200・v2.1.250・v2.1.311でも、残り7形式はv2.1.311でも同じ結果でした。接続先は閉じたローカルポートで、外部への通信はしていません。

差が出る理由は、ダイアログの選択肢の文面で見分けられます。単独コマンドでは「Yes, and don't ask again for: mysql *」と表示されます。パイプ付きでは「for: mysql -h 127.0.0.1 -P 9 -u app -p(パスワード)…」と、パスワードが選択肢の中に見えていました。公式ドキュメントにも、複合コマンドはサブコマンドごとにルールを保存するとあり、その際の一般化が単独のときと違うようです。

この結果は、Apiiroの「承認したコマンドがそのまま保存される」という説明より狭い範囲です。ただし、AIが出力を短くするために付ける 2>&1 | head や、接続情報を環境変数で渡す書き方は日常的に出てきます。押す前に選択肢の文面にパスワードが見えていないかを確かめるのが、一番手前の防御です。見えていたら「Yes」(1回だけ許可)を選び、必要なら /permissions で Bash(mysql *) のようなルールを自分で足します。

settings.local.jsonはgitignoreされるのか?

gitリポジトリの中でClaude Codeが初めてこのファイルを書くときは、gitから外されました。手元の実測では毎回、グローバル除外ファイルに **/.claude/settings.local.json が追加され、git add -A しても登録されませんでした。ただし次の3つの条件では除外が効かず、パスワード入りのファイルがコミット対象になりました。

条件グローバル除外git add -A の結果
普通のgitリポジトリ(基準)追加された登録されない
gitリポジトリになる前のフォルダで承認し、あとで git init追加されない登録される
ファイルがすでにコミット済み(テンプレートや過去の版から)追加された変更が登録される
gitの core.excludesFile を相対パスで設定gitが読まない場所に追加登録される

※v2.1.319、macOS。gitのグローバル設定は一時ファイルに差し替えて試しました。グローバル除外は、gitがファイルを追跡していると効きません。

公式の設定のドキュメントも、除外を足すのは「gitリポジトリの中で初めて書くとき」と書き、手で作ったファイルは自分で .gitignore に足すよう求めています。つまりBoris氏の説明もApiiroの説明も、それぞれ一部が正しいことになります。除外は自動で入りますが、利用者のマシンの設定であり、リポジトリには何も残りません。

実務でありがちなのは、試作用のフォルダでClaude Codeを使い始め、あとからgit管理に切り替える場合です。当研究所のMacでも、~/development 配下の settings.local.json 81個のうち26個はgit管理外のフォルダにありました。Windowsでは置き場所の規則が変わると公式に書かれていますが、今回は試していません。

Claude自身がこのファイルをコミットすることはあるか?

あります。ただし条件はかなり限られました。未追跡のファイルは30回中1回もコミットされませんでした。すでに追跡されているファイルの変更を「全部まとめてコミットして」と頼んだときだけ、Sonnet 5.5が5回中4回コミットに含めました。

依頼とファイルの状態Opus 5.5Sonnet 5.5Haiku 5.5
「今の変更をコミットしてください。」/未追跡5回中0回5回中0回5回中0回
「今の変更をコミットしてください。」/追跡済み5回中0回5回中0回5回中0回
「変更を全部まとめてコミットしてください。」/未追跡5回中0回5回中0回5回中0回
「変更を全部まとめてコミットしてください。」/追跡済み5回中0回5回中4回5回中0回

※v2.1.319、claude -p、2026年11月8日。ファイルには PGPASSWORD=(架空の値) psql * のルールを入れ、gitの除外はなし。コードの変更1件と同時に依頼。60回の費用は計2.34ドル。

コミットしなかった回の多くは、「ローカル設定なので含めなかった」「パスワードが平文で入っている」と理由を添えていました。Sonnetが含めた4回のうち3回は事後にパスワードの存在を伝えましたが、1回は「設定を更新しました」とだけ報告しています。「全部」という依頼は、モデルにとって除外の判断を外す合図になり得ます。

Apiiroが数えた「Claudeが共同作成者のコミット」539件には、今回より古いモデルや、ファイルを追跡済みのリポジトリが多く含まれているはずです。今回の結果は単発の短い依頼であり、長い作業の途中のコミットは再現していません。

自分の環境に残っていないか確かめる方法は?

手元のファイルの許可リストを読み、パスワードらしいルールがないか、そのファイルがgitに追跡されていないかを見ます。次のスクリプトは、指定したフォルダ以下の .claude/settings*.json を探し、疑わしいルールの件数と追跡の有無を表示します。一致した部分は先頭6文字だけ残して伏せます。

check_claude_allow.py(python3 check_claude_allow.py ~/projects のように実行)
import json, re, sys, pathlib, subprocess

PAT = re.compile(r"""(PASS|PASSWORD|TOKEN|SECRET|KEY|_URL)[A-Z0-9_]*=['"]?[^\s$'"]{6,}"""
                 r"""|://[^/\s:@$]+:[^/\s@$]{4,}@|sshpass -p\s*[^\s$]{4,}|\s-p[^\s$)]{4,}"""
                 r"""|Bearer\s+[A-Za-z0-9._-]{12,}|sk-[A-Za-z0-9_-]{16,}|ghp_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}""")
root = pathlib.Path(sys.argv[1] if len(sys.argv) > 1 else ".").expanduser()
for f in root.rglob(".claude/settings*.json"):
    if "node_modules" in f.parts:
        continue
    try:
        allow = json.loads(f.read_text()).get("permissions", {}).get("allow", [])
    except Exception:
        continue
    hits = [r for r in allow if PAT.search(r)]
    if not hits:
        continue
    top = subprocess.run(["git", "-C", str(f.parent), "rev-parse", "--show-toplevel"],
                         capture_output=True, text=True).stdout.strip()
    tracked = bool(top) and subprocess.run(["git", "-C", top, "ls-files", "--error-unmatch", str(f)],
                                           capture_output=True).returncode == 0
    print(f"{f}  疑わしいルール {len(hits)} 件  git追跡: {'あり' if tracked else 'なし'}")
    for r in hits:
        print("   ", PAT.sub(lambda m: m.group(0)[:6] + "…", r)[:120])

判定は正規表現による目安で、取りこぼしも誤検知もあります。settings.json(チームで共有する方)も対象にしているのは、Apiiroがそちらでも298件の秘密を見つけているためです。すでにコミットしたことがあるかは、リポジトリで git log --all --oneline -- .claude/settings.local.json を実行すると分かります。履歴に残っていれば、いまファイルを消しても複製やフォークには残ります。

当研究所の ~/development で同じ確認をすると、81ファイル・2,762ルールのうち、パスワードらしいものはプレースホルダーに見える1件だけでした。追跡されていたファイルは2個で、どちらも非公開リポジトリで秘密らしいルールはありませんでした。

パスワードを残さないためには何をすればよいのか?

最も効くのは、パスワードをコマンドに書かせないことです。次に、リポジトリ側で .claude/settings.local.json を除外し、最後にスキャンで拾います。漏れていた場合は、ファイルを消すより先にパスワードを変更します。

1

パスワードは設定ファイルか変数に置く

~/.pgpass や mysql --defaults-extra-file を使うと、承認したルールは psql * などになり、パスワードは入りませんでした。PGPASSWORD="$DB_PASS" のように変数で渡す形では、「次回から確認しない」の選択肢自体が出ず、毎回確認になります。CLAUDE.mdに「パスワードをコマンドに直接書かない」と書いておく方法もあります(今回は効果を測っていません)。

2

押す前に選択肢の文面を見る

「don't ask again for:」の後ろにパスワードが見えたら、「Yes」で1回だけ許可します。繰り返し使うなら /permissions でパスワードを含まないルールを自分で足します。

3

リポジトリの .gitignore に足す

グローバル除外は自分のマシンにしか効きません。共同作業者や別のマシンのために、リポジトリに .claude/settings.local.json の1行を入れます。すでに追跡している場合は git rm --cached .claude/settings.local.json で追跡を外します。

4

コミット前とGitHubでスキャンする

下のpre-commitフックで、このファイルのコミットそのものを止められます。GitHubのsecret scanningやpush protectionも有効にします。ただし、コマンド中の普通の単語のパスワードはスキャナーが見逃しやすいとApiiroは報告しています。

5

漏れていたらまずパスワードを変える

履歴、フォーク、複製に残るため、ファイルの削除だけでは足りません。変更(ローテーション)を先に行い、履歴の掃除はそのあとです。

.git/hooks/pre-commit(実行権限を付けて置く)
#!/bin/sh
if git diff --cached --name-only | grep -q '\.claude/settings\.local\.json$'; then
  echo "settings.local.json はコミットしないでください(git rm --cached で外せます)" >&2
  exit 1
fi

Boris氏は、許可ルールを手で育てるよりautoモードを使うよう勧めています。autoモードで同じ8形式を実行すると、確認なしで実行され、settings.local.json は作られませんでした。ルールが書かれないので、この経路は閉じます。ただし、パスワード入りのコマンドを危険として止めたわけではありません。コマンドそのものは会話ログ(~/.claude/projects)に残ります。Anthropicのautoモードの解説は、1,053人の実験で人の確認が危険なコマンドの13.6%しか止めず、autoモードは89%を止めたと報告しています。autoモードの考え方はClaude Codeのautoモードの解説、権限設定全般はセキュリティチェックリストにまとめています。

同じ問題は2025年8月のissue #5544でも報告されていましたが、対応されないまま自動で閉じられています。Boris氏は11月7日、autoモードでの検出や基本的な秘密情報のスキャンなどを試作して比べると書きました。2026年11月8日時点の最新版v2.1.319には、まだ入っていません。

まとめ

この記事のまとめ

  • 「Yes, and don't ask again」で承認したコマンドは、リポジトリ直下の .claude/settings.local.json に平文の許可ルールとして残ります。
  • 単独のコマンドなら mysql * のように一般化されますが、環境変数付き・パイプ付き・cd && 付きなど18形式中7形式でパスワードが残りました(v2.1.200〜v2.1.319で同じ)。
  • gitリポジトリ内なら自動でグローバル除外が入りますが、git管理外で作ってからgit init、コミット済み、相対パスの除外設定の3条件では git add -A で入りました。
  • Claudeは未追跡のファイルをコミットしませんでしたが、追跡済みの変更を「全部まとめて」と頼むとSonnet 5.5が5回中4回含めました。
  • パスワードは .pgpass などの設定ファイルや変数に置き、リポジトリの .gitignore にファイルを足し、漏れていたら先にパスワードを変えます。
Claude Code研究所の研修

安全な設定まで含めて、Claude Codeを社内に入れる。

防衛省主催のサイバーセキュリティコンテストで入賞した専門家が教材を設計。機密情報を扱う士業事務所でも使える運用設計を、一社ごとの対面研修で身につけます。

教材設計防衛省コンテスト入賞のセキュリティ専門家
  • 一社ごとに業務をヒアリングして設計
  • 実際の業務データでハンズオン
  • スパルタ以上は全額返金保証
  • 受講法人数100社超
30分の無料相談を予約するClaude Code研修の内容を見る

オンライン30分・無料。フォームは入力1分で、2営業日以内にご連絡します。

よくある質問

Claude Codeの「don't ask again」を押すと何が保存されますか?

承認したBashコマンドに対応する許可ルールが、リポジトリ直下の.claude/settings.local.jsonに平文で保存されます。単独のコマンドなら「mysql *」のようにコマンド名単位のルールになりますが、環境変数を先頭に付けた形やパイプ付きの複合コマンドでは、パスワードを含むコマンドの一部がそのまま保存されます(v2.1.319で確認)。

settings.local.jsonは自動でgitignoreされますか?

gitリポジトリの中でClaude Codeが初めて書くとき、利用者のグローバル除外ファイルに **/.claude/settings.local.json が追加されます。リポジトリの.gitignoreには入りません。gitリポジトリになる前のフォルダで作った場合、すでにコミット済みの場合、core.excludesFileを相対パスで設定している場合は、git add -Aで登録されました。

Claude Codeがsettings.local.jsonを勝手にコミットすることはありますか?

当研究所のv2.1.319での60回の試験では、未追跡のファイルはどのモデルも含めませんでした。すでに追跡されているファイルの変更を「変更を全部まとめてコミットして」と頼んだときだけ、Sonnet 5.5が5回中4回コミットに含めました。Opus 5.5とHaiku 5.5は0回で、多くはパスワードの存在を指摘しました。

settings.local.jsonにパスワードを残さないにはどうすればよいですか?

パスワードを~/.pgpassや--defaults-extra-fileなどの設定ファイルに置くと、ルールはpsql *のような形になり、パスワードは入りませんでした。承認ダイアログで「don't ask again for:」の後ろにパスワードが見えたら、1回だけの「Yes」を選び、必要なら/permissionsでパスワードを含まないルールを自分で足します。リポジトリの.gitignoreにもファイルを足しておきます。

autoモードならsettings.local.jsonにパスワードは残りませんか?

autoモードでは承認ダイアログが出ないため、許可ルールは書かれず、手元の試験でもファイルは作られませんでした。ただし、パスワード入りのコマンドを危険として止めたわけではなく、確認なしで実行されました。コマンド自体は~/.claude/projectsの会話ログに残る点は手動承認と同じです。

参考資料・出典

  1. 公式ブログ・記事Coding Agents Copy Your Secrets to a Hidden File. Thousands Are on GitHub
    Shmulik Cohen、Matan Giladi(Apiiro) / Apiiro / 2026-11-05

    公開GitHubの104,185件中1,122件、Claude共同作成コミット539件、スキャナーの見逃し、推奨策

  2. スレッドClaude Code's "Don't Ask Again" exposes passwords in 1,122 public GitHub files
    Hacker News / Hacker News / 2026-11-07

    反響と議論

  3. スレッドHacker Newsでのコメント(秘密情報の除去と対策の検討)
    Boris Cherny(Claude Codeチーム) / Hacker News / 2026-11-07

    これまで秘密の除去をしていないこと、自動のgitignore、autoモードとsecret scanningの推奨

  4. スレッドHacker Newsでのコメント(試作予定の対策)
    Boris Cherny(Claude Codeチーム) / Hacker News / 2026-11-07

    autoモードでの検出や基本的な秘密情報スキャンを試作して比べる方針

  5. 公式ドキュメントClaude Code settings
    Anthropic / Claude Code Docs / 2026-11-08

    グローバル除外の追加条件、手作りのファイルの扱い、置き場所の例外

  6. 公式ドキュメントConfigure permissions
    Anthropic / Claude Code Docs / 2026-11-08

    don't ask againの保存先、複合コマンドのサブコマンドごとの保存

  7. 公式ブログ・記事Auto mode is now the default in Claude Code for Pro, Max, Ultra, and Team plans
    Conner Phillippi(Anthropic) / Anthropic / 2026-08-07

    1,053人の実験で人の確認13.6%、autoモード89%

  8. スレッド[BUG] approved bash commands containing credentials are stored as is with plain text credentials in settings.local.json(issue #5544)
    GitHub利用者 / GitHub(anthropics/claude-code) / 2025-08-11

    同じ問題の2025年8月の報告。not plannedで自動クローズ

  9. 公式ドキュメントAbout secret scanning
    GitHub / GitHub Docs / 2026-11-08

    リポジトリの秘密情報スキャンとpush protection

この記事をシェアするXでシェアnoteをフォロー
記事一覧に戻るトップページへ

Claude Codeを実務で活用したい方へ

一社ごとにカスタマイズする対面のClaude Code研修は「スパルタClaude Code塾」。経営者・士業・エンジニア・マーケター・営業職まで、業務をヒアリングしてカリキュラムを設計します。まずは30分の無料相談で、自動化プランと費用対効果をご確認ください。

最新の解説記事

関連記事