Sql-Server

防止使用不同數據庫中的過程更新表

  • July 18, 2019

這是我的場景:

  • 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 擁有的對像以降低安全風險的數據庫更改數據庫所有者。

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