Especificação Traga a sua própria chave

Este documento descreve as especificações para importar chaves protegidas por HSM dos HSMs no local dos clientes para Key Vault.

Scenario

Um cliente Key Vault gostaria de transferir de forma segura uma chave do HSM no local fora do Azure para o HSM que suporta o Azure Key Vault. O processo de importação de uma chave gerada fora Key Vault é referido como Bring Your Own Key (BYOK).

Seguem-se os requisitos:

  • A chave a transferir nunca existe fora de um HSM em formato de texto simples.
  • Fora de um HSM, a chave a transferir está sempre protegida por uma chave detida no Azure Key Vault HSM

Terminologia

Nome da Chave Tipo de Chave Origem Descrição
Chave de Troca de Chaves (KEK) RSA HSM do Azure Key Vault Um par de chaves RSA suportado pelo HSM gerado no Azure Key Vault
Tecla de Moldagem AES HSM do Fornecedor Uma chave AES [efémera] gerada pelo HSM no local
Chave de Destino RSA, EC, AES (apenas HSM gerido) HSM do Fornecedor A chave a transferir para o Azure Key Vault HSM

Chave de Troca de Chaves: uma chave suportada por HSM que o cliente gera no cofre de chaves onde a chave BYOK será importada. Esta KEK tem de ter as seguintes propriedades:

  • É uma chave RSA-HSM (4096 bits, 3072 bits ou 2048 bits)
  • Terá corrigido key_ops (APENAS "importação"), que permitirá que seja utilizado apenas durante o BYOK
  • Tem de estar no mesmo cofre onde a Chave de Destino será importada

Passos do utilizador

Para efetuar uma transferência de chave, um utilizador executa os seguintes passos:

  1. Gerar KEK.
  2. Obtenha a chave pública da KEK.
  3. Utilizar o fornecedor de HSM fornecido pela ferramenta BYOK – importe a KEK para o HSM de destino e exporta a Chave de Destino protegida pela KEK.
  4. Importe a Chave de Destino protegida para o Key Vault do Azure.

Os clientes utilizam a ferramenta BYOK e a documentação fornecida pelo fornecedor do HSM para concluir os Passos 3. Produz um Blob de Transferência de Chaves (um ficheiro ".byok").

Restrições de HSM

O HSM existente pode aplicar restrições à chave que gerem, incluindo:

  • O HSM pode ter de ser configurado para permitir a exportação baseada em moldagem de chaves
  • A chave de destino pode ter de ser marcada CKA_EXTRACTABLE para o HSM permitir a exportação controlada
  • Em alguns casos, a KEK e a chave de moldagem podem ter de ser marcadas como CKA_TRUSTED, o que permite que seja utilizada para moldar as teclas no HSM.

A configuração do HSM de origem está, geralmente, fora do âmbito desta especificação. A Microsoft espera que o fornecedor do HSM produza documentação que acompanha a respetiva ferramenta BYOK para incluir esses passos de configuração.

Nota

Vários destes passos podem ser executados com outras interfaces, como o Azure PowerShell e o Portal do Azure. Também podem ser executadas programaticamente com funções equivalentes no SDK Key Vault.

Gerar KEK

Utilize o comando az keyvault key create para criar KEK com operações de chave definidas para importação. Anote o identificador de chave "kid" devolvido pelo comando abaixo.

az keyvault key create --kty RSA-HSM --size 4096 --name KEKforBYOK --ops import --vault-name ContosoKeyVaultHSM

Nota

Os serviços suportam diferentes comprimentos kek; SQL do Azure, por exemplo, suporta apenas comprimentos de chave de 2048 ou 3072 bytes. Consulte a documentação do seu serviço para obter informações específicas.

Obter a chave pública da KEK

Transfira a parte da chave pública do KEK e armazene-a num ficheiro PEM.

az keyvault key download --name KEKforBYOK --vault-name ContosoKeyVaultHSM --file KEKforBYOK.publickey.pem

Gerar o blob de transferência de chaves com a ferramenta BYOK fornecida pelo fornecedor do HSM

O cliente utilizará a ferramenta BYOK fornecida pelo Fornecedor de HSM para criar um blob de transferência de chaves (armazenado como um ficheiro ".byok"). A chave pública KEK (como um ficheiro .pem) será uma das entradas desta ferramenta.

Blob de Transferência de Chaves

A longo prazo, a Microsoft gostaria de utilizar o mecanismo PKCS#11 CKM_RSA_AES_KEY_WRAP para transferir a chave de destino para o Azure Key Vault uma vez que este mecanismo produz um único blob e, mais importante ainda, a chave AES intermédia é processada pelos dois HSMs e é garantido que é efémera. Este mecanismo não está atualmente disponível em alguns HSMs, mas a combinação de proteger a chave de destino com CKM_AES_KEY_WRAP_PAD a utilização de uma chave AES e a proteção da chave AES com CKM_RSA_PKCS_OAEP produz um blob equivalente.

O texto simples da chave de destino depende do tipo de chave:

  • Para uma chave RSA, a chave privada ASN.1 Codificação DER [RFC3447] encapsulada em PKCS#8 [RFC5208]
  • Para uma chave EC, a codificação ASN.1 DER de chave privada [RFC5915] encapsulada em PKCS#8 [RFC5208]
  • Para uma chave octeto, os bytes não processados da chave

Os bytes da chave de texto simples são transformados com o mecanismo de CKM_RSA_AES_KEY_WRAP:

  • É gerada e encriptada uma chave AES efémera com a chave RSA de moldagem com RSA-OAEP com SHA1.
  • A chave de texto simples codificada é encriptada com a chave AES através da Moldagem da Chave AES com Preenchimento.
  • A chave AES encriptada e a chave de texto simples encriptada são concatenadas para produzir o blob de cifra final.

O formato do blob de transferência utiliza a serialização compacta de Encriptação Web JSON (RFC7516) principalmente como um veículo para fornecer os metadados necessários ao serviço para desencriptação correta.

Se CKM_RSA_AES_KEY_WRAP_PAD for utilizada, 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 chave da KEK. Para Key Vault chaves tem o seguinte aspeto:https://ContosoKeyVaultHSM.vault.azure.net/keys/mykek/eba63d27e4e34e028839b53fac905621
  • alg = algoritmo.
  • dir = Modo direto, ou seja, o menor referenciado é utilizado para proteger diretamente o cifratexto 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 e o fabricante e modelo do HSM de origem. Estas informações destinam-se a ser utilizadas na resolução de problemas e suporte.

O blob JSON é armazenado num ficheiro com uma extensão ".byok", para que os clientes Azure PowerShell/CLI o tratem corretamente quando são utilizados os comandos "Add-AzKeyVaultKey" (PSH) ou "az keyvault key import" (CLI).

Carregar o blob de transferência de chaves para importar a chave HSM

O cliente transferirá o Blob de Transferência de Chaves (ficheiro ".byok") para uma estação de trabalho online e, em seguida, executará um comando az keyvault key import para importar este blob como uma nova chave suportada por HSM para Key Vault.

Para importar uma chave RSA, utilize este comando:

az keyvault key import --vault-name ContosoKeyVaultHSM --name ContosoFirstHSMkey --byok-file KeyTransferPackage-ContosoFirstHSMkey.byok --ops encrypt decrypt

Para importar uma chave EC, tem de 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, resulta no envio de um pedido da API REST da seguinte forma:

PUT https://contosokeyvaulthsm.vault.azure.net/keys/ContosoFirstHSMKey?api-version=7.0

Corpo do pedido ao importar uma chave RSA:

{
  "key": {
    "kty": "RSA-HSM",
    "key_ops": [
      "decrypt",
      "encrypt"
    ],
    "key_hsm": "<Base64 encoded BYOK_BLOB>"
  },
  "attributes": {
    "enabled": true
  }
}

Corpo do pedido 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" é o conteúdo completo do keytransferPackage-ContosoFirstHSMkey.byok codificado no formato Base64.

Referências

Passos seguintes