行級安全(Row-Level Security)

来源:http://www.cnblogs.com/ljhdo/archive/2017/01/17/5040234.html
-Advertisement-
Play Games

通過授予和拒絕(Grant/Deny)命令控制用戶的許可權,只能控制用戶對資料庫對象的訪問許可權,這意味著,用戶訪問的粒度是對象整體,可以是一個數據表,或視圖等,用戶要麼能夠訪問資料庫對象,要麼沒有許可權訪問,就是說,一個資料庫對象,通過授予和拒絕用戶的許可權/角色(Permission或Role),無法使 ...


通過授予和拒絕(Grant/Deny)命令控制用戶的許可權,只能控制用戶對資料庫對象的訪問許可權,這意味著,用戶訪問的粒度是對象整體,可以是一個數據表,或視圖等,用戶要麼能夠訪問資料庫對象,要麼沒有許可權訪問,就是說,一個資料庫對象,通過授予和拒絕用戶的許可權/角色(Permission或Role),無法使特定的數據行只允許特定身份的人訪問,但是,該需求可以使用安全策略(Security Policy)實現。

當啟用行級安全(Row-Level Security,簡稱RLS)時,Security Policy在數據行級別上控制用戶的訪問,粒度是數據行,控制用戶只能訪問數據表的特定數據行。斷言(Predicate )是邏輯表達式,返回的結果是布爾(boolean)值:true 或false。在SQL Server 2016中,RLS是基於安全斷言(Security Predicate)的訪問控制,Security Predicate是由內聯表值函數實現的,當邏輯表達式返回結果時,安全斷言的結果是True;當邏輯表達式不返回任何結果時,安全斷言的結果是False。如果安全策略(Security Policy)被禁用,那麼用戶總是訪問所有數據行,跟數據表上不關聯任何安全策略一樣。

 

實現RLS,必須顯式定義三個組件:

  • 數據表(Base Table):用於存儲數據行,在該表上創建Security Policy,使用RLS控制用戶能夠訪問的數據行;
  • 斷言函數(Predicate Function):是內聯表值函數,用於執行安全斷言,Security Policy調用該函數過濾數據行或阻塞寫操作;
  • 安全策略(Security Policy):將數據表和斷言函數綁定,並設置安全斷言的類型;

一,內聯表值函數定義安全斷言(Security Predicate)

如果在數據表上啟用RLS,那麼一個用戶訪問數據行的許可權受到安全斷言(Security Predicate)的限制,Security Predicate 是在內聯表值函數中定義的邏輯表達式,Security Policy調用內聯表值函數,返回Security Predicate 的結果。在用戶訪問行級別數據時,SQL Server自動執行預定義的安全策略(Security Policy),僅當Security Predicate返回邏輯結果時,才允許用戶訪問指定的數據行;如果Security Predicate 不返回任何結果,那麼不允許用戶訪問數據。如果在一個數據表上創建了Security Policy,但是,安全策略(SecurityPolicy)被禁用,那麼,Security Predicate將不會過濾或阻塞任何數據行,不執行任何的Filter 或 Block操作,用戶能夠訪問所有的數據行。

下麵的示例代碼定義了安全斷言(Security Predicate),該表達式根據用戶名作為斷言控制用戶訪問的數據行:

CREATE FUNCTION rls.fn_securitypredicate
(@SalesRep AS sysname)  
RETURNS TABLE  
WITH SCHEMABINDING  
AS  
RETURN SELECT 1 AS fn_securitypredicate_result   
WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'Manager'; 

二,過濾斷言和阻塞斷言(Filter 和 Block)

在Security Policy中,RLS支持兩種類型的安全斷言(Security Predicates):

  • Filter Predicate:當用戶從基礎表讀取數據行時,Filter Predicate透明地過濾數據行,用戶只能讀取有許可權訪問的數據行;如果所有的數據行都被過濾掉,那麼返回空集給用戶;
  • Block Predicate:當違反斷言時,阻塞寫操作事務的提交,回滾寫操作事務;

1,過濾斷言(Filter Predicate)

當從Base Table讀取數據時,讀操作受到Filter Predicate的影響,讀取數據的操作包括:select,delete和update,用戶不能查詢,刪除和更新被過濾的數據行。

過濾斷言(Filter Predicate)定義一個Security Policy,在Base Table上執行select,update和delete命令時,Security Policy透明地過濾數據行,應用程式不會意識到Filter操作的存在;應用程式能夠插入任何數據,不管數據是否被過濾掉。

2,阻塞斷言(Block Predicate)

阻塞斷言(Block predicates)將Update操作拆分成兩個獨立的操作:Before Update 和 After Update。

Block Predicate影響所有的寫操作,有四種阻塞操作:

  • After Insert 斷言:阻止用戶插入違反斷言的欄位值,就是說,插入的數據必須滿足斷言;
  • After Update 斷言:阻止用戶將數據更新為違反斷言的欄位值,就是說,數據更新後,其值必須滿足斷言;
  • Before Update 斷言:只允許用戶更新符合斷言的數據行,就是說,對於符合斷言的數據行,能夠更新為任意值;
  • Before Delete 斷言:只允許用戶刪除符合斷言的數據行,就是說,對於符合斷言的數據行,能夠刪除;

阻塞操作有分為After 和Before選項:

  • After 指定:在執行Insert 或 Update操作之後,計算斷言的邏輯結果;如果邏輯結果為false,那麼回滾Insert 或 Update操作;
  • Before 指定:在執行Update 或Delete 操作之前,計算斷言的邏輯結果,用戶只能Update或Delete符合斷言的數據;
  • 如果沒有指定,那麼預設會指定所有四種阻塞操作。

三,使用Security Policy控制用戶只能訪問指定的數據

1,創建數據表,並插入數據

CREATE TABLE dbo.Sales  
(  
OrderID int not null,  
SalesRep sysname,  
Product varchar(10) not null,  
Qty int not null 
);  

INSERT dbo.Sales 
VALUES   
(1, 'Sales1', 'Valve', 5),   
(2, 'Sales1', 'Wheel', 2),   
(3, 'Sales1', 'Valve', 4),  
(4, 'Sales2', 'Bracket', 2),   
(5, 'Sales2', 'Wheel', 5),   
(6, 'Sales2', 'Seat', 5);
View Code

2,創建User,並授予查詢許可權

--create user
create user Sales1 without login;
create user Manager without login; --grant permission GRANT SELECT ON Sales TO Manager; GRANT SELECT ON Sales TO Sales1;

3,創建記憶體表值函數,用於過濾數據行,返回Security Predicate 的結果

強烈推薦創建一個單獨的Schema,用於RLS對象(Predicate Function和 Security Policy),本例中創建RLS Schema。

--create schema
create schema rls;  
authorization dbo;
 
--create function
CREATE FUNCTION rls.fn_securitypredicate
(@SalesRep AS sysname) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_securitypredicate_result WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'Manager';

4,創建和啟動安全策略(Security Policy)

在新建的Security Policy中,將Base Table和Security Predicate 綁定,添加Filter Predicate,使用dbo.Sales作為過濾條件,啟用新建的Security Policy

CREATE SECURITY POLICY rls.SalesFilter  
ADD FILTER PREDICATE rls.fn_securitypredicate(SalesRep)   
ON dbo.Sales  
WITH (STATE = ON); 

5,測試安全策略(Security Policy)

EXECUTE AS USER = 'Sales1'; 
SELECT USER_NAME() as UserName,* 
FROM dbo.Sales;   
REVERT;  

EXECUTE AS USER = 'Manager';  
SELECT USER_NAME() as UserName,* 
FROM dbo.Sales;    
REVERT; 

6,啟用或禁用安全策略(Security Policy)

--diable
ALTER SECURITY POLICY rls.SalesFilter  
WITH (STATE = OFF);  
--enable
ALTER SECURITY POLICY rls.SalesFilter  
WITH (STATE = ON);  

四,維護安全策略(Security Policy)

Security Policy適用於所有的用戶,包括最高許可權角色 sysadmin 和 db_owner 的成員,以及dbo用戶,雖然這些成員擁有很高的許可權,能夠更改Security Policy的定義,甚至刪除Security Policy,但是,在訪問數據行時,仍然會受到Security Policy的影響,訪問的數據是Filter 或Block的結果。一個User要想訪問所有的數據行,必須在Predicate Function中顯式定義。一般情況下,會設置一個管理RLS的Manager用戶,用於維護Security Predicate控制的數據,必要時對數據處理進行故障排除。如果安全策略(Security Policy)被禁用,那麼,用戶在訪問數據表時,不會Filter或Block任何數據行,看到的數據表的全部數據行。

 

參考文檔:

CREATE SECURITY POLICY (Transact-SQL)

Row-Level Security


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 執行計劃顯示SQL執行的開銷 工具→ SQL Server Profiler : SQL Server 分析器,監視系統調用的SQL Server查詢 Top查詢 -- Top Percent 選擇百分比 SELECT top 30 percent * FROM [SchoolDB].[dbo].[... ...
  • 前言 最近連續接觸了4個OA系統,均存在著不同的性能問題,本文記述對某移動OA系統的優化全過程,讓看官們對資料庫優化流程有一個瞭解,並揭開隱式轉換這無情殺手的神秘面紗。 本文使用的工具:SQL專家雲平臺專業體檢工具 :www.zhuancloud.com 系統情況 硬體配置 軟體情況 資料庫情況 系 ...
  • 遇到的問題 1、最初階段 系統中做了一個監控功能,用於記錄所有的請求數據,數據插入頻繁,量非常大,比如一天1000萬條。考慮到數據插入的效率,就使用記憶體KV緩存來保存。寫入過程是在接收到請求後放入到線程池中,然後線程池非同步處理後寫入。到這問題基本上沒什麼事情。 2、新的需求 後面數據保存了,就需要在 ...
  • httpd yum install httpd -y systemctl status httpd systemctl start httpd systemctl stop firewalld Mariadb yum install mariadb-server mariadb-client -y ...
  • SQL Server 其實從SQL Server 2005開始,也提供了類似ORACLE中固定執行計劃的功能,只是好像很少人使用這個功能。當然在SQL Server中不叫"固定執行計劃"這個概念,而是叫"執行計劃指南"(Plan Guide 很多翻譯是計劃指南,個人覺得執行計劃指南稍好一些)。當然兩... ...
  • 最近在做oracle相關的項目,剛接觸oracle,與sqlserver語法上還是有區別的 sqlserver : 示例:FX+當前年月日+00001 如下圖流水號實力所示 原理: 首先 'FX'是固定的,獲取當前年月日方法在sqlserver中分別是: 1.年:YEAR(GETDATE()) 2. ...
  • 一、博客前言 自接觸學習MySQL已有一段時間了,對於MySQL的基礎知識還是有一定的瞭解的。在這一路學習過來,每次不管看書還是網上看的資料,對於MySQL數據類型中的時間日期類型總是一掃而過,不曾停下來認認真真的研究學習。最近在圖書館借了一本關於MysQL的書籍,打算全面的學習研究一遍。 在之前, ...
  • 本篇源碼基於趙星對Spark 1.3.1解析進行整理。話說,我不認為我這下文源碼的排版很好,不能適應的還是看總結吧。 雖然1.3.1有點老了,但對於standalone模式下的Master、Worker和劃分stage的理解是很有幫助的。 總結: master和worker都要創建ActorSyst ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...