Безопасность регулятора ресурсов

В регуляторе ресурсов используются существующие механизмы безопасности SQL Server, такие как проверка подлинности, уровни разрешений и цепочки владения. В этом разделе обозначаются аспекты настройки и использования регулятора ресурсов, которые следует учитывать для предотвращения потенциальных проблем с безопасностью.

Замечания

Чтобы обеспечить максимальную безопасность при использовании регулятора ресурсов, необходимо учитывать следующие элементы его конструкции и реализации:

  • Разрешения.

  • Имена пулов ресурсов и групп рабочих нагрузок.

  • Определяемая пользователем функция-классификатор.

Разрешения

Для изменения или просмотра настроек регулятора ресурсов необходимы следующие разрешения:

  • Чтобы изменить конфигурацию регулятора ресурсов, пользователь должен обладать разрешением CONTROL SERVER. Разрешения проверяются при выполнении любых DDL-инструкций регулятора ресурсов.

  • Чтобы просмотреть активную конфигурацию в динамических административных представлениях, пользователю необходимо разрешение VIEW SERVER STATE.

Рекомендуется предоставить возможность создания или изменения конфигурации регулятора ресурсов опытным администраторам баз данных.

Имена пулов ресурсов и групп рабочих нагрузок

Все имена пулов ресурсов и групп рабочих нагрузок являются публичными. При создании пулов и групп следует выбирать имена, которые не раскрывают сведения о характере приложений, которые запускаются на сервере. Например, группа рабочей нагрузки с именем CompanyPayroll содержит очевидное указание на характер и важность использующих ее приложений.

Определяемая пользователем функция-классификатор

Определяемая пользователем функция-классификатор хранится в базе данных master.

Конструкция и реализация этой функции подобна триггерам LOGON, и она запускается после триггеров LOGON как часть процесса входа в систему. Функция выполняется в контексте имени входа сеанса, который осуществляет запрос, и классификация должна быть завершена до фактического установления сеанса. Следовательно, все сообщения, которые возникают внутри функции-классификатора и обычно достигают пользователя, такие как сообщения об ошибках и сообщения от инструкции PRINT, перенаправляются в журнал ошибок SQL Server.

ПредупреждениеВнимание!

Хотя в этом выпуске регулятора ресурсов реализована привязка к схеме, чтобы ограничить возможные вызовы из определяемой пользователем функции-классификатора, безопасность всех возвращаемых ею данных не гарантируется. Дополнительные сведения см. в разделе Моменты, которые следует учитывать при создании функции-классификатора.

Отметьте следующие аспекты поведения определяемой пользователем функции-классификатора:

  • Регулятор ресурсов запускает эту функцию как часть классификации в контексте имени входа пользователя по умолчанию или как указанный пользователь, если в функции указано предложение EXECUTE AS.

  • При запуске функции в качестве части классификации регулятор ресурсов не проверяет разрешение EXECUTE на определяемую пользователем функцию-классификатор. Однако все объекты, на которые эта функция ссылается, подлежат стандартным проверкам разрешений, которые могут разрешать доступ на основе цепочки владения.

  • Регистрация функции в качестве классификатора в регуляторе ресурсов не влияет на уровни ее разрешений при использовании вне классификации регулятора ресурсов.

Цепочки владения в регуляторе ресурсов

Можно положиться на цепочки владения по умолчанию на основе схемы или использовать предложение EXECUTE AS, чтобы предоставить отдельному пользователю доступ к схеме во время запуска классификации регулятором ресурсов. Следующий пример кода и комментарии иллюстрируют работу цепочек владения в регуляторе ресурсов.

ПримечаниеПримечание

В следующем примере предполагается, что имена входа SQL включены.

Следующий код создает пользователей схем (SchemaUser1, SchemaUser2), имеющих доступ к базе данных 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

Следующий код создает пользователя (NormalUser1) с разрешениями используемого по умолчанию имени входа.

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

Следующий код создает схемы (Schema1, Schema2) и сопоставляет их с созданными пользователями схемами. Также создается таблица (groupTable) для схем.

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

Следующий код добавляет значения в таблицу groupTable.

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

На этом этапе схемами Schema1 и Schema2 владеют соответственно пользователи SchemaUser1 и SchemaUser2. Следующий пример кода создает функцию, которая будет использоваться для доступа к схемам Schema1 и 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

Следующий код регистрирует предыдущую функцию в качестве определяемой пользователем функции-классификатора. Заметьте, что у пользователя SchemaUser1 нет разрешения на доступ к схеме Schema2.

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

Для проверки попробуйте войти в систему как пользователь NormalUser1 через другое клиентское соединение. Откройте средство просмотра событий Windows. В журнале приложений должна отображаться запись о сбое функции-классификатора. NormalUser1 наследует права доступа к таблице Schema1.groupTable по цепочке владения от Schema1.classifier. Однако Schema1 не имеет разрешения на доступ к таблице Schema2.groupTable.

Для еще одной проверки предоставьте разрешение SELECT пользователю SchemaUser1 для таблицы Schema2.groupTable. 

GRANT SELECT ON Schema2.groupTable TO SchemaUser1
go

Войдите в систему как NormalUser1. В журнале событий появится еще одна запись о сбое функции-классификатора. Этот сбой возникает из-за того, что сервер проверяет, имеет ли имя входа NormalUser1 разрешение SELECT, которое не наследуется от SchemaUser1.

В следующем примере кода создается еще одна функция-классификатор. На этот раз имена входа получают разрешение 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

Так как новая функция запускается в контексте имени входа SchemaUser1, которое обладает разрешением SELECT на таблицу Schema2.groupTable, функция Schema1.classifier2() для имени входа NormalUser1 запускается успешно.

Войдите в систему еще раз как NormalUser1 и проверьте журнал событий на предмет сбоя функции-классификатора.

ПримечаниеПримечание

Так как имени входа NormalUser1 не предоставляется разрешение EXECUTE на функцию Schema1.classifier2, NormalUser1 не может запустить эту функцию как нерегламентированный запрос.

Дополнительные сведения см. в разделе Цепочки владения.

Проверка функции-классификатора

Перед использованием функции-классификатора для классификации входящих запросов ее следует проверить и оптимизировать. Неправильно написанная функция может нарушить работоспособность системы, создавая задержки и раскрывая данные конфигурации. Для устранения неполадок функции-классификатора, когда регулятор ресурсов включен, можно использовать выделенное административное соединение (DAC), поскольку это соединение не подлежит классификации. Рекомендуется включить функцию выделенного административного соединения на сервере. Дополнительные сведения см. в разделе Использование выделенного административного соединения.

ПримечаниеПримечание

Если выделенное административное соединение недоступно для устранения неполадок, другой вариант — перезапустить систему в однопользовательском режиме. Однопользовательский режим не подлежит классификации, однако он не дает возможности выполнить диагностику классификации регулятора ресурсов, если тот запущен.