主要目標
當我們談及數(shù)據(jù)庫安全的時候,主要是希望實現(xiàn)三個目標:
-
機密性(Confidentiality):數(shù)據(jù)只能展示給那些獲得權(quán)限允許訪問的用戶對象。
- 例如,由存取控制機制執(zhí)行
-
完整性(Integrity):數(shù)據(jù)只能被擁有修改權(quán)限的用戶對象修改。
- 例如,由模式上指定的訪問控制機制和完整性約束實施
-
可用性(Availability):如果某個用戶對象允許訪問或修改對象,那么他應當能夠這么做。
- 例如,由恢復和并發(fā)控制機制強制執(zhí)行
在實現(xiàn)數(shù)據(jù)庫安全的實踐中,可能還會采用其他的服務,例如:
- 加密(Encryption):在跨系統(tǒng)傳輸和存儲在輔助存儲器上時保護數(shù)據(jù)。
- 查詢身份驗證(Query authentication):通過使用簽名機制和數(shù)據(jù)結(jié)構(gòu)來確保查詢結(jié)果是正確的。
數(shù)據(jù)庫安全提供的保護通常針對兩種情況:
- 禁止沒有數(shù)據(jù)庫訪問權(quán)限的用戶進行任何訪問;
- 阻止具有數(shù)據(jù)庫訪問權(quán)限的用戶對數(shù)據(jù)庫執(zhí)行不需要執(zhí)行的操作。
數(shù)據(jù)庫安全漏洞的威脅
數(shù)據(jù)庫潛在的安全漏洞,如果成功,將對數(shù)據(jù)庫產(chǎn)生一定的影響。主要有以下幾個方面,與數(shù)據(jù)庫安全的主要目標對應:
- 機密性缺失(Loss of confidentiality):數(shù)據(jù)不應該被那些沒有合法訪問權(quán)限的人訪問。
- 完整性缺失(Loss of integrity):不應通過有意或無意的行為。
- 可用性缺失(Loss of availability):數(shù)據(jù)應該對那些擁有合法訪問權(quán)限的人保持可訪問性。
控制措施
-
訪問控制(Access control)
- 限制對數(shù)據(jù)庫系統(tǒng)的訪問
- 例如,用戶帳戶和密碼
-
推理控制(Inference control)
- 確保用戶未被授權(quán)訪問的數(shù)據(jù)不能從統(tǒng)計或匯總數(shù)據(jù)中推斷出來
- 例如,知道某個部門的平均工資,但不知道某個特定人員的工資
-
流控制(Flow control)
- 防止數(shù)據(jù)流入未經(jīng)授權(quán)的用戶
- 例如,避免秘密通道
-
數(shù)據(jù)加密(Data encryption)
- 在儲存和傳送過程中保護敏感資料
- 例如密碼和信用卡資料。
訪問控制(Access Control)
訪問控制是指控制對數(shù)據(jù)庫中資源的訪問的任何方法,可以將其視為身份驗證(authentication)和授權(quán)(authorization)以及其他措施(如基于ip的限制)的組合
-
身份驗證(Authentication)
- 一個系統(tǒng)識別用戶的過程(誰是用戶?該用戶是本人嗎?)
- 以用戶名稱、密碼、智能卡、密碼、指紋掃描等方式識別。
-
身份授權(quán)(Authorization)
- 一個系統(tǒng)確定已通過身份驗證的用戶對安全資源的訪問級別的過程。
- (該用戶是否授權(quán)訪問或修改數(shù)據(jù)表?)
訪問控制的三種典型機制:
-
自主存取控制(DAC:Discretionary access control)
- 基于訪問特權(quán)的概念,為用戶提供這樣的特權(quán)。
- SQL 支持 DAC;大多數(shù)商業(yè) DBMS 也支持 DAC 。
-
強制存取控制(MAC:Mandatory access control)
- 基于無法由單個用戶更改的系統(tǒng)范圍策略。
- SQL 不支持 MAC,但是一些 DBMS 支持 MAC 。
-
基于角色的訪問控制(RBAC:Role-based access control)
- 基于用戶角色(可以與DAC和MAC一起使用)。
- 角色上的 SQL 支持特權(quán);許多 DBMS 支持 RBAC 。
自主存取控制(DAC:Discretionary access control)
之所以稱為自主存取,是因為它允許主體自行授予其他主體訪問該主體對象的特權(quán)。 DAC 基于主體的特權(quán)管理主體(用戶、賬戶、角色等)查閱客體(關(guān)系表、視圖等)的權(quán)限。
SQL 通過授予(GRANT)和撤銷(REVOKE)兩條命令支持 DAC。
- GRANT:授予用戶特權(quán);
- REVOKE:取消用戶的特權(quán)。
GRANT
基本語法:
GRANT privileges ON object TO users [WITH GRANT OPTION]
這里的 privileges 包括 select、insert、update、references 等操作關(guān)鍵字。
給幾個例子:
GRANT SELECT ON Supplier TO Jerry;
GRANT INSERT, DELETE ON Supplier TO Tom;
GRANT UPDATE (rating) ON Supplier TO Tom;
GRANT REFERENCES (no) ON RatingStandard TO Bob;
視圖(Views)
視圖為自由授權(quán)提供了重要的機制。
首先,創(chuàng)建視圖的語法為:
CREATE VIEW view name AS
SELECT attribute list
FROM table list
[WHERE condition]
[GROUP BY attribute list [HAVING group condition]]
[ORDER BY attribute list];
創(chuàng)建視圖需要對視圖定義中涉及的所有關(guān)系使用 SELECT 特權(quán)。也就是說,用戶需要擁有 SELECT 特權(quán),才能使用 SELECT 獲取目標的關(guān)系內(nèi)容創(chuàng)建視圖。使用視圖可以自由構(gòu)建想要公開給其他對象的關(guān)系視圖,從而保護其他數(shù)據(jù)不被他人訪問。
REVOKE
基本語法:
REVOKE [GRANT OPTION FOR] privileges ON object FROM users
給幾個例子:
REVOKE INSERT, DELETE ON Supplier FROM Peter;
GRANT SELECT ON Supplier TO Bob;
REVOKE SELECT ON Supplier FROM Bob;
權(quán)限委托與撤回
基于上述的 GRANT 和 REVOKE 命令,在實踐中,我們可以迭代地給其他用戶授予或者撤回權(quán)限。這時候就需要用到語法中 GRANT OPTION 的這部分關(guān)鍵字了。比如:
GRANT SELECT ON Supplier TO Bob WITH GRANT OPTION;
在執(zhí)行移除 REVOKE 命令時,同樣可以加上可選的關(guān)鍵字:
- CASCADE:從指定用戶撤消特權(quán),同時也會撤消從該用戶收到特權(quán)的所有用戶的特權(quán)。
- RESTRICT:僅從指定用戶撤消特權(quán)。
如果用戶從多個源接收到某個特權(quán),并且只有在所有源都取消該特權(quán)之后,該用戶才會失去該特權(quán)。比如:
GRANT SELECT ON Supplier TO Bob WITH GRANT OPTION; (by Tom)
GRANT SELECT ON Supplier TO Jerry; (by Tom)
GRANT SELECT ON Supplier TO Jerry WITH GRANT OPTION; (by Bob)
REVOKE SELECT ON Supplier FROM Bob CASCADE; (by Tom)
最后一句由 Tom 運行的命令,首先撤除了他前面授予 Bob 的 SELECT 權(quán)限,由于 CASCADE 關(guān)鍵字的存在,接著撤回了 Bob 授予 Jerry 的 SELECT 權(quán)限,但 Jerry 仍然擁有 Tom 在第二條命令授予的 SELECT 權(quán)限,所以他并沒有失去該特權(quán)。
在實踐中,有些 DBMS 和 SQL 存在用于約束特權(quán)傳播的技術(shù),通常的思路有兩種:
- 限制水平傳播:限制一個帳戶可以通過 GRANT OPTION 最多向其他 n 個帳戶授予特權(quán)。
- 限制垂直傳播:限制特權(quán)授予的深度。
強制存取控制(MAC:Mandatory access control)
根據(jù)對象中包含信息的敏感性和主體對這種敏感性信息訪問的正式授權(quán)來限制對對象的訪問。
Bell-LaPadula模型:根據(jù)信息的敏感性(例如,安全級別)可以分為幾個級別:最高機密(TS)、機密(S)、機密(C)、非機密(U)。其中
TS ≥ S ≥ C ≥ U
該模型規(guī)定了兩條規(guī)則:
- (Read down)主體 X 可以讀取客體 Y 僅當 X 的權(quán)限大于或等于 Y 的權(quán)限級別。
- (Write up)主體 X 可以寫入客體 Y 僅當 X 的權(quán)限小于或等于 Y 的權(quán)限級別。
模型的主要思想在于,防止高級對象中的信息流向低級主題。
可以將安全級別當做是數(shù)據(jù)庫關(guān)系表里的一個屬性,只有當用戶擁有高于或等于相應安全級別時,才能訪問該組數(shù)據(jù)。比如:
| id | name | city | rating | security class |
|---|---|---|---|---|
| 1 | s1 | Paris | 4 | secret(S) |
| 2 | s2 | Canberra | 5 | confidential(C) |
- Bob 具有 C 權(quán)限,只能訪問第二個元組。
- Peter 具有 S 權(quán)限,可以訪問兩個元組。
基于角色的訪問控制(RBAC:Role-based access control)
訪問權(quán)限按角色分組,資源的使用僅限于分配給特定角色的個人。
SQL 注入
SQL 注入通常被認為是一種針對 web 應用程序的攻擊,被開放web應用程序安全項目評為2007年和2010年十大web應用程序漏洞之一。SQL 注入常用于攻擊任意形態(tài)的數(shù)據(jù)庫。
一個 web 應用通常會在以下場景訪問數(shù)據(jù)庫:
- 連接數(shù)據(jù)庫;
- 向數(shù)據(jù)庫發(fā)送SQL語句和數(shù)據(jù)(SQL注入?。?/li>
- 從數(shù)據(jù)庫中獲取結(jié)果并顯示數(shù)據(jù);
- 關(guān)閉連接。
SQL 注入的形式,通常是黑客通過 web 應用注入一個字符串,用于改變 SQL 語句,使之為他們所用。可能會有以下的方式危害到數(shù)據(jù)庫:
- 改變數(shù)據(jù)庫的內(nèi)容;
- 從數(shù)據(jù)庫中獲取敏感數(shù)據(jù),比如信用卡信息或者密碼;
- 執(zhí)行系統(tǒng)級別的命令,導致系統(tǒng)拒絕服務申請;
- 。。。。。。
保護技術(shù)
SQL 注入攻擊可以通過下面的技術(shù)進行防御:
- 防火墻(Firewall):根據(jù)預先確定的安全規(guī)則,監(jiān)控進出的網(wǎng)絡(luò)流量;
- 入侵檢測系統(tǒng)(IDS:Intrusion detection system):監(jiān)視網(wǎng)絡(luò)或系統(tǒng)是否有惡意活動或違反策略;
- 驗證(Authentication):系統(tǒng)識別用戶的過程。
可以通過將某些規(guī)則應用于所有 web 可訪問的過程和函數(shù)來實現(xiàn)對 SQL 注入攻擊的保護。
- 參數(shù)化查詢(Parameterized queries):用于通過防止 SQL 注入來提高安全性(最佳解決方案)。
- 語句是預先定義好的,用于通過解析和編譯,其中的問號 ? 用作實際參數(shù)的位置容器。
- 實際參數(shù)被傳遞到準備好的語句中執(zhí)行。
- 主要思想就是,將控制與數(shù)據(jù)兩部分分離。
PreparedStatement stmt=conn.prepareStatement("SELECT * FROM users WHERE name=? and password=?");
stmt.setString(1, user name);
stmt.setString(2, user passwd);
- 輸入驗證(Input validation):用于從輸入字符串中刪除或轉(zhuǎn)義字符
- 黑名單(Blacklisting):輸入字符串中的引號、分號等。然而,如果忘記將一種類型的危險人物列入黑名單,它可能會導致一次成功的攻擊。
- 白名單(Whitelisting):顯式地測試給定的輸入是否在一組定義良好的已知安全的值中。
- 轉(zhuǎn)義(Escaping):將危險的輸入字符轉(zhuǎn)換為經(jīng)過消毒的輸入字符串
"SELECT * FROM users WHERE name = `" + escape(user name) + "' and password= `" +escape(user passwd) +"'"