Managed Keys позволяют Stronghold использовать криптографические ключи, расположенные во внешней доверенной системе, например в HSM или внешнем KMS, без хранения приватного ключевого материала внутри самого Stronghold.
Такой подход полезен в сценариях, где:
- приватные ключи должны храниться вне Stronghold;
- операции подписи или шифрования должны выполняться внешней системой;
- есть требования по безопасности или соответствию, запрещающие экспорт ключевого материала.
В Stronghold managed key представляет собой именованную запись, управляемую через API sys/managed-keys/<TYPE>/<NAME>.
Как это работает
Stronghold хранит конфигурацию доступа к внешнему ключу, но не сам приватный ключ. Когда механизму секретов требуется операция подписи, проверки подписи, шифрования или расшифрования, он обращается к соответствующему managed key, а уже тот делегирует операцию внешнему backend-у.
Это означает, что:
- ключевой материал остаётся во внешней системе;
- Stronghold использует managed key как абстракцию поверх внешнего backend-а;
- несколько managed keys могут быть настроены для одного и того же backend-а, если нужны разные ключи или разные политики доступа.
Поддерживаемые backend-ы
В Stronghold поддерживаются следующие типы managed keys:
pkcs11yandexcloudkms
pkcs11
Тип pkcs11 используется для работы с HSM и PKCS#11-совместимыми библиотеками. Конфигурация managed key этого типа ссылается на ранее объявленную kms_library "pkcs11" в серверной конфигурации Stronghold.
Типовой сценарий:
- настроить
kms_library "pkcs11"в конфигурации сервера; - зарегистрировать managed key через
sys/managed-keys/pkcs11/<NAME>; - при необходимости проверить доступность ключа через
test/sign; - разрешить использование ключа нужному mount-path.
Пример регистрации:
stronghold write sys/managed-keys/pkcs11/my-hsm-key library=softhsm token_label=managed-keys pin=1234 key_label=my-signing-key usages=sign,verifyПараметры pkcs11
| Параметр | Описание |
|---|---|
library | Обязательный. Имя блока kms_library "pkcs11" из конфигурации сервера |
slot | Номер слота (десятичная строка). Необходимо указать ровно один из параметров slot и token_label |
token_label | Метка токена. Необходимо указать ровно один из параметров slot и token_label |
pin | Обязательный. PIN-код для доступа к токену. При чтении ключа не возвращается (значение redacted) |
key_label, key_id | Метка или идентификатор ключа в HSM. Нужен хотя бы один из них. Если ключа нет и указано allow_generate_key=true, ключ создаётся с меткой key_label |
mechanism | Механизм PKCS#11 для ключа. Указывается в шестнадцатеричном виде с префиксом 0x, например 0x1041 |
curve | Для ECDSA — кривая (P256, P384 или P521) при генерации ключа. Для механизмов ГОСТ — профиль ключа, описанный в разделе «Ключи ГОСТ» |
key_bits | Для RSA — длина ключа при генерации (2048, 3072 или 4096). Для AES при генерации допускается только 256 |
force_rw_session | Принудительно использовать сессии чтения и записи для обхода особенностей некоторых HSM. По умолчанию false |
max_parallel | Максимальное количество одновременных операций, отправляемых в HSM |
usages | Список разрешённых операций через запятую: encrypt, decrypt, sign, verify, wrap, unwrap. По умолчанию sign,verify |
Если mechanism не указан, ключ можно использовать только с уже существующим в HSM ключом, а генерация (allow_generate_key=true) недоступна.
Тип pkcs11 доступен в Stronghold EE.
Поддерживаемые механизмы
| Механизм | Значение | Тип ключа | Операции |
|---|---|---|---|
CKM_ECDSA | 0x1041 | ECDSA (P256, P384, P521) | подпись, проверка подписи |
CKM_RSA_PKCS | 0x1 | RSA (2048, 3072, 4096) | подпись и проверка (PKCS#1 v1.5 или PSS), шифрование, расшифрование, wrap, unwrap |
CKM_RSA_PKCS_OAEP | 0x9 | RSA | аналогично |
CKM_RSA_PKCS_PSS | 0xd | RSA | аналогично |
CKM_GOSTR3410 | 0x1201 | ГОСТ Р 34.10-2012, 256 бит (или ГОСТ 2001) | подпись, проверка подписи |
CKM_GOSTR3410_512 | 0xd4321006 | ГОСТ Р 34.10-2012, 512 бит | подпись, проверка подписи |
CKM_AES_GCM, CKM_AES_CBC, CKM_AES_CBC_PAD | 0x1087, 0x1082, 0x1085 | AES (создаваемые ключи — 256 бит) | шифрование, расшифрование |
CKM_KUZNECHIK_CTR_ACPKM, CKM_KUZNECHIK_MGM | 0xd4321032, 0xd432102d | Кузнечик | шифрование, расшифрование |
RSA и подписи PSS
Для RSA-ключей три RSA-механизма (CKM_RSA_PKCS, CKM_RSA_PKCS_OAEP, CKM_RSA_PKCS_PSS) лишь выбирают RSA-ключ: схему подписи (PKCS#1 v1.5 или RSA-PSS) для каждой операции определяет вызывающий механизм секретов, как в crypto/rsa языка Go. RSA-PSS используется с длиной соли, равной длине хеша. Подпись проверяется локально по открытому ключу, экспортированному из HSM.
- В PKI подпись RSA-PSS запрашивается параметром
use_pss(при создании корневого и промежуточного CA, при подписи и в ролях). Если managed key поддерживает только подписи PSS, для издателя нужно задатьrevocation_signature_algorithmс одним из алгоритмов PSS, иначе построение CRL завершится ошибкой, в тексте которой упоминается PSS. - В
test/signRSA-PSS запрашивается параметромuse_pss=true. Подробнее — в разделе «Базовые операции».
Ключи ГОСТ
Ключи ГОСТ в HSM используются только для подписи и проверки подписи. Механизм определяет размер ключа:
CKM_GOSTR3410— 256-битные ключи;CKM_GOSTR3410_512— 512-битные ключи.
Параметр curve задаёт профиль генерации ключа и должен соответствовать механизму:
gost2001илиgost2012-256дляCKM_GOSTR3410;gost2012-512дляCKM_GOSTR3410_512.
Если curve не указан, профиль выбирается по механизму.
Для подписи используется хеш-функция Стрибог: streebog-256 для 256-битных ключей и streebog-512 для 512-битных.
Проверка подписи выполняется в HSM.
При использовании ключа ГОСТ в pki алгоритм подписи выбирается по типу открытой части ключа. В transit managed key ГОСТ принимает только хеш-функцию Стрибог, соответствующую размеру ключа.
Пример регистрации ключа ГОСТ:
stronghold write sys/managed-keys/pkcs11/gost-ca-key library=rutoken token_label=managed-keys pin=12345678 key_label=my-gost-key mechanism=0x1201 curve=gost2012-256 usages=sign,verifyyandexcloudkms
Тип yandexcloudkms используется для интеграции с Yandex Cloud KMS.
Для конфигурации такого managed key используются параметры:
kms_key_idoauth_tokenилиservice_account_key_jsonendpointпри необходимости
Для аутентификации Stronghold в Yandex Cloud KMS можно использовать один из следующих вариантов:
oauth_token;service_account_key_json;- сервисный аккаунт виртуальной машины в Yandex Cloud.
Если параметры oauth_token и service_account_key_json не заданы, Stronghold пытается использовать сервисный аккаунт виртуальной машины через стандартный механизм получения instance credentials. Это поведение аналогично типовым сценариям в Vault, где для облачных KMS могут использоваться учётные данные самой виртуальной машины.
Пример регистрации:
stronghold write sys/managed-keys/yandexcloudkms/my-yc-key kms_key_id=<KMS_KEY_ID> oauth_token=<OAUTH_TOKEN> usages=sign,verifyГде <KMS_KEY_ID> — идентификатор ключа Yandex Cloud KMS, <OAUTH_TOKEN> — OAuth-токен Yandex Cloud.
Пример использования сервисного аккаунта виртуальной машины:
stronghold write sys/managed-keys/yandexcloudkms/my-yc-key kms_key_id=<KMS_KEY_ID> usages=sign,verifyПараметры oauth_token и service_account_key_json взаимоисключающие. Если указан один из них, именно он будет использоваться для аутентификации в Yandex Cloud.
Для yandexcloudkms набор допустимых операций зависит от самого ключа и его конфигурации. Если managed key будет использоваться для pki или ssh, ему требуется возможность подписи. Для transit набор операций зависит от выбранного сценария использования.
Какие механизмы секретов поддерживают Managed Keys
В Stronghold managed keys могут использовать:
SSHPKITransit
SSH
SSH secrets engine может использовать managed key как ключ центра сертификации (CA) и применять его для подписи SSH-сертификатов.
Это полезно, если SSH CA должен оставаться во внешнем HSM или внешнем KMS.
PKI
PKI secrets engine может использовать managed key для генерации и обслуживания корневых и промежуточных CA, а также для подписи сертификатов.
Это один из основных сценариев использования managed keys в Stronghold. Для PKI дополнительно важно разрешить managed key для конкретного PKI mount-а, если ключ не объявлен с any_mount=true.
Пример:
stronghold secrets tune -allowed-managed-keys=my-hsm-key pki/Transit
Transit secrets engine может использовать managed key как внешний криптографический ключ.
В зависимости от возможностей backend-а и типа ключа это позволяет выполнять:
- подпись;
- проверку подписи;
- шифрование;
- расшифрование.
Для Transit managed key указывается при создании или ротации transit key.
Пространства имён и область видимости
Managed key привязан к конкретному namespace. Механизм секретов, который использует этот ключ, должен находиться в том же namespace, что и сам managed key.
Если ключ не объявлен с any_mount=true, его использование нужно явно разрешить для конкретного mount-path.
Базовые операции
Список managed keys заданного типа:
stronghold list sys/managed-keys/pkcs11Чтение конфигурации ключа:
stronghold read sys/managed-keys/pkcs11/my-hsm-keyПроверка доступности ключа через тестовую подпись:
stronghold write sys/managed-keys/pkcs11/my-hsm-key/test/signЗапрос test/sign принимает необязательные параметры:
hash_algorithm— алгоритм хеширования для тестовой подписи. По умолчанию используетсяsha2-256; для ключейpkcs11с механизмами ГОСТ —streebog-256илиstreebog-512в зависимости от механизма.use_pss— для RSA-ключей подписывать с использованием RSA-PSS. Для RSA-ключейyandexcloudkms, которые подписывают только с PSS, включён по умолчанию.
Удаление managed key:
stronghold delete sys/managed-keys/pkcs11/my-hsm-keyПрактические рекомендации
- Используйте
pkcs11, если ключи находятся в локальном или сетевом HSM с PKCS#11-библиотекой. - Используйте
yandexcloudkms, если ключи управляются в Yandex Cloud KMS. - Ограничивайте
usagesтолько необходимыми операциями. - Если ключ не должен быть доступен всем mount-ам, не включайте
any_mountи явно настраивайтеallowed-managed-keys. - Перед подключением ключа к
pki,sshилиtransitпроверяйте его черезtest/signили другой подходящий тестовый сценарий.