【數(shù)據(jù)庫】數(shù)據(jù)庫入門(十一): 數(shù)據(jù)庫安全(Database Security)

主要目標

當我們談及數(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ī)則:

  1. (Read down)主體 X 可以讀取客體 Y 僅當 X 的權(quán)限大于或等于 Y 的權(quán)限級別。
  2. (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ù)庫:

  1. 連接數(shù)據(jù)庫;
  2. 向數(shù)據(jù)庫發(fā)送SQL語句和數(shù)據(jù)(SQL注入?。?/li>
  3. 從數(shù)據(jù)庫中獲取結(jié)果并顯示數(shù)據(jù);
  4. 關(guān)閉連接。

SQL 注入的形式,通常是黑客通過 web 應用注入一個字符串,用于改變 SQL 語句,使之為他們所用。可能會有以下的方式危害到數(shù)據(jù)庫:

  • 改變數(shù)據(jù)庫的內(nèi)容;
  • 從數(shù)據(jù)庫中獲取敏感數(shù)據(jù),比如信用卡信息或者密碼;
  • 執(zhí)行系統(tǒng)級別的命令,導致系統(tǒng)拒絕服務申請;
  • 。。。。。。

保護技術(shù)

SQL 注入攻擊可以通過下面的技術(shù)進行防御:

  1. 防火墻(Firewall):根據(jù)預先確定的安全規(guī)則,監(jiān)控進出的網(wǎng)絡(luò)流量;
  2. 入侵檢測系統(tǒng)(IDS:Intrusion detection system):監(jiān)視網(wǎng)絡(luò)或系統(tǒng)是否有惡意活動或違反策略;
  3. 驗證(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) +"'"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.下午兩點半被上級電話折回工作的地方,簽個字遭到家屬各種不滿以及質(zhì)問。寶寶心里苦,委屈啊,除了早上啃的幾片面包片...
    瀟瀟未然閱讀 223評論 0 0
  • 1.選擇 不要用忙碌來麻痹自己逃避思考。沒有成績,再多的忙碌也沒有意義。選擇最重要的那一件事情,做好它! 2.清單...
    宵汀閱讀 364評論 2 2
  • 明天就是中秋節(jié)了,今天晚上大姑姐請大家吃飯,老公在外地干活,不能回來,我只能自己去。席間,兩個外甥媳婦非給我倒酒,...
    金秋郁金香閱讀 332評論 0 0
  • 電影《當幸福來敲門》,(The Pursuit Of Happiness). 根據(jù)華爾街投資家Ch...
    xu閑人閱讀 430評論 0 1
  • 他就是這樣的人,在他的歌聲里,他的風格就是和別的歌手不一樣,獨一無二的。無人能替代。 那就是他,那就是他,獨來獨往...
    王密亮閱讀 304評論 0 0

友情鏈接更多精彩內(nèi)容