Перейти к основному содержимому
Версия: 7.0

Восстановление при инциденте

Вариант для Расширенной редакции

Этот раздел описывает автоматизированную церемонию через сервисный аккаунт. Для упрощённого варианта на обычном пользователе процедура восстановления другая — см. раздел «Восстановление при инциденте» страницы «Упрощённый вариант без сервисных аккаунтов».

Когда это нужно

Единственный администратор нужного типа сейфа недоступен — уволен, потерял мастер-ключ, учётная запись скомпрометирована. Организация не может добавить нового администратора обычным способом, потому что для этого нужен доступ, которого уже ни у кого нет. Если покрытие сейфов настроено заранее, восстановить доступ можно кворумом держателей долей.

Шаг 1. Держатели расшифровывают свои доли

Если доли при настройке были зашифрованы под RSA-ключ каждого держателя, каждый расшифровывает свою долю локально, на своей машине — приватный ключ никуда не передаётся:

# Alice у себя
passwork-cli rsa decrypt --privkey holders/alice/alice.priv.pem --in share-alice.enc.b64 --out alice-share.b64

# Bob у себя
passwork-cli rsa decrypt --privkey holders/bob/bob.priv.pem --in share-bob.enc.b64 --out bob-share.b64

# Carol у себя
passwork-cli rsa decrypt --privkey holders/carol/carol.priv.pem --in share-carol.enc.b64 --out carol-share.b64

Если доли изначально хранились в открытом виде (без --holder-pubkey-dir на этапе настройки), этот шаг не нужен — держатели передают файлы долей как есть.

Шаг 2. Держатели передают расшифрованные доли оператору

Оператору нужен только один файл-кворум с M долями — по одной доле на строку:

printf '%s\n' "$(cat alice-share.b64)" "$(cat bob-share.b64)" "$(cat carol-share.b64)" > quorum.txt
Одна доля — одна строка

Склейка файлов через cat share1 share2 > quorum.txt без перевода строки между ними даёт одну длинную строку вместо трёх — и shamir recover/grant-admin завершится с кодом 6 («доли несовместимы»). Используйте printf из примера выше или соберите список долей в коде.

Шаг 3. Восстановление доступа

Для этой команды нужен только API-токен сервисного аккаунта — токен и мастер-ключ оператора настройки здесь не участвуют:

passwork-cli recovery grant-admin \
--host "$PASSWORK_HOST" \
--token-file /secure/recovery-sa.token \
--vault "$VAULT_ID" \
--to-user "$NEW_ADMIN_USER_ID" \
--shares-file quorum.txt
ФлагОбязателенОписание
--vaultдаидентификатор сейфа, к которому нужно выдать доступ
--to-userдаидентификатор пользователя, которому выдаются права администратора
--shares-fileдафайл с M расшифрованными долями, по одной на строку
--token-fileнет*файл с API-токеном сервисного аккаунта (можно задать PASSWORK_SA_TOKEN_FILE)
--hostнетпо умолчанию из PASSWORK_HOST
--audit-file, --syslogнетлокальный журнал операции — подробнее в разделе про аудит

* Токен нужен через --token-file, переменную PASSWORK_SA_TOKEN_FILE (путь к файлу) или PASSWORK_SA_TOKEN (сам токен в переменной окружения). Флаг --token с токеном как значением тоже работает, но устарел: значение попадает в список процессов и историю оболочки — используйте его только для разовой отладки.

Что происходит внутри

  1. Из долей в --shares-file реконструируется мастер-ключ сервисного аккаунта (shamir recover).
  2. Сервисный аккаунт проходит аутентификацию по своему API-токену, реконструированный ключ подтверждает владение аккаунтом.
  3. Ключ сейфа расшифровывается приватным RSA-ключом сервисного аккаунта и заново шифруется публичным ключом целевого пользователя.
  4. Выполняется запрос на выдачу доступа уровня Администратор целевому пользователю в указанном сейфе.
  5. Операция связывается с соответствующей записью в продуктовом журнале История действий (Activity Log), если он доступен.
  6. Локально дописывается запись в журнал восстановления — см. Аудит и коды завершения.

Мастер-ключ сервисного аккаунта, доли и токен очищаются из памяти процесса сразу после выполнения операции.

Что не меняется

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

Идемпотентность

Повторный запуск с теми же параметрами не приводит к ошибке: если целевой пользователь уже администратор сейфа, команда завершится успешно как no-op, но в оба журнала — продуктовый и локальный — попадёт ещё одна запись.

Программный доступ (Python)

from passwork_client import PassworkClient

with open("quorum.txt") as f:
shares = [line.strip() for line in f if line.strip()]

client = PassworkClient(host="https://passwork.example.com")
result = client.grant_admin(
vault_id="<идентификатор-сейфа>",
target_user_id="<идентификатор-нового-администратора>",
shares=shares,
sa_token="<токен-сервисного-аккаунта>",
)

print(result["ok"])
print(result.get("activity_log_correlation_id"))

Больше готовых сценариев (CLI и Python) — в разделе Примеры.