Published on

February 11, 2014

Explorando la Impersonación en SQL Server

La impersonación es una característica poderosa en SQL Server que permite a un usuario imitar a otro usuario y obtener acceso a sus permisos. Si bien puede ser útil en ciertos escenarios, también conlleva serias implicaciones de seguridad que deben ser consideradas cuidadosamente.

Por defecto, SQL Server solo permite la impersonación a nivel de base de datos. Sin embargo, existen formas de impersonar permisos a nivel de servidor también. Veamos algunos ejemplos.

Impersonación a Nivel de Base de Datos

Supongamos que tenemos dos usuarios, UserA y UserB. UserA es el propietario de la base de datos (dbo) y se le ha otorgado a UserB la capacidad de impersonar a UserA. Esto significa que UserB puede realizar cualquier acción que UserA pueda realizar.

Sin embargo, ¿qué sucede si tenemos un UserC que solo necesita un subconjunto de los permisos de UserA? No queremos crear otro usuario para ser impersonado, ni queremos otorgar privilegios innecesarios a UserC. La solución es crear procedimientos almacenados que realicen las acciones necesarias y utilizar la cláusula EXECUTE AS para ejecutarlos como si otro usuario los estuviera ejecutando.

Por ejemplo, podemos crear un procedimiento almacenado que trunque una tabla:


CREATE TABLE TruncateMe (Id int NOT NULL IDENTITY(1,1))

CREATE USER Imp_TruncateMe WITHOUT LOGIN

GRANT ALTER ON TruncateMe TO Imp_TruncateMe

CREATE PROCEDURE dbo.Truncate_TruncateMe
WITH EXECUTE AS 'Imp_TruncateMe'
AS 
TRUNCATE TABLE TruncateMe

Ahora, en lugar de otorgarle a UserB la capacidad de truncar la tabla directamente, simplemente podemos otorgarle permiso de EJECUCIÓN en el procedimiento almacenado dbo.Truncate_TruncateMe. De esta manera, UserB solo puede truncar la tabla ejecutando el procedimiento almacenado.

Impersonación a Nivel de Servidor

La impersonación de permisos a nivel de servidor requiere habilitar la configuración TRUSTWORTHY de las bases de datos. Cuando TRUSTWORTHY está configurado en ON, la instancia confía en todo lo que hay en esa base de datos, lo que permite a los usuarios impersonados utilizar los permisos del inicio de sesión asociado.

Consideremos un escenario en el que queremos otorgar a un DBA junior acceso para ejecutar un comando DBCC que requiere pertenecer al rol de servidor sysadmin. En lugar de otorgarle al DBA junior permisos de sysadmin, podemos crear una solución alternativa utilizando la impersonación.

Aquí tienes un ejemplo:


-- Crear un inicio de sesión para ser el propietario de nuestra base de datos de impersonación
CREATE LOGIN Imp_DBO WITH PASSWORD = 'ContraseñaMuyFuerte', 
CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF;

-- Crear la base de datos con TRUSTWORTHY configurado en ON
CREATE DATABASE ImpTest WITH TRUSTWORTHY ON;

-- Cambiar el propietario al inicio de sesión creado para este propósito
ALTER AUTHORIZATION ON DATABASE::ImpTest TO Imp_DBO;

-- Otorgar los permisos necesarios al inicio de sesión
ALTER SERVER ROLE sysadmin ADD MEMBER Imp_DBO;

-- Crear un procedimiento almacenado para imitar DBCC HELP
USE ImpTest

CREATE PROCEDURE dbo.MyDBCCHelp (@dbcc_param varchar(50))
WITH EXECUTE AS OWNER
AS 
DBCC HELP (@dbcc_param)

En este ejemplo, creamos una base de datos separada (ImpTest) y configuramos TRUSTWORTHY en ON. Luego creamos un inicio de sesión (Imp_DBO) y lo convertimos en el propietario de la base de datos. Al agregar el inicio de sesión al rol de servidor sysadmin, le otorgamos los permisos necesarios para ejecutar el comando DBCC.

Ahora podemos crear un usuario en la base de datos ImpTest y otorgarle permiso de ejecución en el procedimiento almacenado dbo.MyDBCCHelp. Este usuario ahora puede ejecutar el comando DBCC exclusivo de sysadmin ejecutando el procedimiento almacenado.

Es importante tener en cuenta que al utilizar la impersonación, debes utilizar la función ORIGINAL_LOGIN para registrar la información del usuario y garantizar la seguridad de tu sistema.

La impersonación puede ser una herramienta poderosa cuando se utiliza correctamente, pero también introduce riesgos de seguridad. Es crucial considerar cuidadosamente los permisos y el acceso que otorgas a los usuarios y revisar y auditar regularmente tu sistema para garantizar su integridad.

¡Recuerda, con gran poder viene gran responsabilidad!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.