托管 HSM 灾难恢复

如果由于以下任何原因导致原始 HSM 丢失或不可用,你可能希望创建精确的 HSM 副本:

  • 原始 HSM 被删除,然后被清除。
  • 该区域的灾难性故障已导致所有成员分区遭到破坏。

如果具备以下条件,你可以在相同或不同区域中重新创建 HSM 实例:

  • 源 HSM 的安全域
  • 加密安全域的私钥(至少达到仲裁数)。
  • 来自源 HSM 的最新完整 HSM 备份

以下是灾难恢复过程的步骤:

  1. 新建 HSM 实例。
  2. 激活“安全域恢复”。 将为安全域传输生成一个新的 RSA 密钥对(安全域交换密钥)并在响应中发送,该密钥对将以 SecurityDomainExchangeKey(公共密钥)的形式下载。
  3. 创建并上传“安全域传输文件”。 你需要用于加密安全域的私钥。 私钥在本地使用,在此过程中绝不会转移到任何位置。
  4. 获取新 HSM 的备份。 进行任何还原之前都需要备份(即使 HSM 为空)。 使用备份能够轻松地实现回滚。
  5. 从源 HSM 还原最近的 HSM 备份。

通过执行这些步骤,你能够手动将 HSM 的内容复制到另一个区域。 HSM 名称(以及服务终结点 URI)会有所不同,因此必须更改应用程序配置才能从其他位置使用这些密钥。

新建托管 HSM

使用 az keyvault create 命令创建托管 HSM。 此脚本包含 3 个必需参数:资源组名称、HSM 名称和地理位置。

必须提供以下输入才能创建托管 HSM 资源:

  • HSM 的名称。
  • 要将其放置在订阅中的资源组。
  • Azure 位置。
  • 初始管理员的列表。

以下示例会在资源组 ContosoResourceGroup(位于中国北部 3 位置)创建一个名为 ContosoMHSM2 的 HSM,并将当前已登录的用户设为唯一管理员

oid=$(az ad signed-in-user show --query objectId -o tsv)
az keyvault create --hsm-name "ContosoMHSM2" --resource-group "ContosoResourceGroup" --location "chinanorth3" --administrators $oid

注意

运行 create 命令可能需要几分钟的时间。 它成功返回输出后,便可激活 HSM。

警告

托管 HSM 实例被视为始终在使用中。 如果选择使用 --enable-purge-protection 标志启用清除保护,则整个保留期都会计费。

此命令的输出会显示创建的托管 HSM 的属性。 两个最重要的属性是:

  • 名称:在本示例中,名称为 ContosoMHSM。 将在其他 Key Vault 命令中使用此名称。
  • hsmUri:在本示例中,URI 为“https://contosomhsm2.managedhsm.chinacloudapi.cn.” 通过其 REST API 使用 HSM 的应用程序必须使用此 URI。

Azure 帐户现已获得授权,可在此托管 HSM 上执行任何作业。 到目前为止,尚未授权其他任何人。

激活“安全域恢复”模式

此时,在正常的创建过程中,需要进行初始化并下载 HSM 的新安全域。 但由于正在执行灾难恢复过程,我们需要 HSM 进入安全域恢复模式并改为下载安全域交换密钥。 安全域交换密钥是 RSA 公钥,用于在将安全域上传到 HSM 之前对其进行加密。 相应的私钥在 HSM 中受到保护,以确保安全域内容在传输过程中是安全的。

az keyvault security-domain init-recovery --hsm-name ContosoMHSM2 --sd-exchange-key ContosoMHSM2-SDE.cer

创建源 HSM 的安全域上传 blob

在本步骤中,需要具备以下项:

  • 在上一步中下载的安全域交换密钥。
  • 源 HSM 的安全域。
  • 曾用于加密安全域的私钥(至少达到仲裁数)。

az keyvault security-domain restore-blob 命令执行以下操作:

  • 使用你提供的私钥解密源 HSM 的安全域。
  • 创建一个使用在上一步中下载的安全域交换密钥加密的安全域上传 blob

该步骤可以离线执行。

在下面的示例中,我们使用来自 ContosoMHSM 的安全域(对应私钥中的 3)和安全域交换密钥来创建和下载加密的 blob,该 blob 将用于上传到 ContosoMHSM2(正在等待接收安全域)

az keyvault security-domain restore-blob --sd-exchange-key ContosoMHSM2-SDE.cer --sd-file ContosoMHSM-SD.json --sd-wrapping-keys cert_0.key cert_1.key cert_2.key --sd-file-restore-blob restore_blob.json 

将安全域上传 blob 上传到目标 HSM

现在,我们使用在上一步中创建的安全域上传 blob,并将其上传到目标 HSM 以完成安全域恢复。 --restore-blob 标志用于防止在联机环境中公开密钥。

az keyvault security-domain upload --hsm-name ContosoMHSM2 --sd-file restore_blob.json --restore-blob

现在,源 HSM (ContosoMHSM) 和目标 HSM (ContosoMHSM2) 具有相同的安全域。 我们可以立即将完整备份从源 HSM 还原到目标 HSM。

备份和还原

建议在执行完整的 HSM 还原之前,始终获取完整的备份,这样可以获得一个还原点,以防还原出现问题。 可以使用以下两种方法之一执行此操作:用户分配的托管标识或 SAS 令牌。

创建新 HSM 的备份(作为还原点)

若要创建 HSM 备份,需要具备以下项:

  • 用于存储备份的存储帐户
  • 此存储帐户中的 Blob 存储容器,备份过程将在其中新建文件夹,用于存储加密备份
  • 在存储帐户上具有存储 Blob 数据参与者角色的用户分配的托管标识或具有“crdw”权限的存储容器 SAS 令牌

在以下示例中,我们对存储帐户 mhsmdemobackup 的存储容器 mhsmbackupcontainer 中的 HSM 备份使用 az keyvault backup 命令

在以下示例中,如果使用用户分配的托管标识方法,我们会使用 --mi-user-assigned 参数指定用户分配的托管标识,并将其关联到托管 HSM,然后再写入备份。

az keyvault update-hsm --hsm-name ContosoMHSM2 --mi-user-assigned "/subscriptions/subid/resourcegroups/mhsmrgname/providers/Microsoft.ManagedIdentity/userAssignedIdentities/userassignedidentityname"
az keyvault backup start --use-managed-identity true --hsm-name ContosoMHSM2 --storage-account-name mhsmdemobackup --blob-container-name mhsmbackupcontainer

从源 HSM 还原备份

对于此步骤,需要以下项:

  • 其中存储了源 HSM 备份的存储帐户和 Blob 容器。
  • 要从其中还原备份的文件夹的名称。 如果创建常规备份,此容器中将产生许多文件夹。

在以下示例中,我们使用想要还原的源 MHSM 的备份对新 HSM ContosoMHSM2 使用 az keyvault restore 命令,该备份位于存储帐户 ContosoBackup 的存储容器 mhsmdemobackupcontainer 中的 mhsm-ContosoMHSM-2020083120161860 文件夹中

如果使用用户分配的托管标识方法,我们会将 --use-managed-identity 参数设置为“true”。

az keyvault restore start --hsm-name ContosoMHSM2 --storage-account-name ContosoBackup --blob-container-name mhsmdemobackupcontainer --backup-folder mhsm-ContosoMHSM-2020083120161860 --use-managed-identity true

现在,你已完成了完整的灾难恢复过程。 进行备份时,源 HSM 的内容将复制到目标 HSM,包括所有密钥、版本、属性、标记和角色分配。

后续步骤