使用 Azure Database for MySQL 的客户托管密钥进行数据加密

通过对 Azure Database for MySQL 使用客户管理的密钥进行数据加密,可以使用自己的密钥 (BYOK) 来保护静态数据,从而实现密钥管理与数据管理的职责分离。 使用客户管理的密钥(CMK)时,可以控制:

  • 密钥生命周期管理,包括密钥创建、上传、轮换和删除
  • 密钥使用权限
  • 对密钥的审核操作

客户管理密钥(CMK)的优势

使用客户管理的密钥为 Azure Database for MySQL 进行数据加密提供以下优势:

  • 可以通过删除密钥并使数据库无法访问来完全控制数据访问。
  • 你可以完全控制密钥生命周期,包括密钥轮换,以符合公司策略。
  • 可以在Azure 密钥保管库集中管理和组织密钥。
  • 你可以实现安全人员、DBA 和系统管理员之间的职责分离。

使用客户管理的密钥进行数据加密的工作原理

Microsoft Entra ID 中的托管标识提供了一种更安全的方式来对服务进行客户端认证。 CMK 加密使用 Azure Database for MySQL 服务器的托管标识连接到存储 CMK 的 Azure 密钥保管库。 Azure Database for MySQL目前仅支持用户分配的托管标识(UAMI)来访问密钥保管库。 有关详细信息,请参阅 Azure 中的托管标识类型

若要为Azure Database for MySQL配置 CMK,请将 UAMI 链接到服务器,并指定要使用的Azure 密钥保管库和密钥。

UAMI 需要对密钥保管库进行以下访问:

  • 获取:用于检索密钥保管库中密钥的公共部分和属性。
  • 列表:列出存储在密钥保管库中的密钥的版本。
  • 包装密钥:加密 DEK。 加密的 DEK 存储在 Azure Database for MySQL 灵活服务器实例中。
  • 解包密钥:解密 DEK。 Azure Database for MySQL需要解密的 DEK 来加密或解密数据。

如果启用了 Azure RBAC,请将角色分配给 UAMI,而不要单独授予访问权限。

  • 密钥保管库加密服务加密用户或具有权限的角色:
    • Microsoft.KeyVault/vaults/keys/wrap/action
    • Microsoft.KeyVault/vaults/keys/unwrap/action
    • Microsoft.KeyVault/vaults/keys/read,如“密钥保管库加密服务加密用户”

在服务器级别使用 CMK 设置数据加密。 对于特定服务器,使用称为密钥加密密钥(KEK)的 CMK 对服务的数据加密密钥(DEK)进行加密。 KEK 是一种非对称密钥,它存储在客户自有和客户管理的 Azure 密钥保管库实例中。 密钥保管库 是用于存储 RSA 加密密钥的高度可用且可缩放的安全存储。 密钥保管库不允许直接访问存储的密钥,而是使用密钥向授权实体提供加密和解密服务。 密钥保管库可以生成密钥。

将灵活服务器配置为使用存储在 Key Vault 中的 CMK 时,该服务器会将 DEK 发送到 Key Vault 进行加密。 密钥保管库 返回存储在用户数据库中已加密的 DEK。 同样,灵活服务器会根据需要将受保护的 DEK 发送到密钥保管库进行解密。

使用客户管理的密钥进行数据加密的工作原理图。

启用日志记录后,审核员可以使用Azure Monitor来查看密钥保管库审核事件日志。 若要启用密钥保管库审核事件的日志记录,请参阅“使用密钥保管库见解监视密钥保管库服务”。

注释

权限更改最多可能需要在 10 分钟后才会影响密钥保管库。

为 Azure Database for MySQL 配置数据加密的要求

在尝试配置密钥保管库之前,请务必满足以下要求。

  • 密钥保管库和 Azure Database for MySQL 灵活服务器实例必须属于同一个 Microsoft Entra 租户。 需要支持跨租户的 密钥保管库 和灵活服务器交互。 如果在执行配置后移动密钥保管库资源,则需要重新配置数据加密。
  • 密钥保管库和 Azure Database for MySQL 灵活服务器实例必须位于同一区域。
  • 在密钥保管库上启用 软删除 功能
  • 启用 清除保护
  • 将保留期设置为 90 天。
    • 恢复和清除操作在 密钥保管库 访问策略中各自具有相应的权限。
    • 默认情况下,软删除功能处于关闭状态。

在尝试配置 CMK 之前,请务必满足以下要求。

  • 用于加密 DEK 的客户管理的密钥只能非对称、RSA 2048、3072 或 4096。
  • 密钥激活日期(如果已设置)必须是过去的日期和时间。 未设置到期日期。
  • 密钥必须处于“已启用”状态。
  • 密钥必须已启用软删除,保留期设置为 90 天。 此设置将所需的键属性 recoveryLevel 隐式设置为 Recoverable
  • 密钥必须启用清除保护
  • 将现有密钥导入密钥保管库,请确保以受支持的文件格式(.pfx.byok.backup)提供该密钥。

注释

有关如何配置数据加密的详细分步说明,请参阅 Azure 门户的 Azure Database for MySQL 数据加密,或使用 Azure CLI 对 Azure Database for MySQL 灵活服务器进行数据加密

有关配置数据加密的建议

将密钥保管库配置为将数据加密与客户管理的密钥配合使用时,请记住以下建议:

  • 在 密钥保管库 中设置资源锁可控制谁能删除该关键资源,并防止意外或未经授权的删除。
  • 对所有加密密钥启用审核和报告功能。 密钥保管库 提供可轻松注入到其他安全信息和事件管理工具的日志。
  • 将客户管理的密钥副本保存在安全的位置,或将其托管到托管服务。
  • 如果 密钥保管库 生成密钥,请在首次使用该密钥之前创建密钥备份。 只能将备份还原到 密钥保管库。 要详细了解备份命令,请参阅 Backup-AzKeyVaultKey

注释

使用的密钥保管库必须来自数据库服务器所在的同一区域。

无法访问客户管理的密钥的情形

在 密钥保管库 中使用 CMK 配置数据加密时,服务器需要持续访问此密钥才能保持联机状态。 如果灵活服务器无法访问密钥保管库中客户管理的密钥,它将在 10 分钟内开始拒绝所有连接。 灵活服务器会发出相应的错误消息,并将服务器状态更改为“无法访问”。 服务器可能出于各种原因进入此状态。

如果删除密钥保管库,Azure Database for MySQL灵活服务器实例无法访问密钥并移动到Inaccessible状态。 若要创建服务器实例 Available

如果从密钥保管库中删除密钥,则Azure Database for MySQL灵活服务器实例无法访问密钥并移动到Inaccessible状态。 若要创建服务器实例 Available

  • 恢复 密钥
  • 重新验证数据加密。

注释

即使密钥过期,服务器仍可通过设计保持可访问性,以防止停机。

从 密钥保管库 意外撤消密钥访问

对密钥保管库具有足够访问权限的人员可能会意外禁用对密钥的灵活服务器访问:

  • 撤销服务器对密钥保管库获取、列出、包装密钥和拆解密钥的权限
  • 删除密钥
  • 删除密钥保管库
  • 更改密钥保管库的防火墙规则
  • 使用 Microsoft Entra ID 中客户管理的密钥删除用于在灵活服务器上进行加密的用户管理的标识

在 密钥保管库 中监视客户管理的密钥

若要监视数据库状态并启用透明数据加密保护程序访问丢失警报,请配置以下Azure功能:

  • 活动日志:对 密钥保管库 中客户管理的密钥访问失败时,活动日志中会添加相应条目。 如果为这些事件创建警报,就可尽快恢复访问。
  • 操作组:定义这些组,使其根据首选项发送通知和警报。

副本和密钥保管库中客户管理的密钥

使用存储在密钥保管库中的客户托管密钥加密Azure Database for MySQL灵活服务器实例时,也会加密服务器的任何新创建副本。 尝试使用已具有副本的客户托管密钥加密Azure Database for MySQL灵活服务器实例时,请通过添加托管标识和密钥来配置一个或多个副本。 如果将 Azure Database for MySQL 灵活服务器实例配置为使用异地冗余备份,则必须使用托管标识以及该标识有权访问的、位于服务器异地配对区域中的密钥来配置副本。

使用密钥保管库中客户管理的密钥进行还原

还原Azure Database for MySQL灵活服务器实例时,请选择用户管理的标识和密钥以加密还原服务器。 如果 Azure Database for MySQL 灵活服务器实例配置了异地冗余备份,则必须使用托管标识以及该标识有权访问、且位于该服务器异地配对区域中的密钥来配置还原服务器。

在执行还原或创建只读副本时,请在源服务器以及还原后的服务器或副本服务器上执行以下步骤:

  • 从源 Azure Database for MySQL 灵活服务器实例启动还原或只读副本创建过程。
  • 在已还原的服务器或副本服务器上,重新验证数据加密设置中的 CMK,以验证 UAMI 对该密钥的权限。

注释

执行还原时,无需使用与源服务器上相同的标识(UAMI)和密钥。