Security Policy:行級安全(Row-Level Security)

来源:http://www.cnblogs.com/ljhdo/archive/2016/12/15/5040234.html
-Advertisement-
Play Games

行級安全RLS(Row-Level Security)是在數據行級別上控制用戶的訪問,控制用戶只能訪問資料庫表的特定數據行。斷言是邏輯表達式,在SQL Server 2016中,RLS是基於安全斷言(Security Predicate)的訪問控制,Security Predicate是由內聯表值函 ...


通過授予和拒絕(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
更多相關文章
  • 從iOS8系統開始,用戶可以在設置裡面設置在WiFi環境下,自動更新安裝的App。此功能大大方便了用戶,但是一些用戶沒有開啟此項功能,因此還是需要在程式裡面提示用戶的 方法一:在伺服器介面約定對應的數據,這樣,伺服器直接傳遞信息,提示用戶有新版本,可以去商店升級 註意:這個方法是有毛病的,若您的Ap ...
  • 這是一篇我曾經拜讀過的資料庫基礎總結性的文章,原文出自園友 "游戲世界" 。最近想重新鞏固一遍,不過原文訪問受限,我在某網站找到爬蟲版,重新排版後轉載至此處。 1.什麼是SQL語句 SQL語言,結構化的查詢語言(Structured Query Language),是關係資料庫管理系統的標準語言。它 ...
  • 初識spark,需要對其API有熟悉的瞭解才能方便開發上層應用。本文用圖形的方式直觀表達相關API的工作特點,並提供瞭解新的API介面使用的方法。例子代碼全部使用python實現。 1. 數據源準備 準備輸入文件: 啟動pyspark: 使用textFile創建RDD: 查看RDD分區與數據: 2. ...
  • 你正在使用 SQL Server 的哪個版本? "我是誰" SQL Server 及其組件的版本、版本類別和更新級別? 作為一個SQL Server資料庫管理者或維護、支持人員,應該會經常問自己這樣一個問題:我當前SQL Server版本號是?當前版本已經有的累計更新、安全更新包有哪些?這麼多包要選 ...
  • 1、環境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 master作為active主機,data1作為standby備用機,三台機器均作為數據節點,yarn資源管理器在master上開啟,在data1上備用,data1上開啟歷史伺服器 主要參考見下表 Data ...
  • 在Disk-Base資料庫中,如果系統頻繁地創建和更新臨時表,大量的IO操作集中在tempdb中,tempdb很可能成為系統性能的瓶頸。在SQL Server 2016的記憶體(Memory-Optimized)資料庫中,如果考慮使用記憶體優化結構來存儲臨時表,表變數,表值參數的數據,那麼將完全消除IO ...
  • Microsoft SQL Server 2005 提供了一些工具來監控資料庫。方法之一是動態管理視圖。動態管理視圖 (DMV) 和動態管理函數 (DMF) 返回的伺服器狀態信息可用於監控伺服器實例的運行狀況、診斷問題和優化性能。常規伺服器動態管理對象包括:– dm_db_*:資料庫和資料庫對象– ...
  • 我們知道當ORACLE資料庫啟用共用伺服器模式時,通過共用伺服器模式連接到資料庫的會話是有一些特征的。在v$session裡面,其SERVER的狀態一般為SHARED和NONE, 為SHARED時,表示當前會話正在執行SQL語句,其占用共用伺服器進程,會話的STATUS狀態為ACTIVE;當會話狀態... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...