Секрет - ключ, токен, пароль - в агентной среде опасен вдвойне: его видит не только человек, но и модель, которая читает файлы, вывод терминала и историю сессии. В отличие от коллеги, модель может воспроизвести секрет дословно в ответе, в коде или в коммите, не осознавая, что делает. Вопрос не в том, нужны ли секреты, а в том, где они лежат и кто до них дотянется, - и ответ на него составляет половину безопасности.
Наивный ход - положить токен туда, где удобно агенту: вставить в промпт, оставить в .env внутри репозитория, показать в выводе команды. Это кажется практичным, потому что агент сразу видит секрет и использует его без лишних шагов, а вы экономите одно движение.
Ломается это на том, что всё видимое агенту может уйти дальше, чем вы думали. Секрет в промпте живёт в истории сессии и может уехать к провайдеру модели. .env под контролем Git уезжает в удалённый репозиторий, в каждый клон и в reflog, откуда его не вычистить одним коммитом. Токен в выводе терминала попадает в контекст сессии и способен всплыть в следующем ответе агента. Удобство доступа оборачивается неконтролируемым распространением по слоям, каждый из которых вы больше не держите под рукой. И чем дольше секрет живёт в таком слое, тем больше копий его успевает разойтись по клонам, логам и кэшам.
Профессиональный механизм - это несколько правил, а не одно. Держите cloud-credentials в Cognition Secrets Manager или одобренном secret store; локальные токены передавайте через окружение или локальный конфиг, не через Git; закройте .env*, ключевой материал и пути с credentials правилом deny; не прикладывайте вывод терминала с токеном; после утечки делайте revoke и rotate, а не просто удаляйте сообщение.
Минимальный deny-набор в permissions выглядит так, как в блоке ниже. Он закрывает и чтение, и запись .env, файлов .pem и ключей SSH и AWS - две операции, а не одну, потому что запретить чтение мало, если агент способен переписать файл. Это не просьба, а граница, которую агент не переступит независимо от того, что ему написали в промпте.
Почему deny, а не инструкция. Инструкция не читать .env - это влияние на модель; deny - это enforcement средствами системы. Первое можно обойти инъекцией или галлюцинацией, второе не зависит от того, какой текст агент прочитал. Отсюда естественная иерархия доверия: Secrets Manager надёжнее переменной окружения, переменная - надёжнее строки в промпте, а deny стоит поверх всего как последний рубеж.
Важная тонкость - проверить, к чему glob вообще применяется. Относительный glob действует под workspace, домашний путь - отдельно. Sandbox, прямые инструменты агента и remote-окружение могут иметь разные filesystem-границы, и один и тот же deny в них ведёт себя по-разному. Правило Read(.env*), закрывающее корень workspace, ничего не скажет про ~/.aws или про .env во вложенном каталоге, если его туда явно не распространить, - и именно в этих щелях всё и утекает.
Цена промаха - не удалённое сообщение, а действующий ключ на воле. К моменту, когда вы заметили утечку, ключ мог уже быть использован, поэтому revoke и rotate - единственная честная реакция: пока ключ не отозван, он рабочий, а удаление строки из чата лишь прячет симптом. Обращаться с утёкшим секретом как с исправленной опечаткой значит оставить дверь открытой и повесить на неё табличку закрыто. Скорость реакции тут важнее аккуратности: лучше отозвать лишнее, чем оставить рабочим то, что уже видели чужие глаза.
Когда какой инструмент оправдан. Secrets Manager - для всего, что переживает сессию и делится в команде. Окружение - для локального и одноразового. Deny на путях с секретами - всегда, как базовая гигиена, независимо от доверия к конкретной задаче: он ничего не стоит в настройке и закрывает целый класс случайностей, которые иначе всплывают в самый неудобный момент.
Проверять защиту стоит поведением, а не памятью. Попросите агента прочитать .env и убедитесь, что срабатывает deny с указанием слоя. Проверьте, что glob покрывает и workspace, и домашний путь, и remote-слой, если вы там работаете. Просмотрите историю сессии и терминала на предмет случайно вставленных токенов. Проверка - это попытка достать секрет и отказ системы, а не уверенность, что правило где-то написано.
Типичный провал - прятать утечку удалением сообщения вместо rotate; писать инструкцию вместо deny; поставить deny под workspace и забыть про домашний путь и remote; приложить удобный вывод терминала с токеном. Признак один: секрет защищён словами, а не границей. Вынесите защиту в Secrets Manager и permission deny - и большинство утечек станут невозможными в принципе, а не отслеженными постфактум.
{
"permissions": {
"deny": [
"Read(.env*)",
"Write(.env*)",
"Read(**/*.pem)",
"Write(**/*.pem)",
"Read(~/.ssh/**)",
"Read(~/.aws/**)"
]
}
}