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:

  1. Gerar a KEK.
  2. Recuperar a chave pública da KEK.
  3. 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.
  4. 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