TRUSTWORTHY 資料庫屬性

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

TRUSTWORTHY 資料庫屬性用來指定 SQL Server 執行個體是否信任資料庫及其中的內容。 依預設,此設定為 OFF,但可使用 ALTER DATABASE 陳述式來將它設為 ON。 例如: ALTER DATABASE AdventureWorks2022 SET TRUSTWORTHY ON;

注意

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

建議您讓 TRUSTWORTHY 資料庫屬性保持設定為 OFF,以減輕連結的資料庫包含下列其中一個物件時可能會存在的特定威脅:

這兩種情況都需要有特定程度的權限,而且在資料庫已連結至 SQL Server 執行個體的情況下使用時,兩者都會受到適當機制所保護。 然而,如果資料庫離線了,而您可以存取資料庫檔案,則您或許可以將其連結至所選擇的 SQL Server 執行個體,並將惡意內容加入到資料庫。 當資料庫在 SQL Server 內先中斷連結再重新連結時,系統會對資料和記錄檔設定某些權限,以限制資料庫檔案的存取。

因為連結至 SQL Server 執行個體的資料庫無法立即獲得系統信任,所以在系統將該資料庫明確標示為值得信任之前,該資料庫將無法存取資料庫範圍以外的資源。 因此,若您備份或中斷連結的資料庫已將 TRUSTWORTHY 選項設定為 ON,且您將資料庫連結或還原到相同或另一個 SQL Server 執行個體,則在連結或還原完成時,系統會將 TRUSTWORTHY 屬性設定為 OFF。 此外,專為存取資料庫外部資源而設計的模組,以及具有 EXTERNAL_ACCESS 和 UNSAFE 權限設定的組件,都有額外的必備條件,才能順利地執行。

注意

根據預設,msdb 資料庫的 TRUSTWORTHY 設定會設定為 ON。 如果您將此設定變更為非預設值,則使用 msdb 資料庫的 SQL Server 元件可能會導致非預期的行為。

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

詳細資訊

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

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

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

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

下列程式碼範例可用來取得符合下列條件的資料庫清單:TRUSTWORTHY 屬性設定為 ON,且其資料庫擁有者屬於系統管理員伺服器角色。

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

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

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

警告

當設定 db_owner 為 ON 時,有一些方法可將具有 TRUSTWORTHY 角色的使用者提升為 sysadmin。 使用 TRUSTWORTHY 屬性時請小心。 下列 SQL 程式碼可用來取得資料庫中獲授與 db_owner 角色的資料庫使用者清單。

SELECT    roles.principal_id    AS RolePrincipalID
   ,    roles.name       AS RolePrincipalName
   ,    database_role_members.member_principal_id  AS MemberPrincipalID
   ,    members.name      AS MemberPrincipalName
FROM sys.database_role_members AS database_role_members  
JOIN sys.database_principals AS roles  
   ON database_role_members.role_principal_id = roles.principal_id  
JOIN sys.database_principals AS members  
   ON database_role_members.member_principal_id = members.principal_id where  roles.name='db_owner' and members.name <>'dbo'
GO

下一步