Vlastnost databáze TRUSTWORTHY

platí pro:SQL Serverazure SQL Managed Instance

Vlastnost databáze TRUSTWORTHY určuje, zda instance SQL Server důvěřuje databázi a jejímu obsahu. Ve výchozím nastavení je OFFtoto nastavení, ale můžete ho ON nastavit pomocí příkazu ALTER DATABASE .

Příklady:

ALTER DATABASE AdventureWorks2025 SET TRUSTWORTHY ON;

Poznámka:

Chcete-li nastavit tuto možnost, musíte mít CONTROL SERVER oprávnění nebo být členem pevné role serveru správce systému .

Pro zmírnění určitých hrozeb ponechte vlastnost databáze nastavenou TRUSTWORTHY na OFF. Tyto hrozby mohou vzniknout v důsledku připojení databáze, která obsahuje jeden z následujících objektů:

  • Škodlivé sestavy s nastavením EXTERNAL_ACCESS oprávnění or UNSAFE . Pro více informací viz bezpečnost integrace CLR.

  • Škodlivé moduly definované tak, aby běžely jako vysoce privilegovaní uživatelé. Pro více informací viz EXECUTE AS ustanovení.

Obě situace vyžadují určitou míru oprávnění a jsou chráněny příslušnými mechanismy, když jsou používány v kontextu databáze, která je již připojena k instanci SQL Server. Pokud je však databáze přepnuta do offline režimu, můžete ji potenciálně připojit k instanci SQL Serveru podle vašeho výběru a přidat do databáze škodlivý obsah. Pokud jsou databáze odpojené a připojené v SQL Serveru, jsou určitá oprávnění nastavena na data a soubory protokolů, které omezují přístup k databázovým souborům.

Protože databázi připojené k instanci SQL Server nelze okamžitě důvěřovat, databáze nesmí přistupovat ke zdrojům mimo rámec databáze, dokud není databáze výslovně označena jako důvěryhodná. Pokud tedy zálohujete nebo odpojíte databázi, která tuto TRUSTWORTHY možnost ON má, a připojíte nebo obnovujete databázi ke stejné nebo jiné instanci SQL Server, vlastnost TRUSTWORTHY se nastaví na OFF čas při dokončení připojení nebo obnovení. Také moduly navržené pro přístup ke zdrojům mimo databázi a assemblery s nastavením EXTERNAL_ACCESS oprávnění nebo UNSAFE mají pro úspěšný běh dodatečné požadavky.

Poznámka:

Výchozí TRUSTWORTHY nastavení je pro databázi msdb nastaveno na .ON Pokud toto nastavení změníte z výchozí hodnoty, může dojít k neočekávanému chování komponent SYSTÉMU SQL Server, které databázi používají msdb .

Pokud nastavíte TRUSTWORTHY nastavení na ON, a pokud je vlastníkem databáze člen skupiny, která má administrátorské údaje, například skupina sysadmin, vlastník databáze pak může vytvářet a spouštět nebezpečné sestavy, které mohou kompromitovat instanci SQL Server.

Remarks

V prostředí poskytovatele internetových služeb (ISP), jako je webhostingová služba, každý zákazník spravuje svou vlastní databázi a nemá přístup k systémovým databázím ani k databázím jiných uživatelů. Například ISP může hostovat databáze dvou konkurenčních společností ve stejné instanci SQL Server. Pokud připojíte uživatelskou databázi k její původní instanci, můžete do uživatelské databáze přidat nebezpečný kód. Když nasadíte databázi na instanci poskytovatele internetu, kód se aktivuje. Tento scénář činí kontrolu přístupu napříč databázemi zásadní.

Pokud každá databáze vlastní a spravuje stejná obecná entita, stále není dobré navazovat důvěrný vztah s databází, pokud to nevyžaduje specifická funkce aplikace, například komunikace napříč databázemi Service Broker. Vztah důvěry mezi databázemi vytváříte povolením řetězení vlastnictví mezi databázemi nebo označením databáze jako důvěryhodné instancí používající tuto vlastnost TRUSTWORTHY . Sloupec is_trustworthy_on v katalogovém pohledu sys.databases ukazuje, zda má databáze TRUSTWORTHY nastavené vlastnosti.

Mezi osvědčené postupy pro vlastnictví databáze a důvěryhodnost patří:

  • Mít samostatné vlastníky databází. Ne všechny databáze by měl vlastnit správce systému.

  • Omezte počet vlastníků pro každou databázi.

  • Udělte důvěru selektivně.

  • Nastavte řetězení vlastnictví napříč databázemi na nastavené OFF , pokud nenasadíte více databází jako jednu jednotku.

  • Migrujte použití na selektivní důvěryhodnost místo použití vlastnosti TRUSTWORTHY.

Následující Transact-SQL příklad vrací seznam databází, které mají vlastnost nastavenou TRUSTWORTHY na a ON jejichž vlastník databáze patří do role pevného správce systému .

SELECT SUSER_SNAME(owner_sid) AS DBOWNER,
       d.name AS DATABASENAME
FROM sys.server_principals AS r
     INNER JOIN sys.server_role_members AS m
         ON r.principal_id = m.role_principal_id
     INNER JOIN sys.server_principals AS p
         ON p.principal_id = m.member_principal_id
     INNER JOIN sys.databases AS 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

Následující příklad určuje vlastnost TRUSTWORTHY databáze msdb .

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

Pokud tento dotaz ukáže, že vlastnost TRUSTWORTHY je nastavena na OFF pro msdb, můžete spustit následující dotaz a obnovit ji na výchozí hodnotu ON.

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

Upozornění zabezpečení

Když je vlastnost TRUSTWORTHYaON vlastník databáze je členem role pevného správce systému, může člen role db_owner pevné databáze povýšit své oprávnění na správce systému. Obě podmínky jsou povinné. Buďte opatrní s nemovitostí TRUSTWORTHY .

Následující kód Transact-SQL vrací seznam databázových uživatelů v databázi, kterým je přidělena db_owner pevná databázová role.

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
     INNER JOIN sys.database_principals AS roles
         ON database_role_members.role_principal_id = roles.principal_id
     INNER 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