SQL Server 模擬
這個問題是關於 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
權限。如果您希望某人能夠截斷特定表(他們不擁有,因為他們確實有權這樣做),您可以授予他們IMPERSONATE
在dbo
. 但是,沒有辦法將他們的操作限制為僅發出TRUNCATE TABLE
,並且僅在該特定表上。該使用者可以隨時執行EXECUTE AS USER = 'dbo';
,然後做任何他們想做的事情。但是,通過添加EXECUTE AS 'dbo'
到CREATE PROCEDURE .... AS TRUNCATE TABLE {TableName};
語句中,執行該模組的人仍將模擬dbo
,但僅針對該模組中的操作,這裡只是截斷特定表。當然,語句的子句
EXECUTE AS
只能CREATE
模擬另一個使用者(僅限數據庫級)。它不能模擬另一個登錄名(實例級)。此限制導致太多人啟用TRUSTWORTHY
,以便與被模擬使用者的相同 SID 匹配的登錄將能夠臨時授予額外權限。但這非常危險,這就是為什麼臨時提升權限的理想(並且更好)機制是模組簽名。有關為什麼模擬以及
TRUSTWORTHY ON
跨數據庫所有權連結不好以及模組簽名如何/為什麼更好的更多詳細資訊,請參閱: