locked
Uso do xp_cmdshell RRS feed

  • Discussão Geral

  • Ao dar o comando :

    select * from sys.configurations, vi que o xp_cmdshell está com o campo Value = 1.
    Eu gostaria de saber as consequencias disso em termos de segurança.

    Além disso, eu tenho um step ( type TSQL) dentro de um job, que dispara um comando desta forma :
    exec xp_cmdshell (SQLCMD....
    Eu gostaria de saber sua relação com o que está definido em sys.configurations, para saber se ele pode parar de funcionar caso a sys_configurations seja modificada...

    Eduardo
    terça-feira, 19 de janeiro de 2010 15:58

Todas as Respostas

  • efcampo,
    Se voce modificar o xp_cmdshell ficará desabilitados "value = 0". E o JOB com certeza falhará.

    Em termos de segurança: Alguem conectado a instancia pode usar o  xp_cmdshell com os mesmos privilegios da conta de serviço MSSQLSERVER. e caso essa conta tenha permissões a mais o usuario pode fazer de tudo até excluir contas do AD, dar permissões, compatilhar pastas..... ou seja, muita coisa mesmo!!!!

    Neste caso veja as permissões da conta de serviço MSSQLSERVER. E analise se tem permisões a mais.

    []´s
    MCP | MCTS | MCITP - http://leivio.spaces.live.com/
    terça-feira, 19 de janeiro de 2010 16:06
  • Boa Tarde,

    Eu evito ao máximo habilitar essa stored procedure. Normalmente quando se usa XP_CMDSHELL se está fazendo algo que em tese não deveria ficar no banco de dados. A xp_cmdshell roda comandos em DOS. Por que um SGBD precisaria fazer algo em DOS ? Não vejo necessidade de rodar algo em DOS por um banco de dados. Se tívessemos DB2, Oracle, MySQL, etc por exemplo não teríamos xp_cmdshell e certamente a necessidade seria resolvida pelo caminho "correto" já que essa sp abre fortes brechas de segurança.

    Se o valor está na sys.configurations zerado, então o recurso não está habilitado. Para habilitá-lo é necessário rodar a sp_configure seguida da reconfigure with override.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Recuperando o nome dos elementos em um documento XML no SQL Server
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!914.entry


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 19 de janeiro de 2010 16:34
  • Supondo que eu queira continuar executando o job que usa xp_cmdshell, mas que eu também desabilite essa stored procedure :

    É possível fazer o job habilitar a stored procedure, executar o comando xp_cmdshell, e logo a seguir desabilitar a stored procedure de novo ? Dessa forma, o sistema ficaria exposto por pouco tempo. Como ficaria esse script dentro de um job ?

    Eduardo

    terça-feira, 19 de janeiro de 2010 17:21
  • Boa Tarde,

    Não acho que seja muito seguro que o job habilite e depois desabilite. Melhor mesmo seria não usar.
    Ficaria da seguinte forma:

    -- Habilita
    EXEC sp_configure 'xp_cmdshell',1
    GO
    RECONFIGURE WITH OVERRIDE
    GO
    -- Conteúdo do JOB
    -- Desabilita
    EXEC sp_configure 'xp_cmdshell',1
    GO
    RECONFIGURE WITH OVERRIDE
    GO

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Recuperando o nome dos elementos em um documento XML no SQL Server
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!914.entry


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 19 de janeiro de 2010 19:27
  • Oi Gustavo,

    No job, eu poderia colocar esses comandos dentro de um único step type TSQL exatamente da forma que estão ?

    E de que outra maneira eu poderia gerar automaticamente todos os dias um arquivo txt a partir de um comando select ?

    Eduardo
    terça-feira, 19 de janeiro de 2010 19:34
  • Olá Efcampos,

    Pode. Vai funcionar. Se você tiver muitos jobs, não acho que "adiante muita coisa", pois, se cada um habilitar e desabilitar quando precisar, acaba que na prática ela fica habilitada.

    Sobre gerar o arquivo texto procure outros meios como o uso do BCP ou o SSIS. Ambos podem ser executados pelo Agent sem o uso da xp_cmdshell.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Recuperando o nome dos elementos em um documento XML no SQL Server
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!914.entry


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 19 de janeiro de 2010 19:39
  • Gustavo,

    No momento eu só tenho um job que utiliza o xp_cmdshell.
    E como ele leva menos de 1 minuto para executar, eu pensei nessa alternativa de habilitar e desabilitar o cmdshell.
    Enquanto isso, eu vou pesquisando o SSIS e o BCP.
    Imagino que o SSIS seja a criação de packages.
    Eu tentei criar um package há algum tempo atrás gerando um arquivo em xls, mas não deu certo.
    Aparentemente eu teria que instalar algum drive do excel no servidor do banco para conseguir gerar o arquivo.
    Mas não cheguei a tentar gerar em formato texto. Essa não era a necessidade na época.

    Quanto ao BCP, não tenho a menor idéia de como funciona.
    Vou ter que pesquisar...

    Eu pretendo desabilitar o xp_cmdshell hoje.
    Além do job, é possível que alguma aplicação que use os bancos use essa stored procedure ?
    Eu gostaria de ter uma idéia do impacto que posso causar ao fazer essa modificação...

    Eduardo
    quarta-feira, 20 de janeiro de 2010 11:54
  • Outra coisa Gustavo,

    Eu desabilitei o xp_cmdshell, mas para o job dar certo, tive que acrescentar comando. Ficou da seguinte forma :

    -- Habilita
    EXEC sp_configure 'show advanced options', 1
    GO
    -- To update the currently configured value for advanced options.
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell',1
    GO
    RECONFIGURE WITH OVERRIDE
    GO
    -- Conteúdo do JOB
    exec xp_cmdshell 'SQLCMD....
    GO
    -- Desabilita
    EXEC sp_configure 'xp_cmdshell',0
    GO
    RECONFIGURE WITH OVERRIDE
    GO

    Eu tive que acrescentar o configure para o show advanced options.
    Você pode me explicar algo sobre isso ?
    Agora estou na dúvida se tenho que voltá-lo para 0.

    Eduardo
    quarta-feira, 20 de janeiro de 2010 13:35