O uso xp_cmdshell
pode ser bastante útil e, às vezes, possivelmente a única resposta para alguns cenários. Li alguns posts na internet que habilitar xp_cmdshell
pode comprometer a segurança do banco de dados/servidor.
Minha pergunta é: há algo que possamos fazer para reduzir o risco? Por exemplo, podemos definir algumas restrições/aplicar funções de usuários, etc., fornecendo salvaguardas para mitigar o risco?
Obrigado.
Bem, você não pode conceder a execução explicitamente para usuários finais (negê-lo até mesmo) e apenas habilitá-lo em procedimentos armazenados que usam EXECUTE AS com algum login que tenha permissões de execução. Em seguida, conceda a execução apenas nesse procedimento armazenado ao usuário que precisa executar o comando.
Primeiro, verifique se
xp_cmdshell
está ativado para a instância:Agora, dependendo do sistema operacional e da conta de serviço do SQL Server, pode ser necessário configurar uma conta proxy (e para isso, graças ao UAC, pode ser necessário elevar e iniciar o SSMS como administrador ):
Em seguida, crie um wrapper em seu banco de dados que faça tudo o que você precisar (este é apenas um exemplo de um wrapper MUITO genérico que realmente não o protege de nada; use-o apenas para demonstrar):
Agora dê ao seu usuário ou função permissões para executar o procedimento:
Agora
your_user
, quando faz login e tenta executar chamadas quer queira quer não paraxp_cmdshell
:Eles receberão:
No entanto, se eles passarem o mesmo comando para seu novo procedimento:
Ele funcionará bem (supondo que sua conta proxy esteja configurada corretamente e/ou a conta de serviço do SQL Server tenha as permissões adequadas).
Isso pode dar algum trabalho, mas efetivamente permite que você controle exatamente o que seus usuários podem fazer com
xp_cmdshell
.Você também pode configurar uma conta proxy usando sp_xp_cmdshell_proxy_account para permitir que não administradores usem xp_cmdshell. Isso permitirá que você configure uma conta do Windows com menos privilégios em vez de xp_cmdshell sempre usando a conta de serviço do SQL Server. Isso é semelhante à configuração de contas proxy para trabalhos do SQL Agent.