TRUSTWORTHY 資料庫屬性

適用于:SQL ServerAzure SQL 受控執行個體

資料庫 TRUSTWORTHY 屬性是用來指出SQL Server實例是否信任資料庫及其內的內容。 根據預設,此設定為 OFF,但可以使用 語句設定為 ON ALTER DATABASE 。 例如: ALTER DATABASE AdventureWorks2019 SET TRUSTWORTHY ON;

注意

您必須是 系統管理員 (sysadmin) 固定伺服器角色的成員,才能設定此選項。

我們建議您將資料庫屬性設定為 TRUSTWORTHY OFF,以降低附加包含下列其中一個物件之資料庫所造成的特定威脅:

這兩種情況都需要特定程度的許可權,而且在已附加至 SQL Server 實例的資料庫內容中使用適當的機制時,都會受到適當的機制保護。 不過,如果資料庫離線,如果您有資料庫檔案的存取權,您可能會將它附加至您選擇的SQL Server實例,並將惡意內容新增至資料庫。 卸離資料庫並在SQL Server中附加時,會針對限制資料庫檔案存取的資料和記錄檔設定特定許可權。

由於附加至實例的資料庫無法立即信任SQL Server,因此資料庫在明確標示為可信任之前,不允許資料庫存取超出資料庫範圍的資源。 因此,如果您備份或卸離具有 TRUSTWORTHY ON 選項的資料庫,並將資料庫附加或還原至相同或另一個SQL Server實例,則附加或還原完成時, TRUSTWORTHY 屬性會設定為 OFF。 此外,設計來存取資料庫外部資源的模組,以及具有 EXTERNAL_ACCESS 和 UNSAFE 許可權設定的元件,具有成功執行的額外需求。

注意

根據預設, TRUSTWORTHY 此設定會針對 msdb 資料庫設定為 ON。 如果您從預設值變更此設定,可能會SQL Server使用 msdb 資料庫的元件造成非預期的行為。

TRUSTWORTHY如果設定設為 ON,而且資料庫的擁有者是具有系統管理認證的群組成員,例如系統管理員群組,則資料庫擁有者就可以建立和執行不安全的元件,而該元件可能會危害SQL Server的實例。

詳細資訊

例如,在網際網路服務提供者 (ISP) (環境中,例如,在 Web 裝載服務) 中,每個客戶都可以管理自己的資料庫,並限制存取系統資料庫和其他使用者資料庫。 例如,兩家競爭公司的資料庫可以由相同的 ISP 裝載,並存在於相同的SQL Server實例中。 當資料庫附加至其原始實例時,可能會將危險程式碼新增至使用者資料庫,並在部署資料庫時,在 ISP 實例上啟用程式碼。 這種情況讓控制跨資料庫存取非常重要。

如果相同的一般實體擁有和管理每個資料庫,除非需要跨資料庫 Service Broker 通訊等應用程式特定功能,否則與資料庫建立信任關係仍然不是很好的做法。 您可以藉由啟用跨資料庫擁有權鏈結,或使用 屬性將資料庫標示為實例 TRUSTWORTHY 信任,來建立資料庫之間的信任關係。 目錄 is_trustworthy_on 檢視的資料 sys.databases 行會指出資料庫是否已設定其 TRUSTWORTHY 屬性。

資料庫擁有權和信任的最佳做法包括:

  • 具有資料庫的不同擁有者。 並非所有資料庫都應該由系統管理員擁有。
  • 限制每個資料庫的擁有者數目。
  • 選擇性地授與信任。
  • 除非在單一單位部署多個資料庫,否則 將跨資料庫擁有權鏈結 設定保留為 OFF。
  • 將使用量移轉至選擇性信任,而不是使用 TRUSTWORTHY 屬性。

下列程式碼範例可用來取得屬性 TRUSTWORTHY 設定為 ON 且其資料庫擁有者屬於 sysadmin 伺服器角色的資料庫清單。

SELECT SUSER_SNAME(owner_sid) AS DBOWNER,
    d.name AS DATABASENAME
FROM sys.server_principals r
INNER JOIN sys.server_role_members m ON r.principal_id = m.role_principal_id
INNER JOIN sys.server_principals p ON p.principal_id = m.member_principal_id
INNER JOIN sys.databases d ON suser_sname(d.owner_sid) = p.name
WHERE is_trustworthy_on = 1
    AND d.name NOT IN ('msdb')
    AND r.type = 'R'
    AND r.name = N'sysadmin';
GO

您可以執行下列查詢來判斷 TRUSTWORTHY 資料庫的 屬性 msdb

SELECT name,
    trustworthy_setting = CASE is_trustworthy_on
        WHEN 1 THEN 'Trustworthy setting is ON for msdb'
        ELSE 'Trustworthy setting is OFF for msdb'
        END
FROM sys.databases
WHERE database_id = 4;
GO

如果此查詢顯示 TRUSTWORTHY 屬性設定為 OFF,您可以執行下列查詢,將屬性設定 TRUSTWORTHY 為 ON。

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

下一步