Sql-Server
防止使用不同數據庫中的過程更新表
這是我的場景:
- Windows 使用者 Gabe 可以
db_owner
訪問數據庫 DB1。- Windows 使用者 Gabe 擁有
db_reader
數據庫 DB2。- 當使用者執行
UPDATE DB2.dbo.Tbl1 SET X = 1
時,他們得到“更新權限被拒絕..”如預期的那樣。- 當使用者執行
DB1.dbo.uspUpdateTable
包含上述相同UPDATE
語句的過程時,它會成功。我認為這可能是由於數據庫連結或值得信賴的設置,但它們未啟用。
這是
db_owner
特權的預期行為嗎?有沒有辦法防止這種情況?SQL 伺服器 2017
以下是允許通過儲存儲存過程進行更新的情況,而呼叫者對另一個數據庫中的表沒有更新權限。
所有權鏈
所涉及的
DB_CHAINING
數據庫在伺服器級別打開了選項集或“跨數據庫所有權連結”選項。在 dbo 擁有的對象的情況下,數據庫還必須具有相同的所有者(即 dbo 使用者映射到相同的登錄名)以維持完整的所有權鏈。執行為
儲存過程包括一個
EXECUTE AS USER
規範,並且使用者(映射到同一個登錄名)存在於另一個具有更新權限的數據庫中。請注意,數據庫必須是TRUSTWORTHY
為了讓EXECUTE AS
其他數據庫尊重上下文,因此這不適用於您的情況。模組簽名
儲存過程由證書籤名,並且從該證書創建的使用者存在於具有更新表的權限的其他數據庫中。
我從您的評論中看到“跨數據庫所有權連結”是罪魁禍首。這也意味著數據庫也具有相同的所有者。我建議您為非系統管理員角色成員可以創建 dbo 擁有的對像以降低安全風險的數據庫更改數據庫所有者。