Propriedade de banco de dados TRUSTWORTHY
Aplica-se a: SQL Server Instância Gerenciada de SQL do Azure
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, esta 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 esta opção, é preciso ser um membro da função de servidor fixa sysadmin .
Recomendamos que você deixe o conjunto de propriedades do banco de dados TRUSTWORTHY
definido como OFF para mitigar certas ameaças que podem existir como resultado da anexação de um banco de dados que contém um dos seguintes objetos:
Assemblies maliciosos com um definição de permissão EXTERNAL_ACCESS ou UNSAFE. Para obter mais informações, consulte CLR Integration Security.
Módulos maliciosos que são definidos para serem executados como usuários com altos privilégios. Para obter mais informações, veja Cláusula EXECUTE AS (Transact-SQL).
Essas duas situações exigem um grau específico de privilégios e estão protegidas pelos mecanismos adequados, quando usados no contexto de um banco de dados já anexado a uma instância do SQL Server. No entanto, se o banco de dados estiver off-line, se você tiver acesso ao arquivo de banco de dados provavelmente poderá anexá-lo a uma instância do SQL Server de sua preferência e adicionar conteúdo malicioso ao banco de dados. Quando bancos de dados são desanexados e anexados no SQL Server, determinadas permissões são definidas nos dados e nos arquivos de log restringindo o acesso aos arquivos de banco de dados.
Como um banco de dados que é anexado a uma instância do SQL Server não é confiável imediatamente, o banco de dados não tem permissão para acessar recursos além do escopo do banco de dados, até que ele seja explicitamente marcado como confiável. Portanto, se você fizer backup ou desanexar um banco de dados com 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 após a conclusão da anexação ou restauração. Além disso, os módulos que são criados para acessar recursos fora do banco de dados, e assemblies com as definições de permissão EXTERNAL_ACCESS e UNSAFE, têm requisitos extra para uma execução bem-sucedida.
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 dos componentes do SQL Server que usam o banco de dados msdb
.
Se a configuração TRUSTWORTHY
estiver definida como ON, 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 montagens não seguras 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 Web), cada cliente tem permissão para gerenciar seu próprio banco de dados e é impedido de acessar bancos de dados do sistema e outros bancos de dados do usuário. 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 do usuário quando o banco de dados é anexado à sua instância original, e o código seria habilitado na instância 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 será 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 que usa a propriedade TRUSTWORTHY
. A coluna is_trustworthy_on
da exibição de catálogo sys.databases
indica se um banco de dados tem seu conjunto de propriedades TRUSTWORTHY
.
As melhores práticas para propriedade e confiança do banco de dados incluem o seguinte:
- Tenha 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.
- Dê essa 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 consulta a seguir para definir a propriedade TRUSTWORTHY
como ON.
ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO
Aviso
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