← Все статьи

ИИ-агент в моей эксплуатации: ограничители, которые делают его безопасным

Большую часть эксплуатации я веду с ИИ-агентом в терминале: kubectl, логи, манифесты, git, облачные API. Скорость — простая часть. Вот правила, которые делают это безопасным, и ошибки, которые они поймали.

Последние месяцы большая часть моей эксплуатации — и в домашней лаборатории, и на работе — идёт через ИИ-агента в терминале (Claude Code). Не чат-бот, который отвечает на вопросы, а агент, который запускает kubectl, читает логи, правит манифесты, пушит в git и вызывает облачные API.

Скорость — простая часть. Агент с шеллом и доступами — ещё и самый быстрый способ сломать прод, который у меня когда-либо был. Поэтому интересный вопрос не «насколько быстрее», а «что делает это безопасным». Ниже — устройство, которое на него отвечает.

Репозиторий — это память

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

  • методология: как ведётся диагностика, в каком порядке и чего не делаем никогда;
  • runbook’и по симптомам: «под в CrashLoopBackOff», «апгрейд падает с another operation in progress», «сертификат истёк за прокси»;
  • карта каждой среды: топология, workload’ы, сеть, хранилище, кто чем владеет, и датированный снимок состояния;
  • журнал решений по каждой среде.

Знания копятся в git, а не в окне чата. Когда начинается инцидент, среда уже описана, и агент читает её до того, как что-то трогать.

Правило 1: сначала только чтение

Каждый шаг идёт по схеме гипотеза → read-only проверка → вывод, и только потом изменение. Диагностика движется от лёгкого тира к тяжёлому: сначала get, describe, события и логи, потом PromQL для трендов и сатурации, потом вопрос, от которого зависит, кто чинит: это приложение или платформа?

Симптом — не причина. «Иногда работает» или «само починилось» — удача с таймингом, а не фикс; агент продолжает искать.

Правило 2: у каждого изменения откат виден до запуска

Агенту можно менять, но никогда молча. Перед мутацией я вижу точную команду, куда сделан бэкап, и команду, которая всё вернёт. Изменения с широким blast radius — drain ноды, удаление namespace, scale в ноль — сначала получают явное предупреждение.

В домашней лаборатории нет клиентов и SLA, поэтому там агенту разрешены big-bang изменения. В этом и смысл лабы: разведка боем до того, как то же изменение попадёт в среду, где нужны окно и согласование.

Правило 3: короткоживущие узкие доступы

Долгоживущие широкие токены — вот где агент становится опасным. Реальный пример за сегодня: включение защиты от ботов на двух сайтах в Cloudflare.

Агент не брал ключ на весь аккаунт. Он выпустил токен на одну зону, только с правами на управление ботами, живущий один час, сделал изменение и отозвал токен в блоке finally. Первая попытка упала: для чтения настройки нужно было ещё право на чтение зоны. Токен всё равно отозвался — отзыв не зависел от успеха. Текущее состояние сохранили до изменения, вместе с откатом в одну строку.

Секреты не попадают ни во что, что уходит с машины: никаких токенов, внутренних хостов и адресов в веб-поиске, а доступы хранятся зашифрованными в git, а не раскиданы по чатам.

Правило 4: кластер знает не всё

Инфраструктура у меня гибридная: часть сервисов в Kubernetes, часть на обычных VM. Кластер знает только про себя, поэтому агенту запрещено делать вывод «сервис мёртв» по данным кластера. Ноль endpoints или отсутствующий Deployment — факт про кластер. Проверка — DNS против адресов ingress и балансировщика, а потом реальный запрос к сервису.

Соседнее правило появилось после случая «чуть не»: у всех kubeconfig-контекстов одинаковое имя, поэтому агент опознаёт кластер по адресу API и нодам, а не по контексту.

Правило 5: решения записываются в момент принятия

Значимое решение получает датированную запись в момент принятия: что выбрали, какие были альтернативы, почему, чем платим и при каком условии пересматриваем. Через месяц вопрос всегда звучит «почему тогда выбрали X», и ответ должен быть в журнале, а не в истории чата.

Где агент ошибался

Ошибается, и именно ограничители это ловят. Три примера за один день:

  • Неверная дата из-за сломанной кодировки. Агент прочитал страницу в старой кириллической кодировке, и первая сводка назвала не тот месяц публикации. Повторная загрузка с перекодировкой показала настоящую дату в структурированных данных.
  • Уверенная рекомендация, которая оказалась неверной. Агент посоветовал удалить навык в LinkedIn как мусор — а это был локализованный «Site Reliability Engineering». Он исправился, как только увидел полный список.
  • План, который не мог сработать. Агент собирался разрешить внедрённый скрипт в Content Security Policy по его хешу. Проверка трёх ответов показала, что хеш меняется на каждый запрос, и от идеи отказались, вместо того чтобы ослабить политику.

Ни одна из этих ошибок не поймана потому, что модель умная. Их поймали потому, что каждое утверждение сверяется с реальной системой раньше, чем от него что-то начинает зависеть. Доверие даёт проверка, а не модель.

Второе мнение от разных моделей

Для рискованных изменений и непонятных инцидентов у меня есть небольшой «совет»: несколько моделей от разных вендоров, у каждой своя оптика (платформа, приложение, сеть, скептик). Они спорят, допрашивают друг друга и голосуют, пока никто не блокирует, а на выходе — письменный отчёт с сохранённым особым мнением. Это не голосование, которому я подчиняюсь, а дешёвый способ найти вопрос, который я не задал.

Что это меняет, а что нет

Агент — усилитель, а не замена. День, который раньше был одной задачей, теперь цепочка: релиз сайта через CI и Argo CD, разбор аналитики, настройка безопасности, публикация. Но каждое решение по-прежнему моё, и на проде правила окон и согласований не меняются от того, что руки стали быстрее.

Выводы

  • Дайте агенту письменную методологию и карты сред в git; не полагайтесь ни на его память, ни на свою.
  • Сначала только чтение, и никаких изменений без видимого отката.
  • Выпускайте узкие короткоживущие доступы под задачу и отзывайте их в finally.
  • Не позволяйте агенту делать выводы о сервисе только по кластеру.
  • Записывайте решения в момент принятия.
  • Ждите ошибок и проектируйте их поимку: проверка и есть ограничитель.