Токены: TTL, renew, revoke, иерархия

Токен — это пропуск с ограниченным сроком; разбираем, как он рождается, продлевается, отзывается и наследуется.

Токен — выданный после логина пропуск с привязанными политиками и сроком жизни (TTL); по нему Vault авторизует все последующие запросы.

Токены — основной механизм доступа. Хороший токен короткоживущий: даже если он утечёт, окно эксплуатации ограничено. Управление сроком, продлением и отзывом — повседневная операционная работа с Vault.

Создание токена

vault token create \
  -policy=myapp-read \
  -ttl=1h \
  -explicit-max-ttl=4h

TTL и max_TTL

TTL — текущий срок жизни токена. max_TTL — потолок, выше которого продление невозможно. Токен можно продлевать, пока не упрётся в max_TTL, после чего он обязательно истечёт. Это гарантирует, что ни один токен не живёт вечно.

создан (TTL=1h)
  --renew--> +1h
  --renew--> +1h
  ...
  упёрся в max_TTL=4h --> истекает, продлить нельзя

Продление: renew

vault token renew                  # продлить текущий токен
vault token renew -increment=2h    # продлить на 2 часа (в рамках max_ttl)

Долгоживущие сервисы периодически дёргают renew, удерживая токен активным. Если сервис умер и перестал продлевать — токен сам истечёт, и доступ закроется.

Отзыв: revoke

Отзыв немедленно делает токен недействительным, не дожидаясь TTL:

vault token revoke <токен>

Это инструмент реагирования на инцидент: подозреваете утечку — отзываете токен, и доступ пропадает мгновенно.

Иерархия токенов

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

root / admin
  |
  +-- token A (сервис деплоя)
  |     +-- token A1 (под-задача)
  |     +-- token A2
  +-- token B (другой сервис)

revoke A  -->  A, A1, A2 отозваны разом

Это удобно: достаточно отозвать корень ветки, чтобы погасить весь выданный под ней доступ.

Как работает под капотом

Vault ведёт учёт токенов и их аренд (leases) в storage. У каждого токена есть accessor — публичный идентификатор, по которому можно отозвать или посмотреть токен, не зная самого секретного значения. Истечение и отзыв запускают тот же механизм, что и для динамических секретов: связанные аренды отзываются, временные креды удаляются. Поэтому отзыв токена может за собой подтянуть отзыв выданных под ним динамических секретов.

Orphan-токены

Иногда нужен токен без родителя — чтобы его не убил каскадный отзыв (например, для самостоятельного демона). Такой orphan-токен создаётся явно и живёт независимо, но за ним нужно следить отдельно.

Частые ошибки

  • Длинный TTL «чтобы не возиться» — большое окно эксплуатации при утечке.
  • Полагаться только на TTL при инциденте — нужен немедленный revoke.
  • Плодить orphan-токены без учёта — они переживут отзыв родителя.
  • Не продлевать токен сервиса и удивляться внезапной потере доступа после истечения TTL.

Итог

  • Токен живёт ограниченное время: TTL продлевается renew до потолка max_TTL.
  • revoke немедленно гасит токен; это инструмент реагирования на инцидент.
  • Токены образуют дерево с каскадным отзывом; orphan-токены живут вне дерева.
Проверьте себя
1. Что гарантирует max_TTL токена?
AЧто токен никогда не истечёт
BЧто токен нельзя продлить выше этого потолка и он обязательно истечёт
CМинимальный срок жизни
DЧто токен станет orphan
2. Что происходит с дочерними токенами при отзыве родителя?
AНичего
BОни тоже отзываются каскадно
CОни становятся root
DИх TTL обнуляется до 0 без отзыва
3. Чем revoke полезен по сравнению с ожиданием истечения TTL?
AОн продлевает токен
BОн немедленно делает токен недействительным — это реакция на инцидент
CОн создаёт orphan-токен
DОн меняет политики