Em um de nossos servidores de produção, precisamos habilitar xp_cmdshell
algumas funcionalidades do aplicativo.
Com nossas medidas de segurança atuais, ele está desabilitado em todas as instâncias e precisa ser habilitado para apenas um SQL Server específico.
- Quão ruim é habilitar
xp_cmdshell
? - É realmente uma grande coisa para se preocupar?
- Alguma medida específica que possa ser tomada para habilitá-lo e ainda limitar seu uso?
Nossa equipe de aplicativos criou um gatilho que inicia outro processo de fatura e eles precisam xp_cmdshell
para isso.
De acordo com o Microsoft Docs para
xp_cmdshell
:Assim, se você tentar executar
xp_cmdshell
como um usuário não sysadmin, supondo que não tenha configurado a conta proxy, ela falhará. Isso significa que apenas administradores de sistema podem executá-lo. Você confia em seus administradores de sistema?Uma vez
xp_cmdshell
habilitado, o shell que ele gera tem a mesma segurança que a conta usada para executar o próprio SQL Server (ou a conta proxy, se configurada). Se essa conta tiver permissões totais na máquina local, o shell criado porxp_cmdshell
terá permissões totais na máquina local. A mesma coisa se a conta de serviço do SQL Server for um administrador de domínio (o que eu nunca sugeriria). Seguir o princípio do privilégio mínimo deve significar que o SQL Server tem os direitos mínimos necessários para funcionar exp_cmdshell
terá o mesmo conjunto de direitos.Se você configurar
xp_cmdshell
para usar a conta proxy, o shell gerado por ela terá os direitos dessa conta, que pode ser bloqueada. No entanto, qualquer administrador de sistema pode modificar as configurações da conta proxy, portanto, garantir que você limite quem tem direitos de administrador de sistema é extremamente importante.Você mencionou que sua equipe de aplicativos está querendo usar
xp_cmdshell
dentro de um gatilho. Isso vai realmente limitar o desempenho do seu sistema, e você realmente deveria repensar esse design. Se, por exemplo,xp_cmdshell
retornar um erro, a inserção em sua tabela falhará. Se a chamada paraxp_cmdshell
levar vários segundos para ser concluída, as linhas afetadas pela inserção serão bloqueadas durante esse tempo e poderão fazer com que outras sessões sejam bloqueadas.Como @DanGuzman apontou, você deve usar uma fila do service broker para fornecer um mecanismo de entrega de mensagens garantida assíncrona que não interromperá a inserção de linhas na tabela afetada. As filas do Service Broker podem ser consumidas por aplicativos fora do SQL Server de maneira responsiva, confiável e escalonável.