Propiedad de base de datos TRUSTWORTHY

Se aplica a:SQL ServerAzure SQL Managed Instance

La propiedad de base de datos TRUSTWORTHY sirve para indicar si la instancia de SQL Server confía en la base de datos y en su contenido. De forma predeterminada, se establece en OFF, pero puede establecerse en ON mediante la instrucción ALTER DATABASE. Por ejemplo: ALTER DATABASE AdventureWorks2022 SET TRUSTWORTHY ON;.

Nota:

Para establecer esta opción, debe ser miembro del rol fijo de servidor sysadmin .

Se recomienda dejar la propiedad TRUSTWORTHY de base de datos establecida en OFF para mitigar determinadas amenazas que pueden existir como resultado de adjuntar una base de datos que contenga uno de los siguientes objetos:

  • Ensamblados malintencionados con permisos establecidos en EXTERNAL_ACCESS o UNSAFE. Para más información, consulte CLR Integration Security.

  • Módulos malintencionados que se definen para ejecutarse como si se tratase de usuarios con un alto nivel de privilegios. Para obtener más información, vea EXECUTE AS (cláusula de Transact-SQL).

Ambas situaciones requieren un nivel específico de privilegios y están protegidas mediante mecanismos apropiados cuando se utilizan en el contexto de una base de datos que ya está adjuntada a una instancia de SQL Server. Sin embargo, si se deja la base de datos sin conexión, si tiene acceso al archivo de la base de datos podría adjuntarlo a una instancia de SQL Server que desee y agregar contenido malintencionado a la base de datos. Cuando se separan y adjuntan bases de datos en SQL Server, se establecen ciertos permisos en los archivos de datos y de registro que restringen el acceso a los archivos de base de datos.

Puesto que no se puede confiar inmediatamente en una base de datos que se adjunta a una instancia de SQL Server, no se permite a la base de datos el acceso a recursos situados fuera del ámbito de la misma hasta que se marque explícitamente como de confianza. Por tanto, si realiza una copia de seguridad o separa una base de datos que tiene la opción TRUSTWORTHY establecida en ON, y adjunta o restaura la base de datos en la misma instancia de SQL Server o en otra, la propiedad TRUSTWORTHY se establecerá en OFF al finalizar de adjuntar o restaurar. Además, los módulos que se han diseñado para tener acceso a recursos situados fuera de la base de datos, y los ensamblados con permisos EXTERNAL_ACCESS y UNSAFE, tienen requisitos adicionales para ejecutarse correctamente.

Nota:

De forma predeterminada, la configuración de TRUSTWORTHY se establece en ON para la base de datos msdb. Si cambia esta configuración de su valor predeterminado, podría producirse un comportamiento inesperado por parte de los componentes de SQL Server que usan la base de datos msdb.

Si la configuración TRUSTWORTHY se establece en ON y si el propietario de la base de datos es miembro de un grupo que tiene credenciales administrativas, como el grupo del administrador del sistema, el propietario de la base de datos puede crear y ejecutar ensamblados no seguros que puedan poner en peligro la instancia de SQL Server.

Más información

En un entorno de proveedor de servicios de Internet (ISP) (por ejemplo, en un servicio de hospedaje de sitios web), cada cliente puede administrar su propia base de datos y tiene restringido el acceso a las bases de datos del sistema y a otras bases de datos de usuario. Por ejemplo, las bases de datos de dos empresas de la competencia podrían alojarse en el mismo ISP y existir en la misma instancia de SQL Server. Se podría agregar código peligroso a una base de datos de usuario cuando la base de datos está adjuntada a su instancia original y el código se habilitaría en la instancia de ISP cuando se implementase la base de datos. Esta situación hace que el control del acceso entre bases de datos sea fundamental.

Aunque la misma entidad general posea y administre cada base de datos, no se debe establecer una relación de confianza con una base de datos a menos que se requiera una característica específica de la aplicación, como una comunicación entre bases de datos de Service Broker. Se puede establecer una relación de confianza entre bases de datos habilitando el encadenamiento de propiedad entre bases de datos o marcando una base de datos como de confianza para la instancia mediante la propiedad TRUSTWORTHY. La columna is_trustworthy_on de la vista de catálogo sys.databases indica si una base de datos tiene su propiedad TRUSTWORTHY establecida.

Entre los procedimientos recomendados para la propiedad y la confianza de la base de datos se incluyen los siguientes:

  • Tener propietarios distintos para las bases de datos. No todas las bases de datos deben ser propiedad del administrador del sistema.
  • Limitar el número de propietarios de cada base de datos.
  • Conferir confianza de forma selectiva.
  • Deje la configuración de encadenamiento de propiedad entre bases de datos establecida en OFF a menos que se implementen varias bases de datos en una sola unidad.
  • Migre el uso a confianza selectiva en lugar de usar la propiedad TRUSTWORTHY.

El siguiente ejemplo de código se puede usar para obtener una lista de bases de datos que tienen la propiedad TRUSTWORTHY establecida en ON y cuyo propietario de la base de datos pertenece al rol del servidor de administrador del sistema.

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

Puede ejecutar la siguiente consulta para determinar la propiedad TRUSTWORTHY de la base de datos 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

Si esta consulta muestra que la TRUSTWORTHY propiedad está establecida en OFF, puede ejecutar la siguiente consulta para establecer la propiedad TRUSTWORTHY en ON.

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

Advertencia

Hay maneras de elevar el rol de un usuario db_owner para que se convierta en sysadmin cuando TRUSTWORTHY está establecido en ON. Tenga cuidado al usar la propiedad TRUSTWORTHY. El siguiente código SQL se puede usar para obtener una lista de usuarios de la base de datos en una base de datos a la que se concede el rol 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

Pasos siguientes