2009-07-16 84 views
2

如何確保數據庫中的記錄不能被中間層軟件以外的其他人修改(例如,阻止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

爲什麼不鼓勵DBA?該軟件也跟蹤他/她自己的付款... – akarnokd 2009-07-16 20:41:45

+0

我有其他的事情,所以我打開了一個賞金,以增加我的機會。別擔心,我不會讓系統自動接受答案。 – akarnokd 2009-07-18 20:54:45

+0

也可隨意質疑體系結構本身,因爲實現將重用大量現有計算機。 – akarnokd 2009-07-18 20:56:41

回答

3

第一:由於您會將所有代碼發給客戶,因此無法使其真正安全。第二:(在我看來)努力和效果之間的良好平衡的一種方式是添加一個額外的列,然後當您更改值時,連接所有值,爲其添加一個安全密碼(更好的術語將會是'鹽'),通過密碼哈希算法運行它並將結果放在額外的字段中。當你讀取數據時,你重複整個事情並比較數值。如果他們不匹配有人擺弄這些價值觀。

如果檢測到的更改不夠充分,可以使用加密算法而不是散列,從而可以重新創建原始數據。


其實,如果你要保持串接的實施,鹽析和哈希從客戶的網站,這可能成爲相當節省掉的選項。顯而易見的方法是用一個小工具來計算網站上的散列。當值需要更改時,用戶/管理員需要聯繫您以獲取新的正確哈希值。

當然,這隻適用於當更改次數不高並且需要很長時間來發送郵件並獲得回覆時。

+0

謝謝。我不希望它是不可靠的,但至少很難擺弄。 – akarnokd 2009-07-16 20:28:43

0

您可以嘗試一些技巧來阻止DBA更改您的數據,但它們只會是這樣:技巧。另一種方法是實施某種審計跟蹤,在其中記錄對數據的所有修改。

但是由於DBA可以訪問數據庫中的所有對象,因此如果他真的需要,他可以計算出正在使用的方法並禁用它們。這就是DBA的意思:這個人有完整的訪問數據庫。

1

您可以實現一種設計,該設計通過作爲數據庫審計跟蹤的事務表運行所有數據庫活動。它應該包括時間戳列,用戶標識和某種上下文指示符(例如,使用什麼樣的表單來生成事務)。並且包含標識列唯一鍵以公開亂序時間戳。

當然,DBA可以通過審計跟蹤運行事務,但至少您可以驗證(通過訪問)確實是審計所指示的更改源。

您也可以擁有與數據庫其餘部分不同的事務表權限,但這顯然涉及策略問題。

如果您確保更改暴露並可檢查而不是防止它們,則通常更容易(並且後果更明顯)。人們似乎善於發現合法的理由去做你想要阻止的事情。