在 Azure Database for PostgreSQL 灵活服务器中使用客户管理的密钥进行数据加密

适用于:Azure Database for PostgreSQL 灵活服务器

默认情况下,Azure Database for PostgreSQL 灵活服务器使用 Azure 存储加密,通过 Azure 管理的密钥来加密静态数据。 对于 Azure Database for PostgreSQL 灵活服务器用户,这与其他数据库(例如 SQL Server)中的透明数据加密 (TDE) 类似。

许多组织要求使用客户管理的密钥 (CMK) 来完全控制对数据的访问权限。 通过使用客户管理的密钥对 Azure Database for PostgreSQL 灵活服务器进行数据加密,让你能够创建自己的密钥 (BYOK) 来保护静态数据。 通过它,组织还可在管理密钥和数据时实现职责分离。 通过 CMK 的加密,密钥的生命周期、密钥使用权限以及对密钥操作的审核都由你负责和完全控制。

使用客户管理的密钥对 Azure Database for PostgreSQL 灵活服务器进行数据加密需在服务器级别进行设置。 对于特定服务器,一种称为密钥加密密钥 (KEK) 的 CMK 用于加密服务的数据加密密钥 (DEK)。 KEK 是一种非对称密钥,它存储在客户自有和客户管理的 Azure 密钥保管库实例中。 本文稍后将更详细地介绍 KEK 和 DEK。

Key Vault 是一种基于云的外部密钥管理系统。 它具有高可用性,并为 RSA 加密密钥提供可扩展的安全存储。 它不允许直接访问存储的密钥,而是为已获授权的实体提供加密和解密服务。 密钥保管库可以生成密钥,也可以导入密钥。

好处

使用客户管理的密钥对 Azure Database for PostgreSQL 灵活服务器进行数据加密具有以下优势:

  • 完全控制数据访问。 可以删除密钥以使数据库不可访问。

  • 可以完全控制密钥的生命周期,包括按照公司策略的要求轮换密钥。

  • 可以在密钥保管库中集中管理和整理密钥。

  • 无论有或没有 CMK,启动加密都不会影响性能,因为 PostgreSQL 在这两种情况下都依赖 Azure 存储层进行数据加密。 唯一区别在于,当使用 CMK 时,Azure 存储加密密钥(执行实际数据加密)会被加密。

  • 可实现安全管理人员、数据库管理员和系统管理员之间的职责分离。

术语

数据加密密钥 (DEK) – 用于加密分区或数据块的对称 AES 256 密钥。 使用不同的密钥加密每个数据块可以令加密分析攻击更难以实现。 资源提供程序或应用程序实例需要 DEK 访问权限才能加密和解密特定的块。 将 DEK 替换为新密钥时,只需使用新密钥对其关联的块中的数据重新加密。

密钥加密密钥 (KEK):用于加密 DEK 的加密密钥。 KEK 始终在 Key Vault 中,这使得 DEK 本身能得到加密和控制。 有权访问 KEK 的实体可能与需要 DEK 的实体不同。 由于解密 DEK 需要 KEK,因此 KEK 实际上构成了一个单点机制:删除 KEK 即可删除 DEK。

DEK 使用 KEK 加密且单独存储。 只有有权访问 KEK 的实体才能解密这些 DEK。 有关详细信息,请参阅静态加密中的安全性

使用 CMK 进行数据加密的工作原理

显示“创建自己的密钥”概述的示意图。

Microsoft Entra 用户分配的托管标识用于连接和检索 CMK。 若要创建标识,请遵循本教程

若要使 PostgreSQL 服务器使用存储在 Key Vault 中的客户管理的密钥对 DEK 进行加密,Key Vault 管理员需要为创建的托管标识授予以下访问权限

  • get:用于检索 Key Vault 中密钥的公共部分和属性。

  • list:用于列出和迭代 Key Vault 中的密钥。

  • wrapKey:用于加密 DEK。 加密的 DEK 存储在 Azure Database for PostgreSQL 中。

  • unwrapKey:用于解密 DEK。 Azure Database for PostgreSQL 需要经过解密的 DEK 对数据进行加密和解密。

Key Vault 管理员还可启用 Key Vault 审核事件的日志记录,便于稍后对其进行审核。

除上述访问权限分配外,还可以创建具有 Key Vault 加密服务加密用户角色的新 Azure RBAC 角色分配。

重要

如果未向托管标识提供访问 Key Vault 所需的上述访问权限或 RBAC 分配,可能会导致无法提取加密密钥,并且无法设置 CMK 功能。

将服务器配置为使用 Key Vault 中存储的 CMK 时,服务器会将 DEK 发送到 Key Vault 进行加密。 Key Vault 返回存储在用户数据库中已加密的 DEK。 如有必要,服务器会将受保护的 DEK 发送到 Key Vault 进行解密。 如果启用了日志记录,则审核者可使用 Azure Monitor 查看密钥保管库审核事件日志。

为 Azure Database for PostgreSQL 灵活服务器配置数据加密的要求

Key Vault 的配置要求如下:

  • Key Vault 和 Azure Database for PostgreSQL 灵活服务器必须属于同一个 Microsoft Entra 租户。 不支持跨租户的 Key Vault 和服务器交互。 之后若要移动 Key Vault 资源,需要重新配置数据加密。

  • 必须将 Key Vault 的“保留已删除保管库的天数”设置为 90。 如果现有 Key Vault 实例配置的保留天数少于 90,则需要新建 Key Vault 实例,因为在创建后无法修改实例。

  • 建议将密钥保管库的“已删除保管库的保留天数”配置设为 90 天。 如果已配置具有较低数量的现有密钥保管库实例,它仍应有效。 但是,如果想要修改此设置并增加该值,则需要创建新的密钥保管库实例。 创建实例后,将无法修改其配置。

  • 启用 Key Vault 中的软删除功能,以便在意外删除密钥或 Key Vault 实例时帮助防止数据丢失。 Key Vault 会将软删除资源保留 90 天,除非用户在此期间恢复或清除这些资源。 “恢复”和“清除”操作均自带与 Key Vault 访问策略关联的权限。

    默认情况下,软删除功能处于关闭状态,但可以通过 PowerShell 或 Azure CLI 开启。 无法通过 Azure 门户开启该功能。

  • 启用清除保护以对已删除的保管库和保管库对象执行强制保留期。

  • 通过唯一托管标识,使用 getlistwrapKeyunwrapKey 权限授权 Azure Database for PostgreSQL 灵活服务器实例访问 Key Vault。 或者,为托管标识创建具有 Key Vault 加密服务加密用户角色的新 Azure RBAC 角色分配。

下面是在 Azure Database for PostgreSQL 灵活服务器中配置 CMK 的要求:

  • 用于加密 DEK 的 CMK 只能是非对称的 RSA。 支持的密钥大小为 2048、3072 和 4096。

  • 密钥激活的日期和时间(如果已设置)必须是过去的日期和时间。 密钥过期的日期和时间(如果已设置)必须是未来的日期和时间。

  • 密钥必须处于 *Enabled- 状态。

  • 要将现有密钥导入 Key Vault,请确保以受支持的文件格式(.pfx.byok.backup)提供该密钥。

建议

使用 CMK 进行数据加密时,请查看下列 Key Vault 配置建议:

  • 在 Key Vault 中设置资源锁可控制谁能删除该关键资源,并防止意外或未经授权的删除。

  • 对所有加密密钥启用审核和报告功能。 Key Vault 提供可以轻松注入到其他安全信息和事件管理 (SIEM) 工具的日志。 Azure Monitor 日志就是一项已集成的服务。

  • 通过选择“禁用公共访问”和“允许受信任的 Microsoft 服务绕过此防火墙”来锁定 Key Vault。

    用于禁用公共访问和仅允许受信任的 Microsoft 服务访问的网络选项的屏幕截图。

注意

选择“禁用公共访问”和“允许受信任的 Microsoft 服务绕过此防火墙”后,尝试使用公共访问权限通过门户管理 Key Vault 时,可能会收到如下错误:“已启用网络访问控制。 只有经允许的网络才能访问此密钥保管库。”此错误并不妨碍在 CMK 设置期间提供密钥或在服务器操作期间从 Key Vault 获取密钥的能力。

配置 CMK 的建议如下:

  • 将 CMK 的副本保存在安全位置,或将其托管到托管服务。

  • 如果 Key Vault 生成密钥,请在首次使用该密钥之前创建密钥备份。 只能将备份还原到 Key Vault。

从 Key Vault 意外撤消密钥访问

对 Key Vault 具有足够访问权限的人员可能通过下列方式意外禁用服务器对密钥的访问:

  • 从用于在 Key Vault 中检索密钥的标识中撤消 listgetwrapKeyunwrapKey 权限。

  • 删除密钥。

  • 删除 Key Vault 实例。

  • 更改 Key Vault 防火墙规则。

  • 在 Microsoft Entra ID 中删除服务器的托管标识。

监视 Key Vault 中的 CMK

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

  • 资源健康状况:在与数据库的第一次连接遭到拒绝后,已失去对 CMK 数据访问权限的数据库将显示为“无法访问”。
  • 活动日志:未能成功访问客户管理的 Key Vault 实例中的 CMK 时,系统会将条目添加到活动日志中。 如果尽快为这些事件创建警报,则可恢复访问权限。
  • 操作组:定义这些组,使其根据你的首选项接收通知和警报。

使用 Key Vault 中客户管理的密钥进行还原

在使用 Key Vault 中存储的客户管理的密钥对 Azure Database for PostgreSQL 灵活服务器进行加密后,还将所有新创建的服务器副本进行加密。 可以通过时点恢复 (PITR) 操作或只读副本新建此副本。

在还原或创建只读副本期间设置客户管理的数据加密时,可以通过在主服务器和还原/副本服务器上执行以下步骤来避免问题:

  • 启动还原过程或从主 Azure Database for PostgreSQL 灵活服务器实例创建只读副本的过程。

  • 在还原服务器或副本服务器上,可以更改用于访问数据加密设置中的 Key Vault 的 CMK 和/或 Microsoft Entra 标识。 确保新创建的服务器对 Key Vault 中存储的密钥具有 listwrapunwrap 权限。

  • 还原后不要撤销原始密钥。 目前,在将启用了 CMK 的服务器还原到另一台服务器后,我们不支持密钥吊销。

无法访问 CMK 的情况

使用密钥保管库中的 CMK 配置数据加密时,服务器必须保持联机状态才能持续访问该密钥。 如果服务器无法再访问 Key Vault 中客户管理的密钥,它将在 10 分钟内开始拒绝所有连接。 服务器会发出相应的错误消息,并将服务器状态更改为“无法访问”。

服务器状态变为“无法访问”的一些原因包括:

  • 如果删除 Key Vault 实例,则 Azure Database for PostgreSQL 灵活服务器实例无法访问密钥并变为“不可访问”状态。 若要使服务器状态变为“可用”,请恢复 Key Vault 实例并重新验证数据加密。
  • 如果从 Key Vault 中删除密钥,则 Azure Database for PostgreSQL 灵活服务器实例无法访问密钥并变为“不可访问”状态。 若要使服务器状态变为“可用”,请恢复密钥并重新验证数据加密。
  • 如果从 Microsoft Entra ID 中删除用于从 Key Vault 检索密钥的托管标识,或者删除具有 Key Vault 加密服务加密用户角色的 Azure RBAC 角色分配。 Azure Database for PostgreSQL 灵活服务器实例将无法访问密钥,并将变为“无法访问”状态。 若要使服务器状态变为“可用”,请恢复标识并重新验证数据加密。
  • 如果从用于从 Key Vault 检索密钥的托管标识中撤销 Key Vault 的 listgetwrapKeyunwrapKey 访问策略,Azure Database for PostgreSQL 灵活服务器实例将无法访问该密钥并转为不可访问状态。 向 Key Vault 中的标识添加所需的访问策略
  • 如果设置了过于严格的 Key Vault 防火墙规则,Azure Database for PostgreSQL 灵活服务器无法与 Key Vault 通信以检索密钥。 配置 Key Vault 防火墙时,请务必选择选项“允许受信任的 Microsoft 服务绕过防火墙”。

注意

当密钥被禁用、删除、过期或无法访问时,通过该密钥加密数据的服务器将变为不可访问,如前所述。 在重新启用密钥或分配新密钥之前,服务器将不可用。

通常情况下,在密钥被禁用、删除、过期或无法访问后,服务器将在 60 分钟内变得不可访问。 密钥可用后,服务器可能需要长达 60 分钟才能再次变为“可访问”状态。

恢复删除的托管标识

在极少数情况下,CMK 用于从 Azure Key Vault (AKV) 检索密钥的 Entra ID 托管标识在 Microsoft Entra ID 中删除时,建议执行以下步骤进行恢复:

  1. 恢复标识或创建新的托管 Entra ID 标识
  2. 请确保此标识对 Azure Key Vault (AKV) 中的密钥具有适当的操作权限。 根据密钥保管库的权限模型(访问策略或 Azure RBAC),可以通过在密钥保管库上创建访问策略(listgetwrapKeyunwrapKey 访问策略),或通过创建具有 Key Vault 加密服务加密用户角色的新 Azure RBAC 角色分配,来授予密钥保管库访问权限。
  3. 在 Azure Database for PostgreSQL 灵活服务器数据加密 Azure 门户屏幕中使用新的或已恢复的标识重新验证 CMK 数据加密。

重要

仅仅创建一个与已删除标识具有相同名称的新 Entra ID 标识,并不能恢复删除的托管标识。

将数据加密与 CMK 和异地冗余业务连续性功能结合使用

Azure Database for PostgreSQL 灵活服务器支持高级数据恢复功能,例如副本异地冗余备份。 除了使用 CMK 进行数据加密的基本要求之外,以下是使用 CMK 设置数据加密的要求和这些功能:

  • 异地冗余备份加密密钥需要在异地冗余备份存储区域内的 Key Vault 实例中创建。
  • 用于支持已启用异地冗余备份的 CMK 服务器的 Azure 资源管理器 REST API 版本为“2022-11-01-preview”。 若要使用 Azure 资源管理器模板自动创建同时使用 CMK 加密和异地冗余备份功能的服务器,请使用此 API 版本。
  • 不能使用相同的用户托管标识对主数据库的 Key Vault 实例和保存异地冗余备份加密密钥的 Key Vault 实例进行身份验证。 为了保持区域复原能力,我们建议在异地冗余备份所在的同一区域中创建用户托管标识。
  • 如果在创建过程中将只读副本数据库设置为使用 CMK 加密,则其加密密钥需要位于只读副本数据库所在区域的 Key Vault 实例中。 需要在同一区域中创建用于对此 Key Vault 实例进行身份验证的用户分配的标识

限制

下面是在 Azure Database for PostgreSQL 灵活服务器中配置 CMK 的当前限制:

  • 只能在创建新服务器期间配置 CMK 加密,而不能在更新现有 Azure Database for PostgreSQL 灵活服务器实例时配置 CMK 加密。 可以改为使用 CMK 加密将 PITR 备份还原到新服务器

  • 配置 CMK 加密后,无法将其删除。 如果要删除此功能,唯一的方法是将服务器还原到非 CMK 服务器

  • 计划在其上存储加密密钥的实例 Azure Key Vault 必须在要创建 Azure 数据库灵活服务器实例的同一区域中存在。

后续步骤