用于安全性的 Oracle 增量校验和加密

Oracle Incremental Checksum Crypto for Security

我有一个独特的问题要解决。 我有一个遗留的 java 应用程序连接到 Oracle RDBMS。应用程序中散布着各种查询和 DML——插入、更新、删除,当然还有选择。它使用 JBC (Preparedstatement),尽管最近添加的一个模块使用 JPA。

我需要向应用程序/数据库添加保护层/逻辑,如果任何用户(甚至可以是 DBA 或 OS root 用户)试图修改数据(更新、插入)或删除)绕过应用程序,我们能够将操作识别为审计的一部分。

审计线索似乎是这里的首选,除了我们甚至不能信任 OS root 用户,因此拥有 DBA 和 root 访问权限的人可以轻松修改数据并删除它的痕迹在审计追踪中。

我正在考虑在敏感表上实施一种循环加密算法,以便在应用程序执行的每个 DML 上,引入一个加密/散列并且它是增量的,以便通过执行以下操作轻松捕获任何更改使用应用程序进行审核。

理论上,这似乎是可行的,只是它可能会变得棘手,因为在每个 DML 之后,我们可能需要重新计算许多后续记录的哈希/校验和,这可能会使应用程序/数据库负担过重。

这是可行的解决方案吗?

您是对的,计算每个更新的数据行的哈希值会给系统带来负担。您是否还要在将更改提交到数据库之前验证该散列以确保在应用程序之外没有任何更改?那是更多的开销,并且为您的应用程序编写了更多的自定义代码。它也不会帮助您确定谁修改了数据,或者何时修改了数据,只能确定它是在应用程序之外更新的。使用数据库触发器是行不通的,因为它们很容易被禁用,并且无法修改调用它们的 table(您需要一个单独的散列 table,每一行都有一个条目您想要监控的每个 table 中的数据)。审核仍然是您的最佳方式,因为它不需要对您的应用程序或数据模式进行任何修改。

根据您使用的 Oracle 版本,您有几个关于审计的选项。如果您使用的是 12c 或更高版本,则可以使用统一审计,它有自己的一组权限和角色以允许职责分离(即普通 DBA 与安全管理员)。即使在旧版本中,您也可以在实际审计跟踪 table 上放置 update/delete 审计,这样任何修改数据的尝试都会留下指纹。

最后,您可以使用 Splunk、Elastic Search、syslog 或 Oracle 的 Database Audit Vault 或其他一些文件监控解决方案等工具将您的审计记录集中到另一个系统,因为它们是由数据库创建的 - 使它们无法访问给 DBA 或本地系统管理员。首先,这将需要您的 DBA and/or 系统管理员进行一些配置工作,但可以大大保护您的审计数据。

综上所述,您迟早会信任两个人:系统管理员和 DBA。如果你不能信任他们,那你就有大麻烦了。

Oracle 20c 有 blockchain tables。 20c 版目前仅在 Oracle 的云中可用,但可能会在几个月内在本地提供。