Personalizar permisos con suplantación en SQL ServerCustomizing Permissions with Impersonation in SQL Server

Muchas aplicaciones utilizan procedimientos almacenados para obtener acceso a los datos, sirviéndose del encadenamiento de propiedad para restringir el acceso a tablas base.Many applications use stored procedures to access data, relying on ownership chaining to restrict access to base tables. Se pueden conceder permisos EXECUTE en procedimientos almacenados revocando o denegando permisos en las tablas base.You can grant EXECUTE permissions on stored procedures, revoking or denying permissions on the base tables. SQL Server no comprueba los permisos del llamador si el procedimiento almacenado y las tablas tienen el mismo propietario.SQL Server does not check the permissions of the caller if the stored procedure and tables have the same owner. No obstante, el encadenamiento de propiedad no funciona si los objetos tienen distintos propietarios o en el caso de SQL dinámico.However, ownership chaining doesn't work if objects have different owners or in the case of dynamic SQL.

Puede usar la cláusula EXECUTE AS en un procedimiento almacenado cuando el autor de la llamada no dispone de permisos en los objetos de base de datos a los que se hace referencia.You can use the EXECUTE AS clause in a stored procedure when the caller doesn't have permissions on the referenced database objects. El resultado de la cláusula EXECUTE AS es que el contexto de ejecución cambia al del usuario proxy.The effect of the EXECUTE AS clause is that the execution context is switched to the proxy user. Todo el código, así como todas las llamadas a los desencadenadores y procedimientos almacenados anidados, se ejecutan en el contexto de seguridad del usuario proxy.All code, as well as any calls to nested stored procedures or triggers, executes under the security context of the proxy user. El contexto de ejecución se revierte al llamador original sólo después de la ejecución o cuando se ha emitido una instrucción REVERT.Execution context is reverted to the original caller only after execution of the procedure or when a REVERT statement is issued.

Cambio de contexto con la instrucción EXECUTE ASContext Switching with the EXECUTE AS Statement

La instrucción Transact-SQL EXECUTE AS permite cambiar el contexto de ejecución de una instrucción mediante la suplantación de otro inicio de sesión o usuario de la base de datos.The Transact-SQL EXECUTE AS statement allows you to switch the execution context of a statement by impersonating another login or database user. Esta técnica es útil para probar consultas y procedimientos como otro usuario.This is a useful technique for testing queries and procedures as another user.

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

Se deben tener permisos IMPERSONATE en el inicio de sesión o usuario al que se está suplantando.You must have IMPERSONATE permissions on the login or user you are impersonating. Este permiso está implícito en sysadmin de todas las bases de datos y en los miembros del rol db_owner de bases de datos de las que son propietarios.This permission is implied for sysadmin for all databases, and db_owner role members in databases that they own.

Conceder permisos con la cláusula EXECUTE ASGranting Permissions with the EXECUTE AS Clause

Se puede utilizar la cláusula EXECUTE AS del encabezado de definición de un procedimiento almacenado, un desencadenador o una función definida por el usuario (excepto funciones alineadas con valores de tabla).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). Esto hace que el procedimiento se ejecute en el contexto del nombre de usuario o palabra clave especificada en la cláusula EXECUTE AS.This causes the procedure to execute in the context of the user name or keyword specified in the EXECUTE AS clause. Se puede crear un usuario proxy en la base de datos que no esté asignado a un inicio de sesión, otorgándole únicamente los permisos necesarios en los objetos a los que se obtiene acceso mediante el procedimiento.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. Únicamente el usuario proxy especificado en la cláusula EXECUTE AS debe tener permisos en todos los objetos a los que se tiene acceso mediante el módulo.Only the proxy user specified in the EXECUTE AS clause must have permissions on all objects accessed by the module.

Nota

Algunas acciones, como TRUNCATE TABLE, no tienen permisos que se puedan conceder.Some actions, such as TRUNCATE TABLE, do not have grantable permissions. Mediante la incorporación de la instrucción dentro de un procedimiento y especificando un usuario proxy que tenga permisos ALTER TABLE, puede ampliar los permisos para truncar la tabla a llamadores que tienen sólo permisos EXECUTE en el procedimiento.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.

El contexto especificado en la cláusula EXECUTE AS es válido mientras dure el procedimiento, incluidos los desencadenadores y procedimientos almacenados anidados.The context specified in the EXECUTE AS clause is valid for the duration of the procedure, including nested procedures and triggers. El contexto se revierte al llamador cuando se completa la ejecución o se emite una instrucción REVERT.Context reverts to the caller when execution is complete or the REVERT statement is issued.

Son tres los pasos que implica el uso de la cláusula EXECUTE AS en un procedimiento.There are three steps involved in using the EXECUTE AS clause in a procedure.

  1. Crear un usuario proxy en la base de datos que no esté asignado a un inicio de sesión.Create a proxy user in the database that is not mapped to a login. Este no es un requisito, pero ayuda a la hora de asignar permisos.This is not required, but it helps when managing permissions.
CREATE USER proxyUser WITHOUT LOGIN  
  1. Conceder al usuario proxy los permisos necesarios.Grant the proxy user the necessary permissions.

  2. Agregar la cláusula EXECUTE AS al procedimiento almacenado o a la función definida por el usuario.Add the EXECUTE AS clause to the stored procedure or user-defined function.

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

Nota

Las aplicaciones que requieren auditoría pueden verse interrumpidas debido a que no se ha mantenido el contexto de seguridad original del llamador.Applications that require auditing can break because the original security context of the caller is not retained. Las funciones integradas que devuelven la identidad del usuario actual, como SESSION_USER, USER, o USER_NAME, devuelven el usuario asociado a la cláusula EXECUTE AS, no el llamador original.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.

Utilizar EXECUTE AS con REVERTUsing EXECUTE AS with REVERT

Se puede utilizar la instrucción Transact-SQL REVERT para revertir al contexto de ejecución original.You can use the Transact-SQL REVERT statement to revert to the original execution context.

La cláusula opcional, sin Revert COOKIE = @variableName, permite volver a cambiar el contexto de ejecución al autor de la llamada si la variable @variableName contiene el valor correcto.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. Con ello podrá volver a cambiar el contexto de ejecución al llamador en entornos donde se utiliza la agrupación de conexiones.This allows you to switch the execution context back to the caller in environments where connection pooling is used. Dado que el valor de @variableName solo lo conoce el llamador de la instrucción EXECUTe AS, el llamador puede garantizar que el usuario final no puede cambiar el contexto de ejecución que invoca la aplicación.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. Cuando se cierra la conexión, se devuelve al grupo.When the connection is closed, it is returned to the pool. Para obtener más información sobre la agrupación de conexiones en ADO.NET, vea SQL Server agrupación de conexiones (ADO.net).For more information on connection pooling in ADO.NET, see SQL Server Connection Pooling (ADO.NET).

Especificar el contexto de ejecuciónSpecifying the Execution Context

Además de especificar un usuario, EXECUTE AS se puede utilizar también con cualquiera de las palabras clave siguientes.In addition to specifying a user, you can also use EXECUTE AS with any of the following keywords.

  • CALLER.CALLER. La ejecución como CALLER es el valor predeterminado; si no se especifica otra opción, el procedimiento se ejecuta en el contexto de seguridad del llamador.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. La ejecución como OWNER ejecuta el procedimiento en el contexto del propietario del procedimiento.Executing as OWNER executes the procedure in the context of the procedure owner. Si el procedimiento se crea en un esquema cuyo propietario es dbo o el propietario de la base de datos, el procedimiento se ejecutará con permisos restringidos.If the procedure is created in a schema owned by dbo or the database owner, the procedure will execute with unrestricted permissions.

  • SELF.SELF. La ejecución como SELF se ejecuta en el contexto de seguridad del creador del procedimiento almacenado.Executing as SELF executes in the security context of the creator of the stored procedure. Esto es equivalente a la ejecución como un usuario especificado, en la que el usuario especificado es la persona que crea o altera el procedimiento.This is equivalent to executing as a specified user, where the specified user is the person creating or altering the procedure.

Vea tambiénSee also