托管 HSM 灾难恢复
如果由于以下任何原因导致原始 HSM 丢失或不可用,你可能希望创建精确的 HSM 副本:
- 原始 HSM 被删除,然后被清除。
- 该区域的灾难性故障已导致所有成员分区遭到破坏。
如果具备以下条件,你可以在相同或不同区域中重新创建 HSM 实例:
以下是灾难恢复过程的步骤:
- 新建 HSM 实例。
- 激活“安全域恢复”。 将为安全域传输生成一个新的 RSA 密钥对(安全域交换密钥)并在响应中发送,该密钥对将以 SecurityDomainExchangeKey(公共密钥)的形式下载。
- 创建并上传“安全域传输文件”。 你需要用于加密安全域的私钥。 私钥在本地使用,在此过程中绝不会转移到任何位置。
- 获取新 HSM 的备份。 进行任何还原之前都需要备份(即使 HSM 为空)。 使用备份能够轻松地实现回滚。
- 从源 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,包括所有密钥、版本、属性、标记和角色分配。
后续步骤
- 若要详细了解安全域,请参阅关于托管 HSM 安全域
- 遵循托管 HSM 最佳做法