Безопасность регулятора ресурсов
В регуляторе ресурсов используются существующие механизмы безопасности 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), поскольку это соединение не подлежит классификации. Рекомендуется включить функцию выделенного административного соединения на сервере. Дополнительные сведения см. в разделе Использование выделенного административного соединения.
Примечание |
---|
Если выделенное административное соединение недоступно для устранения неполадок, другой вариант — перезапустить систему в однопользовательском режиме. Однопользовательский режим не подлежит классификации, однако он не дает возможности выполнить диагностику классификации регулятора ресурсов, если тот запущен. |
См. также