Настройка разрешений с олицетворением в SQL Server (ADO.NET)

Во многих приложениях используются хранимые процедуры для получения доступа к данным, что позволяет ограничивать доступ к базовым таблицам на основе формирования цепочки владения. При этом можно предоставлять разрешения EXECUTE для хранимых процедур, отзывая или отменяя разрешения по отношению к базовым таблицам. В СУБД SQL Server если хранимая процедура и таблицы имеют одного владельца, то разрешения вызывающего объекта не проверяются. Но формирование цепочки владения перестает действовать, если объекты имеют разных владельцев, а также в случае применения динамического кода SQL.

Начиная с версии SQL Server 2005, появилась возможность использовать предложение EXECUTE AS в хранимой процедуре, если вызывающий объект не имеет разрешений на указанные в ссылках объекты базы данных. Результат действия предложения EXECUTE AS состоит в том, что контекст выполнения переключается на пользователя-посредника. Весь код, а также все вызовы вложенных хранимых процедур или триггеров выполняются в контексте безопасности пользователя-посредника. Контекст выполнения переходит к вызывающему объекту только после выполнения процедуры или при выполнении инструкции REVERT.

Переключение контекста с помощью инструкции EXECUTE AS

Инструкция EXECUTE AS языка Transact-SQL позволяет переключать контекст выполнения инструкции путем олицетворения другого имени входа или пользователя базы данных. Это удобный метод проверки запросов и процедур от имени другого пользователя.

EXECUTE AS LOGIN = 'loginName';
EXECUTE AS USER = 'userName';

В данном случае необходимо иметь разрешения IMPERSONATE по отношению к олицетворяемому имени входа или пользователю. Это разрешение подразумевается для sysadmin во всех базах данных, а также для членов роли db_owner в базах данных, которыми они владеют.

Предоставление разрешений с помощью предложения EXECUTE AS

Предложение EXECUTE AS можно использовать в заголовке определения хранимой процедуры, триггера или определяемой пользователем функции (за исключением встроенных функций с табличным значением). Применение этого предложения приводит к выполнению процедуры в контексте пользователя с указанным именем или ключевого слова, заданного в предложении EXECUTE AS. В базе данных можно создать пользователя-посредника, не сопоставленного с каким-либо именем входа, и предоставить ему только самые необходимые разрешения на объекты, доступ к которым осуществляется в процедуре. Только пользователь-посредник, указанный в предложении EXECUTE AS, должен иметь разрешения на все объекты, к которым осуществляется доступ в модуле.

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

Некоторые действия, такие как TRUNCATE TABLE, не имеют предоставляемых разрешений.Включение инструкции в процедуру и определение пользователя-посредника, имеющего разрешения ALTER TABLE, позволяет распространить разрешения на усечение таблицы на те вызывающие объекты, которые имеют только разрешения EXECUTE на процедуру.

Контекст, заданный в предложении EXECUTE AS, действует только на время выполнения процедуры, включая вложенные процедуры и триггеры. Контекст снова становится контекстом вызывающего объекта после завершения выполнения или после выдачи инструкции REVERT.

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

  1. Создать в базе данных пользователя-посредника, который не сопоставляется с именем входа. Этот шаг не является обязательным, но позволяет упростить управление разрешениями.
CREATE USER proxyUser WITHOUT LOGIN
  1. Предоставить пользователю-посреднику необходимые разрешения.

  2. Добавить предложение EXECUTE AS в хранимую процедуру или определяемую пользователем функцию.

CREATE PROCEDURE [procName] WITH EXECUTE AS 'proxyUser' AS ...
ПримечаниеПримечание

Работа приложений, требующих аудита, может быть нарушена, поскольку первоначальный контекст безопасности вызывающего объекта не сохраняется.Встроенные функции, которые возвращают идентификатор текущего пользователя, такие как SESSION_USER, USER или USER_NAME, возвращают данные о пользователе, связанном с предложением EXECUTE AS, а не данные первоначального вызывающего объекта.

Использование предложения EXECUTE AS с инструкцией REVERT

Инструкцию REVERT языка Transact-SQL можно использовать для возврата к первоначальному контексту выполнения.

Необязательное предложение WITH NO REVERT COOKIE = @variableName позволяет переключать контекст выполнения обратно к контексту вызывающего объекта, если переменная @variableName содержит правильное значение. Это позволяет переключать контекст выполнения обратно к контексту вызывающего объекта в тех средах, где используются пулы соединений. Поскольку значение @variableName известно только в объекте, вызывающем инструкцию EXECUTE AS, вызывающий объект может гарантировать, что контекст выполнения не может изменяться конечным пользователем, который вызывает данное приложение. Соединение после закрытия возвращается в пул. Дополнительные сведения об использовании пулов соединений в ADO.NET см. в разделе Организация пулов соединений SQL Server (ADO.NET).

Определение контекста выполнения

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

  • CALLER. По умолчанию происходит выполнение с ключевым словом CALLER. Если не указан другой параметр, то процедура выполняется в контексте безопасности вызывающего объекта.

  • OWNER. Выполнение с ключевым словом OWNER приводит к выполнению процедуры в контексте владельца процедуры. Если процедура создана в схеме, принадлежащей dbo или владельцу базы данных, то процедура выполняется с неограниченными разрешениями.

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

Внешние ресурсы

Дополнительные сведения см. в следующих ресурсах.

Ресурс

Описание

Переключение контекста в электронной документации по SQL Server 2008

Содержит ссылки на разделы с описаниями способов использования предложения EXECUTE AS.

Использование инструкции EXECUTE AS для создания пользовательских наборов разрешений и раздел Использование предложения EXECUTE AS в модулях электронной документации по SQL Server 2005

Разделы содержат описание способов использования предложения EXECUTE AS.

См. также

Основные понятия

Сценарии защиты приложений в SQL Server (ADO.NET)

Управление разрешениями с помощью хранимых процедур в SQL Server (ADO.NET)

Написание защищенного динамического SQL-кода в SQL Server (ADO.NET)

Подписывание хранимых процедур в SQL Server (ADO.NET)

Изменение данных с помощью хранимых процедур (ADO.NET)

Другие ресурсы

Защита приложений ADO.NET

Общие сведения о безопасности SQL Server (ADO.NET)