TRUSTWORTHY, свойство базы данных

Область применения: SQL Server Управляемый экземпляр SQL Azure

Свойство TRUSTWORTHY базы данных используется для указания того, доверяет ли экземпляр SQL Server базе данных и содержимому в ней. По умолчанию этот параметр имеет значение OFF, но его можно задать с помощью инструкции ALTER DATABASE ON. Например: ALTER DATABASE AdventureWorks2022 SET TRUSTWORTHY ON;.

Примечание.

Изменять это свойство могут только члены предопределенной роли сервера sysadmin .

Рекомендуется оставить TRUSTWORTHY для свойства базы данных значение OFF, чтобы устранить некоторые угрозы, которые могут существовать в результате подключения базы данных, содержащей один из следующих объектов:

  • вредоносные сборки с параметром разрешения EXTERNAL_ACCESS или UNSAFE. Дополнительные сведения см. в статье CLR Integration Security.

  • вредоносные модули, выполняемые в контексте привилегированных пользователей. Дополнительные сведения см. в разделе EXECUTE AS (Transact-SQL).

Обе ситуации требуют определенной степени привилегий и защищаются соответствующими механизмами, когда они используются в контексте базы данных, которая уже подключена к экземпляру SQL Server. Однако если база данных отключена, если у вас есть доступ к файлу базы данных, вы можете подключить его к экземпляру SQL Server вашего выбора и добавить вредоносное содержимое в базу данных. При отключении и присоединении баз данных в SQL Server определенные разрешения задаются в файлах данных и журналах, ограничивающих доступ к файлам базы данных.

Так как база данных, подключенная к экземпляру SQL Server, не может быть немедленно доверенной, база данных не может получить доступ к ресурсам за пределами области базы данных, пока база данных явно не будет помечена как надежная. Поэтому при резервном копировании или отключении базы данных с параметром TRUSTWORTHY ON и присоединении или восстановлении базы данных к тому же или другому экземпляру TRUSTWORTHY SQL Server свойство задается как OFF при завершении подключения или восстановления. Кроме того, модули, предназначенные для доступа к ресурсам за пределами базы данных и сборок с параметром разрешения EXTERNAL_ACCESS и UNSAFE, имеют дополнительные требования для успешного выполнения.

Примечание.

По умолчанию TRUSTWORTHY параметр имеет значение ON для msdb базы данных. Если изменить этот параметр с его значением по умолчанию, это может привести к неожиданному поведению компонентов SQL Server, использующих msdb базу данных.

TRUSTWORTHY Если для параметра задано значение ON, и если владелец базы данных является членом группы, которая имеет административные учетные данные, например группу sysadmin, владелец базы данных сможет создавать и запускать небезопасные сборки, которые могут скомпрометировать экземпляр SQL Server.

Дополнительные сведения

В среде поставщика услуг Интернета (ISP) (например, в службе веб-размещения) каждый клиент может управлять собственной базой данных и ограничен доступом к системным базам данных и другим пользовательским базам данных. Например, базы данных двух конкурирующих компаний могут размещаться с помощью одного поставщика услуг и существовать в одном экземпляре SQL Server. Опасный код можно добавить в пользовательную базу данных при присоединении базы данных к исходному экземпляру, а код будет включен в экземпляре ISP при развертывании базы данных. В этой ситуации управление доступом между базами данных имеет решающее значение.

Если одна и та же общая сущность владеет каждой базой данных и управляет ими, то не рекомендуется устанавливать отношения доверия с базой данных, если только не требуется связь между базами данных, например обмен данными между базами данных Service Broker. Связь доверия между базами данных можно установить, включив цепочку владения между базами данных или помечая базу данных доверенным экземпляром с помощью TRUSTWORTHY свойства. Столбец sys.databases представления каталога указывает, is_trustworthy_on имеет ли база данных набор свойств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

Предупреждение

Существуют способы повышения уровня пользователя с db_owner ролью, чтобы стать параметром sysadmin TRUSTWORTHY on. Используйте осторожность при использовании 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

Следующие шаги