xp_cmdshell y seguridad

10/01/2005 - 17:05 por dile57-cosas | Informe spam
hola,
me he encontrado con el siguiente problema de seguridad en la
aplicacion que estoy desarrollando y necesitaba algo de ayuda,
gracias.


antecedentes:
tenemos un procedimiento almacenado que realiza una serie de
inserciones y actualizaciones contra una serie de tablas.

si este procedimiento se realiza con exito debemos ejectutar un
comando del sistema (este comando abre una conexion a una
maquina remota, le envia una breve informacion y cierra la conexion)

PROCEDURE sp_hace_cosas_y_envia_informe
inserta tablaZ
actualiza t1
...
SI todo_esta_correcto
@COMANDO = 'c:\talk.exe' + @CODIGO
EXEC master..xp_cmdshell @COMANDO
FINSI

FIN PROCEDURE

el problema:
para que este procedimiento almacenado pueda lanzar el programa
de comunicaciones debo permitir la ejecucion de el procedimiento
extendido xp_cmdshell al usuario que ejecuta el procedimiento
'sp_hace_cosas_y_envia_informe'

cosa que me parece, cuando menos, bastante osada :-)
puesto que ese usuario podria ejecutar cualquier comando del sistema.
borrar archivos importantes, por ejemplo.


la pregunta:
¿hay alguna forma de permitir la ejecucion de un programa en concreto?
o mejor aun...
hay forma de decir: "este procedimiento almacenado tiene permiso
para lanzar este procedimiento" asi evitaria dar cualquier tipo
de permiso adicional al usuario que usa el procedimiento.

¿como solucionariais este problema?

-

espero haberme explicado bien,
muchas gracias, un saludo

Preguntas similare

Leer las respuestas

#1 Paulino Padial
10/01/2005 - 17:35 | Informe spam
hombre podrias solucionarlo de muchas formas,
una de ellas seria a nivel de Sistema Operativo, utilizando una usuario de
windows, y que pertenece a un grupo, que tiene directivas, etc.. que le
permitan solo ejecutar, los programas que desees, o que tenga permisos solo
sobre lo que tu desees. Eso creo que seria de lo mejor... asi a bote pronto.

Tb podrias, pues depende, crear un procedimiento, y ver que es el comando
que te manda el usuario, y que dentro del procedimiento, permitas o
restringas el lanzado de cmdshell, por ejemplo, si la cadena de la operacion
contiene la palabra delete, no hagas nada. ¿se comprende?

Algo así estaria bien.
Ahora.. el tema del xp_cmdshell a un usuario de una aplicacion, lo
mejor, si no hay mas remedio, ( es decir, no puedes invocar Jobs.. o la
Aplicacion, GUI cliente, que es la que deberiahacer esas cosas, no puede
hacerlo..) y te ves TOTALMENTE OBLIGADO a usar un xp_cmdshell, con ordenes
de un usuario pues lo haria quizas, de las dos formas, uqe te he dicho
antes. Por si... falla un administrador en dar permisos... y por si falla,
alguna casuística de tu sp.

¿en que entorno se esta dando esto? es decir, es una aplicacion grafica que
ataka a base de datos? o es quizas una aplicacion, web, que ataka a base de
datos? con solo gente de intranet? gente de fuera? :S
bueno con lo que te he dicho espero haberte ayudado.

Saludos cordiales,

__________________________________________

Paulino Padial López
Murcia - España

Microsoft SQL-Server Administrator.
Microsoft Certified Solution Developer
Microsoft Certified Trainer
Oracle Certified Asociate
__________________________________________
"rodrigo" escribió en el mensaje
news:
hola,
me he encontrado con el siguiente problema de seguridad en la
aplicacion que estoy desarrollando y necesitaba algo de ayuda,
gracias.


antecedentes:
tenemos un procedimiento almacenado que realiza una serie de
inserciones y actualizaciones contra una serie de tablas.

si este procedimiento se realiza con exito debemos ejectutar un
comando del sistema (este comando abre una conexion a una
maquina remota, le envia una breve informacion y cierra la conexion)

PROCEDURE sp_hace_cosas_y_envia_informe
inserta tablaZ
actualiza t1
...
SI todo_esta_correcto
@COMANDO = 'c:\talk.exe' + @CODIGO
EXEC master..xp_cmdshell @COMANDO
FINSI

FIN PROCEDURE

el problema:
para que este procedimiento almacenado pueda lanzar el programa
de comunicaciones debo permitir la ejecucion de el procedimiento
extendido xp_cmdshell al usuario que ejecuta el procedimiento
'sp_hace_cosas_y_envia_informe'

cosa que me parece, cuando menos, bastante osada :-)
puesto que ese usuario podria ejecutar cualquier comando del sistema.
borrar archivos importantes, por ejemplo.


la pregunta:
¿hay alguna forma de permitir la ejecucion de un programa en concreto?
o mejor aun...
hay forma de decir: "este procedimiento almacenado tiene permiso
para lanzar este procedimiento" asi evitaria dar cualquier tipo
de permiso adicional al usuario que usa el procedimiento.

¿como solucionariais este problema?

-

espero haberme explicado bien,
muchas gracias, un saludo
Respuesta Responder a este mensaje
#2 Javier Loria
10/01/2005 - 17:42 | Informe spam
Hola:
Este tipo de cosas es mejor dejarselo a la Aplicacion y no hacerlo desde
el SQL. En principio lo optimo me parece hacerlo desde algun lenguaje
fuerte: VB, C#, C++, Pascal, Java, etc..
Si este no es posible o no es deseable, se me ocurre que si la ejecucion
no se tiene que se sincronica, podrias simplemente insertar en una tabla el
codigo, y definir un job que periodicamente revise la tabla y si encuentra
codigos ejecute el programa y los borre de la tabla.
Esto me parece permite mejora la seguridad, (ya que el usuario no
requiere permisos sobre la xp_cmdshell), y es mas facil darle mantenimiento
ya que separa la funcionalidad, permitiendo reemplazarla o ampliarla con
mucha facilidad despues.
Si la aplicacion debe ser sincronica es mucho mas complejo, ya que en
esta solucion habria que iniciar el job y esperar y monitorear el resultado
de la ejecucion, con mil complicaciones, incluyendo problemas de
concurrencia. Buscaria otra alternativa.
Una nota: si usas xp_cmdshell, y es ejecutado por usuarios que no son
SYSADMIN, entonces puedes definir un usuario sqlagent_proxy_account, esta
cuenta podria estar muy limitada en permisos y con solo la autorizacion de
ejecutar el programa indicado. Reduciendo la exposicion de seguridad.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"rodrigo" wrote in message
news:
hola,
me he encontrado con el siguiente problema de seguridad en la
aplicacion que estoy desarrollando y necesitaba algo de ayuda,
gracias.


antecedentes:
tenemos un procedimiento almacenado que realiza una serie de
inserciones y actualizaciones contra una serie de tablas.

si este procedimiento se realiza con exito debemos ejectutar un
comando del sistema (este comando abre una conexion a una
maquina remota, le envia una breve informacion y cierra la conexion)

PROCEDURE sp_hace_cosas_y_envia_informe
inserta tablaZ
actualiza t1
...
SI todo_esta_correcto
@COMANDO = 'c:\talk.exe' + @CODIGO
EXEC master..xp_cmdshell @COMANDO
FINSI

FIN PROCEDURE

el problema:
para que este procedimiento almacenado pueda lanzar el programa
de comunicaciones debo permitir la ejecucion de el procedimiento
extendido xp_cmdshell al usuario que ejecuta el procedimiento
'sp_hace_cosas_y_envia_informe'

cosa que me parece, cuando menos, bastante osada :-)
puesto que ese usuario podria ejecutar cualquier comando del sistema.
borrar archivos importantes, por ejemplo.


la pregunta:
¿hay alguna forma de permitir la ejecucion de un programa en concreto?
o mejor aun...
hay forma de decir: "este procedimiento almacenado tiene permiso
para lanzar este procedimiento" asi evitaria dar cualquier tipo
de permiso adicional al usuario que usa el procedimiento.

¿como solucionariais este problema?

-

espero haberme explicado bien,
muchas gracias, un saludo
Respuesta Responder a este mensaje
#3 Isaías
10/01/2005 - 19:11 | Informe spam
Ademas de lo que ya comentaron Paulino y Javier.

Podria considerar dejar la ejecucion del XP_CMDSHELL en el
entorno del usuario de windows que arranca los servicios
de SQL Server, comunmente el ADMINISTRATOR.

Esto evitaria darle permisos a cada usuario de SQL de
ejecutar dicho store de sistema.

Saludos.
Respuesta Responder a este mensaje
#4 Carlo Sorrel
10/01/2005 - 20:52 | Informe spam
Permiso, tambien podrias generar un store procedure que haga lo que
necesitas, con el xp_cmdshell y todo lo involucrado, crear un job que lo
ejecute con una cuenta con los permisos necesarios (no necesariamente la
cuenta del usuario, incluso puede ser una cuenta del sistema, u otra que
nadie conozca), y desde la aplicación, al momento de que el usuario ejecute
el proceso, envie un error parametrizado a SQL (50001 por ejemplo), el cual
levante una alerta, y esta alerta a su vez levante el job. Esto lo estoy
utilizando en mi empresa para poder ejecutar todo lo necesario con
xp_cmdshell sin darle permisos a ningún usuario común y silvestre. Para los
usuarios es transparente y para mi seguro, ya que nadie conoce los usuarios
ni las claves con que se jecutan los job's.
Saludos.

Atte.,
Carlo Sorrel

"rodrigo" escribió en el mensaje
news:
hola,
me he encontrado con el siguiente problema de seguridad en la
aplicacion que estoy desarrollando y necesitaba algo de ayuda,
gracias.


antecedentes:
tenemos un procedimiento almacenado que realiza una serie de
inserciones y actualizaciones contra una serie de tablas.

si este procedimiento se realiza con exito debemos ejectutar un
comando del sistema (este comando abre una conexion a una
maquina remota, le envia una breve informacion y cierra la conexion)

PROCEDURE sp_hace_cosas_y_envia_informe
inserta tablaZ
actualiza t1
...
SI todo_esta_correcto
@COMANDO = 'c:\talk.exe' + @CODIGO
EXEC master..xp_cmdshell @COMANDO
FINSI

FIN PROCEDURE

el problema:
para que este procedimiento almacenado pueda lanzar el programa
de comunicaciones debo permitir la ejecucion de el procedimiento
extendido xp_cmdshell al usuario que ejecuta el procedimiento
'sp_hace_cosas_y_envia_informe'

cosa que me parece, cuando menos, bastante osada :-)
puesto que ese usuario podria ejecutar cualquier comando del sistema.
borrar archivos importantes, por ejemplo.


la pregunta:
¿hay alguna forma de permitir la ejecucion de un programa en concreto?
o mejor aun...
hay forma de decir: "este procedimiento almacenado tiene permiso
para lanzar este procedimiento" asi evitaria dar cualquier tipo
de permiso adicional al usuario que usa el procedimiento.

¿como solucionariais este problema?

-

espero haberme explicado bien,
muchas gracias, un saludo
Respuesta Responder a este mensaje
#5 rodrigo
11/01/2005 - 11:04 | Informe spam
hola, gracias por vuestras respuestas, me habeis dado ideas
para implementar una posible solución en el caso de que me
la pidan.

Os cuento un poco como es el entorno de trabajo...
la aplicacion va a funcionar en una red local,
pero a través de wireless, de ahi mis reservas en cuanto a
seguridad (aunque, en cualquier caso, no sería facil
ejecutar comandos aleatorios en el servidor... es mejor
evitar incluso la posibilidad.)

Los clientes serán dispositivos PocketPC y todo
el trafico llega a SQL Server(version 2000, desconozco el
SP instalado que tiene el cliente) a traves de un servidor IIS.


muchas gracias de nuevo, un saludo.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida