Especificación Bring Your Own Key

En este documento se describen las especificaciones para importar claves protegidas con HSM desde los HSM locales de los clientes en Key Vault.

Escenario

Un cliente de Key Vault quiere transferir de forma segura una clave desde su HSM local fuera de Azure hacia el HSM que respalda Azure Key Vault. Este proceso se denomina bring your own key (BYOK).

Se aplican los siguientes requisitos:

  • La clave que se va a transferir nunca existe fuera de un HSM como texto no cifrado.
  • Fuera de un HSM, la clave que se va a transferir siempre está protegida por una clave contenida en el HSM de Azure Key Vault.

Terminología

Nombre de clave Tipo de clave Origen Descripción
Clave de intercambio de claves (KEK) RSA HSM de Azure Key Vault Un par de claves RSA respaldado por HSM generado en Azure Key Vault
Clave de encapsulado oct HSM del proveedor Clave oct [efímera] generada por HSM en las instalaciones
Clave de destino RSA, EC, oct (solo HSM administrado) HSM del proveedor Clave que se transferirá al HSM de Azure Key Vault

Key Exchange Key: clave respaldada por HSM que se genera en el almacén de claves donde se importa la clave BYOK. Esta KEK debe tener las siguientes propiedades:

  • Es una clave de RSA-HSM (4096 bits, 3072 bits o 2048 bits).
  • Tiene un valor fijo key_ops (ONLY import), que solo se puede usar durante BYOK.
  • Debe estar en el mismo almacén donde se va a importar la clave de destino.

Pasos del usuario

Para realizar una transferencia de claves, un usuario realiza los pasos siguientes:

  1. Generar la KEK.
  2. Recupere la clave pública de la KEK.
  3. Use la herramienta BYOK proporcionada por el proveedor de HSM para importar la KEK en el HSM de destino y exportar la clave de destino protegida por la KEK.
  4. Importe la clave de destino protegida en Azure Key Vault.

Los clientes usan la herramienta BYOK y la documentación proporcionadas por el proveedor de HSM para completar el paso 3. Genera un blob de transferencia de claves (un .byok archivo).

Restricciones de HSM

Los HSM existentes pueden aplicar restricciones en las claves que administran, entre las que se incluyen:

  • Es posible que tenga que configurar el HSM para permitir la exportación basada en encapsulado de claves.
  • Es posible que tenga que marcar la clave de destino como CKA_EXTRACTABLE para que el HSM permita la exportación controlada.
  • En algunos casos, es posible que tenga que marcar la KEK y la clave de encapsulado como CKA_TRUSTED, lo que permite que se use para encapsular las claves en el HSM.

La configuración del HSM de origen está generalmente fuera del ámbito de esta especificación. Microsoft espera que el proveedor de HSM genere documentación que acompaña a su herramienta BYOK para incluir estos pasos de configuración.

Nota:

Puede realizar varios de estos pasos mediante otras interfaces, como Azure PowerShell y Azure portal. También puede realizar estos pasos mediante programación mediante funciones equivalentes en Key Vault SDK.

Generar la KEK

Use el comando az keyvault key create para crear una KEK con operaciones de clave establecidas para importar. Anote el identificador kid de clave devuelto por este comando.

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

Nota:

Los servicios admiten diferentes longitudes KEK. Azure SQL, por ejemplo, solo admite longitudes de clave de 2048 o 3072 bits. Consulte la documentación de su servicio para obtener información específica.

Recuperar la clave pública de la KEK

Descargue la parte de clave pública de la KEK y almacénela en un archivo PEM.

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

Generación de blobs de transferencia de claves mediante la herramienta BYOK proporcionada por el proveedor de HSM

Use la herramienta BYOK proporcionada por el proveedor de HSM para crear un blob de transferencia de claves (almacenado como un .byok archivo). La herramienta toma la clave pública KEK como un .pem archivo como una de sus entradas.

Blob de transferencia de claves

Microsoft planea usar el mecanismo de CKM_RSA_AES_KEY_WRAP PKCS#11 para transferir la clave de destino a Azure Key Vault. Este mecanismo genera un único blob y, lo que es más importante, los dos HSM controlan la clave AES intermedia y garantizan que es efímero. Este mecanismo no está disponible actualmente en algunos HSM, pero la combinación de proteger la clave de destino mediante el uso de CKM_AES_KEY_WRAP_PAD con una clave AES y la protección de la clave AES mediante CKM_RSA_PKCS_OAEP crea un blob equivalente.

El texto no cifrado de la clave de destino depende del tipo de clave:

  • Para una clave RSA, la clave privada usa la codificación ASN.1 DER [RFC3447] encapsulada en PKCS#8 [RFC5208].
  • Para una clave EC, la clave privada usa la codificación ASN.1 DER [RFC5915] encapsulada en PKCS#8 [RFC5208].
  • Para una clave de octeto, la clave usa bytes sin formato.

El proceso transforma los bytes de la clave de texto no cifrado mediante el mecanismo de CKM_RSA_AES_KEY_WRAP:

  • El proceso genera una clave de octeto efímera y la cifra utilizando el encapsulado de la clave RSA y RSA-OAEP con SHA-1.
  • El proceso cifra la clave de texto sin formato codificada mediante la clave de octeto y encapsulado de clave AES con relleno.
  • El proceso concatena la clave oct cifrada y la clave de texto plano cifrada para generar el blob de texto cifrado final.

El formato del blob de transferencia usa la serialización compacta de cifrado web JSON (RFC7516) principalmente como un vehículo para entregar los metadatos necesarios al servicio para su correcto descifrado.

Si usa CKM_RSA_AES_KEY_WRAP_PAD, la serialización JSON del blob de transferencia es:

{
  "schema_version": "1.0.0",
  "header":
  {
    "kid": "<kek-key-id>",
    "alg": "dir",
    "enc": "CKM_RSA_AES_KEY_WRAP"
  },
  "ciphertext":"BASE64URL(<ciphertext>)",
  "generator": "BYOK tool name and version; source HSM name and firmware version"
}

  • kid = identificador clave de KEK. Para las claves de Key Vault, tiene este aspecto: https://<vault-name>.vault.azure.net/keys/mykek/<key-version>
  • alg = algoritmo.
  • dir = modo directo. El kid referenciado protege directamente el texto cifrado, que es una representación precisa de CKM_RSA_AES_KEY_WRAP.
  • generator = un campo informativo que denota el nombre y la versión de la herramienta BYOK y el fabricante y el modelo de HSM de origen. Use esta información para solucionar problemas y soporte técnico.

Almacene el blob JSON en un archivo con una extensión .byok para que el cliente de Azure PowerShell o la CLI lo trate correctamente al usar los comandos Add-AzKeyVaultKey (PowerShell) o az keyvault key import (CLI).

Cargar el blob de transferencia de clave para importar la clave de HSM

Para importar una clave, transfiera el archivo Blob de transferencia de claves (".byok") a una estación de trabajo en línea y, a continuación, ejecute el comando az keyvault key import . Este comando importa el blob como una nueva clave respaldada por HSM en Key Vault.

Para importar una clave RSA, use el siguiente comando:

az keyvault key import --vault-name <vault-name> --name <key-name> --byok-file KeyTransferPackage-<key-name>.byok --ops encrypt decrypt

Para importar una clave EC, especifique el tipo de clave y el nombre de la curva.

az keyvault key import --vault-name <vault-name> --name <key-name> --kty EC-HSM --curve-name "P-256" --byok-file KeyTransferPackage-<key-name>.byok --ops sign verify

Al ejecutar este comando, envía una solicitud de API REST de la siguiente manera:

PUT https://<vault-name>.vault.azure.net/keys/<key-name>?api-version=7.6

Contenido de la solicitud al importar una clave RSA:

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

Cuerpo de la solicitud al importar una clave EC:

{
  "key": {
    "kty": "EC-HSM",
    "crv": "P-256",
    "key_ops": [
      "sign",
      "verify"
    ],
    "key_hsm": "<base64-encoded-byok-blob>"
  },
  "attributes": {
    "enabled": true
  }
}

El key_hsm valor es todo el contenido del archivo KeyTransferPackage-<key-name>.byok, codificado en formato Base64.

Referencias

Pasos siguientes