Especificação de Bring Your Own Key
Este documento descreve as especificações para importar chaves protegidas por HSM de HSMs locais de clientes para o Key Vault.
Cenário
Um cliente do Key Vault deseja transferir de forma segura uma chave do seu HSM local fora do Azure para o HSM compatível com o Azure Key Vault. O processo de importação de uma chave gerada fora do Key Vault é conhecido como BYOK (Bring Your Own Key).
Estes são os requisitos:
- A chave a ser transferida nunca existiu fora de um HSM em formato de texto sem formatação.
- Fora de um HSM, a chave a ser transferida é sempre protegida por uma chave mantida no HSM do Azure Key Vault.
Terminologia
Nome da chave | Tipo de Chave | Origem | Descrição |
---|---|---|---|
KEK (Chave de Troca de Chaves) | RSA | HSM do Azure Key Vault | Um par de chaves RSA compatível com o HSM gerado no Azure Key Vault |
Chave de Encapsulamento | AES | HSM do fornecedor | Uma chave AES [efêmera ] gerada pelo HSM local |
Chave de Destino | RSA, EC, AES (somente HSM gerenciado) | HSM do fornecedor | A chave a ser transferida para o HSM do Azure Key Vault |
KEK (Chave de Troca de Chaves) : uma chave compatível com o HSM que o cliente gera no cofre de chaves em que a chave BYOK será importada. A KEK deve ter as seguintes propriedades:
- Ser uma chave RSA-HSM (4096 bits, 3072 bits ou 2048 bits)
- Ter key_ops fixo (somente 'import'), o que permite que seja usada SOMENTE durante BYOK
- Deve estar no mesmo cofre em que a Chave de Destino será importada
Etapas do usuário
Para executar uma transferência de chave, o usuário deve seguir estas etapas:
- Gerar a KEK.
- Recuperar a chave pública da KEK.
- Usando a ferramenta BYOK fornecida pelo fornecedor do HSM, importar a KEK para o HSM de destino e exportar a Chave de Destino protegida pela KEK.
- Importar a Chave de Destino protegida para o Azure Key Vault.
Os clientes usam a ferramenta BYOK e a documentação fornecida pelo fornecedor do HSM para concluir a etapa 3. Ela produz um Blob de Transferência de Chave (um arquivo " byok").
Restrições de HSM
O HSM existente pode aplicar restrições à chave gerenciada, como:
- O HSM pode precisar ser configurado para permitir exportação baseada em encapsulamento de chave.
- Talvez seja necessário marcar a chave de destino como CKA_EXTRACTABLE para que o HSM permita a exportação controlada.
- Em alguns casos, a KEK e a tecla de encapsulamento podem precisar ser marcadas como CKA_TRUSTED, o que permite que ela seja usada para encapsular chaves no HSM.
Em geral, a configuração do HSM de origem está fora do escopo dessa especificação. A Microsoft espera que o fornecedor do HSM produza documentação associada à ferramenta BYOK para incluir essas etapas de configuração.
Observação
Várias dessas etapas podem ser executadas por meio de outras interfaces, como o Azure PowerShell e o Portal do Azure. Elas também podem ser executadas de forma programática usando funções equivalentes no SDK do Key Vault.
Gerar a KEK
Use o comando az keyvault key create para criar a KEK com operações de chave definidas para importação. Anote o identificador de chave 'kid' retornado do comando abaixo.
az keyvault key create --kty RSA-HSM --size 4096 --name KEKforBYOK --ops import --vault-name ContosoKeyVaultHSM
Observação
Os serviços dão suporte a diferentes comprimentos de KEK; o SQL do Azure, por exemplo, dá suporte apenas a comprimentos de chave de 2048 ou 3072 bytes. Confira a documentação do serviço para obter detalhes.
Recuperar a chave pública da KEK
Baixe a parte de chave pública da KEK e armazene-a em um arquivo PEM.
az keyvault key download --name KEKforBYOK --vault-name ContosoKeyVaultHSM --file KEKforBYOK.publickey.pem
Gerar o blob de transferência de chave usando a ferramenta BYOK fornecida pelo fornecedor do HSM
O cliente usará a ferramenta BYOK fornecida pelo fornecedor do HSM para criar um blob de transferência de chave (armazenado como um arquivo ".byok"). A chave pública KEK (como um arquivo. pem) será uma das entradas para essa ferramenta.
Blob de Transferência de Chave
A longo prazo, a Microsoft deseja usar o mecanismo PKCS#11 CKM_RSA_AES_KEY_WRAP para transferir a chave de destino para o Azure Key Vault, já que esse mecanismo produz um único blob e, o mais importante, a chave AES intermediária é processada por dois HSMs e tem a garantia de ser efêmera. Esse mecanismo não está disponível atualmente em alguns HSMs, mas a combinação de proteção da chave de destino com CKM_AES_KEY_WRAP_PAD usando uma chave AES e proteção da chave AES com CKM_RSA_PKCS_OAEP produz um blob equivalente.
O texto não criptografado da chave de destino depende do tipo de chave:
- Para uma chave RSA, a chave privada ASN.1 com codificação DER [RFC3447] encapsulada em PKCS nº 8 [RFC5208]
- Para uma chave EC, a chave privada ASN.1 com codificação DER [RFC5915] encapsulada no PKCS nº 8 [RFC5208]
- Para uma chave de octeto, os bytes brutos da chave
Os bytes da chave de texto não criptografado são transformados usando o mecanismo CKM_RSA_AES_KEY_WRAP:
- Uma chave AES efêmera é gerada e criptografada com a chave RSA de encapsulamento usando RSA-OAEP com SHA1.
- A chave codificada de texto não criptografado é criptografada por meio da chave AES que usa o Encapsulamento de Chave AES com Preenchimento.
- A chave AES criptografada e a chave de texto não criptografado criptografada são concatenadas para produzir o blob de texto cifrado final.
O formato do blob de transferência usa a serialização compacta de Criptografia da Web JSON (RFC7516) basicamente como um veículo para entregar ao serviço os metadados necessários para a descriptografia correta.
Se CKM_RSA_AES_KEY_WRAP_PAD for usado, a serialização JSON do blob de transferência será:
{
"schema_version": "1.0.0",
"header":
{
"kid": "<key identifier of the KEK>",
"alg": "dir",
"enc": "CKM_RSA_AES_KEY_WRAP"
},
"ciphertext":"BASE64URL(<ciphertext contents>)",
"generator": "BYOK tool name and version; source HSM name and firmware version"
}
- kid = identificador de chave da KEK. Em chaves do Key Vault, ela tem esta aparência: https://ContosoKeyVaultHSM.vault.azure.net/keys/mykek/eba63d27e4e34e028839b53fac905621
- alg = algoritmo.
- dir = modo direto, ou seja, o kid referenciado é usado para proteger diretamente o texto cifrado, que é uma representação precisa de CKM_RSA_AES_KEY_WRAP
- generator = um campo informativo que indica o nome e a versão da ferramenta BYOK, bem como o modelo e o fabricante do HSM de origem. Essas informações devem ser usadas para suporte e solução de problemas.
O blob JSON é armazenado em um arquivo com extensão ".byok" para ser processado corretamente pelos clientes de Azure PowerShell/CLI quando os comandos 'Add-AzKeyVaultKey' (PSH) ou 'az keyvault key import' (CLI) forem usados.
Carregar o blob de transferência de chave para importar a chave do HSM
O cliente transferirá o Blob de Transferência de Chave (arquivo ".byok") para uma estação de trabalho online e executará um comando az keyvault key import para importar esse blob como uma nova chave compatível com o HSM para o Key Vault.
Para importar uma chave RSA, use este comando:
az keyvault key import --vault-name ContosoKeyVaultHSM --name ContosoFirstHSMkey --byok-file KeyTransferPackage-ContosoFirstHSMkey.byok --ops encrypt decrypt
Para importar uma chave de curva elíptica, você precisa especificar o tipo de chave e o nome da curva.
az keyvault key import --vault-name ContosoKeyVaultHSM --name ContosoFirstHSMkey --byok-file --kty EC-HSM --curve-name "P-256" KeyTransferPackage-ContosoFirstHSMkey.byok --ops sign verify
Quando o comando acima é executado, ele resulta no envio de uma solicitação da API REST da seguinte maneira:
PUT https://contosokeyvaulthsm.vault.azure.net/keys/ContosoFirstHSMKey?api-version=7.0
Corpo da solicitação ao importar uma chave RSA:
{
"key": {
"kty": "RSA-HSM",
"key_ops": [
"decrypt",
"encrypt"
],
"key_hsm": "<Base64 encoded BYOK_BLOB>"
},
"attributes": {
"enabled": true
}
}
Corpo da solicitação ao importar uma chave EC:
{
"key": {
"kty": "EC-HSM",
"crv": "P-256",
"key_ops": [
"sign",
"verify"
],
"key_hsm": "<Base64 encoded BYOK_BLOB>"
},
"attributes": {
"enabled": true
}
}
o valor "key_hsm" reflete todo o conteúdo do arquivo KeyTransferPackage-ContosoFirstHSMkey.byok codificado no formato Base64.
Referências
Próximas etapas
- Instruções passo a passo sobre a ferramenta BYOK: Importar chaves protegidas por HSM para o Key Vault (BYOK)