權限層次結構與 WITH GRANT OPTION
我有一個具有此安全設置的 Azure SQL 數據庫:
SchemaUpdater
具有db_ddladmin
、db_datawriter
和db_datareader
角色的使用者。使用者用於在應用程序部署期間執行數據庫更改腳本。App
具有db_datawriter
, 和db_datareader
角色的使用者。應用程序使用使用者來處理數據。我希望應用程序使用者也執行一個儲存過程,比如
dbo.sp_MyProc
. 我做了以下工作:
grant execute to [SchemaUpdater] with grant option
使用管理員帳戶,以便更改腳本可以授予任何 SP 的權限。- 在更改腳本中創建了儲存過程。
- 嘗試
grant execute on [dbo].[sp_MyProc] to [App]
在相同的更改腳本中。那沒有用。該步驟失敗了
Cannot find the object 'sp_MyProc', because it does not exist or you do not have permission.
有趣的是,如果沒有提到單獨的
SchemaUpdater
SPgrant execute to [App]
,它會起作用。我的問題是:
- 為什麼不能
SchemaUpdater
授予單個 SP 的權限,但可以授予所有 SP?- 是否
SchemaUpdater
缺少其他一些權限,以便它可以向單個 SP 授予權限?
不幸的
WITH GRANT
是,在某些或所有情況下,權限不會被繼承。我在文件或其他文章中找不到任何內容$$ cue thunder $$全球資訊網$$ stop thunder $$不過,說明這一點。我和你一樣,我希望它會被繼承。 我在 SQL Server 2016 上對此進行了測試,並得到了與您相同的結果。有幾個選項可以解決它,但最細粒度的選項是分配
EXECUTE WITH GRANT
給每個儲存過程的 SchemaUpdater。GRANT EXECUTE ON [dbo].[sp_MyProc] TO [SchemaUpdater] WITH GRANT OPTION
我已經確認它
WITH GRANT
也不會在其他權限和對像上繼承。我在表上使用 VIEW DEFINITION 測試了相同的場景,並且在 SchemaUpdater 可以將該權限授予另一個使用者之前,必須在表上顯式地 GRANT WITH GRANT。因此,您的問題的具體答案:
- 由於 WITH GRANT 不是繼承的,因此使用者必須對對象具有明確的 WITH GRANT 權限才能授予權限。由於 SchemaUpdater 在數據庫上有 EXECUTE WITH GRANT,它可以在數據庫上授予 EXECUTE。由於它在儲存過程上沒有顯式 EXECUTE WITH GRANT,因此它無法授予對該儲存過程的顯式權限。
- 如前所述,SchemaUpdater 需要在每個儲存過程上顯式執行 EXECUTE WITH GRANT,或者需要包含該權限的更高權限(例如 db_owner)。
WITH GRANT OPTION 早於 SQL 2005 中引入的增強授權模型,該模型啟用了數據庫級別和架構級別的授權。但即使它們是同時設計的,我懷疑這是否會被啟用。
例如,考慮一下,如果數據庫級別權限 WITH GRANT OPTION 的被授予者可以在對象級別授予相同的權限,那麼當您撤銷被授予者的權限時會發生什麼?
例如
USE tempdb go CREATE proc foo2 as select 1 a go create user joe without login create user alice without login go grant execute to joe with grant option execute as user = 'joe' grant execute on foo to alice revert go revoke execute to joe cascade go execute as user='alice' exec foo2 revert
SQL 必須跟踪 alice 的執行權限不僅是由 joe 授予的,它確實如此,而且是因為 joe 的模式級別或數據庫級別的權限而授予的。考慮到 joe 可能對對象具有數據庫級、模式級和對象級權限,這聽起來既難以實現又難以理解。