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

Хранилища

Команда semaphore vault управляет шифрованием секретов, которые Semaphore хранит в базе данных, — секретов ключей доступа (SSH-ключи, пары логин/пароль, секретные строки) и ключа подписи JWT.

semaphore vault --help

vault — псевдоним для vaults.

У неё две подкоманды:

КомандаНазначение
vault rekeyПерешифровать все хранимые секреты активным ключом шифрования.
vault checkПоказать, каким идентификатором ключа зашифрован каждый хранимый секрет (только чтение).

О том, как настраиваются и ротируются ключи шифрования, см. раздел Ключи шифрования.

Перешифрование секретов (vault rekey)

Перешифровывает все локально хранимые секреты — секреты ключей доступа и ключ подписи JWT — активным ключом шифрования, проставляя идентификатор этого ключа в каждое значение. Секреты, хранящиеся во внешнем хранилище секретов, пропускаются (они не шифруются связкой ключей Semaphore).

semaphore vault rekey

Ротация ключей без простоя

Активный ключ шифрует новые записи; все остальные ключи в наборе по-прежнему могут расшифровывать старые данные. Поэтому ротация выглядит так: добавить ключ, переключить указатель активного ключа, перешифровать данные в фоне, затем удалить старый ключ.

  1. Добавьте новый ключ в набор (файл в keys_folder или запись в keys:) и направьте на него указатель активного ключа (active.secret_key или secret_key_file). Изменение применяется в течение keys_poll_interval (по умолчанию 15s) или немедленно по kill -HUP <pid> — перезапуск не требуется.
  2. Выполните semaphore vault rekey, чтобы перешифровать существующие данные новым ключом.
  3. Выполните semaphore vault check; как только у старого ключа отобразится 0 rows, его можно безопасно удалить из набора.

Опции

ФлагОписание
--old-key <key>Явно указанный старый ключ шифрования для миграции с устаревшей схемы с одним ключом. Не требуется, если старый ключ уже присутствует в наборе как дополнительный. Используется для расшифровки данных без префикса (устаревших), у которых нет проставленного идентификатора ключа.
--backup <file>Перед перешифрованием записать резервную копию текущих шифротекстов ключей доступа в <file>.
--rollback <file>Восстановить шифротексты ключей доступа из файла резервной копии вместо перешифрования.

Резервное копирование и откат

Сделайте снимок текущих шифротекстов перед перешифрованием и восстановите его, если что-то пойдёт не так:

# Back up current ciphertexts, then re-encrypt to the active key:
semaphore vault rekey --backup /var/backups/vault.jsonl

# Restore the ciphertexts from the backup:
semaphore vault rekey --rollback /var/backups/vault.jsonl

Резервная копия — это файл в формате JSON Lines, по одной записи на ключ доступа (project_id, key_id, secret). Откат записывает эти шифротексты обратно без изменений.

Миграция с устаревшей схемы с одним ключом

Если ваши данные были зашифрованы более старой версией Semaphore, использовавшей единственный ключ access_key_encryption (без ротации и без проставленного идентификатора ключа), передайте этот ключ явно, чтобы данные можно было расшифровать перед перешифрованием активным ключом:

semaphore vault rekey --old-key <base64-old-key>

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

Проверка использования ключей (vault check)

Только чтение. Показывает по каждому идентификатору ключа, сколько локально хранимых секретов ключей доступа (и ключ подписи JWT) им зашифровано, а также статус ключа подписи JWT. Запускайте после vault rekey, чтобы убедиться, что выведенный из использования ключ можно безопасно удалить: ключ без ссылок можно удалить из набора.

semaphore vault check

Пример вывода:

Access keys: 12 total
IFTi6Ipik8Q: 12 rows — active
rcGGC2AQfKo: 0 rows — retired, SAFE TO REMOVE
JWT signing key: IFTi6Ipik8Q

Для каждого идентификатора ключа выводится один из следующих статусов:

СтатусЗначение
activeКлюч в данный момент шифрует новые записи.
retired, rekey pendingКлюч всё ещё шифрует часть строк; выполните vault rekey, чтобы перевести их на активный ключ.
retired, SAFE TO REMOVEНа ключ не ссылается ни одна строка (0 rows) — его можно удалить из набора.
legacy (no id)Строки, зашифрованные до появления идентификаторов ключей; выполните rekey, чтобы проставить идентификатор.
MISSING KEY (cannot decrypt)Указанный идентификатор ключа отсутствует в наборе.

Последняя строка сообщает, каким ключом зашифрован ключ подписи JWT, либо JWT signing key: not set, если он ещё не был сгенерирован.

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