Sql Dinámico y seguridad en SQL2005

by 9. julio 2009 17:47

 

SQL-Dinámico y seguridad dentro de SQLServer 2005

El SQL-dinámico es una técnica la cual nos permite ejecutar sentencias TSQL de forma dinámica,  para poder hacer uso de esta técnica es necesario utilizar o bien el store procedure sp_executesql o sino EXEC(@str).

Este articulo no tiene como objetivo entrar en detalle del SQL-dinámico ya que hay otros escritos al respecto como por ejemplo el siguiente link el cual recomiendo leer

 

Aquí nos concentraremos en la seguridad y los cambios que hay en SQL2005 al respecto.

Una de las mayores contras que tiene el uso de SQL-Dinámico es que si lo ponemos dentro de un Store Procedure el usuario que ejecute tal Store no solo deberá tener permisos de execute sino que también deberá tener permisos sobre los objetos que haga referencia el SQL-Dinámico.

Para poder ser más específicos veamos un ejemplo al respecto

USE

MASTER

GO

CREATE DATABASE TEST1

GO

USE TEST1

GO

-- CREAMOS UN NUEVO LOGIN

CREATE

LOGIN FEDERICO WITH PASSWORD ='PASSW@RD'

GO

USE TEST1

GO

-- CREAMOS EL USUARIO EN LA BASE DE DATOS

CREATE USER FEDERICO

GO

-- CREAMOS UNA TABLA

CREATE

TABLE DBO.EMPLEADOS (ID INT IDENTITY, NAME VARCHAR(50))

GO

-- CREAMOS UN STORE QUE CONSUME LA TABLA EMPLEADOS

CREATE

PROC DBO.USP_EMPLEADOS_GET_ALL AS
SELECT * FROM DBO.EMPLEADOS

GO

-- CREAMOS OTRO STORE QUE CONSUME LA TABLA PERO CON SQLDINAMICO

CREATE

PROC DBO.USP_EMPLEADOS_GET_ALL2 AS

DECLARE @N NVARCHAR(50)

SET @N = N'SELECT * FROM DBO.EMPLEADOS'
EXECUTE SP_EXECUTESQL @N

GO

-- FEDERICO SOLO TIENE PERMISOS A LOS STORES

GRANT

EXECUTE ON DBO.USP_EMPLEADOS_GET_ALL TO FEDERICO
GRANT EXECUTE ON DBO.USP_EMPLEADOS_GET_ALL2 TO FEDERICO

GO

-- ENTRAMOS COMO FEDERICO

EXECUTE

AS LOGIN = 'FEDERICO'

SELECT

SUSER_SNAME()

SELECT

* FROM DBO.EMPLEADOS -- FALLA PORQUE NO TENEMOS PERMISO

EXEC

DBO.USP_EMPLEADOS_GET_ALL -- FUNCIONA

EXEC

DBO.USP_EMPLEADOS_GET_ALL2 -- FALLA POR EL SQL-DINAMICO

REVERT

-- REVERTIMOS EL LOGIN

Como se ha podido observar en el ejemplo el segundo Store ha fallado cuando el usuario Federico lo invoco ya que no tenia permisos sobre los objetos internos del mismo, en este caso la tabla "Empleados".

Esto atenta contra el buen uso de un Store procedure ya que una de sus virtudes es aislar a los usuarios del acceso directo a los objetos, con lo cual si deseamos en este caso usar SQL-Dinámico deberíamos darle permisos de Select a la tabla correspondiente.

Esto funciona así en 2000 y no hay solución al respecto, por lo cual yo no recomiendo mucho el uso de SQL-Dinámico y de usarlo tener en claro lo que está sucediendo.

¿Que cambios hay en 2005?

SqlServer 2005 permite dentro de un objeto como el Store Procedure indicarle el contexto de ejecución, esto es totalmente nuevo y se indica con la sentencia WITH EXECUTE AS (Caller, Owner o Username)

  • Caller es utilizado por defecto y representa a quien llama (como vimos en el ejemplo 1)
  • Owner indica que se impersonificara como el usuario propietario del objeto, en este caso como entre con la cuenta de SA entonces estamos impersonificando con ella.
  • User_name nos permite indicar con que login deseamos que se impersonifique

 

El siguiente ejemplo modifica el  Store con SQL Dinámico pero utilizando Execute AS

-- CAMBIOS EL STORE DEL SQL DINAMO PARA QUE SE EJECUTE EN

-- OTRO CONTEXTO DE SEGURIDAD

ALTER PROC DBO.USP_EMPLEADOS_GET_ALL2

WITH EXECUTE AS OWNER

AS

DECLARE @N NVARCHAR(50)

SET @N = N'SELECT * FROM DBO.EMPLEADOS'
EXECUTE SP_EXECUTESQL @N

GO

-- VOLVEMOS A PROBAR

EXECUTE

AS LOGIN = 'FEDERICO'

SELECT

SUSER_SNAME()

SELECT

* FROM DBO.EMPLEADOS -- FALLA PORQUE NO TENEMOS PERMISO

EXEC

DBO.USP_EMPLEADOS_GET_ALL

EXEC

DBO.USP_EMPLEADOS_GET_ALL2

REVERT

Aquí se ve claramente que ahora Federico no necesito permisos sobre la tabla "Empleados" para poder hacer uso del SQL-Dinámico.

Con esto lo que logramos es seguir manteniendo una de las enormes virtudes que tienen los Stores Procedures que es el aislamiento con respecto a los objetos base.

No confundir el Execute AS del Store con el luego utilizado en el query para dentro del management Studio impersonificarnos como Federico sin la necesidad entrar a otra ventana.

Estos ejemplos deben ser probados desde SQL2005, si desea probar el primer ejemplo desde SQL2000 deberá sacar la sentencia Execute AS y probar la seguridad entrando con el correspondiente login y password.

Bueno espero les sea de utilidad y espero sus comentarios.

Nos vemos!

Tags:

How To

Comentarios

22/07/2009 0:32:29 #

Hey I love your style I will subscribe for your feed please keep posting!

Betsey Johnson United States

13/08/2009 23:48:15 #

Do you earn decent money from this blog or are you doing it just for fun?

Gucci Mens 5500 Series United States

14/08/2009 22:18:01 #

Hey I love your style I will subscribe for your feed please keep posting!

Vintageantique Watch Lord Elgin United States

14/08/2009 22:19:38 #

I am quite interesting in this topic hope you will elaborate more on it in future posts.

Geneve 14kt Solid Gold United States

15/08/2009 21:29:07 #

Hmm strange this post is totaly irrelevant to the search query I entered in google but it was listed on the first page.

Chopard Mens Mille Miglia United States

16/08/2009 20:22:42 #

Tried to autotranslate you site not understand the writing any hope deutsch version?

Adee Kaye Deuce Mens United States

16/08/2009 20:23:59 #

I would like to add your blog to my blogroll please tell me what anchor should I use?

Citizen Eco Drive Womens United States

17/08/2009 19:49:29 #

Do you accept guest posts? I would love to write couple articles here.

Festina F163514 Grande Tour United States

18/08/2009 17:42:41 #

I like your blog curently we are looking for a part time article writer would you be interested?

Momentum M1 Womens Yellow United States

18/08/2009 17:44:07 #

I don't like your template but your posts are quite good so I will check back!

Mens Helbros Fashion Silver United States

26/08/2009 9:25:50 #

I would like to add your blog to my blogroll please tell me what anchor should I use?

Baume Mercier Classima United States

27/08/2009 7:19:19 #

I like how you write.Are you interesting in a part time writer job?

Baume Mercier Classima United States

27/08/2009 7:21:07 #

I think you have to improve a bit the design and usability of your blog.

Baume Mercier Classima United States

27/08/2009 19:24:32 #

Hi there, I found your blog on Google while seeking for first aid for a heart attack and your post looks very interesting for me.

bad credit loans United States

16/09/2009 21:34:15 #

Of course, what a great site and informative posts, I will add backlink - bookmark this site? Regards, Reader.

payday loan United States

22/09/2009 4:28:54 #

I wasn?t aware of the many ripples and depth to this story until I surfed here through Google! Great job.


Gucci Shoes

Gucci Shoes United States

Maximiliano Damian Accotto