第13講:數據庫安全性
大綱:
- 數據庫安全性的概念及分類
- SQL語言實現自主安全性
一、前言
1. 數據庫安全性是數據庫的一種特性(免受非法或非授權用戶的使用、泄露、破壞),其由DBMS保證實現
2. 數據庫系統的安全級別涉及多個方面,如網絡控制、操作系統控制、DBMS控制等,我們只在DBMS上進行控制
二、數據庫安全性概述
1. DBMS的安全機制可包括自主安全性機制、強制安全性機制、數據加密存儲機制等
①自主安全性機制:通過授權機制(讓權限在用戶之間傳遞,使用戶自主管理數據庫安全性)來實現
②強制安全性機制:對數據和用戶進行分類,不同類用戶能看到不同類別的數據
2. 數據庫自主安全性機制
- DBMS專門提供一個DBA賬戶,DBA利用該賬戶的特權可以進行用戶賬戶的創建以及權限授予和撤消、安全級別控制調整等
- 用戶在使用數據庫前必須從DBA處獲得一個賬戶,並由DBA授予該賬戶一定的權限,該賬戶的用戶依據其所擁有的權限對數據庫進行操作,同時,該賬戶的用戶也可將其所擁有的權利轉授給其他的用戶,由此實現權限在用戶之間的傳播和控制
3. DBMS如何實現數據庫自主安全性
- DBA定義安全性控制規則(安全性訪問規則)
- 當用戶請求訪問數據時,DBMS將依據安全性控制規則來檢查是否符合規則,進而決定是否允許訪問
三、安全性訪問規則的表達
1. 安全性訪問規則的一般形式:(S,O,t,P),即用戶S在滿足條件P時,以權利t來訪問對象O
- S:請求主體,即用戶或用戶組
- O:訪問的對象,即要訪問的數據庫、表、元組、屬性等
- t:訪問權利,包括創建、增、刪、改、查等
- P:謂詞,即擁有權利需要滿足的條件
四、自主安全性的兩種實現方式
1. 存儲矩陣
①只包含S、O、t,不能表達P
2. 視圖
①包含S、O、t、P,因為視圖可將數據訪問對象與謂詞結合起來
②可以限制用戶訪問和操作關系中的哪些數據,如定義不同的視圖給不同的用戶來使用
五、利用SQL語言實現自主安全性
1. SQL中的用戶分級
①超級用戶:DBA
②賬戶級別:程序員
③關系級別:普通用戶
2. SQL中的權利分級
①1級(讀):select
②2級(更新):insert、update、delete
③3級(創建):create、alter、drop
註:級別高的權利自動包含級別低的權利,一般將級別3的權利稱為賬戶級別的權利,而將級別1和2的權利稱為關系級別的權利。
3. 授權命令
grant {all privileges | privilege [, privilege ... ]} on [table] 表名 | 視圖名
to {public | user-id [, user-id ... ]} [with grant option];
①privilege可以是select、insert、update、delete
②user-id是某一個由DBA創建的用戶賬號,而public則是所有有效用戶
③with grant option選項表示允許被授權者傳播這些權利
④授予的權利必須是授權者已擁有的權利
【示例】現有一關系Employee(P#, Pname, Page, Psex, Psalary, D#, HEAD),並創建了4個視圖EmpV1、EmpV2、EmpV3、EmpV4,現假定高級領導為Emp0001,部門領導為Emp0021,員工管理員為Emp2001,收發員為Emp5001(均為UserId, 也即員工的P#):
- createEmpV1asselect*fromEmployee;
- createEmpV2asselectPname,D#fromEmployee;
- createEmpV3asselect*fromEmployeewhereP#=UserId;
- createEmpV4asselect*fromEmployeewhereHead=UserId;
- grant all priviledges on Employee to Emp2001; // 授予Emp2001“所有權利”去訪問Employee表
- grant select on EmpV2 to Emp5001 ; // 授予Emp5001“select”權利去訪問視圖EmpV2
- grant select on EmpV3 to public; // 授予public“select”權利去訪問視圖EmpV3
- grant select on EmpV4 to Emp0021; // 授予Emp0021“select”權利去訪問視圖EmpV4
- 上面4條grant語句就是授權(grant)機制與視圖結合而實現自主安全性的典例
4. 收回授權命令
revoke {all privileges | privilege [, privilege ... ]} on [table] 表名 | 視圖名 from {public | user-id [, user-id ... ]};
- 示例:revoke select on Employee from UserB;
第13講:數據庫安全性