Security8:許可權模擬

悅光陰發表於2020-05-25

使用者可以模擬其他使用者或登陸的許可權來執行查詢,並且在檢視使用者和登入的許可權時,結果會受到模擬上下文的影響。當執行EXECUTE AS命令時,原始使用者的安全上下文會進行切換,除了ORIGINAL_LOGIN之外,其他函式都會返回模擬上下文的Login和User資訊。

一,指定Session的安全上下文

預設情況下,一個會話在使用者登陸時開始,在使用者退出時結束,使用者的許可權決定了使用者的操作。當使用者使用EXECUTE AS 命令時,當前使用者的許可權切換到制定的使用者或登陸的安全上下文,以模擬物件的許可權來執行操作。EXECUTE AS 命令用於設定會話的執行上下文:

{ EXEC | EXECUTE } AS { LOGIN | USER } = 'domain\name' | CALLER
...
REVERT;

把執行上下文切換到指定的Login 或User,引數CALLER 只用於模組內部,以模組呼叫者的安全上下文來執行。

要結束許可權模擬,可以執行命令 REVERT,該命令用於恢復當前使用者的原始執行上下文。

當執行EXECUTE AS 命令之後,使用者的安全上下文會被切換為指定的使用者。ORIGINAL_LOGIN() 返回最原始的Login名稱,不受上下文切換的影響:

ORIGINAL_LOGIN( ) 

其他返回使用者和Login的函式,都是基於當前上下文的。比如,SESSION_USER返回當前安全上下文的使用者名稱稱,如果該函式在EXECUTE AS 命令之後被呼叫,那麼上下文被切換,SESSION_USER返回模擬上下文的使用者名稱稱:

SESSION_USER 

二,指定模組的安全上下文

在SQL Server中,你可以定義使用者定義模組(內聯表值函式、儲存過程、queue和觸發器)的執行上下文。預設值是CALLER,也就是說,使用模組呼叫者的安全上下文來執行:

WITH EXECUTE AS { CALLER | SELF | OWNER | 'user_name' }  

引數註釋

  • CALLER:以模組呼叫者的安全上下文來執行,模組的呼叫者不僅要有呼叫模組的許可權,還要有訪問被模組引用的物件的許可權。
  • SELF:指定以模組的建立者或修改者的安全上下文來執行
  • OWNER:以模組的所有者(Owner)的安全上下文來執行,如果沒有指定物件的Owner,那麼以Schema的Owner來執行。

資料庫物件的Owner可以通過命令ALTER AUTHORIZATION來修改,常見的class_type是:OBJECT、ROLE、SCHEMA :

ALTER AUTHORIZATION    
ON [ <class_type>:: ] entity_name    
TO { principal_name | SCHEMA OWNER } 

通過指定模組的執行上下文,你可以控制資料庫引擎使用哪個使用者的安全上下文來驗證被模組引用的物件的許可權。也就是說,通過使用模組的EXECUTE AS 子句,可以指定以特定的使用者來驗證資料庫物件的許可權,而不僅僅是使用模組的呼叫者。

可以把執行使用者定義的模組的許可權分為兩部分:執行模組和訪問被模組引用的物件,一個使用者可以只授予執行模組的許可權,而不需授予操作被模組引用的物件的許可權。對於這種情況,模組的EXECUTE AS 子句必須指定一個使用者,該使用者有許可權訪問被模組引用的物件。

對於模組的EXECUTE AS 設定,可以通過 sys.sql_modules 或 sys.service_queues的 execute_as_principal_id來檢視,該欄位有三種型別的值:

  • NULL: 預設設定,EXECUTE AS CALLER
  • -2:EXECUTE AS OWNER
  • ID 值:特定的Database Principal ID

 

對於模組的呼叫者而言,其必須有呼叫(EXECUTE)模組的許可權。當指定特定的模擬使用者時,當前使用者必須有模擬的許可權。

CREATE PROCEDURE dbo.usp_Demo  
WITH EXECUTE AS 'CompanyDomain\SqlUser1'

 

 

 

參考文件:

EXECUTE AS Clause (Transact-SQL)

EXECUTE AS (Transact-SQL)

相關文章