天天看點

第4章:資料庫安全性第4章:資料庫安全性

文章目錄

  • 第4章:資料庫安全性
    • 4.1、資料庫安全性控制
    • 4.2、使用者辨別和鑒定
    • 4.3、存取控制
      • 4.3.1、存取控制概述
      • 4.3.2、自主存取控制(DAC)
      • 4.3.3、強制存取控制(MAC)
    • 4.4、視圖機制
    • 4.5、審計(Audit)

第4章:資料庫安全性

基于SQLServer學習使用,與MySQL有略微差别!

4.1、資料庫安全性控制

對資料庫進行安全性控制的常用機制

  1. 使用者辨別和鑒定
  2. 存取控制
  3. 視圖機制
  4. 審計
  5. 資料加密

4.2、使用者辨別和鑒定

  • 系統提供的最外層安全保護措施
  • 基本方法
    • 系統提供一定的方式讓使用者辨別自己的名字或身份。
    • 每次使用者要求進入系統時,由系統核對使用者提供的身份辨別。
    • 通過鑒定後才提供系統使用權。

4.3、存取控制

4.3.1、存取控制概述

  • 存取控制機制作用
    • 隻允許使用者來存取允許他存取的資料。
    • 不允許使用者存取的資料,該使用者無法接觸。
  • 存取控制機制的實作方式
    • 授權
  • 存取控制機制的組成
    • 定義存取權限
      • 在資料庫系統中,為了保證使用者隻能通路他有權存取的資料,必須預先對每個使用者定義存取權限,這些權限最終被存放在資料字典中,被稱安全規則或授權規則。
    • 檢查存取權限
      • 每當使用者發出存取資料庫的操作請求後,DBMS查找資料字典,根據安全規則進行合法權限檢查,若使用者的操作請求超出了定義的權限,系統将拒絕執行此操作。
  • 存取權限定義和存取權限檢查機制一起組成了DBMS的本機安全性授權
  • 常用存取控制方法
    • 自主存取控制(Discretionary Access Control ,簡稱DAC)
    • 強制存取控制(Mandatory Access Control,簡稱 MAC)(一般用于軍用系統,對安全性要求非常高)

4.3.2、自主存取控制(DAC)

  • 自主存取控制方法
    • 同一使用者對于不同的資料對象有不同的存取權限
    • 不同的使用者對同一對象也有不同的存取權限
    • 使用者還可将其擁有的存取權限轉授(傳播)給其他使用者
  • 定義存取權限稱為授權
  • 誰可以授權
    • DBA(資料庫管理者)、表的建立者(即表的屬主)、擁有一定權限的其他使用者
  • 如何授權
    • SQL語句:grant
下面主要講述的是對 SQLServer 中的使用者進行的授權操作:
  • Login(登入)(伺服器級别)

    是伺服器一級的概念,表示登入某個伺服器的憑證,比如在伺服器A上有一個資料庫,那麼想要通路該資料庫,第一步要做的事情就是先登入到持有該資料庫的伺服器A上。

  • User(使用者)(資料庫級别)

    有了一個Login,表明你可以登入持有資料庫的伺服器A ,并不表明你能夠通路資料庫,你隻有成為資料庫的User,才能通路該資料庫。

  • Login和User的關系
    • 每個User必須對應一個Login。
    • 每個Login可以對應多個User,前提是User在不同的資料庫中

1、建立登入文法::

示例:

-- 在管理者權限下運作
create login U1login with password = '123' 
           

2、建立使用者文法:

示例:

create user U1 for login U1login 
           
  • 授予使用者對某個資料對象具有某種操作權限,稱之為對象授權
  • 在SQLServer中還有另外一種授權——語句授權

3、grant 對象授權語句文法:

grant <權限>[, <權限>, ... ]
	on <對象名>[, <對象名>, …]
	to <使用者>[, <使用者>, ...]
	[with grant option];
           
  • 指定了 with grant option 子句:獲得權限的使用者還可以把這種權限再授予别的使用者。
  • 沒有指定 with grant option 子句:獲得權限的使用者隻能使用該權限,不能傳播該權限

注意:授權時如果有 with grant option,回收權限時要帶着 cascade,代表級聯操作

可以授予的<權限>:

對于基本表而言:

  • insert、delete、update、select
  • all

對于視圖而言:

  • insert、delete、update、select
  • all

對于屬性列而言:

  • select、update
  • all

示例:

-- 把查詢student表的權限授給使用者U1
grant select on student to u1
-- 把查詢sc表的sno列的權限授給使用者U1
grant select(sno) on sc to u1
-- 把查詢SC表的cno、grade列的權限授給使用者U1
grant select(cno,grade) on sc to u1
grant select(cno), select(grade) on sc to u1
-- 把查詢course表的cpno列的權限授給使用者U1,允許U1傳播該權限
grant select(cpno) on course to u1 with grant option
-- U1可以執行下面操作
grant select(cpno) on course to U2;

-- 把删除course表中元組的權限授給使用者U1
grant delete on course to u1
-- U1是否可以執行下面操作?
delete from course where cname = '實體' 
-- 不可以,因為U1沒有對course的cname 的查詢(select)權限
grant select(cname) on course to u1
           

4、grant 語句授權的一般格式:

grant <權限>[, <權限>, ... ]
	to <使用者>[, <使用者>, ...]
	[with grant option];
           

<語句權限>:

  • create database
  • create table
  • create view

示例:

-- 把建立表的權限授給使用者U1
grant create table to U1;
-- 把建立視表的權限授給使用者U2,允許使用者傳播該權限
grant create table to U2 with grant option
           

5、收回對象權限文法:

revoke <權限>[, <權限>, …] 
	on <對象名>[, <對象名>, …]
	from <使用者>[, <使用者>, …]
	[cascade]
           

示例:

-- 授予使用者U1查詢 sc 表的sno列的權限
grant select(sno) on sc to u1
-- 把使用者U1查詢SC表的sno列的權限收回
revoke select(sno) on sc from u1
-- 把查詢course表的權限授予使用者U1,允許使用者傳播該權限
grant select on course to u1 with grant option
-- 把上面授予使用者U1查詢course表的權限收回
revoke select on course from u1 				-- 【錯誤】
revoke select on course from u1 cascade -- 【正确】 級聯撤銷
           

6、收回語句權限文法:

revoke <權限>[, <權限>, …] 
	from <使用者>[, <使用者>, …]
  [cascade]
           

示例:

-- 把建立表的權限授給使用者U1
grant create table to U1;
-- 把上面授予使用者U1建立表的權限收回
revoke create table from u1
           
SQLServer中的架構(了解即可)

架構的引入就是為了解決資料庫對象太多不好管理的問題。這是資料庫管理就變成了使用者-架構-資料庫對象的模式了

資料庫對象:所有的表、視圖、存儲過程、觸發器都稱為資料庫對象。

架構:微軟的官方說明(MSDN): “資料庫架構是一個獨立于資料庫使用者的非重複命名空間,您可以将架構視為對象的容器”,是以,我們要通路一個資料庫對象的時候,通常應該是引用它的全名“架構名. 對象名”。

架構(schema)

從 SQL Server 2005 開始,每個對象都屬于一個資料庫架構。可以在資料庫中建立和更改架構,并且可以授予使用者通路架構的權限。

架構的特點:

  1. 一個架構中不能包含相同名稱的對象,相同名稱的對象可以在不同的架構中存在。
  2. 一個架構必須有一個所有者。
  3. 一個資料庫使用者擁有多個架構。
  4. 架構的所有權可以改變。

建立架構:

示例:

create schema schema2 authorization u1 -- 架構權限
grant create,insert table to u1 	     -- 建立表的權限
-- u1上運作
create table schema2.t2( c1 int )
insert into schema2.t2 values(100)
           

對于查詢、删除,修改而言:

1)登陸資料庫的權限

2)查詢、删除、修改資料庫對象的權限

對于新增而言:

1)登陸資料庫的權限

2)架構的權限

3)查詢、删除、修改資料庫對象的權限

SQLServer中的角色

角色可以簡化授權

資料庫角色:資料庫角色是權限的集合

建立角色:

示例:

-- 建立登入賬号
create login u1login with password = '123'
-- 建立使用者 u1
create user u1 for login u1login
-- 将資料庫使用者 u1 添加到資料庫角色 role1 中,管理者下執行
sp_addrolemember 'role1', 'u1'
           

為角色授權與為使用者的授權文法一緻;

收回角色與為收回使用者的權限文法一緻;

4.3.3、強制存取控制(MAC)

在MAC方法中,DBMS所管理的全部實體被分為主體和客體兩大類

  • 主體:是系統中的活動實體
    • DBMS所管理的實際使用者
    • 代表使用者的各程序
  • 客體:是系統中的被動實體,是受主體操縱的
    • 檔案
    • 基本表
    • 索引
    • 視圖

對于主體和客體,DBMS為它們每個執行個體指派一個敏感度标記(Label)

  • 敏感度标記分成若幹級别
    • 絕密(Top Secret)
    • 機密(Secret)
    • 可信(Confidential)
    • 公開(Public)
  • 主體的敏感度标記稱為許可證級别(Clearance Level)
  • 客體的敏感度标記稱為密級(Classification Level)

強制存取控制實作的基本原理:

? MAC機制就是通過對比主體的Label和客體的Label,最終确定主體是否能夠存取客體

當某一主體憑借它的許可證級别注冊進入系統後,系統要求他對任何客體的存取必須遵循下面兩條規則:

(1)僅當主體的許可證級别>=客體的密級時,該主體才能讀取相應的客體;

(不上讀)

(2)僅當主體的許可證級别<=客體的密級時,主體能寫客體

(不下寫)

強制存取控制(MAC)特點:

  • MAC是對資料本身進行密級标記
  • 無論資料如何複制,标記與資料是一個不可分的整體
  • 隻有符合密級标記要求的使用者才可以操縱資料,進而提供了更進階别的安全性

自主存取控制(DAC)特點

  • 優點
    • 能夠通過授權機制有效地控制其他使用者對敏感資料的存取
  • 缺點
    • 可能存在資料的“無意洩露”
    • 僅僅通過對資料的存取權限來進行安全控制,而資料本身并沒有安全性标記。

4.4、視圖機制

原因:grant 語句不支援 where 條件(存取謂詞)

? 假設現在有一張總的學生表,裡面有各種系别的學生資訊,有計算機系、數學系、外語系…,我們現在希望某一個使用者隻能查詢某一系别的學生資訊,而不是所有系的學生都可以看到,這時可以通過視圖機制來實作權限控制!

假設我們希望使用者 u2 隻能查詢計算機系的學生資訊,那麼我們隻需要建立查詢計算機系學生資訊的視圖,通過對視圖進行權限控制,來把一些資料進行隐藏。

例如:

-- 先建立計算機系學生的視圖CS_Student
CREATE VIEW CS_Student
	AS 
	SELECT * FROM Student 
			WHERE Sdept='CS'
grant SELECT ON CS_Student TO  U1
-- u2能檢索、增删改計算機系學生的資訊
GRANT ALL PRIVILIGES ON  
	CS_Student TO U2 
           

總之,視圖機制通過把要保密的資料對無權存取這些資料的使用者隐藏起來來實作

4.5、審計(Audit)

什麼是審計?

  • 将使用者對資料庫的所有操作記錄在審計日志(Audit Log)上面
  • DBA利用審計日志找出非法存取資料的人、時間和内容

C2以上安全級别的DBMS必須具有審計機制