Seguridad del regulador de recursos

El Regulador de recursos utiliza los mecanismos de seguridad de SQL Server existentes como la autenticación, los niveles de permisos y las cadenas de propiedad. En este tema se identifican aspectos de la configuración y el uso del Regulador de recursos que se deben considerar para garantizar que se tratan los posibles problemas de seguridad.

Consideraciones

Hay que considerar los siguientes elementos de diseño e implementación del Regulador de recursos para garantizar la máxima seguridad posible de esta característica al usarla:

  • Permisos

  • Nombres del grupo de recursos de servidor y del grupo de cargas de trabajo

  • La función clasificadora definida por el usuario

Permisos

Los permisos siguientes se requieren para cambiar o ver la configuración del Regulador de recursos:

  • Para cambiar la configuración del Regulador de recursos, un usuario necesita el permiso CONTROL SERVER. Los permisos se comprueban cuando se ejecuta cualquiera de las instrucciones DDL del Regulador de recursos.

  • Para ver la configuración activa que proporcionan las vistas de administración dinámica, un usuario requiere el permiso VIEW SERVER STATE.

Se recomienda que la capacidad para crear o cambiar la configuración del Regulador de recursos se conceda a los administradores de bases de datos experimentados.

Nombres del grupo de recursos de servidor y del grupo de cargas de trabajo

Todos los nombres de los grupos de recursos de servidor y de los grupos de cargas de trabajo son públicos. Al crear los grupos, se deben elegir nombres que no divulguen información sobre la naturaleza de las aplicaciones que se están ejecutando en el servidor. Por ejemplo, un grupo de cargas de trabajo denominado NóminasCompañía proporciona una indicación obvia de la naturaleza e importancia de las aplicaciones que lo utilizan .

La función clasificadora definida por el usuario

La función clasificadora definida por el usuario (UDF) se almacena en la base de datos maestra.

Esta función es similar a los desencadenadores LOGON en su diseño e implementación, y se ejecuta después de que se desencadene LOGON como parte del proceso de inicio de sesión. La función se ejecuta en el contexto de inicio de la sesión que realiza una solicitud y la clasificación debe finalizar antes de que se establezca realmente una sesión. Por tanto, todos los mensajes que se originan dentro de la función clasificadora que normalmente llegarían al usuario, como los mensajes de error y los mensajes de la instrucción PRINT, se desvían al registro de errores de SQL Server.

Nota de advertenciaAdvertencia

Aunque esta versión del Regulador de recursos implementa el enlace de esquemas para restringir las llamadas que se pueden realizar desde la función clasificadora definida por el usuario, todos los datos que devuelve la función no son necesariamente seguros. Para obtener más información, vea Consideraciones para escribir una función clasificadora.

Tenga en cuenta los aspectos siguientes del comportamiento de la función clasificadora definida por el usuario:

  • El Regulador de recursos ejecuta esta función como parte de la clasificación en el contexto del usuario de inicio de sesión de forma predeterminada, o como usuario designado si en la función se especifica EXECUTE AS.

  • Cuando el Regulador de recursos ejecuta esta función como parte de la clasificación, no comprueba el permiso EXECUTE en la función clasificadora definida por el usuario. Sin embargo, todos los objetos a los que hace referencia la función están sujetos a las comprobaciones de permisos estándar, que pueden permitir el acceso en función de la cadena de propiedad.

  • Registrar una función como clasificadora del Regulador de recursos no afecta a sus niveles de permisos si se utiliza fuera del ámbito de la clasificación del Regulador de recursos.

Cadenas de propiedad en el Regulador de recursos

Puede confiar en las cadenas predeterminadas de propiedad basadas en esquemas o usar EXECUTE AS para dar acceso a un esquema a un único usuario cuando la clasificación del Regulador de recursos se está ejecutando. En el ejemplo de código siguiente y en los comentarios se ilustra cómo funcionan las cadenas de propiedad en el Regulador de recursos.

Nota

En el ejemplo siguiente se supone que los inicios de sesión de SQL están habilitados.

En el código siguiente se crean usuarios del esquema (SchemaUser1, SchemaUser2) que tienen acceso a master.

use master
go

CREATE LOGIN SchemaUser1 WITH PASSWORD='your password here';
CREATE USER SchemaUser1 FOR LOGIN [SchemaUser1];
CREATE LOGIN SchemaUser2 WITH PASSWORD='your password here';
CREATE USER SchemaUser2 FOR LOGIN [SchemaUser2];
go

En el código siguiente se crea un usuario (NormalUser1) con los permisos de inicio de sesión predeterminados.

CREATE LOGIN NormalUser1 WITH PASSWORD='your password here';
CREATE USER NormalUser1 FOR LOGIN [NormalUser1];
go

En el código siguiente se crean esquemas (Schema1, Schema2) y se asignan a los usuarios de esquemas que se crearon. También se crea una tabla (groupTable) para los esquemas.

CREATE SCHEMA Schema1 AUTHORIZATION SchemaUser1
CREATE TABLE groupTable (uname sysname, gname sysname);
CREATE SCHEMA Schema2 AUTHORIZATION SchemaUser2
CREATE TABLE groupTable (uname sysname, gname sysname);
go

En el código siguiente se agregan valores a groupTable.

INSERT Schema1.groupTable VALUES(N'NormalUser1',N'Group1');
INSERT Schema2.groupTable VALUES(N'NormalUser1',N'Group2');
go

En este momento, Schema1 y Schema2 son propiedad de SchemaUser1 y SchemaUser2, respectivamente. En el ejemplo de código siguiente se crea una función que se utilizará para tener acceso a Schema1 y Schema2.

CREATE FUNCTION Schema1.classifier() RETURNS sysname WITH SCHEMABINDING AS
BEGIN
      DECLARE @n sysname
      SELECT @n = gname FROM Schema1.groupTable WHERE uname = SUSER_NAME()
      SELECT @n = gname FROM Schema2.groupTable WHERE uname = SUSER_NAME()
      RETURN @n
END
go

En el código siguiente se registra la función anterior como una función clasificadora definida por el usuario. Observe que SchemaUser1 no tiene permiso de acceso a Schema2.

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=Schema1.classifier);
ALTER RESOURCE GOVERNOR RECONFIGURE
go

Como prueba, intente iniciar sesión como NormalUser1 desde otra conexión de cliente. Abra el Visor de eventos de Windows. Debe ver una entrada de error del clasificador en el registro de aplicación. NormalUser1 hereda los derechos de acceso para Schema1.groupTable por las cadenas de propiedad de Schema1.classifier. Sin embargo, Schema1 no tiene permiso de acceso a Schema2.groupTable.

Como otra prueba, conceda el permiso SELECT a SchemaUser1 para Schema2.groupTable. 

GRANT SELECT ON Schema2.groupTable TO SchemaUser1
go

Inicie sesión como NormalUser1. Una vez más, verá una entrada de error del clasificador en el registro de eventos. Este error se produce porque el servidor comprueba si NormalUser1 tiene o no el permiso SELECT, que no se hereda de SchemaUser1.

En el ejemplo de código siguiente, se crea otra función clasificadora. Esta vez, se concede a los inicios de sesión el permiso para EXECUTE AS SchemaUser1.

CREATE FUNCTION Schema1.classifier2() RETURNS sysname WITH SCHEMABINDING, EXECUTE AS 'SchemaUser1' AS
BEGIN
      DECLARE @n sysname
      SELECT @n = gname FROM Schema1.groupTable WHERE uname = SUSER_NAME()
      SELECT @n = gname FROM Schema2.groupTable WHERE uname = SUSER_NAME()
      RETURN @n
END
go

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=Schema1.classifier2);
ALTER RESOURCE GOVERNOR RECONFIGURE;
go

Dado que la nueva función se ejecuta en el contexto de SchemaUser1, y que SchemaUser1 tiene el permiso SELECT en Schema2.groupTable, la función Schema1.classifier2() se ejecutará correctamente para el inicio de sesión NormalUser1.

Inicie sesión de nuevo como NormalUser1 y compruebe si hay un error del clasificador en el registro de eventos.

Nota

Dado que NormalUser1 no tiene concedido el permiso EXECUTE en la función Schema1.classifier2, no puede ejecutar la función como una consulta ad hoc.

Para obtener más información, vea Cadenas de propiedad.

Probar la función clasificadora

Debe probar y optimizar la función clasificadora antes de utilizarla para clasificar las solicitudes entrantes. Una función mal escrita puede dejar el sistema inutilizable al agotar el tiempo de espera y exponer información de configuración. Puede utilizar una Conexión de administrador dedicada (DAC) para solucionar los problemas de una función clasificadora mientras el Regulador de recursos está habilitado, porque esta conexión no está sujeta a clasificación. Se recomienda tener habilitada la Conexión de administrador dedicada en el servidor. Para obtener más información, vea Usar una conexión de administrador dedicada.

Nota

Si no hay disponible ninguna Conexión de administrador dedicada para solucionar los problemas, la otra opción es reiniciar el sistema en modo de usuario único. El modo de usuario único no está sujeto a clasificación; sin embargo, no ofrece la capacidad de evaluar el clasificador del Regulador de recursos mientras se ejecuta.