保护对托管 HSM 的访问

本教程提供了 Azure Key Vault 托管 HSM 访问控制的实际实现示例。 你将学习如何通过一个现实场景使用 Azure RBAC 和托管 HSM 本地 RBAC 来实现职责分离。

重要

在继续学习本教程之前,请确保了解托管 HSM 访问控制模型,包括控制平面和数据平面访问之间的差异。 有关此概念基础,请参阅托管 HSM 访问控制

先决条件

  • Azure 订阅。 如果没有 Azure 订阅,可注册一个试用版订阅
  • Azure CLI 版本 2.25.0 或更高版本。 运行 az --version 即可查找版本。 如需进行安装或升级,请参阅安装 Azure CLI
  • 订阅中的托管 HSM。 请参阅快速入门:使用 Azure CLI 预配和激活托管 HSM,了解如何预配和激活托管 HSM。

登录到 Azure

若要使用 CLI 登录到 Azure,可以键入:

az cloud set -n AzureChinaCloud
az login
# az cloud set -n AzureCloud   //means return to Public Azure.

若要详细了解通过 CLI 使用的登录选项,请参阅使用 Azure CLI 登录

了解示例方案

本例中,我们正在开发一个应用程序,该应用程序使用 RSA 2048 位密钥进行签名操作。 我们的应用程序在具有托管标识的 Azure 虚拟机 (VM) 中运行。 用于签名的 RSA 密钥存储在托管 HSM 中。

定义角色和职责

我们已确定了负责管理、部署和审核应用程序的以下角色:

  • 安全团队:CSO(首席安全官)办公室中的 IT 人员或类似参与者。 安全团队负责妥善保管密钥。 密钥包括用于签名的 RSA 或 EC 密钥,以及用于数据加密的 RSA 或 AES 密钥。
  • 开发人员和操作人员:开发应用程序并在 Azure 中进行部署的人员。 此团队的成员不属于安全人员。 他们不应有权访问 RSA 密钥等敏感数据。 仅他们部署的应用程序才应有权访问此敏感数据。
  • 审核员:此角色适用于不属于开发人员或一般 IT 人员的参与者。 他们评审证书、密钥和机密的使用及维护,确保符合安全标准。

还有一个超出我们应用程序范围的角色:订阅(或资源组)管理员。 订阅管理员为安全团队设置初始访问权限。 他们通过使用具有应用程序所需资源的资源组来授予安全团队访问权限。

定义每个角色所需的操作

我们需要为角色的以下操作进行授权:

安全团队

  • 创建托管 HSM
  • 下载托管 HSM 安全域(用于灾难恢复)
  • 启用日志
  • 生成或导入密钥
  • 创建用于灾难恢复的托管 HSM 备份
  • 设置托管 HSM 本地 RBAC,向用户和应用程序授予执行特定操作的权限
  • 定期更新密钥

开发人员和操作人员

  • 从安全团队获取用于签名的 RSA 密钥的参考(密钥 URI)
  • 开发和部署以编程方式访问密钥的应用程序

审核人员

  • 查看密钥到期日期,确保密钥保持最新
  • 监视角色分配,确保仅授权用户/应用程序可以访问密钥
  • 查看托管 HSM 日志,确认正确使用符合数据安全标准的密钥

分配适当的角色

下表总结了为访问托管 HSM 而对团队和资源进行的角色分配。

角色 控制平面角色 数据平面角色
安全团队 托管 HSM 参与者 托管 HSM 管理员
开发人员和操作员 没有 没有
审核人员 没有 托管 HSM 加密审核者
应用程序所用 VM 的托管标识 没有 托管 HSM 加密用户
应用程序所用存储帐户的托管标识 没有 托管 HSM 加密服务加密

三个团队角色需要访问其他资源的权限以及托管 HSM 权限。 若要部署 VM(或 Azure 应用服务的 Web 应用功能),开发人员和操作人员需要对这些资源类型的 Contributor 访问权限。 审核员需要具有对存储托管 HSM 日志的存储帐户的“读取”访问权限。

使用 Azure CLI 实现

若要分配控制平面角色(Azure RBAC),可以使用 Azure 门户或任何其他管理接口,例如 Azure CLI 或 Azure PowerShell。 若要分配托管 HSM 数据平面角色,必须使用 Azure CLI 或 Azure REST API。

有关控制平面角色的详细信息,请参阅 Azure 内置角色。 有关托管 HSM 数据平面角色的详细信息,请参阅托管 HSM 的本地 RBAC 内置角色

以下 Azure CLI 代码片段演示如何实现上述角色分配:

假设

  • Microsoft Entra 管理员已创建安全组来表示三个角色:Contoso 安全团队、Contoso 应用开发运营团队和 Contoso 应用审核员。 管理员已将用户添加到其各自的组中。
  • 所有资源都位于 ContosoAppRG 资源组中。
  • 托管 HSM 日志存储在 contosologstorage 存储帐户中。
  • ContosoMHSM” 托管 HSM 和 “contosologstorage” 存储帐户位于同一 Azure 位置。

分配控制平面角色

订阅管理员将 Managed HSM Contributor 角色分配给安全团队。 此角色允许安全团队管理现有的托管 HSM 以及新建托管 HSM。

# This role assignment allows Contoso Security Team to create new Managed HSMs
az role assignment create --assignee-object-id $(az ad group show -g 'Contoso Security Team' --query 'id' -o tsv) --assignee-principal-type Group --role "Managed HSM Contributor"

分配数据平面角色

对于现有的托管 HSM,安全团队需要分配“托管 HSM 管理员”角色来管理它们:

# This role assignment allows Contoso Security Team to become administrator of existing managed HSM
az keyvault role assignment create --hsm-name ContosoMHSM --assignee $(az ad group show -g 'Contoso Security Team' --query 'id' -o tsv) --scope / --role "Managed HSM Administrator"

配置日志记录并分配其他角色

安全团队设置日志记录并将角色分配给审核员和 VM 应用程序:

# Enable logging
hsmresource=$(az keyvault show --hsm-name ContosoMHSM --query id -o tsv)
storageresource=$(az storage account show --name contosologstorage --query id -o tsv)
az monitor diagnostic-settings create --name MHSM-Diagnostics --resource $hsmresource --logs '[{"category": "AuditEvent","enabled": true}]' --storage-account $storageresource

# Assign the "Crypto Auditor" role to Contoso App Auditors group. It only allows them to read.
az keyvault role assignment create --hsm-name ContosoMHSM --assignee $(az ad group show -g 'Contoso App Auditors' --query 'id' -o tsv) --scope / --role "Managed HSM Crypto Auditor"

# Grant the "Crypto User" role to the VM's managed identity. It allows to use keys.
az keyvault role assignment create --hsm-name ContosoMHSM --assignee $(az vm identity show --name "vmname" --resource-group "ContosoAppRG" --query principalId -o tsv) --scope / --role "Managed HSM Crypto User"

# Assign "Managed HSM Crypto Service Encryption User" role to the Storage account identity
storage_account_principal=$(az storage account show --id $storageresource --query identity.principalId -o tsv)
# (if no identity exists), then assign a new one
[ "$storage_account_principal" ] || storage_account_principal=$(az storage account update --assign-identity --id $storageresource --query identity.principalId -o tsv)

az keyvault role assignment create --hsm-name ContosoMHSM --role "Managed HSM Crypto Service Encryption User" --assignee $storage_account_principal

生产环境的注意事项

本教程演示了一个简化的方案,演示了访问控制实现。

根据特定要求调整对托管 HSM 的权限。 在此示例中,我们假设安全团队向 DevOps 员工提供密钥和机密引用(URI 和指纹),以便在其应用程序中使用。 开发人员和运营人员不需要直接访问数据平面。 虽然本教程重点介绍如何保护托管 HSM,但对其他 Azure 资源(例如 虚拟机存储帐户和其他资源)应用类似的安全措施。

后续步骤