Безопасность облачной работы держится на трёх вопросах: где живут данные, как долго и куда агент может обратиться. Виртуальные машины изолированы, простаивающие перерабатываются, а доступ в интернет определяется политикой окружения. Режимов сети три: разрешить всё, набор по умолчанию плюс список исключений и только список исключений. Окружение может наследовать командную или пользовательскую политику, дополнять список или иметь собственный режим, а на корпоративном уровне это может быть закреплено жёстко.
Наивная модель - считать, что изоляция машины и есть безопасность. Она закрывает один класс рисков: агент не дотянется до чужих данных на соседней машине. Но она ничего не говорит о том, что агент может отправить наружу через разрешённый домен и что он прочитает у себя внутри. Именно эти две вещи чаще всего и составляют реальный риск автономной работы, потому что обе выглядят как обычная работа и не оставляют следа, похожего на инцидент.
Полезно один раз свести жизненный цикл данных в таблицу. Ниже такая карта: рабочая машина изолирована и перерабатывается при простое; состояние диска сборок и снимков переиспользуется и истекает после длительного бездействия; разговор хранится и удаляется вместе с агентом, а корпоративная политика может сузить окно; секреты живут до удаления, а сессионные переменные уходят вместе с агентом; артефакты привязаны к агенту; токен системы контроля версий определяется подключённым провайдером и правами учётной записи.
| Данные | Жизненный цикл |
|---|---|
| Рабочая машина | Изолирована; простаивающая перерабатывается |
| Состояние диска сборок и снимков | Переиспользуется; истекает после длительного бездействия |
| Разговор | Хранится и удаляется вместе с агентом; корпоративная политика может сузить окно |
| Секреты | Хранятся до удаления; сессионные переменные уходят вместе с агентом |
| Артефакты | Привязаны к агенту и доступны через интерфейс и API |
| Токен системы контроля версий | Определяется провайдером и правами учётной записи |
Последняя строка этой таблицы важнее остальных. Права агента в репозитории - это не его собственные права, а права той учётной записи, под которой он подключён. Личный токен даёт агенту всё, что можете вы, включая репозитории, к задаче отношения не имеющие; служебная учётная запись с узкой областью даёт ровно необходимое. Разница видна только в момент инцидента, поэтому решают её заранее.
Передача переменных окружения на запуск - удобный механизм со своими ограничениями: значения шифруются при хранении, число записей и длина ограничены, а имена с зарезервированным префиксом не принимаются. Важная эксплуатационная деталь: функция может быть в стадии постепенной раскатки, и в отдельных случаях значения молча не применяются. Отсюда практика - на первом же боевом прогоне проверить, что переменная действительно видна в оболочке, а не полагаться на факт отправки.
Главное предупреждение главы касается списков разрешённых адресов. Они управляют тем, куда можно обратиться, но не тем, что оттуда придёт. Разрешённый домен может отдавать пользовательское или скомпрометированное содержимое, и оно попадёт в контекст агента как обычные данные. Поэтому сетевую политику сочетают с учётными данными узкой области, подтверждениями инструментов, обработчиками событий и проверкой того, что агент получил.
Стоит развернуть это на конкретном примере, потому что он не выдуманный. Трекер задач - домен, который вы почти наверняка разрешите: без него агенту не прочитать задание. Задачу в трекере создаёт кто угодно с доступом, а её текст попадает в контекст как обычное описание работы. Достаточно вложить туда указание, выглядящее как часть требований, - и агент выполнит его наравне с настоящим заданием, не нарушив ни одного сетевого правила. То же верно для комментариев в пул-реквестах, страниц документации и ответов сторонних сервисов. Останавливает такую попытку не список адресов, а то, что стоит после него: узкие права учётной записи, подтверждение действий, обработчики и чтение результата человеком.
У самого жёсткого режима есть цена, из-за которой его чаще всего и отменяют. Режим только по списку ломает обычную работу: установка зависимостей, получение образов, обращение к внутренним сервисам - всё требует явного разрешения, и первые дни уходят на расширение списка по мере падений. Это терпимо, если список ведут осознанно, и превращается в фикцию, если его расширяют каждым падением, пока в нём не окажется полсети. Различить два исхода легко по одному признаку: в здоровом варианте список растёт и время от времени сокращается, в фиктивном - только растёт, и никто не помнит, зачем в нём половина строк.
Инженерный вывод простой: облачная безопасность - это композиция, а не переключатель. Изоляция машины, политика сети, хранение секретов, срок жизни данных и права учётной записи закрывают разные классы рисков, и ни один из них не покрывает остальные. Разворачивают их вместе, а проверяют по отдельности.
Типичные провалы предсказуемы. Считать изоляцию машины достаточной защитой. Подключить облако личным токеном вместо служебной учётной записи. Полагаться на сессионные переменные, не проверив их наличие в первом прогоне. Расширять список разрешённых адресов каждым падением, не сокращая его никогда. И принимать содержимое разрешённого домена за доверенное только потому, что домен в списке.