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

Цель

Передать коллеге пароль так, чтобы его можно было прочитать только один раз, в течение ограниченного времени, и чтобы получатель мог убедиться, что токен не был подменён или использован до него.

Предварительные требования

Для выполнения примера нужны:

  • Отправитель имеет токен Stronghold с правами на чтение передаваемого секрета или на sys/wrapping/wrap.
  • Получателю доступен адрес Stronghold. Входить в Stronghold получателю не нужно: для распаковки достаточно самого токена обёртывания.
  • Отдельный канал связи для передачи токена (мессенджер, почта).

Шаг 1. Оберните секрет

Выберите один из вариантов.

  • Секрет уже хранится в KV. Прочитайте его с параметром -wrap-ttl:

    d8 stronghold kv get -wrap-ttl=1h -mount=secret handover/db-admin
  • Произвольные данные. Оберните их через sys/wrapping/wrap, ничего не сохраняя в KV:

    d8 stronghold write -wrap-ttl=1h sys/wrapping/wrap username=db-admin password='T3mp-P@ss'

Ответ содержит поля wrapping_token, wrapping_token_ttl, wrapping_token_creation_time и wrapping_token_creation_path. Запомните creation_path — получатель сверит его.

Выбирайте -wrap-ttl минимально достаточным: чем короче срок, тем меньше окно для перехвата.

Шаг 2. Передайте токен

Передайте получателю токен и путь создания по разным каналам:

  1. Отправьте получателю wrapping_token.
  2. Отдельно (например, голосом) сообщите ожидаемый путь создания: secret/data/handover/db-admin или sys/wrapping/wrap.

Шаг 3. Проверьте токен (получатель)

Перед распаковкой проверьте свойства токена. Эта операция не расходует токен и не требует аутентификации:

d8 stronghold write sys/wrapping/lookup token=<WRAPPING_TOKEN>

<WRAPPING_TOKEN> — токен обёртывания, полученный от отправителя.

Убедитесь, что:

  • токен существует и не истёк;
  • creation_path совпадает с сообщённым отправителем;
  • creation_time соответствует времени отправки.

Если токен не найден или путь не совпадает, не распаковывайте его и сообщите в службу безопасности: токен мог быть перехвачен или подменён.

Шаг 4. Распакуйте секрет (получатель)

Распакуйте секрет с помощью токена обёртывания:

d8 stronghold unwrap <WRAPPING_TOKEN>

Команда возвращает исходный ответ. После этого токен становится недействительным.

Проверка

Проверьте результат:

  1. Повторите d8 stronghold unwrap <WRAPPING_TOKEN> — команда должна вернуть ошибку: токен одноразовый.
  2. Отправитель проверяет, что токен использован: sys/wrapping/lookup для этого токена возвращает ошибку.
  3. При включённом аудите найдите в журнале запрос sys/wrapping/unwrap и убедитесь, что он пришёл от ожидаемого получателя.

Обязательное обёртывание для директории передачи

Чтобы секреты из директории handover/ нельзя было прочитать без обёртывания, задайте в политике, по которой их читают, min_wrapping_ttl и max_wrapping_ttl:

d8 stronghold policy write handover-readers - <<'POLICY'
path "secret/data/handover/*" {
  capabilities = ["read"]
  min_wrapping_ttl = "1s"
  max_wrapping_ttl = "24h"
}
POLICY

Запись в директорию выдайте отдельной политикой без этих параметров.

Подробнее — в разделе «Требуемые TTL для обёртывания ответа».

Очистка

Удалите объекты, созданные в примере:

  1. Удалите исходный секрет, если он больше не нужен:

    d8 stronghold kv metadata delete -mount=secret handover/db-admin
  2. Если получатель не распаковал токен, а передача отменена, отзовите токен, чтобы им нельзя было воспользоваться до истечения TTL:

    d8 stronghold token revoke <WRAPPING_TOKEN>
  3. Попросите получателя сменить временный пароль после первого входа.

Дополнительные ресурсы