Sql-Server

SQL Server 模擬

  • May 2, 2019

這個問題是關於 Microsoft SQL Server 中的模擬。我想知道,如果我對特定登錄具有模擬權限,那麼我可以隨時輕鬆模擬該登錄,並且我不需要儲存過程EXECUTE AS OWNER?如果是這樣,那麼儲存過程的目的是什麼EXECUTE AS

很好的問題。是的,如果IMPERSONATE在 LoginB(或 UserB)上授予 LoginA(或 UserA),則 LoginA(或 UserA)可以隨時執行該EXECUTE AS 語句不受限制

EXECUTE AS LOGIN = 'LoginB';

或者

EXECUTE AS USER = 'UserB';

 

那麼使用 EXECUTE AS 儲存過程的目的是什麼?

EXECUTE AS 子句CREATE {module}語句的一部分)的目的是僅在該模組的上下文中臨時授予該權限。IMPERSONATE這可以防止您需要顯式授予IMPERSONATE. 不同之處在於,在該模組的上下文之外,EXECUTE AS {SomeUser}執行該模組的人不應該具有模擬該使用者的能力。您不希望登錄/使用者能夠隨時冒充他人。這是一個安全風險。該EXECUTE AS 條款使您能夠需要時讓委託人冒充另一個委託人,而不是他們嘗試自己(您不能限制他們使用這些提升​​的權限所做的事情)。因此,您實際上確實想要該EXECUTE AS子句,並且不想授予IMPERSONATE任何人(如果可以避免,並且很可能可以)。

例如:沒有TRUNCATE TABLE權限。如果您希望某人能夠截斷特定表(他們不擁有,因為他們確實有權這樣做),您可以授予他們IMPERSONATEdbo. 但是,沒有辦法將他們的操作限制為僅發出TRUNCATE TABLE,並且僅在該特定表上。該使用者可以隨時執行EXECUTE AS USER = 'dbo';,然後做任何他們想做的事情。但是,通過添加EXECUTE AS 'dbo'CREATE PROCEDURE .... AS TRUNCATE TABLE {TableName};語句中,執行該模組的人仍將模擬dbo,但僅針對該模組中的操作,這裡只是截斷特定表。

當然,語句的子句EXECUTE AS 只能CREATE模擬另一個使用者(僅限數據庫級)。它不能模擬另一個登錄名(實例級)。此限制導致太多人啟用TRUSTWORTHY,以便與被模擬使用者的相同 SID 匹配的登錄將能夠臨時授予額外權限。但這非常危險,這就是為什麼臨時提升權限的理想(並且更好)機制是模組簽名

有關為什麼模擬以及TRUSTWORTHY ON跨數據庫所有權連結不好以及模組簽名如何/為什麼更好的更多詳細資訊,請參閱:

請,請,請停止使用模擬、可信和跨數據庫所有權連結

引用自:https://dba.stackexchange.com/questions/237137