Właściwość bazy danych TRUSTWORTHY

Dotyczy:SQL ServerAzure SQL Managed Instance

Właściwość bazy TRUSTWORTHY danych wskazuje, czy instancja SQL Server ufa bazie danych i jej zawartości. Domyślnie to ustawienie to OFF, ale można je ustawić ON , używając ALTER DATABASE instrukcji.

Przykład:

ALTER DATABASE AdventureWorks2025 SET TRUSTWORTHY ON;

Uwaga / Notatka

Aby ustawić tę opcję, musisz mieć CONTROL SERVER uprawnienia lub być członkiem stałej roli serwera sysadmin .

Aby zminimalizować pewne zagrożenia, pozostawić właściwość bazy danych ustawioną TRUSTWORTHY na .OFF Zagrożenia te mogą pojawić się w wyniku dołączenia bazy danych zawierającej jeden z następujących obiektów:

  • Złośliwe asemblery z ustawieniami EXTERNAL_ACCESSUNSAFE lub uprawnień. Więcej informacji można znaleźć w artykule o bezpieczeństwie integracji CLR.

  • Złośliwe moduły zdefiniowane do działania jako użytkownicy o wysokich uprawnieniach. Więcej informacji można znaleźć w artykuleEXECUTE AS o klauzuli.

Obie sytuacje wymagają określonego stopnia uprawnień i są chronione odpowiednimi mechanizmami, gdy są używane w kontekście bazy danych już powiązanej z instancją SQL Server. Jeśli jednak baza danych jest przełączona w tryb offline, a ty masz dostęp do pliku bazy danych, możesz potencjalnie dołączyć go do dowolnie wybranego wystąpienia SQL Servera i dodać złośliwą treść do bazy danych. Gdy bazy danych są odłączane i dołączone w programie SQL Server, określone uprawnienia są ustawiane na plikach danych i dziennika, które ograniczają dostęp do plików bazy danych.

Ponieważ baza danych powiązana z instancją SQL Server nie może być od razu zaufana, nie może ona uzyskać dostępu do zasobów wykraczających poza zakres bazy, dopóki nie zostanie ona wyraźnie oznaczona jako wiarygodna. Dlatego jeśli zrobisz kopię zapasową lub odłączysz bazę danych, która ma taką TRUSTWORTHY opcjęON, i dołączysz lub przywrócisz bazę danych do tej samej lub innej instancji SQL Server, właściwość jest ustawiona TRUSTWORTHY na moment OFF zakończenia przyłączenia lub przywrócenia. Ponadto moduły zaprojektowane do dostępu do zasobów spoza bazy danych oraz zespoły z ustawieniami EXTERNAL_ACCESS uprawnień lub UNSAFE mają dodatkowe wymagania, aby działać pomyślnie.

Uwaga / Notatka

Domyślnie ustawienie jest TRUSTWORTHY ustawione na dla ON bazy msdb danych. Jeśli zmienisz to ustawienie z wartości domyślnej, może to spowodować nieoczekiwane zachowanie składników programu SQL Server korzystających z msdb bazy danych.

Jeśli ustawisz TRUSTWORTHY ustawienie na ON, a właściciel bazy danych jest członkiem grupy posiadającej dane uwierzytelniające administratora, takiej jak grupa administratorów, właściciel bazy danych może wtedy tworzyć i uruchamiać niebezpieczne asemblery, które mogą zagrozić instancji SQL Server.

Remarks

W środowisku dostawcy usług internetowych (ISP), takim jak hosting webowy, każdy klient zarządza własną bazą danych i nie ma dostępu do baz danych systemowych ani innych baz użytkowników. Na przykład dostawca internetu może hostować bazy danych dwóch konkurujących firm w tej samej instancji SQL Server. Jeśli dołączysz bazę danych użytkowników do jej oryginalnej instancji, możesz dodać niebezpieczny kod do bazy użytkowników. Gdy wdrożysz bazę danych na instancji ISP, kod staje się aktywny. W takim przypadku kontrola dostępu międzybazowego jest kluczowa.

Jeśli ta sama jednostka jest właścicielem i zarządza każdą bazą danych, nadal nie jest dobrą praktyką ustanawianie relacji zaufania z bazą danych, chyba że wymaga tego specyficzna dla aplikacji, taka jak komunikacja między bazami danych Service Broker. Relację zaufania między bazami danych ustanawiasz, umożliwiając łańcuchowe powiązanie własności między bazami danych lub oznaczając bazę danych jako zaufaną przez instancję korzystającą z tej TRUSTWORTHY właściwości. Kolumna is_trustworthy_on widoku katalogu sys.databases wskazuje, czy baza danych ma ustawione TRUSTWORTHY właściwości.

Najlepsze rozwiązania dotyczące własności i zaufania bazy danych obejmują następujące elementy:

  • Mają odrębnych właścicieli baz danych. Nie wszystkie bazy danych powinny być własnością administratora systemu.

  • Ogranicz liczbę właścicieli dla każdej bazy danych.

  • Selektywne nadawanie zaufania.

  • Zachowaj ustawienie OFFchaining cross-bazowego własności, chyba że wdrożysz kilka baz danych jako jedną jednostkę.

  • Przenieś użycie na selektywne zaufanie zamiast korzystania z właściwości TRUSTWORTHY.

Poniższy przykład Transact-SQL zwraca listę baz danych, które mają ustawioną właściwość TRUSTWORTHY na i ON których właściciel bazy danych należy do roli stałego administratora systemu .

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

Poniższy przykład określa właściwość TRUSTWORTHY bazy msdb danych.

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

Jeśli to zapytanie pokaże, że właściwość jest ustawiona TRUSTWORTHY na dla OFFmsdb, możesz uruchomić następujące zapytanie, aby przywrócić ją do wartości domyślnej .ON

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

Ostrzeżenie o zabezpieczeniach

Gdy TRUSTWORTHY własność jest iON właściciel bazy danych jest członkiem roli stałego serwera administratora systemu, członek db_owner stałej roli bazy danych może podnieść swoje uprawnienia do poziomu administratora systemu. Oba warunki są wymagane. Zachowaj ostrożność wobec TRUSTWORTHY nieruchomości.

Poniższy kod Transact-SQL zwraca listę użytkowników bazy danych, którym przypisana jest db_owner stała rola bazy danych.

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