使用客户管理的密钥进行透明数据加密的托管标识
适用于: Azure SQL 数据库 Azure SQL 托管实例
Microsoft Entra ID(以前称为 Azure Active Directory)提供自动托管标识,可对支持 Microsoft Entra 身份验证的任何 Azure 服务(例如 Azure Key Vault)进行身份验证,而无需在代码中公开凭据。 有关详细信息,请参阅 Azure 中的托管标识类型。
托管标识有两种类型:
- 系统分配
- 用户分配
有关详细信息,请参阅 Microsoft Entra ID 中用于 Azure SQL 的托管标识。
对于 Azure SQL 中带有客户托管密钥 (CMK) 的 TDE,服务器上的托管标识用于提供对密钥保管库上服务器的访问权限。 例如,在服务器上启用带有 CMK 的 TDE 之前,应向系统分配的服务器托管身份提供密钥保管库权限。
除了带有 CMK 的 TDE 已经支持的系统分配的托管标识之外,分配给服务器的用户分配的托管标识 (UMI) 可用于允许服务器访问密钥保管库。 启用密钥保管库访问的先决条件是确保已向用户分配的托管标识提供对密钥保管库的 Get、wrapKey 和 unwrapKey 权限。 由于用户分配的托管标识是可以创建并可被授予对密钥保管库访问权限的独立资源,因此现在可以在创建服务器或数据库时启用带有客户托管密钥的 TDE。
注意
要将用户分配的托管标识分配给逻辑服务器或托管实例,用户必须具有 SQL Server 参与者或 SQL 托管实例参与者 Azure RBAC 角色以及包含 Microsoft.ManagedIdentity/userAssignedIdentities/*/assign/action 操作的任何其他 Azure RBAC 角色。
将 UMI 用于客户管理的 TDE 的优势
通过创建用户分配的托管标识并授予其对密钥保管库的访问权限,即使是在创建服务器或数据库之前,也可以预先授权对 Azure SQL 逻辑服务器或托管实例的密钥保管库访问权限
允许创建启用了 TDE 和 CMK 的 Azure SQL 逻辑服务器
允许将相同的用户分配的托管标识分配给多个服务器,无需为每个 Azure SQL 逻辑服务器或托管实例单独开启系统分配的托管标识,并为其提供对密钥保管库的访问权限
提供了如下功能:使用可用的内置 Azure 策略在创建服务器时强制执行 CMK
将 UMI 用于客户管理的 TDE 时的注意事项
- 默认情况下,Azure SQL 中的 TDE 使用服务器上设置的主要用户分配托管标识进行密钥保管库访问。 如果尚未将用户分配的身份分配给服务器,则系统分配的服务器托管标识将用于密钥保管库访问。
- 将用户分配的托管标识用于 TDE 和 CMK 时,请将该标识分配给服务器并将其设置为服务器的主要标识
- 用户分配的主要托管标识需要持续的密钥保管库访问权限(get、wrapKey、unwrapKey 权限)。 如果标识对密钥保管库的访问权限被撤销或未提供足够的权限,则数据库将进入“不可访问”状态
- 如果主用户分配的托管标识正在更新为不同的用户分配托管标识,则必须先向新标识授予对密钥保管库的所需权限,然后才能更新主标识
- 若要将服务器从用户分配的托管标识切换到系统分配的托管标识以进行密钥保管库访问,请为系统分配的托管标识提供所需的密钥保管库权限,然后从服务器中删除所有由用户分配的托管标识
重要
不应从 Azure 中删除用于带有 CMK 的 TDE 的用户分配的主要托管标识。 删除此标识将导致服务器失去对密钥库的访问权限,并且数据库变为“无法访问”。
限制和已知问题
- 如果密钥保管库位于使用防火墙的 VNet 之后,若要使用用户分配的托管标识或系统分配的托管标识,则必须在密钥保管库的“网络”菜单中启用“允许受信任的 Microsoft 服务绕过此防火墙”选项。 启用此选项后,无法在 Azure 门户的 SQL Server TDE 菜单中列出可用密钥。 要设置单个 CMK,必须使用密钥标识符。 未启用“允许受信任的 Microsoft 服务绕过此防火墙”选项时,将返回以下错误:
Failed to save Transparent Data Encryption settings for SQL resource: <ServerName>. Error message: The managed identity with ID '/subscriptions/subsriptionID/resourcegroups/resource_name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/umi_name' requires the following Azure Key Vault permissions: 'Get, WrapKey, UnwrapKey' to the key 'https://keyvault_name/keys/key_name'. Please grant the missing permissions to the identity. Additionally ensure the key is not expired and is not disabled. For expired key, please extend the key expiry time so that SQL can use it to perform wrap and unwrap operations. If your key vault is behind a virtual network or firewall, ensure you select the 'Allow trusted Microsoft services to bypass this firewall' option. (https://docs.azure.cn/azure-sql/database/transparent-data-encryption-byok-create-server).
- 如果收到上述错误,请检查密钥保管库是否位于虚拟网络或防火墙之后,并确保已启用“允许受信任的 Microsoft 服务绕过此防火墙”选项。
- 目前,只有启用了“从所有网络进行公共访问”的密钥保管库才支持 SQL 托管实例的用户分配的托管标识。 当 AKV 防火墙筛选特定虚拟网络和 IP 地址或使用专用终结点连接时,不支持此标识。
- 将多个由用户分配的托管标识分配给服务器或托管实例时,如果使用 Azure 门户的“标识”窗格从服务器中删除单个标识,则操作虽然会成功,但不会从服务器中删除标识。 从 Azure 门户中同时删除所有由用户分配的托管标识的操作将会奏效。
- 当服务器或托管实例配置了客户托管的 TDE 并且在服务器上同时启用了系统分配的托管标识和用户分配的托管标识时,如果直接从服务器中删除用户分配的托管标识,但没有首先为系统分配的托管标识授予密钥保管库的访问权限,那么将导致出现“发生意外错误”消息。 在从服务器中删除主要的用户分配的托管标识(和任何其他用户分配的托管标识)之前,请确保已为系统分配的托管标识提供密钥保管库访问权限。