Propiedad de base de datos TRUSTWORTHY
Se aplica a: SQL Server Azure 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