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