Перейти к основному содержимому

Сохранение доступа после завершения запуска: почему учётные данные агента живут дольше своей задачи

Учётные данные агента часто остаются действительными после завершения задачи. Реальный разрыв — между завершением запуска и истечением срока действия учётных данных, а не между наймом и увольнением.

Крупный план серверной стойки с мигающими индикаторами состояния и сетевыми кабелями, символизирующий инфраструктуру жизненного цикла учётных данных.

Наблюдаемая закономерность

Агентные системы всё чаще развёртываются для выполнения задач, требующих доступа к корпоративным данным: чтения репозиториев, запросов к базам данных, вызовов внутренних API. В операционных обзорах регулярно отмечается, что после завершения запуска агента его учётные данные остаются действительными. Агент больше не выполняется, но токен или ключ, который он использовал, по-прежнему предоставляет доступ. Это не проблема найма или отзыва доступа. Разрыв — между завершением задачи и истечением срока действия учётных данных.

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

Почему TTL — неправильный примитив

Фиксированное время жизни — это догадка о том, сколько займёт задача. Запуски агентов неравномерны: они могут завершиться за секунды или приостановиться на минуты в ожидании ограничения скорости, одобрения человека или внешнего события. TTL, достаточно короткий, чтобы быть безопасным для быстрого запроса, истечёт в середине законной длительной задачи. TTL, достаточно длинный, чтобы покрыть худший случай, оставляет широкое окно ненужного доступа.

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

Более глубокая проблема в том, что TTL измеряют время, а не полномочия. Они отвечают на вопрос «как долго?», но не «для чего?» или «под чьим контролем?». Агент, завершающий задачу за десять секунд, и агент, работающий десять часов, получают один и тот же класс учётных данных, только с разными метками времени истечения.

Close-up of a cactus with sharp thorns against a blurred green background

Привязка полномочий к запуску

Более надёжная модель привязывает учётные данные к идентификатору запуска и объявленной задаче. Вместо выдачи токена с фиксированным сроком действия оркестратор выдаёт учётные данные, действительные только пока запуск активен и только для операций, объявленных в спецификации задачи. Учётные данные — это не bearer-токен, который можно использовать где угодно; это capability, ограниченная конкретным запуском и конкретным набором действий.

Оркестратор как орган отзыва

Оркестратор, запускающий выполнение, должен также быть органом, способным отозвать учётные данные. Когда запуск завершается — по завершении, сбою или отмене — оркестратор помечает запуск как неактивный. Любые учётные данные, предъявленные с этим идентификатором запуска, отклоняются. Это инвертирует поведение по умолчанию: вместо опоры на истечение срока система опирается на живость. Нет активного запуска — нет действительных учётных данных.

Возобновление как новое событие авторизации

Когда агент возобновляется с чекпоинта, он начинает новый контекст выполнения. Оркестратор должен рассматривать это как новое событие авторизации: переоценить задачу, выдать новые учётные данные, ограниченные возобновлённым запуском, и потребовать те же проверки политики, что и для исходного запуска. Это не позволяет чекпоинту стать чёрным ходом для бессрочного доступа. Компромисс — дополнительная задержка и сложность: каждое возобновление влечёт цикл авторизации, и оркестратор должен хранить состояние о том, какие запуски активны. Для высокочастотных короткоживущих агентов эти накладные расходы могут быть приемлемы; для конвейеров, чувствительных к задержке, может потребоваться кэширование или предварительная авторизация для известных шаблонов задач.

Конкретный механизм: токены с областью запуска

Практическая реализация использует подписанный токен, который включает идентификатор запуска, область задачи и подпись оркестратора. Токен предъявляется точке применения политики (PEP), которая проверяет две вещи: подпись действительна, и идентификатор запуска помечен как активный в хранилище состояния оркестратора. PEP не полагается только на срок действия токена. Если оркестратор пометил запуск как завершённый, токен отклоняется, даже если его срок действия ещё не истёк. Этот механизм требует общего хранилища состояния между оркестратором и PEP, а также пути отзыва, достаточно быстрого, чтобы иметь значение. Компромисс — зависимость от доступности оркестратора: если хранилище состояния недоступно, PEP должен решить, открываться или закрываться при сбое. Закрытие при сбое безопаснее,Panoramic view of wind turbines in a grassy field under a clear blue sky

Обнаружение

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

Второй показатель — разрыв между последним вызовом инструмента и истечением срока действия учётных данных. В здоровой системе этот разрыв должен быть близок к нулю для завершённых запусков: учётные данные должны становиться недействительными, как только запуск завершается. Устойчивый разрыв указывает на то, что учётные данные живут дольше своих запусков — будь то через продление, кэширование или неспособность отозвать. Отслеживание этого разрыва во времени выявляет регрессии в пути отзыва.

Третий сигнал — частота событий возобновления, не запускающих повторную авторизацию. Если чекпоинты используются для продления доступа без нового события авторизации, это нарушение политики, которое должно быть видно в журнале аудита.

Операционная реальность

Внедрение учётных данных с областью запуска и отзыва на основе оркестратора не бесплатно. Оно требует изменений в том, как агенты запрашивают доступ, как оркестратор отслеживает состояние запусков и как точки применения политики проверяют учётные данные. Оно вводит зависимость от живости оркестратора и потенциальное узкое место в хранилище состояния. Для систем, уже имеющих центральный оркестратор с надёжным управлением состоянием, изменение инкрементально. Для систем, где агенты порождают суб-агентов или работают через несколько оркестраторов, синхронизация состояния усложняется.

Альтернатива — опора на TTL и периодические проверки — проще в реализации, но оставляет структурный разрыв. Разрыв не между наймом и увольнением; он между завершением задачи и истечением срока действия учётных данных. Закрытие этого разрыва требует отношения к учётным данным как к capability, привязанным к запуску, а не как к секретам с таймером.

ПоделитьсяXLinkedInПостоянная ссылка5 мин чтения

Связанное чтение

На какие вопросы это отвечает

Why do agent credentials outlive their task?

Credentials are often issued with fixed TTLs or inherited from static service accounts. The credential's expiry is not tied to the run's termination, so it remains valid after the agent stops executing.

What is the alternative to TTL-based expiry for agent credentials?

Bind credentials to a run identifier and declared task scope. The orchestrator marks the run active or inactive, and policy enforcement points reject credentials for inactive runs, regardless of expiry.

How should resume-from-checkpoint be handled?

Treat resume as a new authorisation event: re-evaluate the task, re-issue a run-scoped credential, and require the same policy checks as the original run.

What should be monitored to detect credentials outliving their runs?

Audit for credential usage after the issuing run has terminated, track the gap between last tool call and credential expiry, and monitor resume events that do not trigger re-authorisation.