Хранилища
Команда semaphore vault управляет шифрованием секретов, которые Semaphore
хранит в базе данных, — секретов ключей доступа (SSH-ключи, пары
логин/пароль, секретные строки) и ключа подписи JWT.
semaphore vault --help
vault— псевдоним дляvaults.
У неё две подкоманды:
| Команда | Назначение |
|---|---|
vault rekey | Перешифровать все хранимые секреты активным ключом шифрования. |
vault check | Показать, каким идентификатором ключа зашифрован каждый хранимый секрет (только чтение). |
О том, как настраиваются и ротируются ключи шифрования, см. раздел Ключи шифрования.
Перешифрование секретов (vault rekey)
Перешифровывает все локально хранимые секреты — секреты ключей доступа и ключ подписи JWT — активным ключом шифрования, проставляя идентификатор этого ключа в каждое значение. Секреты, хранящиеся во внешнем хранилище секретов, пропускаются (они не шифруются связкой ключей Semaphore).
semaphore vault rekey
Ротация ключей без простоя
Активный ключ шифрует новые записи; все остальные ключи в наборе по-прежнему могут расшифровывать старые данные. Поэтому ротация выглядит так: добавить ключ, переключить указатель активного ключа, перешифровать данные в фоне, затем удалить старый ключ.
- Добавьте новый ключ в набор (файл в
keys_folderили запись вkeys:) и направьте на него указатель активного ключа (active.secret_keyилиsecret_key_file). Изменение применяется в течениеkeys_poll_interval(по умолчанию15s) или немедленно поkill -HUP <pid>— перезапуск не требуется. - Выполните
semaphore vault rekey, чтобы перешифровать существующие данные новым ключом. - Выполните
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, если он ещё не был сгенерирован.
Если какой-либо секрет ссылается на идентификатор ключа, отсутствующий в наборе, команда помечает такие строки и завершается с ненулевым статусом — верните недостающий ключ в набор, прежде чем эти данные можно будет расшифровать.