摘要管理

适用于: SQL Server 2022 (16.x) Azure SQL 数据库Azure SQL 托管实例

数据库摘要

数据库账本中最新块的哈希称为数据库摘要。 它表示生成块时数据库中所有账本表的状态。 生成数据库摘要很有效,因为它只涉及计算最近追加的块的哈希。

数据库摘要可以由系统自动生成,也可以由用户手动生成。 你可在稍后将其用于验证数据库的完整性。

数据库摘要以 JSON 文档的形式生成,其中包含最新块的哈希以及与块 ID 相关的元数据。 元数据包括生成摘要的时间,以及此块中最后一个事务的提交时间戳。

验证过程和数据库的完整性取决于输入摘要的完整性。 为此,需要将提取自数据库的数据库摘要存储在受信任的存储中,使其无法被数据库的高特权用户或攻击者篡改。

数据库摘要的自动生成和存储

注意

SQL Server 中数据库摘要的自动生成和存储仅支持 Azure 存储帐户。

账本与 Azure Blob 存储的不可变存储功能Azure 机密账本集成。 此集成在 Azure 中提供安全存储服务,防止数据库摘要遭受潜在篡改。 此集成为用户提供了一种简单且经济高效的方法,可以自动执行摘要管理,而无需担心其可用性和地理复制。 对于可能担心特权管理员访问摘要的客户,Azure 机密账本为其提供了更强的完整性保证。 此表比较了 Azure Blob 存储和 Azure 机密账本的不可变存储功能。

可通过 Azure 门户、PowerShell 或 Azure CLI 配置数据库摘要的自动生成和存储。 有关详细信息,请参阅启用自动摘要存储。 配置自动生成和存储后,数据库摘要会按预定义的间隔(30 秒)生成,并上传到所选的存储服务。 如果在 30 秒时间间隔内,系统上未发生任何事务,则不会生成和上传数据库摘要。 此机制可确保仅在数据库中更新数据时生成数据库摘要。 当终结点是 Azure Blob 存储时,Azure SQL 数据库的逻辑服务器或 Azure SQL 托管实例会创建一个名为 sqldbledgerdigest 的新容器,并使用命名模式,例如:ServerName/DatabaseName/CreationTime。 需要创建时间,因为可以删除、重新创建或还原具有相同名称的数据库,从而允许同名数据库存在不同“化身” 。 有关详细信息,请参阅摘要管理注意事项

注意

对于 SQL Server,容器必须由用户手动创建。

Azure 存储帐户不可变性策略

如果使用 Azure 存储帐户来进行数据库摘要的存储,则在预配后,应在容器上配置不可变性策略,确保防止数据库摘要被篡改。 确保不可变性策略允许受保护的追加写入追加 blob,而且策略已锁定。

Azure 存储帐户权限

如果使用“Azure SQL 数据库”或“Azure SQL 托管实例”,请确保逻辑服务器或托管实例(系统标识)具有足够的基于角色的访问控制 (RBAC) 权限,可通过将其添加到存储 Blob 数据参与者角色来写入摘要。 如果使用活动异地复制或自动故障转移组,请确保次要副本对 Azure 存储帐户具有相同的 RBAC 权限。

如果使用 SQL Server,则必须在摘要容器上创建共享访问签名 (SAS) ,以允许 SQL Server 针对 Azure 存储帐户进行连接和身份验证。

  • 在 Azure 存储帐户上创建名为 sqldbledgerdigests 的容器。
  • 在具有读取添加创建写入列出权限的容器上创建策略,并生成共享访问签名密钥。
  • 对于用于摘要文件存储的 sqldbledgerdigests 容器,要创建一个SQL Server 凭据,其名称与容器路径匹配。

以下示例假定已创建 Azure 存储容器、策略和 SAS 密钥。 SQL Server 需要这个条件,才能访问容器中的摘要文件。

在以下代码段中,将 <your SAS key> 替换为 SAS 密钥。 SAS 密钥类似于 'sr=c&si=<MYPOLICYNAME>&sig=<THESHAREDACCESSSIGNATURE>'

CREATE CREDENTIAL [https://ledgerstorage.blob.core.windows.net/sqldbledgerdigests]  
WITH IDENTITY='SHARED ACCESS SIGNATURE',  
SECRET = '<your SAS key>'   

Azure 机密账本权限

如果使用 Azure SQL 数据库Azure SQL 托管实例,请确保逻辑服务器或托管实例(系统标识)具有足够的权限,可通过将其添加到参与者角色来写入摘要。 为此,请遵循 Azure 机密账本用户管理的步骤。

注意

SQL Server 中数据库摘要的自动生成和存储仅支持 Azure 存储帐户。

配置 Azure SQL 托管实例 NSG 规则以与 Azure 机密账本结合使用

如果使用“Azure SQL 托管实例”,请务必配置 Azure SQL 托管实例的虚拟网络规则以与 Azure 机密账本进行通信。 有关详细信息,请参阅配置 Azure SQL 托管实例 NSG 规则以与 Azure 机密账本结合使用

数据库摘要的手动生成和存储

还可按需生成数据库摘要,以便可以手动将摘要存储在你认为受信任的存储目标的任何服务或设备中。 例如,你可能选择本地一次写入多次读取 (WORM) 设备作为目标。 可在 SQL Server Management StudioAzure Data Studio 中运行 sys.sp_generate_database_ledger_digest 存储过程手动生成数据库摘要。

EXECUTE sp_generate_database_ledger_digest;

返回的结果集为单行数据。 应以 JSON 文档的形式将其保存到受信任的存储位置,如下所示:

    {
        "database_name":  "ledgerdb",
        "block_id":  0,
        "hash":  "0xDC160697D823C51377F97020796486A59047EBDBF77C3E8F94EEE0FFF7B38A6A",
        "last_transaction_commit_time":  "2020-11-12T18:01:56.6200000",
        "digest_time":  "2020-11-12T18:39:27.7385724"
    }

权限

生成数据库摘要需要 GENERATE LEDGER DIGEST 权限。 有关与账本表相关的权限的详细信息,请参阅权限

摘要管理注意事项

数据库还原

将数据库还原到较早的时间点,也称为时间点还原,是发生错误且用户需要快速将数据库状态恢复到较早时间点时经常使用的操作。 将生成的摘要上传到 Azure 存储或 Azure 机密账本时,会捕获这些摘要映射到的数据库的创建时间。 每次还原数据库时,都会用新的创建时间标记它,利用此技术,我们可以将摘要存储在数据库的不同“化身”中。 对于 SQL Server, 创建时间是首次启用摘要上传时的当前 UTC 时间。 账本会保留有关何时发生还原操作的信息,从而允许验证过程在数据库的各种“化身”中使用所有相关摘要。 此外,用户还可以检查不同创建时间的所有摘要,以确定数据库的还原时间以及还原到多久以前。 由于此数据写入了不可变存储中,因此该信息也受到保护。

注意

如果在 Azure SQL 托管实例中执行数据库备份的本机还原,则需要使用 Azure 门户、PowerShell 或 Azure CLI 来手动更改摘要路径。

活动异地复制和 Always On 可用性组

可以为 Azure SQL 数据库或 Azure SQL 托管实例配置活动异地复制或自动故障转移组。 出于性能原因,跨地理区域的复制是异步的,因此,与主数据库相比,辅助数据库会略微落后。 如果发生地理故障转移,任何尚未复制的最新数据都会丢失。 账本只会为已复制到地理辅助数据库的数据发布数据库摘要,以保证摘要永远不会引用在发生地理故障转移时可能会丢失的数据。 这仅适用于数据库摘要的自动生成和存储。 在故障转移组中,主数据库和辅助数据库都将具有相同的摘要路径。 即使你执行故障转移,主数据库和辅助数据库的摘要路径也不会更改。

如果删除故障转移组或丢弃链接,这两个数据库将充当主数据库。 此时,上一个辅助数据库的摘要路径将更改,我们将向路径添加 RemoveSecondaryReplica 文件夹。

当数据库是 SQL Server 中的 AlwaysOn 可用性组或托管实例链接的一部分时,将使用与活动异地复制相同的原则。 仅当所有事务都复制到次要副本时,才会完成摘要上传。