Коротко (TL;DR)
Чтобы Claude Code не раскрывал e-mail, пароли и ключи, путь секрета наружу надо перекрыть в нескольких местах сразу: обновиться до версии 2.1.317 или новее, закрыть чтение .env deny-правилами, не давать паролю попадать в текст команды, держать .claude/settings.local.json вне git и Docker, а затем проверить свои репозитории сканером. Всё, что уже утекло, — сменить.
- Коротко (TL;DR)
- Две утечки ноября 2026: e-mail в User-Agent и пароли на GitHub
- E-mail в User-Agent: обновление, проверка и свой хук на Bash
- «Yes, and don’t ask again» сохраняет пароль в файл проекта
- Deny-правила в settings.json: закрываем .env и папки с ключами
- Песочница и переменные окружения: что видит агент при закрытом .env
- Auto mode и YOLO: что они не гарантируют для секретов
- Файлы в .gitignore и .dockerignore: что добавить сегодня
- Как проверить свои репозитории: gh search, gitleaks, TruffleHog
- Ключ API или пароль уже утёк: что делать и в каком порядке
- Чек-лист безопасности Claude Code на 15 минут
- Что настройки Claude Code не закрывают: остаточные риски
- FAQ
- E-mail аккаунта. Начиная с 2.1.317 (3 ноября 2026) встроенная проверка спрашивает, прежде чем e-mail уйдёт в сеть. Она ловит не всё, поэтому ниже есть свой хук.
- «Yes, and don’t ask again». Для Bash-команды это правило навсегда записывается в
.claude/settings.local.json— вместе с паролем, если он был в команде. - Чтение секретов.
Read(./.env)вpermissions.denyзакрывает файл от встроенных инструментов, но не отgrep -rи скриптов. Глубже защищает песочница. - Git. Claude Code прячет свой файл только в глобальном git excludes, поэтому в
.gitignoreрепозитория и в.dockerignoreстроку нужно добавить самим. - Аудит и утечка. gitleaks и TruffleHog, плюс ручной поиск: по данным Apiiro, сканеры пропустили 215 из 1 122 файлов. Утёкший ключ сначала отзывают, историю чистят потом.
Все версии, статусы и цифры в статье — на 9 ноября 2026 года. Устройство защитных механизмов, обучение на данных и маскирование учётных данных подробно разобраны в нашем материале о пяти периметрах безопасности Claude Code. Здесь — практический чек-лист по двум свежим историям.
Две утечки ноября 2026: e-mail в User-Agent и пароли на GitHub
В первую неделю ноября 2026 года вокруг Claude Code всплыли две истории. Первая: агент иногда вписывал e-mail вашего аккаунта в заголовок User-Agent, когда сам составлял команду curl, и адрес уходил на чужие сайты. Вторая: кнопка «Yes, and don’t ask again» сохраняла команду целиком, с паролем внутри, в файл проекта, и этот файл тысячами оказывался в публичных репозиториях на GitHub. Вторую историю подтверждает документация Claude Code по разрешениям, первую — changelog версии 2.1.317 и сами разработчики.
У обеих историй одна причина. Агент одновременно видит ваши данные и умеет отправлять их наружу — через сеть или через коммит. Исследователь Саймон Уиллисон называет это «смертельной триадой» (lethal trifecta, 2025): доступ к приватным данным, недоверенный контент и канал связи с внешним миром. Пока у агента есть все три, утечка — вопрос времени. Поэтому каждый пункт чек-листа ниже убирает хотя бы одно ребро: секрет не попадает в контекст, файл не читается, коммит не уходит, утёкшее находится и отзывается.
| Что случилось | Чем подтверждено | Что сделать |
|---|---|---|
E-mail аккаунта уходил в User-Agent запросов curl | Признание команды Claude Code на Hacker News, issue #107757, changelog 2.1.317 | Обновиться до 2.1.317+, не выключать проверку, поставить свой хук |
| Полное удаление e-mail из контекста модели | Обещано «в начале следующей недели» (HN, 5–6 ноября); в changelog до 2.1.319 его нет, issue открыт на 9 ноября | Следить за changelog, проверить версию в день чтения |
Пароли и токены в .claude/settings.local.json в публичных репозиториях | Документация (куда пишется правило), исследования Apiiro и GitGuardian | Вычистить файл, добавить его в .gitignore и .dockerignore, сменить ключи |
| Сканеры пропускают часть утёкших файлов | Apiiro: 215 из 1 122 файлов не нашли ни gitleaks, ни TruffleHog | Дополнить сканер ручным поиском по шаблонам команд |
Масштаб второй истории две компании-вендора сканеров считали по-разному, и цифры не надо смешивать:
- Apiiro (данные собраны 1–3 ноября 2026, исследование опубликовано 5 ноября): 104 185 публичных копий
.claude/settings.local.jsonв 103 617 репозиториях, из них 1 122 файла содержали хотя бы один настоящий секрет — всего 1 379 разных секретов. Эти цифры — по текущим копиям файлов, валидность ключей не проверялась. Старые версии файла Apiiro считала отдельно: в них ещё 734 секрета в 509 репозиториях (по Breach Signal), а вместе с историей, общими настройками и транскриптами набирается 2 539 секретов в 1 994 репозиториях (по Cybersecurity News). - GitGuardian (январь 2025 — 7 ноября 2026, данные компании): 31 088 разных секретов в этом файле в 23 276 репозиториях за всё время, включая историю коммитов. 5 343 из них работали в момент обнаружения.
- Кто коммитил. По данным Apiiro (это же повторяет GitGuardian), в 539 из 1 105 прослеженных репозиториев с настоящим секретом файл менял коммит, где соавтором стоит сам Claude.
Обе компании продают сканеры секретов, так что у них есть коммерческий интерес к теме. Но механизм утечки описан в официальной документации, и от методики подсчёта он не зависит.
E-mail в User-Agent: обновление, проверка и свой хук на Bash
Почему вообще e-mail попадал в запросы: Anthropic добавила адрес аккаунта в контекст модели для вошедших пользователей, чтобы Claude не выдумывал автора в тегах вроде @author. Когда же Claude сам писал команду curl, он иногда ставил этот адрес как контактный в User-Agent. Так это объяснила сотрудница команды Claude Code Лидия Халли в треде Hacker News 6 ноября 2026 года.
Что понадобится:
- Claude Code версии 2.1.317 или новее;
- утилита
jqдля хука (без неё хук молча пропускает все команды — проверьтеjq --version); - gitleaks и/или TruffleHog для аудита;
- GitHub CLI (
gh) для поиска файла в своих репозиториях.
Что сделать по шагам:
- Проверьте версию. Выполните
claude --version. Если ниже 2.1.317 — обновитесь командойclaude update. В changelog версии 2.1.317 от 3 ноября 2026 года записано: добавлена проверка, которая спрашивает разрешения, прежде чем веб- или shell-инструмент отправит e-mail аккаунта в сеть. - Не выключайте встроенную проверку. Она называется
cc-plugin-privacy, включена по умолчанию и видна в/plugins. Там же её можно отключить — делать этого не нужно. - Следите за полным исправлением. Команда пообещала убрать e-mail из контекста модели в следующем релизе «в начале следующей недели». На 9 ноября в changelog до версии 2.1.319 (6 ноября) такого пункта нет, а issue #107757 остаётся открытым. Проверяйте changelog в день, когда читаете эту статью.
- Не смешивайте рабочий и личный аккаунты. В треде HN советуют не смешивать рабочие и личные аккаунты — это мнение сообщества, а не рекомендация Anthropic. От себя добавим: отдельный адрес под Claude Code снижает цену утечки, если она всё же случится.
Чего встроенная проверка не ловит. По словам самой Халли, она не перехватывает случаи, когда Claude пишет скрипт и запускает его сам: адрес оказывается внутри файла, а не в тексте команды. Кроме того, пользователи сообщают в комментариях к issue, что вариант curl -A на версиях 2.1.318 и 2.1.319 не блокировался. Мы это не воспроизводили, поэтому подаём как жалобу пользователей, а не как факт.
PreToolUse-хук Claude Code, который блокирует ваш e-mail в командах
Хук — это ваша команда, которую Claude Code запускает автоматически перед вызовом инструмента. Механизм документирован: событие PreToolUse получает на вход JSON, для Bash в поле tool_input.command лежит текст команды, а выход с кодом 2 и сообщением в stderr блокирует вызов. Подробно механика разобрана в нашем гайде про хуки PreToolUse в Claude Code.
Скрипт ниже — наш синтез на основе документированного примера protect-files.sh, а не официальная рекомендация. Проверьте его на своей версии, прежде чем полагаться на него: попросите Claude выполнить безобидный echo с вашим адресом и убедитесь, что вызов заблокирован.
#!/bin/bash
# ~/.claude/hooks/block-email.sh — пример insidepc.tech, проверьте на своей версии
MY_EMAIL="you@example.com" # замените на адрес своего аккаунта
INPUT=$(cat)
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // .tool_input.url // empty')
shopt -s nocasematch
if [[ "$CMD" == *"$MY_EMAIL"* ]]; then
echo "Blocked: команда содержит e-mail аккаунта" >&2
exit 2
fi
exit 0
Сделайте файл исполняемым (chmod +x ~/.claude/hooks/block-email.sh) и зарегистрируйте его в пользовательских настройках ~/.claude/settings.json, чтобы хук работал во всех проектах:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash|WebFetch",
"hooks": [
{ "type": "command", "command": "$HOME/.claude/hooks/block-email.sh" }
]
}
]
}
}
Учтите две особенности. Хук заблокирует любую команду с вашим адресом, включая безобидную git config user.email — такие команды придётся выполнять самому. А если jq не установлен, переменная CMD останется пустой, и хук молча пропустит всё.
Ограничение у хука то же, что у встроенной проверки: он видит только буквальный адрес в тексте команды или URL. Скрипт, который Claude сначала записал в файл, а потом запустил, хук не прочитает. Для этого случая работают песочница с ограничением сети и привычка просматривать скрипты перед запуском.
«Yes, and don’t ask again» сохраняет пароль в файл проекта
Когда Claude Code просит разрешения на Bash-команду, а вы нажимаете «Yes, and don’t ask again», он сохраняет правило allow в файл .claude/settings.local.json в корне git-репозитория. По таблице документации такое разрешение для Bash действует навсегда для этого репозитория и этой команды, для WebFetch — навсегда для домена, а разрешение на правку файлов живёт только до конца сессии и в файл не пишется.
Проблема в том, что диалог сохраняет точную команду или её префикс (например, Bash(npm test *)). Секрет попадает в файл, если он стоит в сохранённой части команды. Если в команде был токен (curl -H "Authorization: Bearer …") или пароль базы (PGPASSWORD=… psql), он лежит в файле открытым текстом. Составную команду вроде git status && npm test Claude Code разбивает и сохраняет до пяти отдельных правил — по одному на каждую подкоманду, которой нужно разрешение. Секрет может оказаться в любом из них.
Как вычистить файл:
- Откройте
.claude/settings.local.jsonв корне репозитория (в worktree — в основном checkout). Правила также видны командой/permissionsвнутри сессии. - Найдите в
permissions.allowстроки с секретами: токены,Bearer,PGPASSWORD=,-pс паролем, ключи API в URL. - Если файл хоть раз попадал в коммит, образ Docker или чужие руки — сначала смените секрет (раздел про утечку ниже), потом правьте файл.
- Удалите эти правила и сохраните файл. Это строгий JSON: комментарий
//или лишняя запятая дадут ошибку настроек при следующем запуске. - Перенесите секрет в переменную окружения, а в команде ссылайтесь на неё:
$API_KEYвместо самого ключа. Тогда в правило попадёт имя переменной, а не значение.
Так выглядит проблемный файл (значения выдуманы для примера):
{
"permissions": {
"allow": [
"Bash(npm test)",
"Bash(PGPASSWORD=Hunter2-prod psql -h db.example.com -U admin)"
]
}
}
GitGuardian в своём разборе советует ещё и сужать сохраняемые правила: вместо широкого Bash(curl *) одобрять конкретную команду к конкретному хосту, где ключ передаётся переменной. Здесь важна оговорка документации: шаблоны, которые пытаются ограничить аргументы команды, хрупкие. Bash(curl http://github.com/ *) не совпадёт с curl -X GET http://github.com/…, с https:// или с запросом через переменную. Узкое правило нужно, чтобы секрет не сохранялся в файл, а не как защитный барьер.
Deny-правила в settings.json: закрываем .env и папки с ключами
Deny-правило — это запрет в блоке permissions.deny файла настроек. Правила проверяются в порядке deny → ask → allow, и первое совпадение решает исход, поэтому запрет побеждает любое разрешение. Ниже — блок из документации, дополненный правилами для папки secrets и каталога ~/.ssh в синтаксисе той же документации. Его можно вставить как есть. Это и есть базовые security settings Claude Code в формате JSON: положите их в ~/.claude/settings.json, чтобы они действовали во всех проектах, или в .claude/settings.json репозитория, чтобы их получила вся команда.
{
"permissions": {
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Read(~/.ssh/**)"
]
}
}
Учтите: правило с ./ закрывает только .env в корне папки, где запущена сессия. Для вложенных .env (например, в монорепозитории) нужны правила Read(**/.env) и Read(**/.env.*).
Как устроена иерархия файлов и почему массивы правил из разных уровней складываются, а не заменяют друг друга, мы подробно разбирали в статье про settings.json в Claude Code. Для безопасности важны четыре детали путей:Префикс Что значит Пример из документации ./ или имя файла./ — путь от текущей папки; голое имя файла совпадает на любой глубинеRead(./.env) — только .env в текущей папке; Read(.env) и Read(**/.env) — любой .env в проекте на любой глубине~/Путь от домашней папки Read(~/.ssh/**)//Абсолютный путь от корня диска Read(//Users/alice/secrets/**)/ (один слэш)Не корень диска: якорь — каталог, связанный с файлом настроек. В проектных .claude/settings.json и settings.local.json это папка проекта, в пользовательском ~/.claude/settings.json — ~/.claudeВ ~/.claude/settings.json правило Read(/secrets/**) закроет ~/.claude/secrets, а не папку проекта
Если вы годами вели файл .claudeignore — документация прямо пишет, что он «has no effect», то есть ничего не делает. Его записи нужно перенести в Read-deny. The Register ещё 28 января 2026 года (версия 2.1.12) показала, что Claude читает .env вопреки .claudeignore.
Что обходит deny-правила Claude Code: grep -r, скрипты, путь к curl
Документация сама перечисляет пределы, и их стоит знать до того, как полагаться на запрет:Правило Что останавливает Что не останавливает Read(./.env)Встроенный инструмент Read, cat, head, tail, sed, перенаправления < .envgrep -r pattern . из папки с файлом, скрипт на Python или Node, который сам открывает файлBash(curl *)curl https://example.com/usr/bin/curl https://example.com, sh -c 'curl …'
Для защиты на уровне операционной системы, которая останавливает любой процесс, документация отсылает к песочнице.
Ещё одна полезная деталь касается чужих репозиториев. Правила allow из .claude/settings.json проекта Claude Code применяет только после того, как вы приняли диалог доверия к папке, а deny и ask действуют сразу. Клонированный проект не может молча выдать агенту лишние разрешения, но может сразу добавить запреты.
Песочница и переменные окружения: что видит агент при закрытом .env
Песочница (sandbox) — это изоляция Bash-команд Claude Code на уровне операционной системы. По документации на 9 ноября 2026 года она выключена по умолчанию: включается командой /sandbox или ключом sandbox.enabled. И даже включённая, по умолчанию она разрешает читать большую часть машины, включая ~/.ssh и ~/.aws/credentials, а переменные окружения со всеми секретами наследуются от Claude Code. Встроенного списка запретов нет: закрыто только то, что вы перечислили.
Пример из документации закрывает файл AWS и папку SSH и убирает два токена из окружения команд в песочнице:
{
"sandbox": {
"enabled": true,
"credentials": {
"files": [
{ "path": "~/.aws/credentials", "mode": "deny" },
{ "path": "~/.ssh", "mode": "deny" }
],
"envVars": [
{ "name": "GITHUB_TOKEN", "mode": "deny" },
{ "name": "NPM_TOKEN", "mode": "deny" }
]
}
}
}
Три оговорки к этому блоку:
- Где хранить. Источник настроек можно исключить при запуске (например, чтобы не подгружать настройки чужого репозитория). Начиная с версии 2.1.246 в таком случае Claude Code не применяет ни одной записи
credentialsиз исключённых настроек проекта и локальных настроек. А записиmaskон учитывает только из пользовательских и управляемых настроек или флага--settings. Надёжное место — пользовательский~/.claude/settings.json. - Что покрывает.
sandbox.credentialsдействует только на Bash-команды внутри песочницы. Чтобы вычистить учётные данные из окружения всех подпроцессов, включая хуки и stdio-серверы MCP, задайте переменнуюCLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1(например,exportв профиле оболочки). Она узнаёт секрет по имени или значению переменной, но токены GitHub и настройки прокси оставляет. - Транскрипты. Даже если секрет не попал в файл правил, он мог попасть в диалог. Claude Code хранит транскрипты сессий локально открытым текстом в
~/.claude/projects/30 дней по умолчанию; срок меняется ключомcleanupPeriodDays. Эту папку стоит сканировать вместе с репозиториями.
Режим mask (агент видит подставное значение, а настоящее подставляет прокси) подробно разобран в статье о пяти периметрах. Если настроек мало и нужна полная изоляция, вынесите агента в контейнер, где ключей просто нет, — как это сделать, мы показывали в разборе песочницы для ИИ-агентов.
Auto mode и YOLO: что они не гарантируют для секретов
Auto mode — режим, в котором действия агента вместо вас оценивает классификатор. С версии 2.1.283 он стал стартовым режимом для интерактивных сессий в терминале и VS Code. Глава Claude Code Борис Черни на Hacker News назвал его более безопасным выбором и посоветовал всем. Критики в том же треде возражают, что модель угроз у классификатора не определена. Это спор мнений; ниже — только то, что записано в документации.Режим Кто решает Что важно для секретов Ручной (с запросами) Вы, на каждое действие «Don’t ask again» сохраняет команду с секретом в settings.local.jsonAuto mode Классификатор По умолчанию разрешено читать .env и отправлять учётные данные в «их» API; блокируется пуш секретов в публичный репозиторий и печать живого ключа в транскрипт или файлbypassPermissions (YOLO)Почти никто Запросов почти нет, в том числе на запись в .git и .claude; документация разрешает его только в контейнерах и виртуальных машинах
Два вывода из таблицы. Первый: auto mode не обещает, что агент не прочитает .env, — чтение там разрешено по умолчанию. Deny-правила из предыдущих разделов нужны и в этом режиме. Второй: сохранение команд с секретами в файл настроек в auto mode тоже возможно — на замечание пользователя об этом Черни ответил «good catch», то есть признал проблему (по данным Ars Technica).
Если YOLO-режим вам не нужен, запретите его себе явно. Документация разрешает ставить этот ключ в любой файл настроек, а в управляемых настройках организации его нельзя переопределить:
{
"permissions": {
"disableBypassPermissionsMode": "disable"
}
}
Чем отличаются режимы, когда какой включать и как переключаться в сессии, мы подробно разбирали в гайде по режимам доступа Claude Code.
Файлы в .gitignore и .dockerignore: что добавить сегодня
Главный сюрприз этой истории в том, что Claude Code действительно прячет свой файл от git, но не там, где многие думают. По документации о файлах настроек, при первой записи он добавляет строку **/.claude/settings.local.json в глобальный git excludes — файл из core.excludesFile или ~/.config/git/ignore. Если файл вы создали руками, добавить его в .gitignore нужно самим.
Отсюда и спор на Hacker News. Черни писал, что команда «автоматически игнорирует файл», а автор исследования Apiiro — что игнор только глобальный; в ответ на возражения он сузил формулировку. Свежий клон файла не содержит: файл не отслеживается, а на новой машине Claude Code сам допишет глобальный игнор при первой записи. Глобальный игнор действует на все репозитории машины. Реальные пути утечки другие:
- файл создан руками до того, как Claude Code впервые записал в него, и глобального игнора ещё нет;
- файл уже отслеживается git — тогда никакой игнор его не исключает;
- рабочую папку скопировали целиком (архив, rsync, общий том, образ Docker, артефакт CI) туда, где глобального игнора нет, и там закоммитили;
- файл добавили принудительно через
git add -f.
Строка в .gitignore самого репозитория закрывает эти случаи для всех, кто с ним работает. Проверить, кто и как игнорирует файл у вас, можно командой:
git check-ignore -v .claude/settings.local.json
Если вывод указывает на глобальный файл или пустой, добавьте строки в .gitignore самого репозитория:
.env
.env.*
!.env.example
.claude/settings.local.json
Если файл уже отслеживается git, одной строки в .gitignore мало: git продолжит его коммитить. Уберите его из индекса, оставив на диске:
git rm --cached .claude/settings.local.json
git commit -m "Stop tracking Claude Code local settings"
Этот коммит не удаляет файл из истории — секреты в старых коммитах остаются, поэтому их всё равно нужно сменить.
Отдельный канал утечки — Docker. Команда COPY . . берёт рабочее дерево, а не индекс git, поэтому файл, который git игнорирует, всё равно попадёт в образ. GitGuardian (данные на 7 ноября 2026) нашла в публичных образах Docker Hub 613 разных секретов из этого файла, 99 из них были рабочими. В .dockerignore добавьте:
.env
.env.*
.claude/
Файл .claude/settings.json с общими командными правилами в git коммитить можно и нужно: секретов в нём быть не должно, а deny-правила полезно раздать всей команде. Закрывать от git нужно только settings.local.json. Вместо настоящего .env в репозиторий кладут .env.example с пустыми значениями.
Как проверить свои репозитории: gh search, gitleaks, TruffleHog
Аудит отвечает на вопрос, утекло ли что-то уже, и начинается с поиска самого файла, а заканчивается защитой от следующей утечки. Порядок такой:
- Найдите файл в своих публичных репозиториях. Через GitHub CLI:
gh search code --owner <логин> --filename settings.local.json. Документация CLI предупреждает, что команда работает на устаревшем движке поиска, и результаты могут отличаться от веб-поиска. Для сверки ищите на сайте GitHub с квалификаторамиuser:<логин>иpath:.claude/settings.local.json. - Проверьте, попадал ли файл в историю. В каждом локальном репозитории:
git log --all --oneline -- .claude/settings.local.json. Пустой вывод означает, что файл никогда не коммитился. - Прогоните gitleaks по истории и по папке транскриптов:
gitleaks git -v
gitleaks dir -v ~/.claude/projects
- Прогоните TruffleHog с проверкой валидности:
trufflehog git file://. --results=verifiedдля репозитория иtrufflehog filesystem ~/.claude/projectsдля транскриптов. Флаг--results=verifiedоставляет только ключи, которые сейчас работают. - Поищите руками то, что сканеры пропускают. У пароля после
PGPASSWORD=или-pнет узнаваемого формата, как у ключа AWS, поэтому сканер его не видит. Наш вариант поиска (подстройте под свои команды):grep -rnE "PGPASSWORD=|Bearer |api[_-]?key=|password=" .claude/. - Включите защиту на GitHub. Для публичных репозиториев secret scanning работает бесплатно и автоматически. Для приватных репозиториев организации нужен GitHub Secret Protection на тарифе Team или Enterprise Cloud. Push protection на уровне пользователя включён по умолчанию и не даёт пушить секреты в публичные репозитории. А на уровне репозитория любой с правом записи может обойти блок, указав причину.
- Поставьте gitleaks в pre-commit, чтобы ловить секрет до коммита: репозиторий
gitleaks/gitleaks, хукgitleaksв.pre-commit-config.yaml.
| Инструмент | Что ловит | Что пропускает |
|---|---|---|
gh search code / веб-поиск GitHub | Публичные копии файла в ваших репозиториях | Приватные репозитории, форки у чужих аккаунтов, историю коммитов |
| gitleaks | Секреты известных форматов в истории git и в любых папках | Пароли без узнаваемого формата: по данным Apiiro, нашёл 564 из 1 122 файлов |
| TruffleHog | Секреты известных форматов с проверкой, работают ли они | Те же пароли без формата: 643 из 1 122 файлов (Apiiro) |
Ручной grep | Ваши собственные шаблоны команд | Всё, о чём вы не подумали |
| GitHub secret scanning и push protection | Ключи партнёров, включая Anthropic API Key (с проверкой валидности) | Пароли баз данных и самописные токены |
Цифры Apiiro показательны: оба сканера вместе не заметили 215 файлов из 1 122. Поэтому ручной поиск в пункте 5 — не перестраховка, а обязательный шаг.
Ключ API или пароль уже утёк: что делать и в каком порядке
Если аудит что-то нашёл, порядок важнее скорости. Удалить файл недостаточно: история git, форки, клоны и образы Docker хранят копии. Документация GitHub прямо пишет, что первым шагом секрет нужно отозвать или сменить.
- Отзовите или смените секрет. Ключ Anthropic API: в Console на странице
platform.claude.com/settings/keysоткройте меню рядом с ключом и выберите «Delete API key». Пароль базы данных, токен GitHub, SSH-ключ — смените там, где они выданы. - Проверьте журналы использования. Посмотрите, не было ли запросов с этим ключом, которых вы не делали. Если ключ лежал в публичном репозитории, учтите, что Anthropic автоматически деактивирует найденные там ключи. Но такой ключ мог успеть поработать до деактивации, а пароль базы никто за вас не отключит.
- Уберите секрет из рабочих файлов: вычистите
settings.local.json, добавьте его в.gitignoreи выполнитеgit rm --cached, как в предыдущем разделе. - Решите, переписывать ли историю. Если секрет уже сменён, переписывание истории (например, через
git-filter-repo) по документации GitHub может быть не нужно: старое значение больше ничего не открывает. Переписывают, когда секрет нельзя сменить или в истории лежат персональные данные. - Найдите копии вне репозитория. Пересоберите образы Docker с новым
.dockerignoreи удалите старые теги. Проверьте форки: их владельцы ваши правки не получат.
Масштаб «старых» ключей виден по данным GitGuardian: из 31 088 найденных секретов 5 343 работали в момент обнаружения. Утечка, которой полгода, остаётся опасной, пока ключ не сменён.
Чек-лист безопасности Claude Code на 15 минут
Сжатая версия всей статьи — то, что стоит сделать сегодня. Базовые настройки (пункты 1–7) занимают около 15 минут; аудит и смена ключей (пункты 8–10) — дольше, в зависимости от числа репозиториев:
claude --version— не ниже 2.1.317; проверкаcc-plugin-privacyв/pluginsвключена.- Хук против своего e-mail в
~/.claude/settings.jsonпроверен на безобидной команде. .claude/settings.local.jsonоткрыт, правила с секретами удалены, секреты перенесены в переменные окружения.- В
~/.claude/settings.jsonесть deny на.env,.env.*, папки с ключами и~/.ssh;.claudeignoreудалён или перенесён. - Песочница включена,
sandbox.credentialsперечисляет ваши файлы и токены; заданаCLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1. disableBypassPermissionsModeстоит, если YOLO-режим вам не нужен.- В
.gitignoreкаждого репозитория есть.env*и.claude/settings.local.json, в.dockerignore—.claude/. gh search codeиgit logпо файлу пусты; gitleaks, TruffleHog и ручнойgrepпо репозиториям и~/.claude/projectsничего не нашли.- Secret scanning и push protection включены, gitleaks стоит в pre-commit.
- Всё, что когда-либо лежало в файле правил или в истории, сменено.
Что настройки Claude Code не закрывают: остаточные риски
Даже полный чек-лист не делает агента безопасным. Он убирает самые частые пути утечки и оставляет несколько рисков, которые надо держать в голове:
- Prompt injection. Агент читает недоверенный контент: страницы, issue, зависимости. Текст в нём может уговорить модель отправить данные наружу способом, который ни deny-правила, ни хук не предусмотрели. Это второй элемент триады — недоверенный контент. Убрать его нельзя, поэтому разрывают третий — канал наружу: изоляция и ограничение сети, а не правила разрешений.
- Обходы deny.
grep -r, скрипты и другой путь к бинарнику остаются, пока не включена песочница. Песочница по умолчанию выключена, а включённая читает всё, что вы не запретили. - Доверие к вендору. E-mail в контекст модели положила сама Anthropic, и пользователи узнали об этом из инцидента. Глава Claude Code признал на HN, что исторически инструмент не вычищает секреты, и пообещал поискать защиту. Поэтому хотя бы один слой проверки — сканер, хук, pre-commit — должен быть вашим, а не встроенным.
- Старые утечки. По GitGuardian, число утечек через этот файл упало на 92%: с пика в 12 535 в апреле 2026 года до 959 в октябре. Причину компания не знает. Это повод не паниковать, но не повод не проверять: уже утёкшие ключи от спада не перестают работать.
- Приватность кода. Код и диалоги уходят на серверы Anthropic, а транскрипты 30 дней лежат на диске открытым текстом. Условия обучения на ваших данных зависят от тарифа — они разобраны в материале о пяти периметрах.
Что устареет первым: статус удаления e-mail из контекста, номера версий и список того, что auto mode разрешает по умолчанию. Свежие данные — в changelog Claude Code и в issue #107757.
FAQ
Как отключить отправку e-mail в Claude Code?
Обновитесь до версии 2.1.317 или новее (claude update): в ней встроенная проверка cc-plugin-privacy спрашивает разрешения, прежде чем адрес уйдёт в сеть. Она включена по умолчанию, выключать её в /plugins не нужно. Проверка не ловит скрипты, которые Claude пишет сам, поэтому добавьте свой PreToolUse-хук и следите за changelog: полное удаление адреса из контекста на 9 ноября 2026 года ещё не вышло.
Что делать, если в settings.local.json уже есть пароль?
Сначала смените пароль или отзовите ключ — особенно если файл хоть раз попадал в коммит или образ Docker. Затем удалите правило из permissions.allow, перенесите секрет в переменную окружения и ссылайтесь на $VAR в командах. Добавьте файл в .gitignore репозитория и, если он отслеживается, выполните git rm --cached. История git после смены секрета уже не опасна для этого секрета.
Защищает ли .gitignore от утечки settings.local.json?
Да, если строка .claude/settings.local.json стоит в .gitignore самого репозитория и файл ещё не отслеживается. Глобальный git excludes, который пишет Claude Code, не спасает, если файл создан руками до первой записи, уже отслеживается git, добавлен через git add -f или папку скопировали целиком туда, где игнора нет. От Docker .gitignore не защищает: COPY . . берёт рабочее дерево, нужен ещё .dockerignore.
Обходит ли команда cat или grep deny-правило Read(./.env)?
cat, head, tail и sed правило блокирует: Claude Code распознаёт эти команды и сверяет их цели с Read-deny. А grep -r pattern ., запущенный из папки с файлом, и скрипт на Python или Node, который сам открывает файл, правило не останавливает — так написано в документации. Для полной блокировки на уровне ОС нужна песочница с sandbox.credentials.
Нужно ли переписывать историю git после утечки ключа?
Чаще всего нет, если ключ уже отозван или сменён: документация GitHub называет смену секрета первым шагом и допускает, что переписывать историю не понадобится. Старое значение в коммитах больше ничего не открывает. Историю чистят через git-filter-repo, когда секрет сменить нельзя или в коммитах лежат персональные данные, и тогда нужно учесть форки и клоны.
Достаточно ли auto mode, чтобы не следить за секретами?
Нет. По документации auto mode по умолчанию разрешает читать .env и отправлять учётные данные в соответствующий им API. Он блокирует пуш секретов в публичный репозиторий и печать живого ключа в файл, но сохранение команд с секретами в настройки в нём тоже возможно. Deny-правила, .gitignore и сканер нужны и в этом режиме.


