如何确保数据库中的记录不能被中间层软件改变(例如,不鼓励DBA更改值)?
我想使用开源堆栈实现一个简单的多层会计程序。该应用程序的主要功能是跟踪为一个产品支付的费用。数据模型的主要部分基本上是这样的:
CREATE TABLE ACCOUNT_LOG(
USER_ID NVARCHAR2(128), /* user identifier of some sort */
TIMEST TIMESTAMP, /* the UTC timestamp of the payment. */
PREV_AM NUMBER(13,3), /* the previous money level. */
DIFF_AM NUMBER(13,3), /* the the money delta (+/- possible) */
NEXT_AM NUMBER(13,3), /* the new money amount. */
UOM NVARCHAR(20) /* the money type (Euro, Dollar, etc.) */
CONSTRAINT pk PRIMARY KEY (USER_ID, TIMEST));
然而,这种结构容易受到DBA的影响,因为他/她可以进入并改变各种人的金额或者增加未经授权的金钱。
如何确保此表中的数据只能由中间层软件更改(例如,检测其他方式的更改)?请注意,我想使用开源数据库引擎,因为我的程序应该尽可能便宜。
我有自己的想法(肮脏的方式),但我想听听你的意见/最佳实践。此外,如有必要,请随时询问更多详细信息。
感谢您的时间。
答案 0 :(得分:3)
首先:由于您将所有代码分发给客户,因此无法使其真正安全。
第二:一种方式(在我看来)努力和效果之间的良好平衡将是添加一个额外的列,然后当你改变值,连接所有的值,添加一个secreat密码(更好的术语将是'盐'),通过加密哈希算法运行它并将结果放在额外的字段中。当您读取数据时,重复整个过程并比较值。如果他们与那些摆弄价值观的人不匹配。
如果检测到更改不充分,您可以使用加密算法而不是哈希,从而可以重新创建原始数据。
实际上,如果你可以选择保持串联,盐析和散列的实现远离客户站点,这可能会非常省钱。显而易见的方法是使用一个小工具来计算您网站上的哈希值。当值需要更改时,用户/管理员需要与您联系以获取新的正确哈希值。
当然这只有作用,当变化的数量不高并且邮寄给你时需要很长的时间,并且回复是可以的。
答案 1 :(得分:1)
您可以实现一个通过事务表运行所有数据库活动的设计,该事务表用作数据库的审计跟踪。它应该包括timestamp列,userid和某种上下文指示符(例如,用于生成事务的形式。)并包含一个标识列唯一键以显示无序时间戳。
当然,DBA可以通过审计跟踪来运行事务,但至少您可以(通过访谈)验证更改源确实是审计指示的内容。
您还可以拥有与数据库其余部分不同的事务表权限,但这显然涉及策略问题。
如果您确保更改是暴露和可审核的,那么通常会更容易(后果更明显)。人们似乎善于发现你想要阻止的正当理由。
答案 2 :(得分:0)
您可以尝试一些技巧来阻止DBA更改您的数据,但它们只是:技巧。另一种方法是实现某种审计跟踪,您可以在其中记录对数据的所有修改。
但是由于DBA可以访问数据库中的所有对象,因此他可以确定您正在使用哪些方法并禁用它们,如果他真的想要的话。这就是DBA的含义:此人具有完全访问数据库的权限。