El TRUSTWORTHY
propiedad de una base de datos (cuando se establece en ON
) esencialmente declara a SQL Server que el código contenido dentro de esa base de datos, y que se ejecuta en un contexto suplantado, debe poder llegar fuera de esa base de datos mientras se mantiene ese contexto de seguridad suplantado. También permite todos Los ensamblajes SQLCLR en esa base de datos se establecerán en EXTERNAL_ACCESS
y UNSAFE
, ya sea que ese código llegue o no fuera del servidor (significado externo:acceso a la red, acceso al sistema de archivos, acceso al registro, acceso al entorno, etc.).
Es un medio bastante genérico de permitir esto, ya que cubre todo el código dentro de la base de datos. El uso de certificados y/o claves asimétricas para firmar módulos (proces y/o ensamblajes) permite un control más granular sobre qué código tiene qué permisos.
Establecer una base de datos en TRUSTWORTHY
también permite que cualquier proceso que comience en esta base de datos llegue hasta el nivel del servidor y/o a través de otras bases de datos. Normalmente, un proceso está confinado/en cuarentena a la base de datos donde comenzó. Si la base de datos es propiedad del inicio de sesión "sa", entonces cualquier proceso iniciado en esa base de datos y que se ejecute como "dbo" tendrá efectivamente privilegios "sa" (¡ay!).
En lugar de tratar de describir aquí, en la cantidad de detalles necesarios para comunicar completamente los detalles sobre la suplantación de identidad, la ampliación de dicha suplantación, la firma de módulos, etc., recomiendo leer detenidamente los siguientes recursos sobre este tema:
- POR FAVOR, por favor , deje de utilizar la suplantación de identidad, TRUSTWORTHY y el encadenamiento de propiedad entre bases de datos
- Directrices para usar la configuración de base de datos TRUSTWORTHY en SQL Server
- Ampliación de la suplantación de la base de datos mediante el uso de EXECUTE AS
Este es un documento muy informativo que cubre la mayoría de los aspectos de este tema, y también se menciona en la página vinculada anterior. - Escalera a SQLCLR nivel 4:seguridad (ensamblados EXTERNOS y NO SEGUROS)
Este es un artículo que escribí como parte de una serie sobre SQLCLR que tiene ejemplos que ilustran las diferencias entre el método TRUSTWORTHY y el método de inicio de sesión basado en ensamblaje firmado; Se requiere registro gratuito.
Debe evitar configurar su base de datos en TRUSTWORTHY
cuanto más se pueda. Si realmente debe tener llamadas multiproceso/asincrónicas Y si tiene el código fuente y está compilando el ensamblaje, entonces no puedo pensar en una razón para usar SET TRUSTWORTHY ON
opción. En su lugar, debe firmar el ensamblado con una contraseña y use los siguientes comandos para configurar el método preferido para permitir EXTERNAL_ACCESS
y UNSAFE
asambleas:
USE [master];
CREATE ASYMMETRIC KEY [ClrPermissionsKey]
AUTHORIZATION [dbo]
FROM EXECUTABLE FILE = 'C:\path\to\my\assembly.dll';
CREATE LOGIN [ClrPermissionsLogin]
FROM ASYMMETRIC KEY [ClrPermissionsKey];
GRANT UNSAFE ASSEMBLY TO [ClrPermissionsLogin];
Una vez que esté en su lugar, puede ir a la base de datos donde se cargó su ensamblaje y ejecutar:
ALTER ASSEMBLY [MyAssembly] WITH PERMISSION_SET = UNSAFE;
O podría haber incluido WITH PERMISSION_SET = UNSAFE
al final de CREATE ASSEMBLY
comando.