Temos um login/usuário com DBO para um único banco de dados e agora estamos adicionando uma consulta que fornece algumas informações básicas de monitoramento que exigem permissões que se estendem um pouco para o lado do administrador do sistema.
Basicamente, a consulta precisa ser capaz de executar (somente leitura) os seguintes comandos:
DBCC SQLPERF(logspace)
EXEC master..xp_fixeddrives
dbo.sysfiles
sys.master_files
tempdb.sys.database_files
tempdb.sys.dm_db_file_space_usage
sys.dm_exec_requests
sys.dm_tran_locks
sys.partitions
sys.indexes
sys.dm_os_waiting_tasks
sys.dm_os_tasks
sys.dm_exec_sessions
sys.dm_exec_sql_text
A maioria dessas coisas envolve permissões como VIEW SERVER STATE, VIEW ANY DEFINITION, etc, todas as quais podem ser usadas para conceder as permissões necessárias sem ir para a função de servidor sysadmin. Mas queremos apenas limitar essas permissões a essa única consulta.
Então, o que estamos procurando são opções. Minha última opção preferida é adicionar as várias permissões ao login/usuário, pois assim ele teria acesso a mais do que precisa (várias sub-permissões da função de servidor sysadmin), então tentei criar um procedimento com o EXECUTE AS cláusula, apenas aparentemente por causa do SQL dinâmico interno (precisamos enviar os resultados de DBCC SQLPERF para uma variável de tabela), o encadeamento de propriedade fica difícil. Mesmo independentemente disso, parece bastante complicado permitir que um procedimento seja executado com credenciais limítrofes de administrador de sistema.
Pesquisei mais sobre esse assunto do que posso entender e ainda não consigo fazer isso funcionar. Basicamente, vocês podem me dizer como fazer isso sem criar falhas de segurança.
Apenas um lote, que executa esta consulta, só pode ser alterado pelo administrador do sistema e pode ser lido/executado por qualquer pessoa com permissão para executá-lo? Obrigado!
EDITAR:
Atualmente estou analisando a possibilidade de criar um proxy de logins e/ou assinar o procedimento com um certificado. Parece uma opção bastante interessante.
Acho que sua opção mais simples é um trabalho.
Você pode conceder as permissões para iniciar um trabalho por meio da função SQLAgentOperatorRole no msdb. Os membros dessa função podem iniciar trabalhos pertencentes a um login de administrador de sistema, que pode executar os comandos necessários.
Aqui está um exemplo baseado em seus requisitos:
Embora conceder o SQLAgentOperatorRole ainda seja uma preocupação de segurança (menor), acho menos preocupante do que outras soluções.