Published on

May 26, 2013

Habilitar xp_cmdshell para no administradores en SQL Server

SQL Server proporciona un procedimiento almacenado extendido del sistema llamado “xp_cmdshell” que permite a los usuarios emitir comandos de shell utilizando código TSQL. De forma predeterminada, este procedimiento almacenado extendido está deshabilitado y solo puede ser ejecutado por miembros del rol de servidor “sysadmin”. Sin embargo, puede haber situaciones en las que desee permitir que los inicios de sesión de no administradores utilicen xp_cmdshell. En este artículo, exploraremos cómo habilitar xp_cmdshell para no administradores.

Habilitar xp_cmdshell

Para habilitar xp_cmdshell, puede utilizar el procedimiento almacenado extendido “sp_configure”. Aquí hay un ejemplo de cómo habilitar xp_cmdshell:

EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO

Otra forma de habilitar xp_cmdshell es utilizar la Administración basada en directivas, que está documentada en los Libros en línea.

Derechos de seguridad predeterminados para las operaciones de xp_cmdshell

Cuando xp_cmdshell se habilita por primera vez, solo puede ser ejecutado por miembros del rol de servidor “sysadmin”. Además, el proceso xp_cmdshell se ejecuta utilizando las mismas credenciales que la cuenta de servicio de SQL Server. Esto significa que los inicios de sesión que no pertenecen al rol de sysadmin no pueden ejecutar xp_cmdshell. Sin embargo, podemos configurar SQL Server para permitir que los inicios de sesión no administradores ejecuten xp_cmdshell creando una cuenta de proxy.

Creación de credenciales de proxy para xp_cmdshell

Para permitir que los inicios de sesión no administradores utilicen xp_cmdshell, debemos crear una cuenta de proxy. De forma predeterminada, las credenciales para xp_cmdshell están desactivadas. Para habilitar las credenciales de proxy, podemos utilizar el procedimiento almacenado extendido del sistema llamado “sp_xp_cmdshell_proxy_account”. Aquí está la sintaxis para crear una cuenta de proxy xp_cmdshell:

EXEC sp_xp_cmdshell_proxy_account [MyDomain\SQLServerProxy], 'password'

En este ejemplo, creamos una cuenta de proxy xp_cmdshell para el usuario “SQLServerProxy” en el dominio “MyDomain” con una contraseña de “password”.

También puede utilizar el procedimiento almacenado extendido “sp_xp_cmdshell_proxy_account” para deshabilitar la cuenta de proxy para xp_cmdshell ejecutando el siguiente comando:

EXEC sp_xp_cmdshell_proxy_account NULL;

Al no pasar ningún parámetro a “sp_xp_cmdshell_proxy_account”, SQL Server eliminará la cuenta de proxy.

Cuando se configura una cuenta de proxy, se crea una credencial llamada “##xp_cmdshell_proxy_account##”. SQL Server utilizará la cuenta almacenada en esta credencial cuando se ejecute xp_cmdshell por un inicio de sesión que no sea miembro del rol de servidor “sysadmin”. Además, el proceso de shell de comandos de Windows generado por xp_cmdshell se ejecutará utilizando las credenciales de Windows almacenadas en “##xp_cmdshell_proxy_account##”. Esto permite perfiles de seguridad diferentes para inicios de sesión de sysadmin y no administradores.

Problemas que puede encontrar al configurar las credenciales de proxy

A veces, al configurar la cuenta de proxy xp_cmdshell, los usuarios que no son administradores pueden encontrar problemas al intentar ejecutar xp_cmdshell. Aquí hay algunos errores comunes y sus soluciones:

Error: “No se pueden recuperar o son inválidas las información de la cuenta de proxy xp_cmdshell. Verifique que la credencial ‘##xp_cmdshell_proxy_account##’ existe y contiene información válida.”

Este error ocurre cuando un usuario que no es sysadmin intenta ejecutar xp_cmdshell antes de crear una cuenta de proxy xp_cmdshell. Para resolver esto, cree la cuenta de proxy como se mencionó anteriormente.

Error: “Se denegó el permiso EXECUTE en el objeto ‘xp_cmdshell’, base de datos ‘mssqlsystemresource’, esquema ‘sys’.”

Si un usuario que no es sysadmin no tiene permisos EXECUTE en xp_cmdshell, se producirá este error. Para solucionar esto, otorgue al usuario que no es sysadmin los derechos para ejecutar xp_cmdshell creando un usuario de base de datos en la base de datos principal y otorgando los permisos necesarios. Aquí hay un ejemplo:

USE master;
GO
CREATE USER [MyDomain\Dorothy] FOR LOGIN [MyDomain\Dorothy];
GRANT EXECUTE ON xp_cmdshell TO [MyDomain\Dorothy];

Error: “Se produjo un error durante la ejecución de xp_cmdshell. Se produjo un error en la llamada a ‘CreateProcessAsUser’ con el código de error: ‘1314’.”

Este error ocurre cuando la cuenta de servicio que ejecuta SQL Server no tiene suficientes derechos de directiva de seguridad local en el servidor. Revise las directivas de seguridad local identificadas en el artículo de la base de conocimientos http://support.microsoft.com/kb/248391/en-us para asegurarse de que la cuenta de proxy tenga los derechos necesarios.

Acceso de seguridad apropiado

Habilitar xp_cmdshell para el personal que no es del sistema requiere una cuidadosa consideración del acceso de seguridad. Es importante evitar otorgar derechos de administrador del sistema innecesarios a los inicios de sesión solo para ejecutar xp_cmdshell. En su lugar, determine el acceso de seguridad apropiado para las tareas específicas y siga los pasos descritos en este artículo para configurar una cuenta de proxy xp_cmdshell.

Siguiendo estos pasos, puede permitir que los inicios de sesión que no son administradores del sistema utilicen xp_cmdshell en SQL Server.

Ver todos los artículos de Greg Larsen

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.