Назад к блогу
#claude code#вайбкодинг#безопасность

Как я научил Claude безопасно брать пароли и ключи с помощью мода

Мод secret-drop для Claude Code: ключ вводится в скрытое поле над чатом и сохраняется в .env или GitHub Secrets, а Claude видит только имя и длину. Как пользоваться и как его делал.

Артём Исламов8 мин чтения
Содержание

Когда Claude нужен API-ключ или пароль, у меня было два варианта, и оба так себе. Первый: вставить ключ прямо в чат. Быстро, но ключ навсегда остаётся в переписке. Второй: попросить Claude поднять локальную страничку, чтобы ввести ключ в браузере. Безопасно, но каждый раз это отдельная маленькая задача.

Недавно в Claude Code появились моды, и я сделал мод secret-drop. Теперь, когда Claude нужен ключ, прямо над полем ввода появляется скрытое поле. Я вставляю ключ, жму Enter, и мод сам кладёт его в .env или в секреты GitHub. Claude узнаёт только имя ключа и длину. Ниже расскажу, как этим пользоваться, как мы делали мод вместе с Claude (я не написал ни строчки кода) и где у этой защиты границы.

Почему ключ в чате это плохо

Ключи я даю Claude постоянно. Telegram-бот: токен от BotFather. Расшифровка голосовых: ключ OpenAI. Деплой: токен для GitHub Actions. Для вайбкодинга это обычная рутина.

Проблема в том, что всё написанное в чат становится частью разговора. Ключ остаётся в истории сессии на диске, уходит в модель с каждым следующим запросом и может всплыть там, где его не ждёшь: в логах, на скриншоте, в записи экрана. Я снимаю ролики, и засветить в кадре свой ключ OpenAI мне совсем не хочется. Подробнее о том, что вообще не стоит отправлять нейросетям, я писал в памятке по безопасности данных.

Поэтому я обычно просил: «подними локальную страницу, я введу ключ там». В ролике про Telegram-бота с оплатой я так и делал. Работает, но Claude каждый раз пишет мини-сервер, я переключаюсь в браузер, потом обратно. Хотелось, чтобы безопасный способ стал самым ленивым.

Моды: интерфейс Claude Code теперь можно допиливать

В начале октября в Claude Code появились моды. Это плагины на JavaScript или TypeScript, которые работают внутри самого Claude Code. Мод подписывается на события: Claude вызывает инструмент, вы отправляете сообщение, перерисовывается кусок интерфейса. И на каждое событие может ответить: нарисовать свою панель, добавить команду, остановить сообщение. С примерами я разбирал это в статье как сделать свой мод в Claude Code.

Многие первые моды, которые я видел, про красоту: анимации, статусы, украшения. Прикольно, но мне хотелось закрыть реальную боль. Ключи оказались идеальной задачей: здесь нужен свой кусок интерфейса прямо в чате, а скиллом или MCP-сервером его не нарисуешь.

Как работает secret-drop

Claude просит ключ сам

Мод даёт Claude новый инструмент request_secret и объясняет: ключи в чате не проси, вызывай инструмент. Выглядит это так. Я пишу «подключи бота к OpenAI», Claude доходит до места, где нужен ключ, и над полем ввода появляется плашка: какой ключ нужен и куда он сохранится.

Плашка над полем ввода: имя ключа, куда он сохранится, и оранжевая подсказка «Вставь ключ →». Здесь я открыл её сам командой /secret, когда ключ просит Claude, она выглядит так же.

Поле скрытое: вместо символов кружочки. Кнопка «Показать» нужна, если хочется проверить, что вставилось. Вставляете ключ, жмёте Enter. Если ключей несколько, плашка пройдёт по ним по очереди, любой можно пропустить.

Ключ вставлен, но в поле только кружочки. Ни в переписку, ни на экран он не попадает.

Дальше мод всё делает сам, без Claude:

  • В .env обновляет строку на месте, если такой ключ там уже был, или дописывает новую. Новый файл получает права 600, то есть читать его можете только вы.
  • Следит за git. Если .env лежит в репозитории и не попал в .gitignore, мод добавляет его туда. Если файл уже закоммичен, предупреждает.
  • В секреты GitHub Actions отправляет через gh secret set. Значение идёт через stdin, а не аргументом команды, поэтому его не видно в списке процессов.
Ключ сохранён: зелёная плашка показывает, куда он ушёл.

А Claude получает короткий отчёт:

[secret-drop] The user finished the secure input you requested.
Entered: OPENAI_API_KEY (51 chars).
✓ OPENAI_API_KEY → /Users/me/bot/.env
✓ added /.env to .gitignore

Имя, длина и куда сохранено. Самого ключа в разговоре нет. Дальше Claude работает с ним через окружение, как с любой переменной из .env.

Или открываете поле сами

Иногда ключ хочется положить заранее, не дожидаясь вопроса. Для этого есть команда /secret:

/secret OPENAI_API_KEY
/secret DEPLOY_TOKEN --github
/secret DEPLOY_TOKEN --github owner/repo
/secret DB_PASSWORD --env-file config/.env.local

Без флагов ключ уходит в .env в папке проекта. Флаг --github кладёт его ещё и в секреты GitHub Actions текущего репозитория, а если указать owner/repo, то другого. --env-file меняет файл. Можно перечислить несколько имён через пробел, плашка спросит их по очереди.

Страховка от привычки

Руки помнят Cmd+V прямо в чат. Поэтому мод проверяет каждое сообщение перед отправкой, и если видит в нём ключ, сообщение до Claude не доходит. Вместо него сразу открывается та же плашка, только ключ в ней уже подставлен точками, а имя мод угадал по формату, например ELEVENLABS_API_KEY. Имя можно поправить, Enter сохраняет ключ.

Ключ ElevenLabs в сообщении: мод его не отправил, а сразу открыл плашку с подставленным ключом и угаданным именем. Это версия для терминала, ключ на снимке тестовый.

А сообщение возвращается в поле ввода, и на месте ключа там стоит его имя с пометкой, куда он сохранён: ELEVENLABS_API_KEY (сохранён в .env в папке проекта). Отправляете, и Claude понимает, какую переменную брать. Если ключ сохранять не надо, есть кнопка «Не сохранять», и тогда Claude вообще ничего не узнает.

Мод узнаёт ключи OpenAI, Anthropic, ElevenLabs, GitHub, GitLab, AWS, Google, Stripe, Groq, xAI, Perplexity, Replicate, npm, Яндекса, Slack, Supabase, Hugging Face, токены Telegram-ботов и приватные ключи. А если в сообщении есть слова «ключ», «токен», «пароль» или их английские версии, он ловит и длинные строки из букв и цифр незнакомого формата.

Как мы делали мод вместе с Claude

Код я не писал вообще. Весь мод Claude собрал в одном диалоге, а я был заказчиком, которому вечно что-то не нравится: ставил задачу, смотрел, кидал скриншоты и говорил, что не так. По-моему, самое интересное тут не результат, а итерации.

Сайдбар переехал в плашку над полем ввода

Первую версию Claude сделал отдельной панелью справа, сбоку от чата. Логика понятная: такую панель проще всего сфокусировать. Но выглядело это как окно настроек, а ключ нужен прямо сейчас, посреди разговора. Я спросил: почему в сайдбаре? Можно же прямо над чатом, другие моды так делают. Claude переделал.

Вывод: агент часто выбирает решение, которое проще сделать, а не которым удобнее пользоваться. Если видели, как сделано у других, так и скажите.

«Бедно»

Вторая версия жила уже над полем, но выглядела как текст и пара кнопок. Я так и написал: бедно. Без подробностей, что именно не так.

Claude пошёл смотреть, как устроены моды, которые выглядят хорошо. Разобрал plan-progress с пиксельными прогресс-барами и понял: на десктопе красота рисуется через SVG. Скругления, иконки Lucide, шрифт Anthropic Sans, фирменный цвет Claude. По этому образцу он сделал карточку с пиксельной текстурой и бейджем-ключом.

Вывод: не бойтесь коротких оценок вроде «бедно». Агенту хватает этого сигнала, чтобы пойти искать референсы, а не двигать кнопки на пару пикселей.

«Покажи варианты»

Дальше упёрлись в поле ввода: хотелось растянуть его на всю ширину плашки, а оно не растягивалось. Вместо того чтобы пробовать вслепую по одному варианту за ход, Claude нарисовал четыре варианта обёртки, A, B, C и D, на одном экране. Я сделал один скриншот, и всё стало ясно: родное поле ввода на десктопе фиксированной ширины, как его ни оборачивай.

Раз поле не растянуть, дизайн построили вокруг него: тихая шапка с названием ключа и одна яркая оранжевая подсказка «Вставь ключ →», у которой стрелка покачивается в сторону поля. Глаз сразу понимает, куда вставлять.

Вывод: «покажи несколько вариантов сразу» экономит кучу кругов. Один скриншот с четырьмя вариантами заменил полчаса переписки.

Мод не может ждать человека

Технический нюанс, который Claude раскопал сам. У функции мода есть примерно 10 секунд своего времени, а человек ищет ключ в личном кабинете OpenAI минуту, а то и пять. Держать вызов инструмента открытым всё это время нельзя.

Поэтому инструмент сразу отвечает Claude «плашка открыта, жди», и ход заканчивается. Когда я ввёл ключ, мод сам отправляет Claude отчёт новым сообщением, и тот продолжает с того места, где остановился.

Тесты поймали то, чего я бы не увидел

У модов есть свои тесты: claude plugin test прогоняет события без живого Claude Code. Тесты нашли баг: в терминале шапка плашки просто пропадала. Терминал не рисует SVG, а проверка в коде думала, что рисует. Для терминала оставили текстовую версию плашки. Я сижу в десктопном приложении и сам бы этого никогда не заметил.

Публикация

В конце Claude выложил мод в публичный репозиторий на GitHub с маркетплейсом, чтобы он ставился одной командой, и написал README на английском и русском.

Если собрать всё в три правила работы с агентом: скриншоты вместо описаний, «покажи варианты» вместо «попробуй ещё раз» и честное «бедно», когда бедно.

Чего мод не делает

  • Защищает переписку, а не файл. Если разрешить Claude выполнить cat .env, ключ всё равно окажется в контексте. Мод просит Claude так не делать, но последнее слово за вами: на такую команду отвечайте «нет».
  • Поле на десктопе фиксированной ширины. Длинный ключ прокручивается внутри поля, это не баг.
  • Мод работает с вашими правами, как любой мод. Ставьте моды только от тех, кому доверяете. Мой код открыт, его можно прочитать до установки.

Как установить

Нужен Claude Code с модами, то есть версия 2.1.287 или новее. Если Claude Code ещё не стоит, начните со статьи как установить Claude Code. Дальше в терминальной сессии Claude Code выполните:

/plugin install secret-drop --marketplace aislam23/secret-drop

Согласитесь добавить маркетплейс и выберите установку для пользователя (user scope). После этого мод работает и в терминале, и во вкладке Code десктопного приложения Claude.

Код и подробный README: github.com/aislam23/secret-drop. Если чего-то не хватает или нашли баг, пишите в issues.

P.S. Если раньше вы вставляли ключи прямо в чат, ничего страшного, но перевыпустите их. Это пять минут в личном кабинете сервиса, а спать спокойнее.

Частые вопросы

Что такое secret-drop?

Это мод для Claude Code, который передаёт Claude API-ключи и пароли без вставки в чат. Когда Claude нужен ключ, над полем ввода появляется скрытое поле. Мод сам сохраняет значение в .env или в секреты GitHub Actions, а Claude узнаёт только имя ключа и длину.

Увидит ли Claude мой ключ?

Нет, значение не попадает в разговор: Claude получает отчёт вида «OPENAI_API_KEY (51 chars) → .env». Но если разрешить Claude прочитать файл командой cat .env, ключ окажется в контексте, поэтому на такие команды стоит отвечать отказом.

Куда мод сохраняет ключ?

По умолчанию в .env в папке проекта: строка обновляется на месте, новый файл получает права 600, а .env добавляется в .gitignore. С флагом --github ключ уходит ещё и в секреты GitHub Actions через gh secret set, другой файл задаётся флагом --env-file.

Что будет, если вставить ключ прямо в сообщение?

Сообщение не отправится. Мод узнаёт ключи OpenAI, Anthropic, ElevenLabs, GitHub, AWS, Google, Stripe, Supabase, токены Telegram-ботов и ещё десяток форматов, сразу открывает плашку с подставленным ключом и угаданным именем. Enter сохраняет ключ, а сообщение возвращается в поле ввода с именем ключа вместо самого ключа.

Работает ли secret-drop в приложении Claude?

Да. Мод ставится в терминальной сессии Claude Code командой /plugin install secret-drop --marketplace aislam23/secret-drop, и после установки для пользователя работает и во вкладке Code десктопного приложения.

Сколько стоит мод?

Нисколько, код открыт на GitHub под лицензией MIT. Нужен только сам Claude Code версии 2.1.287 или новее.