Настройка разрешений с олицетворением в SQL ServerCustomizing Permissions with Impersonation in SQL Server

Во многих приложениях используются хранимые процедуры для получения доступа к данным, что позволяет ограничивать доступ к базовым таблицам на основе формирования цепочки владения.Many applications use stored procedures to access data, relying on ownership chaining to restrict access to base tables. При этом можно предоставлять разрешения EXECUTE для хранимых процедур, отзывая или отменяя разрешения по отношению к базовым таблицам.You can grant EXECUTE permissions on stored procedures, revoking or denying permissions on the base tables. В СУБД SQL Server если хранимая процедура и таблицы имеют одного владельца, то разрешения вызывающего объекта не проверяются.SQL Server does not check the permissions of the caller if the stored procedure and tables have the same owner. Но формирование цепочки владения перестает действовать, если объекты имеют разных владельцев, а также в случае применения динамического кода SQL.However, ownership chaining doesn't work if objects have different owners or in the case of dynamic SQL.

Начиная с версии SQL Server 2005, появилась возможность использовать предложение EXECUTE AS в хранимой процедуре, если вызывающий объект не имеет разрешений на указанные в ссылках объекты базы данных.You can use the EXECUTE AS clause in a stored procedure when the caller doesn't have permissions on the referenced database objects. Результат действия предложения EXECUTE AS состоит в том, что контекст выполнения переключается на пользователя-посредника.The effect of the EXECUTE AS clause is that the execution context is switched to the proxy user. Весь код, а также все вызовы вложенных хранимых процедур или триггеров выполняются в контексте безопасности пользователя-посредника.All code, as well as any calls to nested stored procedures or triggers, executes under the security context of the proxy user. Контекст выполнения переходит к вызывающему объекту только после выполнения процедуры или при выполнении инструкции REVERT.Execution context is reverted to the original caller only after execution of the procedure or when a REVERT statement is issued.

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

Инструкция EXECUTE AS языка Transact-SQL позволяет переключать контекст выполнения инструкции путем олицетворения другого имени входа или пользователя базы данных.The Transact-SQL EXECUTE AS statement allows you to switch the execution context of a statement by impersonating another login or database user. Это удобный метод проверки запросов и процедур от имени другого пользователя.This is a useful technique for testing queries and procedures as another user.

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

В данном случае необходимо иметь разрешения IMPERSONATE по отношению к олицетворяемому имени входа или пользователю.You must have IMPERSONATE permissions on the login or user you are impersonating. Это разрешение подразумевается для sysadmin во всех базах данных, а также для членов роли db_owner в базах данных, которыми они владеют.This permission is implied for sysadmin for all databases, and db_owner role members in databases that they own.

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

Предложение EXECUTE AS можно использовать в заголовке определения хранимой процедуры, триггера или определяемой пользователем функции (за исключением встроенных функций с табличным значением).You can use the EXECUTE AS clause in the definition header of a stored procedure, trigger, or user-defined function (except for inline table-valued functions). Применение этого предложения приводит к выполнению процедуры в контексте пользователя с указанным именем или ключевого слова, заданного в предложении EXECUTE AS.This causes the procedure to execute in the context of the user name or keyword specified in the EXECUTE AS clause. В базе данных можно создать пользователя-посредника, не сопоставленного с каким-либо именем входа, и предоставить ему только самые необходимые разрешения на объекты, доступ к которым осуществляется в процедуре.You can create a proxy user in the database that is not mapped to a login, granting it only the necessary permissions on the objects accessed by the procedure. Только пользователь-посредник, указанный в предложении EXECUTE AS, должен иметь разрешения на все объекты, к которым осуществляется доступ в модуле.Only the proxy user specified in the EXECUTE AS clause must have permissions on all objects accessed by the module.

Примечание

Некоторые действия, такие как TRUNCATE TABLE, не имеют предоставляемых разрешений.Some actions, such as TRUNCATE TABLE, do not have grantable permissions. Включение инструкции в процедуру и определение пользователя-посредника, имеющего разрешения ALTER TABLE, позволяет распространить разрешения на усечение таблицы на те вызывающие объекты, которые имеют только разрешения EXECUTE на процедуру.By incorporating the statement within a procedure and specifying a proxy user who has ALTER TABLE permissions, you can extend the permissions to truncate the table to callers who have only EXECUTE permissions on the procedure.

Контекст, заданный в предложении EXECUTE AS, действует только на время выполнения процедуры, включая вложенные процедуры и триггеры.The context specified in the EXECUTE AS clause is valid for the duration of the procedure, including nested procedures and triggers. Контекст снова становится контекстом вызывающего объекта после завершения выполнения или после выдачи инструкции REVERT.Context reverts to the caller when execution is complete or the REVERT statement is issued.

Чтобы использовать предложение EXECUTE AS в процедуре, необходимо выполнить следующие три действия.There are three steps involved in using the EXECUTE AS clause in a procedure.

  1. Создать в базе данных пользователя-посредника, который не сопоставляется с именем входа.Create a proxy user in the database that is not mapped to a login. Этот шаг не является обязательным, но позволяет упростить управление разрешениями.This is not required, but it helps when managing permissions.
CREATE USER proxyUser WITHOUT LOGIN  
  1. Предоставить пользователю-посреднику необходимые разрешения.Grant the proxy user the necessary permissions.

  2. Добавить предложение EXECUTE AS в хранимую процедуру или определяемую пользователем функцию.Add the EXECUTE AS clause to the stored procedure or user-defined function.

CREATE PROCEDURE [procName] WITH EXECUTE AS 'proxyUser' AS ...  

Примечание

Работа приложений, требующих аудита, может быть нарушена, поскольку первоначальный контекст безопасности вызывающего объекта не сохраняется.Applications that require auditing can break because the original security context of the caller is not retained. Встроенные функции, которые возвращают идентификатор текущего пользователя, такие как SESSION_USER, USER или USER_NAME, возвращают данные о пользователе, связанном с предложением EXECUTE AS, а не данные первоначального вызывающего объекта.Built-in functions that return the identity of the current user, such as SESSION_USER, USER, or USER_NAME, return the user associated with the EXECUTE AS clause, not the original caller.

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

Инструкцию REVERT языка Transact-SQL можно использовать для возврата к первоначальному контексту выполнения.You can use the Transact-SQL REVERT statement to revert to the original execution context.

Необязательное предложение с параметром NO REVERT COOKIE = @variableNameпозволяет переключить контекст выполнения обратно вызывающему объекту, если переменная @variableName содержит правильное значение.The optional clause, WITH NO REVERT COOKIE = @variableName, allows you switch the execution context back to the caller if the @variableName variable contains the correct value. Это позволяет переключать контекст выполнения обратно к контексту вызывающего объекта в тех средах, где используются пулы соединений.This allows you to switch the execution context back to the caller in environments where connection pooling is used. Поскольку значение @variableName известно только вызывающему оператору инструкции EXECUTE AS, вызывающий объект может гарантировать, что контекст выполнения не может быть изменен конечным пользователем, который вызывает приложение.Because the value of @variableName is known only to the caller of the EXECUTE AS statement, the caller can guarantee that the execution context cannot be changed by the end user that invokes the application. Соединение после закрытия возвращается в пул.When the connection is closed, it is returned to the pool. Дополнительные сведения о пуле подключений в ADO.NET см. в разделе SQL Server подключение пулов (ADO.NET).For more information on connection pooling in ADO.NET, see SQL Server Connection Pooling (ADO.NET).

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

Предложение EXECUTE AS можно не только использовать для указания пользователя, но и указывать в нем любое из следующих ключевых слов.In addition to specifying a user, you can also use EXECUTE AS with any of the following keywords.

  • CALLER.CALLER. По умолчанию происходит выполнение с ключевым словом CALLER. Если не указан другой параметр, то процедура выполняется в контексте безопасности вызывающего объекта.Executing as CALLER is the default; if no other option is specified, then the procedure executes in the security context of the caller.

  • OWNER.OWNER. Выполнение с ключевым словом OWNER приводит к выполнению процедуры в контексте владельца процедуры.Executing as OWNER executes the procedure in the context of the procedure owner. Если процедура создана в схеме, принадлежащей dbo или владельцу базы данных, то процедура выполняется с неограниченными разрешениями.If the procedure is created in a schema owned by dbo or the database owner, the procedure will execute with unrestricted permissions.

  • SELF.SELF. Выполнение с ключевым словом SELF приводит к выполнению в контексте безопасности создателя хранимой процедуры.Executing as SELF executes in the security context of the creator of the stored procedure. Это эквивалентно вызову на выполнение от имени указанного пользователя, где указанным пользователем является лицо, создавшее или изменившее процедуру.This is equivalent to executing as a specified user, where the specified user is the person creating or altering the procedure.

См. такжеSee also