1. 程式人生 > >SQL Server 2016 行級別許可權控制

SQL Server 2016 行級別許可權控制

背景

假如我們有關鍵資料儲存在一個表裡面,比如人員表中包含員工、部門和薪水資訊。只允許使用者訪問各自部門的資訊,但是不能訪問其他部門。一般我們都是在程式端實現這個功能,而在sqlserver2016以後也可以直接在資料庫端實現這個功能。

解決

安全已經是一個數據方面的核心問題,每一代的MS資料庫都有關於安全方面的新功能,那麼在Sql Server 2016,也有很多這方面的升級,比如‘Row Level Security’, ‘Always Encrypted’, ‘Dynamic Data Masking’, 和‘Enhancement of Transparent Data Encryption’ 等等都會起到安全方面的作用。本篇我將介紹關於Row Level Security (RLS--行級別安全), 能夠控制表中行的訪問許可權。RLS 能使我們根據執行查詢人的屬性來控制基礎資料,從而幫助我們容易地為不同使用者提透明的訪問資料。行級安全性使客戶能夠根據執行查詢的使用者的特性控制資料庫中的行。

為了實現RLS我們需要準備下面三個方面:

  1. 謂詞函式
  2. 安全謂詞
  3. 安全策略

逐一描述上面三個方面

謂詞函式

謂詞函式是一個內建的表值函式,用於檢查使用者執行的查詢訪問資料是否基於其邏輯定義。這個函式返回一個1來表示使用者可以訪問。

安全謂詞

安全謂詞就是將謂詞函式繫結到表裡面,RLS提供了兩種安全謂詞:過濾謂詞和阻止謂詞。過濾謂詞就是在使用SELECT, UPDATE, 和 DELETE語句查詢資料時只是過濾資料但是不會報錯。而阻止謂詞就是在使用違反謂詞邏輯的資料時,顯示地報錯並且阻止使用者使用 AFTER INSERT, AFTER UPDATE, BEFORE UPDATE, BEFORE DELETE 等操作。

安全策略

安全策略物件專門為行級別安全建立,分組所有涉及謂詞函式的安全謂詞。

例項

例項中我們建立一個Person表和測試資料,最後我們讓不懂得使用者訪問各自部門的資訊,程式碼如下:

Create table dbo.Person

(

PersonId INT IDENTITY(1,1),

PersonName varchar(100),

Department varchar(100),

Salary INT,

User_Access varchar(50)

)

GO

INSERT INTO Person (PersonName, Department, Salary, User_Access)

SELECT 'Ankit', 'CS', 40000, 'User_CS' UNION ALL SELECT 'Sachin', 'EC', 20000, 'User_EC' UNION ALL SELECT 'Kapil', 'CS', 30000, 'User_CS' UNION ALL SELECT 'Ishant', 'IT', 50000, 'User_IT' UNION ALL SELECT 'Aditya', 'EC', 45000, 'User_EC' UNION ALL SELECT 'Sunny', 'IT', 60000, 'User_IT' UNION ALL SELECT 'Rohit', 'CS', 55000, 'User_CS' GO

此時表已經被建立,並且插入了測試資料,執行下面語句檢索有是有的記錄:

SELECT * FROM Person

clip_image001

正如所示,目前有三個部門department(CS,EC,IT),並且User_Access列表示各自的使用者組。讓我們建立三個測試使用者資料的賬戶語句如下:

--For CS department

CREATE USER User_CS WITHOUT LOGIN

--For EC department

CREATE USER User_EC WITHOUT LOGIN

-- For IT Department

CREATE USER User_IT WITHOUT LOGIN

在建立了使用者組以後,授權讀取許可權給上面是哪個新建的使用者,執行語句如下:

---授予select許可權給所有的使用者

GRANT SELECT ON Person TO User_CS

GRANT SELECT ON Person TO User_EC

GRANT SELECT ON Person TO User_IT

現在我們建立一個謂詞函式,該函式是對於查詢使用者是不可見的。

----Create function

CREATE FUNCTION dbo.PersonPredicate

( @User_Access AS varchar(50) )

RETURNS TABLE

WITH SCHEMABINDING

AS

RETURN SELECT 1 AS AccessRight

WHERE @User_Access = USER_NAME()

GO

這個函式是隻返回行,如果正在執行查詢的使用者的名字與User_Access 列匹配,那麼使用者允許訪問指定的行。在建立該函式後,還需要建立一個安全策略,使用上面的謂詞函式PersonPredicate來對錶進行過濾邏輯的繫結,指令碼如下:

--安全策略

CREATE SECURITY POLICY PersonSecurityPolicy

ADD FILTER PREDICATE dbo.PersonPredicate(User_Access) ON dbo.Person

WITH (STATE = ON)

State(狀態)為ON才能是策略生效,如果打算關閉策略,你可以改變狀態為OFF。

再來看一下查詢結果:

clip_image002

這次查詢沒有返回任何行,這意味著謂詞函式的定義和策略的建立後,使用者查詢需要具有相應許可權才能返回行,接下來使用不同使用者來查詢這個資料,首先,我們用使用者User_CS來查詢一下結果:

EXECUTE AS USER = 'User_CS'

SELECT * FROM dbo.Person

REVERT

正如所示,我們看到只有三行資料資料該使用者,User_CS,已經檢索出來。因此,過濾函式將其他不屬於該使用者組的資料過濾了。

實際上這個查詢執行的過程就是資料庫內部呼叫謂詞函式,如下所示:

SELECT * FROM dbo.Person

WHERE User_Name() = 'User_CS'

其他兩組使用者的查詢結果是相似的這裡就不一一演示了。

因此,我們能看到執行查詢根據用的不同得到只屬於指定使用者組的指定資料。這就是我們要達成的目的。

到目前為止,我們已經演示了過濾謂詞,接下來我們演示一下如何阻止謂詞。執行如下語句來授權DML操作許可權給使用者。

--授權DML 許可權

GRANT INSERT, UPDATE, DELETE ON Dbo.Person TO User_CS

GRANT INSERT, UPDATE, DELETE ON Dbo.Person TO User_EC

GRANT INSERT, UPDATE, DELETE ON Dbo.Person TO User_IT

我們用使用者User_IT執行插入語句,並且插入使用者組為UserCS的,語句如下:

EXECUTE AS USER = 'User_IT'

INSERT INTO Person (PersonName, Department, Salary, User_Access)

SELECT 'Soniya', 'CS', 35000, 'User_CS'

REVERT

but,竟然沒有報錯,插入成功了。

讓我們在檢查一下使用者資料插入的情況:

EXECUTE AS USER = 'User_IT'

SELECT * FROM dbo.Person

REVERT

奇怪,新插入行並沒有插入到該使用者組'User_IT'中。而是出現在了'User_CS' 的使用者組資料中。

--插入資料出現在了不同的使用者組

EXECUTE AS USER = 'User_CS'

SELECT * FROM dbo.Person

REVERT

clip_image005

通過上面的例子我們發現,過濾謂詞不不會阻止使用者插入資料,因此沒有錯誤,這是因為沒有在安全策略中定義阻止謂詞。讓我們加入阻止謂詞來顯示報錯,有四個阻止謂詞AFTER INSERT, AFTER UPDATE, BEFORE UPDATE, 和 BEFORE DELETE可以使用。我們這裡測試使用AFTER INSERT 謂詞。這個謂詞阻止使用者插入記錄到沒有許可權檢視的資料使用者組。

新增謂詞阻止的安全策略,程式碼如下:

--新增阻止謂詞

ALTER SECURITY POLICY PersonSecurityPolicy

ADD BLOCK PREDICATE dbo.PersonPredicate(User_Access)

ON dbo.Person AFTER INSERT

現在我們用之前類似程式碼再試一下,是否可以插入資料:

EXECUTE AS USER = 'User_CS'

INSERT INTO Person (PersonName, Department, Salary, User_Access)

SELECT 'Sumit', 'IT', 35000, 'User_IT'

REVERT

1

擦,果然這次錯誤出提示出現了,阻止了不同許可權使用者的插入。因此我們能說通過新增阻止謂詞,未授權使用者的DML操作被限制了。

注意:在例子中每個部門只有一個使用者組成。如果在一個部門包含多個使用者的情況下,我們需要建立分支登入為每個使用者都分配需要的許可權,因為謂詞函式應用於使用者基礎並且安全策略取決於謂詞函式。

行級別安全的限制

這裡有幾個行級別安全的限制:

  1. 謂詞函式一定要帶有WITH SCHEMABINDING關鍵詞,如果函式沒有該關鍵字則繫結安全策略時會丟擲異常。
  2. 在實施了行級別安全的表上不能建立索引檢視。
  3. 記憶體資料表不支援
  4. 全文索引不支援

總結

帶有行級別安全功能的SQLServer2016,我們可以不通過應用程式級別的程式碼修改來實現資料記錄的許可權控制。行級別安全通過使用謂詞函式和安全策略實現,不需要修改各種DML程式碼,伴隨著現有程式碼即可實現。

相關推薦

SQL Server 2016 級別許可權控制

背景 假如我們有關鍵資料儲存在一個表裡面,比如人員表中包含員工、部門和薪水資訊。只允許使用者訪問各自部門的資訊,但是不能訪問其他部門。一般我們都是在程式端實現這個功能,而在sqlserver2016以後也可以直接在資料庫端實現這個功能。 解決 安全已經是一個數據方面的核心問題,每一代的MS資料庫都有關於安全方

SQL Server 2016 版本由系統控制的臨時表(Temporal tables)

臨時表是 ANSI SQL 2011 中引入的資料庫功能。版本由系統控制的臨時表是使用者表的一種型別,旨在保留完整的資料更改歷史記錄,並實現輕鬆的時間點分析。 這種型別的臨時表之所以稱為版本由系統控制的臨時表,是因為每一行的有效期由系統(即資料庫引擎)管理。(官方文件直接翻譯

SQL Server計劃操作符具體解釋(2)——串聯(Concatenation )

-s 而且 article font order close 格式 聚集索引 content 本文接上文:SQL Server 運行計劃操作符具體解釋(1)——斷言(Assert)前言: 依據計劃。本文開始講述另外一個操作符串聯(Concatenation)。讀者能夠依

SQL Server 2016 發送郵件功能

logs server img 註意 http 基本 3.5 net .net 3.5 --1 安裝好SQL Server 2016 --2 安裝.Net 3.5 由於SQL Server 2016 安裝不提示強制安裝.NET 3.5 但是還是需要安裝,數據庫發送郵件會使用

數據庫原理及應用(SQL Server 2016數據處理)【上海精品視頻課程】

應用 原理 sql 信息無處不在,數據處理無處不用。物質、信息、能源已經成為人類生存和發展的重要保障。數據庫的應用廣度深度及建設規模已經成為衡量一個國家信息化程度的一項重要標誌。數據庫技術是計算機學科的一個重要分支,反映了數據管理的最新技術。數據庫技術與計算機網絡、人工智能一起被稱為計算機三大

SQL Server 2016 共享功能目錄 不可修改

技術分享 麻煩 ima ·· log class 個人電腦 ... png x 個人電腦上沒有安裝MSSQL,以前需要鏈接數據庫寫SQL,都是在{VS ->>視圖->>SQL Server對象資源管理器}直接鏈接數據庫進行訪問操作的... 但是確實有

SQL Server 事務隔離級別詳解

完成 sql 事務 create 事務隔離 測試數據 span read type off SQL 事務隔離級別 概述 隔離級別用於決定如果控制並發用戶如何讀寫數據的操作,同時對性能也有一定的影響作用。 步驟 事務隔離級別通過影響讀操作來間接地影響寫操作;可以在回

JSON in SQL Server 2016

sum finall exec log msdn eve har ctu type JSON functions in SQL Server enable you to analyze and query JSON data, transform JSON to relat

Saturday SQL Server 2016 初體驗

主界面 cbt 啟動界面 公眾號 微軟官網 .com 截圖 控制臺 euc 最近在開發一個有關數據庫的項目,我想用SQLite,但是SQLite的設計器不是特別友好,然後據說VS有一個集成的SQLite設計器,但是我用的VS2017親測並沒有,用戶體驗不佳,所以安裝一個SQ

SQL Server 2016新特性:Temporal Table

clu let tween 事務 之間 small 激活 設置 版本 什麽是系統版本的Temporal Table 系統版本的Temporal Table是可以保存歷史修改數據並且可以簡單的指定時間分析的用戶表。 這個Temporal Table就是系統版本的Tempora

SQL Server 2016授權說明-備望

sql server 2016授權說明SQL 2016授權方式有點復雜,說明如下:1、 版本:標準版本和企業版,軟件功能沒有差別,只是標準版有如下限制 :a) 內存最大識別64Gb) CPU最大識別4顆,且最多只能識別16個核心c) 集群只支持2臺主機而企業版則沒有上面的限

SQL Server 2016 Failover + ALwaysOn

所有者 檢測 禁用 ger sha 上進 定義 ecb cef 我們前面寫了很多關於SQL Server相關的文章,近期公司為了提高服務的可用性,就想到了部署AlwaysOn,之前的環境只是部署了SQL Server Failover Cluster,所以決定將雲端放一臺S

SQL Server 2016 Failover Cluster+ ALwaysOn--增多個偵聽器

always nag db4 ger img 51cto roc 今天 配置 我們前面3片文章介紹了SQL Server 2016 Failover Cluster+ ALwaysOn的完整配置,今天我們介紹一下如果給ALwaysOn增加多個客戶端訪問點,常規情況下,每個可

SQL Server 2016 Failover +AlwaysOn 增加數據庫到可用性組

服務器 water path eba dfa instance logback 個數 ilove SQL Server Failover +AlwaysOn 增加數據庫到可用性組前面幾篇文章都已經詳細介紹了SQL Server Failover +AlwaysOn 的配置,

SQL Server 2016新特性:DROP IF EXISTS

obj 宋體 fff article 特性 這一 ble family base 原文:SQL Server 2016新特性:DROP IF EXISTS ?? 在我們寫T-SQL要刪除某個對象(表、存儲過程等)時,一

SQL Server 事務隔離級別

目前 lte log har 獲取 span 單用戶模式 最大 logs 參考文檔: https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-transaction-isolation-level-transact

FineReport9.0定義數據連接(創建與SQL Server 2016數據庫的連接)

數據連接 選擇 用戶 wid jdbc blog ros conf 驗證 1、下載並安裝好FineReport9.0和SQL Server 2016 2、開始——>所有應用——>Microsoft SQL Ser

安裝好SQL Server 2016,沒有自帶SSMS 工具

sqlhttps://docs.microsoft.com/zh-cn/sql/ssms/sql-server-management-studio-changelog-ssms?view=sql-server-2016#previous-ssms-releases 安裝:SQL Server Manageme

配置SQL Server 2016無域AlwaysOn(轉)

命令 火墻 地址 ons 五步 red 圖形 ssp 故障轉移群集 Windows Server 2016 以及 SQL Server 2016出來已有一段時間了,因為Windows Server 2016可以配置無域的Windows群集,因此也能夠以此來配置無域的SQL

SQL server 2016 安裝步驟

1.進入安裝中心:可以參考硬體和軟體要求、可以看到一些說明文件 2.選擇全新安裝模式繼續安裝 3.輸入產品祕鑰:這裡使用演示祕鑰進行 4.在協議中,點選同意,並點選下一步按鈕,繼續安裝 5.進入全域性規則檢查項,這裡可能要花費幾秒鐘,試具體情況而定