sql >> Base de Datos >  >> RDS >> Sqlserver

Riesgos de seguridad de establecer trustworthy =on en sql server 2012

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:

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.