Propriedade de banco de dados "TRUSTWORTHY"
Aplica-se a:SQL Server
Azure SQL Managed Instance
A propriedade de banco de dados TRUSTWORTHY
é usada para indicar se a instância do SQL Server confia no banco de dados e no conteúdo dentro dele. Por padrão, essa configuração é OFF, mas pode ser definida como ON usando a instrução ALTER DATABASE
. Por exemplo: ALTER DATABASE AdventureWorks2022 SET TRUSTWORTHY ON;
.
Observação
Para definir essa opção, você deve ter permissão CONTROL SERVER
ou ser membro da função de servidor fixa sysadmin.
Recomendamos que você deixe a propriedade de banco de dados TRUSTWORTHY
definida como OFF para mitigar determinadas ameaças que podem existir como resultado da anexação de um banco de dados que contém um dos seguintes objetos:
Assemblies mal-intencionados com uma configuração de permissão EXTERNAL_ACCESS ou UNSAFE. Para mais informações, consulte Segurança de Integração CLR.
Módulos maliciosos que são definidos para serem executados como usuários altamente privilegiados. Para obter mais informações, consulte Cláusula EXECUTE AS (Transact-SQL).
Ambas as situações exigem um grau específico de privilégio e são protegidas por mecanismos apropriados quando são usadas no contexto de um banco de dados que já está anexado a uma instância do SQL Server. No entanto, se o banco de dados for colocado offline, se você tiver acesso ao arquivo de banco de dados, poderá anexá-lo a uma instância do SQL Server de sua escolha e adicionar conteúdo mal-intencionado ao banco de dados. Quando os bancos de dados são desanexados e anexados no SQL Server, determinadas permissões são definidas nos arquivos de dados e de log que restringem o acesso aos arquivos de banco de dados.
Como um banco de dados anexado a uma instância do SQL Server não pode ser imediatamente confiável, o banco de dados não tem permissão para acessar recursos além do escopo do banco de dados até que o banco de dados seja explicitamente marcado como confiável. Portanto, se você fizer backup ou desanexar um banco de dados que tenha a opção TRUSTWORTHY
ON e anexar ou restaurar o banco de dados para a mesma ou outra instância do SQL Server, a propriedade TRUSTWORTHY
será definida como OFF quando a anexação ou restauração for concluída. Além disso, os módulos projetados para acessar recursos fora do banco de dados e assemblies com a configuração de permissão EXTERNAL_ACCESS e UNSAFE têm requisitos extras para serem executados com êxito.
Observação
Por padrão, a configuração TRUSTWORTHY
é definida como ON para o banco de dados msdb
. Se você alterar essa configuração de seu valor padrão, isso poderá resultar em um comportamento inesperado por componentes do SQL Server que usam o banco de dados msdb
.
Se a configuração TRUSTWORTHY
estiver definida como ATIVADA e se o proprietário do banco de dados for membro de um grupo que tenha credenciais administrativas, como o grupo sysadmin, o proprietário do banco de dados poderá criar e executar assemblies não seguros que podem comprometer a instância do SQL Server.
Mais informações
Em um ambiente de provedor de serviços de Internet (ISP) (por exemplo, em um serviço de hospedagem na web), cada cliente tem permissão para gerenciar seu próprio banco de dados e está impedido de acessar bancos de dados do sistema e outros bancos de dados de usuários. Por exemplo, os bancos de dados de duas empresas concorrentes podem ser hospedados pelo mesmo ISP e existir na mesma instância do SQL Server. Código perigoso pode ser adicionado a um banco de dados de usuário quando o banco de dados é anexado à sua instância original, e o código seria habilitado na instância do ISP quando o banco de dados é implantado. Essa situação torna crucial o controle do acesso entre bancos de dados.
Se a mesma entidade geral possuir e gerenciar cada banco de dados, ainda não é uma boa prática estabelecer uma relação de confiança com um banco de dados, a menos que um recurso específico do aplicativo, como uma comunicação entre bancos de dados do Service Broker, seja necessário. Uma relação de confiança entre bancos de dados pode ser estabelecida habilitando o encadeamento de propriedade entre bancos de dados ou marcando um banco de dados como confiável pela instância usando a propriedade TRUSTWORTHY
. A coluna is_trustworthy_on
da exibição de catálogo sys.databases
indica se um banco de dados tem sua propriedade TRUSTWORTHY
definida.
As práticas recomendadas para propriedade e confiança do banco de dados incluem o seguinte:
- Ter proprietários distintos para bancos de dados. Nem todos os bancos de dados devem ser de propriedade do administrador do sistema.
- Limite o número de proprietários para cada banco de dados.
- Confera confiança seletivamente.
- Deixe a configuração de encadeamento de propriedade entre bancos de dados definida como OFF, a menos que vários bancos de dados sejam implantados em uma única unidade.
- Migre o uso para confiança seletiva em vez de usar a propriedade
TRUSTWORTHY
.
O exemplo de código a seguir pode ser usado para obter uma lista de bancos de dados que têm a propriedade TRUSTWORTHY
definida como ON e cujo proprietário do banco de dados pertence à função de servidor 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
Você pode executar a seguinte consulta para determinar a propriedade TRUSTWORTHY
do banco de dados 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
Se essa consulta mostrar que a propriedade TRUSTWORTHY
está definida como OFF, você poderá executar a seguinte consulta para definir a propriedade TRUSTWORTHY
como ON.
ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO
Advertência
Há maneiras de elevar um usuário com a função db_owner
para se tornar um sysadmin
ao definir TRUSTWORTHY
como ON. Tenha cuidado ao usar a propriedade TRUSTWORTHY
. O código SQL a seguir pode ser usado para obter uma lista de usuários de banco de dados em um banco de dados que recebem a função 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