數據庫整理(四)數據庫安全性與完整性
安全性
數據庫的安全性保護數據庫以防止不合法使用所造成的數據泄漏、更改或破壞
數據庫的不安全因素:
- 非授權用戶對數據庫的惡意存取和破壞 ---用戶身份鑒定 存取控制 視圖
- 數據庫中重要或敏感的數據被泄露 ---強制存取控制、數據加密存儲、加密傳輸。審計
- 安全環境的脆弱 與操作系統的安全性、網絡協議安全保障有關
數據庫系統安全模型
安全措施是一級一級層層設置的。用戶要求進入計算機系統時,系統首先根據輸入的用戶標識進行用戶身份鑒定;只有合法的用戶才准許進入計算機系統;對已進入系統的用戶,數據庫管理系統還要進行存取控制,只允許用戶執行合法操作:操作系統也會有自己的保護措施:數據最后還可以以密碼形式存儲到數據庫中。
與數據庫有關的安全技術
用戶身份鑒別、多層存取控制、審計、視圖、數據加密
用戶身份鑒定
每個用戶賦予唯一的一個身份標識
靜態口令鑒別(密碼)、動態口令鑒別(一次一密 短信密碼 動態令牌)等
存取控制
確保只授權給有資格的用戶訪問數據庫的權限 --DBMS存取控制機制
定義用戶權限
將用戶權限登記到數據字典中(權限是用戶對某一數據對象的操作權力)
合法權限檢查
用戶發出存取數據庫操作請求后,DBMS根據在數據字典查找,根據安全規則進行權限檢查,無權限進行拒絕
兩類存取控制方法
自主存取控制方法
- 用戶對於不同的數據庫對象有不同的存取權限,不同的用戶對同一對象也有不同的權限,而且用戶還可將其擁有的存取權限轉授給其他用戶。因此自主存取控制非常靈活。
- SQL中的 GRANT 與 REVOKE 語句實現。
- 用戶權限:數據庫對象+操作類型
- 定義一個用戶的存取權限就是要定義這個用戶可以在哪些數據庫對象上進行哪些類型的操作。在數據庫系統中,定義存取權限稱為授權
- 關系數據庫系統中,存取控制的對象不僅有數據本身(基本表中的數據、屬性列上的數據),還有數據庫模式(包括數據庫、基本表、視圖和索引的創建等)
強制存取控制方法
- 每一個數據庫對象被標以一定的密級,每一個用戶也被授予某一個級別的許可證。對於任意一個對象,只有具有合法許可證的用戶才可以存取。強制存取控制因此相對比較嚴格。(比如A僅授予B某個數據的查看權限,B進行了拷貝進行傳播,采用強制存取控制方式對數據本身加上標記,不管如何復制,只有符合密級標記的用戶才能操作數據)
授權
用戶:合法的數據庫用戶
對象:數據庫中可訪問的各類數據對象,如:表、視圖等
權限:能夠對數據對象進行的操作。權限分為系統權限(如Create、Alter等)和對象權限(如SELECT, INSERT等)。
授權語句:
GRANT <權限>[,<權限>] ... [ON <對象類型> <對象名>]
TO <用戶> [,<用戶>] … [ WITH GRANT OPTION ];
撤銷權限:
REVOKE <權限> [,…] [ON <對象類型> <對象名>] FROM <用戶> [,…] ;
GRANT UPDATE(Sno),SELECT ON TABLE Students TO U1,U2;/*把查詢Student表和修改學號的權限給U1,U2*/
GRANT ALL PRIVILEGES ON TABLE SC,Student TO PUBLIC; /*將SC表和Student表全部權限給所有用戶*/
REVOKE SELECT ON TABLE SC FROM PUBLIC;
GRANT
其語義為:將對指定操作對象的指定操作權限授予指定的用戶。
發出該 GRANT語句的可以是數據庫管理員,也可以是該數據庫對象創建者(即屬主 owner),還可以是已經擁有該權限的用戶。
接受權限的用戶可以是一個或多個具體用戶,也可以是 PUBLIC,即全體用戶
GRANT語句如果指定了 WITH GRANT OPTION子句,則獲得某種權限的用戶還可以把這種權限再授予其他的用戶。但不允許循環授權。如果沒有指定 WITH GRANT OPTION子句,則獲得某種權限的用戶只能使用該權限,不能傳播該權限。
REVOKE
授予用戶的權限可以由數據庫管理員或其他授權者用 REVOKE語句收回
CASCADE(級聯) INSERT權限收回的同時,級聯( CASCADE)收回了U6和U7的INSERT權限
創建數據庫模式的權限
GRANT和 REVOKE語句向用戶授予或收回對數據的操作權限。對創建數據庫模類的數據庫對象的授權則由數據庫管理員在創建用戶時實現。
CREATE USER語句一般格式如下:
CREATE USER <username> [WITH] [DBA | RESOURCE | CONNECT];
只有系統的超級用戶才有權創建一個新的數據庫用戶
新創建的數據庫用戶有三種權限:CONNECT、 RESOURCE和DBA
數據庫角色
數據庫角色:被命名的一組與數據庫操作相關的權限。角色是權限的集合。可以為一組具有相同權限的用戶創建一個角色,簡化授權的過程。
創建角色:
CREATE ROLE <角色名> /*剛創建的角色沒有內容*/
給角色授權:
GRANT <權限>[,<權限>]… [ ON <對象類型> 對象名 ]
TO <角色>[,<角色>]…;
分配角色:
GRANT <角色1>[,<角色2>]… TO <角色3>[,<用戶1>]…
[WITH ADMIN OPTION];
角色權限的收回 :
REVOKE <權限>[,<權限>]… [ ON <對象類型> <對象名> ]
FROM <角色>[,<角色>]…;
視圖
-
作用:把要保密的數據對無權存取這些數據的用戶隱藏起來,對數據提供一定程度的安全保護。
-
視圖的主要功能是提供數據獨立性,無法完全滿足要求;
-
視圖間接實現了支持存取謂詞的用戶權限定義。(某大學中假定王平老師只能檢索計算機系學生的信息,系主任張明具有檢索和增刪改計算機系學生信息的所有權限)
審計
將用戶對數據庫的所有操作自動記錄到審計日志中,DBA利用日志,找出非法的操作等 事后檢查的安全機制
用戶級審計
- 針對自己創建的數據庫表或視圖進行審計 ;
- 記錄所有用戶成功和(或)不成功的訪問及各種類型的SQL操作 。
系統級審計
- DBA設置;
- 監測成功或失敗的登錄要求 ;
- 監測GRANT和REVOKE操作以及其他數據庫級權限下的操作。
數據加密
儲存加密與傳輸加密
數據庫完整性
數據庫中數據的完整性:指數據的正確、有效、相容。
數據庫管理系統采取的方法:
- 提供完整性約束條件(規則)的定義機制 實體 參照 用戶完整性約束
- 提供完整性檢查的方法 數據修改時由DBMS自動完成
- 進行違約處理
實體完整性
檢查主碼是否唯一,檢查主碼各個屬性是否為空
在主碼自動建立索引,避免全表掃描
用戶定義的完整性
- 列值非空( NOT NULL)
- 列值唯一( UNIQUE)
- 檢查列值是否滿足一個條件表達式( CHECK短語)
完整性規則違約處理
-
用戶定義規則的違約處理:拒絕操作
-
實體完整性的違約處理:拒絕操作
-
參照完整性的違約處理:
參照關系違約處理:拒絕操作
被參照關系的違約處理:拒絕、級聯、置空值(SET NULL)
- 拒絕 一般設置為默認策略
- 級聯 刪除或修改被參照表一個元組導致與參照表的不一致時,刪除或修改參照表中所有導致不一致的元組。
- 空值 當刪除或修改被參照表的一個元組時造成了不一致,則將參照表中的所有造成不一致的元組的對應屬性設置為空值
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),/*在表級定義實體完整性,Sno、Cno都不能取空值*/
FOREIGN KEY (Sno) REFERENCES Student(Sno)/*在表級定義參照完整性*/
ON DELETE CASCADE
/*當刪除 Student表中的元組時,級聯刪除SC表中相應的元組*/
ON UPDATE CASCADE
/*當更新 Student表中的sno時,級聯更新SC表中相應的元組*/
FOREIGN KEY(Cno) REFERENCES Course( Cno)/*在表級定義參照完整性*/
ON DELETE NO ACTION/*當刪除 Course表中的元組造成與SC表不一致時,拒絕刪除*/
ON UPDATE CASCADE /*當更新Coue表中的cmo時,級聯更新SC表中相應的元組*/
完整性約束命名子句
可以給每個完整性約束命名,方便增加刪除,不命名的話系統會自動命名,刪除較為麻煩
CONSTRAINT <約束規則名>
[PRIMARY KEY短語 | FOREIGN KEY短語 | CHECK短語]
CREATE TABLE SC (Sno CHAR(10),Cno CHAR(4),
Grade SMALLINT
CONSTRAINT C1 CHECK(Grade BETWEEN 0 AND 100),
PRIMARY KEY(Sno, Cno));
/*Alter修改表中的完整性約束*/
ALTER TABLE SC DROP CONSTRAINT C1;
ALTER TABLE SC
ADD CONSTRAINT C1 CHECK (Grade BETWEEN 0 AND 120);
斷言
斷言創建以后,任何對斷言中所涉及關系的操作都會觸發關系數據庫管理系統對斷言的檢查,任何使斷言不為真值的操作都會被拒絕執行。
復雜的斷言開銷很大
CREATE ASSERTION <斷言名> CHECK <約束規則>
Create Assertion chk_empid
Check (Emp_Sal.emp_id in
(Select emp_id From EmployeeInfo
Where emp_name is not null);