數據庫安全專家面臨的主要威脅之一就是如何消除推理功能。簡單而言,推理就是從已知的信息推出新的信息,當用戶能夠在低的安全級別下進行數據拼湊從而推導出在高安全級別保護下的數據時,推理功能便構成了對數據庫的嚴重威脅。我們最好還是通過實例來了解什么是推理吧。
假設你是一個軍隊交通運輸系統的數據庫管理員,你的數據庫里有一份名為運輸貨物的數據表,包含了每條出貨航班上大量的貨艙信息。表中的每一行都代表了單次發貨信息,并列出了發貨的內容和航班號。航班號被其他的數據表交叉引用,以確定發貨地、目的地、飛行時間和類似的數據。運輸貨物表內容如下:
航班號 |
貨艙 |
貨品 |
安全分類 |
1254 |
A A |
Boots靴子 |
Unclassified未分類 |
1254 |
B B |
Guns槍 |
Unclassified未分類 |
1254 |
CCC |
Atomic Bomb原子彈 |
Top Secret絕密 |
1254 |
D D |
Butter牛油 |
Unclassified未分類 |
假設趙將軍(具有查看最高安全機密信息的權限)來要求查看關于1254航班運載的貨物信息。趙將軍將會看到所有四次發貨信息。另一方面,小兵張三(沒有查看最高安全機密信息的權限)也要了這份數據,不過他只能看到下面這個數據表:
航班號 |
貨艙 |
貨品 |
安全分類 |
1254 |
A A |
Boots靴子 |
Unclassified未分類 |
1254 |
B B |
Guns槍 |
Unclassified未分類 |
1254 |
D D |
Butter牛油 |
Unclassified未分類 |
上面的操作過程都正確貫徹了安全規則,禁止沒有相應安全權限的人看到比他不應該看到的分類數據。然而,假設對于航班號和貨艙的排列有一個不能重復輸入信息的限制條件,這樣可以避免把兩次出貨任務安排到同一個貨艙。當小兵張三看到看到1254航班的C貨艙沒有安排任何貨物時,他很可能試圖為該航班插入一條運輸蔬菜的新記錄。不過,當他試圖插入這條記錄時,當唯一對應的限制條件起作用時,他的插入操作就會失敗。這時,這個小兵張三完全可以根據上面這些數據來推理出1254航班上將要運送一批機密貨物。然后,他可能會交叉引用航班信息表,找到這次秘密運輸任務的發貨地、目的地和其他更多信息。
這自然引出了一個問題:你要怎么做才能防止這種推理問題的發生?基本上,你有兩個選擇。第一,你可以把安全列納入到唯一性的約束條件中。這種技術,我們稱之為多實例(polyinstantiation),使同一張表格中的不同記錄處于不同的安全級別上。這樣小兵張三就永遠不會知道最高機密運輸任務的任何信息了。第二,你可以處理對貨艙的雙預約請求,把小兵張三要運的一卡車蔬菜就擱置在機場。第二個選擇只是簡單的保持表格的原樣。小兵張三可能知道有一個安全分類的運輸任務要執行,但不會有機會獲取運輸內容的任何信息。無論哪一個解決方案都很理想,但都要求對安全和實用之間的平衡做出某種意義上的取舍。