Ir al contenido principal

Usando una nube HSM

Cómo crear una nube HSM en Azure y conectarla a celocli.


Introducción a HSM

Un Hardware Security Module (HSM) en la nube ofrece un buen equilibrio entre seguridad y accesibilidad. Un HSM en la nube puede gestionar una clave privada Celo y puede utilizarse sin problemas con celocli y contractkit. De forma similar a un dispositivo ledger, una clave en un HSM evita que la clave se envíe nunca a través de la red o se almacene en disco, ya que la clave nunca puede salir del límite del hardware y toda la firma se realiza dentro del HSM. Para autenticarse en el HSM, se recomienda crear una cuenta principal de servicio a la que se haya concedido acceso para firmar con las claves gestionadas. Un HSM en la nube puede ser una gran opción para gestionar claves de firmante de votos, ya que es posible que desee que estas claves sean portátiles pero también mantener buenas prácticas de seguridad.

Crear una suscripción Azure

Si aún no tiene una suscripción a Azure, puede crear una prueba gratuita aquí que comienza con 200 dólares de crédito. Puede ver los precios de las claves HSM de Eliptic Curve Cryptography (ECC) aquí.

Despliegue de su Caja Fuerte de Llaves Azure

La Caja Fuerte puede almacenar llaves, secretos y certificados. Se pueden especificar permisos para realizar determinadas acciones en toda la Bóveda de claves (por ejemplo, la firma de claves).

  • Buscar "Key Vault" en el mercado
  • Haga clic en Crear y rellene la información de despliegue
  • Asegúrese de seleccionar el nivel de precios Premium para el soporte HSM
  • Activa la protección contra borrado suave y purga para asegurarte de que tus claves no se borran accidentalmente

Cree su llave

A continuación, crearemos la clave ECDSA.

  • Navegue hasta su recién creada Caja Fuerte de Claves y haga clic en la sección Keys.
  • Haga clic en "Generate/Import"
  • Selecciona "EC-HSM"
  • Selecciona "SECP256K1"

Verás tu nueva clave generada en la sección Keys.

# En su máquina local
export AZURE_VAULT_NAME=<VAULT-NAME>
export AZURE_KEY_NAME=<KEY-NAME>

Crear un servicio principal

Se prefiere un Service Principal (SP) a su cuenta personal para poder restringir mucho los permisos. En general, las cuentas de Service Principal deben utilizarse para cualquier automatización o servicio que necesite acceder a los recursos de Azure.

Utilice Cloud Shell para crear las credenciales de cliente.

Cree un service principal y configure su acceso a los recursos de Azure:

# En el shell de la nube
az ad sp create-for-rbac -n <your-application-name> --skip-assignment

Se creará la cuenta y se mostrarán sus credenciales.

{
"appId": "generated-app-ID",
"displayName": "dummy-app-name",
"name": "http://dummy-app-name",
"password": "random-password",
"tenant": "tenant-ID"
}

Establézcalas como variables de entorno para que puedan ser utilizadas por celocli o contractkit.

# En su máquina local
export AZURE_CLIENT_ID=<GENERATED-APP-ID>
export AZURE_CLIENT_SECRET=<PASSWORD>
export AZURE_TENANT_ID=<TENANT-ID>

Conceda a su Servicio Principal acceso a la clave

En el panel Cloud Shell o Políticas de acceso de la Caja Fuerte de claves, establezca el permiso [GET, LIST, SIGN] para la nueva cuenta.

# En el Shell de la nube
az keyvault set-policy --name <your-key-vault-name> --spn $AZURE_CLIENT_ID --key-permissions get list sign

Conexión de CeloCLI a KeyVault

Ahora que sus variables de entorno están configuradas, sólo tenemos que dejar que celocli sepa que queremos utilizar este firmante de Key Vault. Hacemos esto pasando la bandera --useAKV y --azureVaultName. Similar a --useLedger, todos los comandos CLI usarán el signer HSM cuando se especifique --useAKV.

# En su máquina local
celocli account:list --useAKV --azureVaultName $AZURE_VAULT_NAME

Tu dirección de Key Vault aparecerá en "Local Addresses". Si desea utilizar esta clave como su clave de firmante de votos, puede seguir esta guía y sustituir --useLedger por --useAKV --azureVaultName $AZURE_VAULT_NAME.

Conexión de ContractKit a KeyVault

Para aprovechar sus claves HSM en contractkit, cree primero un objeto AzureHSMWallet y utilícelo para crear un objeto ContractKit con newKitFromWeb3. Tenga en cuenta que AzureHSMWallet espera que se especifiquen las variables de entorno AZURE_CLIENT_ID, AZURE_CLIENT_SECRET y AZURE_TENANT_ID.

import { ContractKit, newKitFromWeb3 } from "@celo/contractkit";
import { AzureHSMWallet } from "@celo/wallet-hsm-azure";

const azureVaultName = "AZURE-VAULT-NAME";
const akvWallet = await new AzureHSMWallet(azureVaultName);
await akvWallet.init();
console.log(`Found addresses: ${await akvWallet.getAccounts()}`);
const contractKit = newKitFromWeb3(this.web3, akvWallet);

Resumen

Ahora puede aprovechar una clave HSM en la nube para realizar la firma como usuario o aplicación. Esto mejora tanto la seguridad como la disponibilidad de sus llaves Celo. También recomendamos activar la autenticación de dos factores en toda la suscripción a Azure y aprovechar Managed Service Identities siempre que sea posible.