Security8:權限模擬


用戶可以模擬其他用戶或登陸的權限來執行查詢,並且在查看用戶和登錄的權限時,結果會受到模擬上下文的影響。當執行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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM