テック技報最新号へ →
AIコーディング

Claude Code:「Yes, and don't ask again」でパスワードが .claude/settings.local.json に残る。コマンドに秘密を直書きしない

許可の確認で「Yes, and don't ask again」を選ぶと、その時のコマンドが allow ルールとして .claude/settings.local.json に保存される。コマンドにパスワードやトークンを直接書いていると、それも平文で残る。秘密は環境変数で渡し、ファイルはリポジトリの .gitignore にも入れる。

@Lattice_Node · 投稿 2026-11-07
#ai-coding#claude-code#セキュリティ#権限#シークレット

何が起きているか

  • Apiiro が公開 GitHub を調べたところ、.claude/settings.local.json 約10万4千件のうち 1,122 件に本物とみられる秘密が入っていた(The Hacker News が 2026-11-07 に報道)。DB のパスワードが最も多く、SSH ログイン、GitHub/npm のトークン、AWS キーなども見つかった
  • 保存されるのは、確認画面の選択肢に出ていた範囲。npm test * のようなパターンのこともあれば、コマンドそのもののこともある。後者だと PGPASSWORD=...、mysql -p...、sshpass -p ... などがそのまま残る
  • 公式ドキュメントでは、Claude Code はこのファイルを初めて書くときに「グローバルの git excludes」(core.excludesFile、未設定なら ~/.config/git/ignore)へ **/.claude/settings.local.json を足す。守られるのはそのパソコンの git だけで、リポジトリの .gitignore には入らない。手で作ったファイル、すでにコミット済みのファイル、別マシンや CI でのコミットは守られない
  • gitleaks や TruffleHog は、コマンド中に埋まったパスワードを見逃しやすい(Apiiro の検証では2割ほどがどちらにも検出されなかった)

やること

  1. まず自分のリポジトリの履歴を調べる(消したファイルも履歴とフォークに残る)
bash
git log --all --oneline -- .claude/settings.local.json .claude/settings.json
git grep -nE 'PGPASSWORD=|sshpass -p|mysql .*-p[^ ]|Bearer [A-Za-z0-9_-]{20,}' $(git rev-list --all) -- .claude/ 2>/dev/null | head
  1. 一度でも入っていた秘密は、先に無効化・再発行する(掃除より先)
  2. 追跡をやめて、プロジェクトの .gitignore に入れる
bash
git rm --cached .claude/settings.local.json
echo '.claude/settings.local.json' >> .gitignore
  1. コミットしていなくても、手元のファイルを開いて秘密入りのルールを消す(npm パッケージ、Docker イメージ、同期フォルダに紛れ込むことがある)
  2. これからは秘密を変数で渡す。保存されるのは変数名だけになる
bash
psql "$DATABASE_URL" -c 'select 1'   # 良い: ルールに残るのは $DATABASE_URL
# 悪い: PGPASSWORD=hunter2 psql -h db.example.com ...
  1. 承認はコマンド単位ではなくパターンで(例: Bash(npm run *))。確認画面の選択肢に何が書かれているかを見てから選ぶ

注意点

出典

  • X: @Lattice_Node(未登録アカウント。点検用プロンプトは続きの投稿。下の一次情報で裏取り)
  • The Hacker News(Apiiro の調査の報道, 2026-11-07): thehackernews.com
  • Claude Code ドキュメント(Settings: settings.local.json の扱い): code.claude.com
  • Claude Code ドキュメント(Permissions: 「don't ask again」の保存先): code.claude.com
X の元の投稿を開く