账本概述
适用于:SQL Server 2022 (16.x) Azure SQL 数据库 Azure SQL 托管实例
对于管理财务、医疗或其他敏感数据的所有组织来说,围绕存储在数据库系统中的数据的完整性建立信任一直是一个长期存在的问题。 账本功能在数据库中提供防篡改功能。 你能够以加密方式向其他方(如审核员或其他业务参与方)证明你的数据未篡改。
账本有助于保护数据免受任何攻击者或高特权用户(包括数据库管理员 (DBA)、系统管理员和云管理员)的攻击。 与传统的账本一样,该功能将保留历史数据。 如果某个行在数据库中进行更新,则其以前的值将在历史记录表中得到维护和保护。 账本提供了一段时间内对数据库所做的所有更改的历史记录。
账本和历史数据以透明方式进行管理,无需进行任何应用程序更改即可提供保护。 该功能以关系形式维护历史数据,以支持用于审核、取证和其他目的的 SQL 查询。 它在保持 SQL 数据库的功能、灵活性和性能的同时,提供加密数据完整性的保证。
账本的用例
让我们来看看使用账本的一些优势。
简化审核
任何生产系统的价值都基于信任该系统正在使用和生产的数据的能力。 如果恶意用户篡改了数据库中的数据,则可能对依赖该数据的业务流程产生灾难性的结果。
保持对数据的信任需要结合实现适当的安全控制来减少潜在攻击、备份和还原做法,以及彻底的灾难恢复过程。 由外部参与方审核可确保这些做法落实到位。
审核过程是非常耗时的活动。 审核需要现场检查实现的做法,如查看审核日志、检查身份验证和检查访问控制。 尽管这些手动过程可能会使潜在的安全漏洞得以暴露,但它们无法提供有力证据来表明数据并未受到恶意篡改。
账本向审核员提供数据完整性的加密证明。 此证明有助于简化审核过程。 它还可以提供有关系统数据完整性的不可否认性。
多方业务流程
在某些系统(例如供应链管理系统)中,多个组织必须相互共享一个业务流程中的状态。 这些系统如何共享和信任数据是一大挑战。 许多组织都求助于传统区块链(例如以太坊或 Hyperledger Fabric),从而以数字方式转换其多方业务流程。
区块链是适用于多方网络的优秀解决方案,在这种网络中,参与网络的各方之间的信任度较低。 许多这样的网络基本上都是集中式解决方案,对信任要求很高,而完全分布式基础结构是一个重量级的解决方案。
账本为这些网络提供了一种解决方案。 参与者可以验证集中存储的数据的完整性,而不必考虑网络共识在区块链网络中引入的复杂性和性能影响。
客户成功案例
- 要了解 Lenovo 如何通过在 Azure SQL 数据库中使用账本来增强客户信任,请观看此视频。
- RTGS.global 使用 Azure SQL 数据库中的账本,与世界各地的银行建立信任。
- Qode Health Solutions 使用 Azure SQL 数据库中的账本功能保护 COVID-19 疫苗接种记录
适用于区块链的受信任的链外存储
在多方业务流程需要区块链网络时,能在不影响性能的情况下查询区块链上的数据是一个挑战。
解决此问题的典型模式涉及将数据从区块链复制到链外存储,如数据库。 但是,在将数据从区块链复制到数据库后,区块链提供的数据完整性保证就会丢失。 账本为区块链网络的链外存储提供数据完整性,这有助于确保整个系统完全信任数据。
工作原理
账本表中由事务修改的任何行都是使用 Merkle 树数据结构以加密方式进行 SHA-256 哈希处理的,该结构将创建表示事务中所有行的根哈希。 数据库处理的事务随后也会通过 Merkle 树数据结构一起进行 SHA-256 哈希处理。 结果是构成块的根哈希。 然后会通过该块的根哈希以及上一个块的根哈希(作为哈希函数的输入)对该块进行 SHA-256 哈希处理。 此哈希处理形成了区块链。
数据库账本中的根哈希(也称为数据库摘要)包含加密哈希处理的事务并表示数据库的状态。 可以定期生成它们并且将它们存储在数据外部防篡改的存储中,例如使用不可变策略配置的 Azure Blob 存储、 Azure 机密账本或本地 Write Once Read Many (WORM) 存储设备。 数据库摘要稍后会用于验证数据库的完整性,方法是将摘要中的哈希值与数据库中计算出的哈希值进行比较。
账本功能以两种形式被引入到表中:
“可更新账本表”和“仅追加账本表”都提供篡改证据和数字取证功能 。
可更新账本表
对于希望对数据库中的表进行更新和删除的应用程序模式(例如记录系统 (SOR) 应用程序),可更新账本表是理想选择。 应用程序的现有数据模式不需要更改即可启用账本功能。
可更新账本表会在执行更新或删除的事务发生时跟踪数据库中任何行的更改历史记录。 可更新账本表是带有系统版本的表,它包含对另一个具有镜像架构的表的引用。
另一个表称为历史记录表。 每当更新或删除了账本表中的某行后,系统都将使用此表来自动存储该行的先前版本。 创建可更新账本表时,将自动创建历史记录表。
可更新账本表中的值及其相应的历史记录表提供了一段时间内数据库值的历史记录。 一个系统生成的账本视图将联接可更新账本表和历史记录表,使你可以轻松查询数据库的此历史记录。
有关可更新账本表的详细信息,请参阅创建和使用可更新账本表。
仅追加账本表
仅追加账本表非常适合“仅插入”的应用程序模式,例如安全信息和事件管理 (SIEM) 应用程序。 仅追加账本表在 API 级别阻止更新和删除。 这种阻止可以进一步防止特权用户(例如系统管理员和 DBA)篡改数据。
由于系统只允许插入,因此仅追加账本表没有对应的历史记录表,因为没有要捕获的历史记录。 与可更新账本表一样,账本视图可提供对将行插入“仅追加”表的事务以及执行插入的用户的见解。
有关仅追加账本表的详细信息,请参阅创建和使用仅追加账本表。
账本数据库
对于需要在数据库的整个生命周期内保护所有数据的完整性的应用程序,账本数据库提供了一种简单的解决方案。 账本数据库只能包含账本表。 不支持创建常规表(非账本表)。 默认情况下,每个表都将创建为采用默认设置的可更新的账本表,这使得创建此类表非常简单。 在创建时将数据库配置为账本数据库。 创建后,无法将账本数据库转换为常规的数据库。 有关详细信息,请参阅配置账本数据库。
数据库摘要
数据库账本中最新块的哈希称为数据库摘要。 它表示生成块时数据库中所有账本表的状态。
块形成时,它所关联的数据库摘要将发布并存储在数据库之外的防篡改存储中。 由于数据库摘要表示在生成数据库时数据库的状态,因此保护摘要免受篡改至关重要。 有权修改摘要的攻击者能够:
- 篡改数据库中的数据。
- 生成表示包含这些更改的数据库的哈希。
- 修改摘要以表示该块中事务的已更新哈希。
通过账本,可以在不可变存储或 Azure 机密账本中自动生成并存储数据库摘要,以防止篡改。 或者,用户可以手动生成数据库摘要,并将其存储在所选位置。 数据库摘要用于稍后验证存储在账本表中的数据是否未遭篡改。
账本验证
账本功能不允许修改账本系统视图、仅追加表和历史记录表的内容。 但是,控制计算机的攻击者或系统管理员可以绕过所有系统检查,直接篡改数据。 例如,攻击者或系统管理员可以编辑存储中的数据库文件。 账本无法防止此类攻击,但可保证在验证账本数据时会检测到任何篡改。
账本验证过程使用先前生成的一个或多个数据库摘要作为输入,并根据账本表的当前状态,重新计算存储在数据库账本中的哈希值。 如果计算所得的哈希值与输入摘要不符,则验证将失败,指示数据已篡改。 然后,账本将报告它所检测到的所有不一致项。