Nossa equipe de desenvolvimento criou alguns relatórios do SSRS que recuperam apenas metadados (sem dados 'reais') de todos os bancos de dados. Estou tentando bloquear a conta de serviço que executa esses relatórios com os privilégios mínimos necessários.
As consultas apenas selecionam nas tabelas do sistema em cada banco de dados, como:
sys.tables
sys.extended_properties
SYS.objects
SYS.schemas
sys.dm_db_partition_stats
sys.indexes
Eu pensei que o seguinte faria isso, mas não tive essa sorte.
GRANT VIEW ANY DATABASE TO [DOMAIN\LOGIN]
GRANT VIEW SERVER STATE TO [DOMAIN\LOGIN]
GRANT VIEW DATABASE STATE TO [DOMAIN\LOGIN]
Consultar tabelas do sistema dá o erro:
The server principal "DOMAIN\LOGIN" is not able to access the database "DATABASENAME" under the current security context.
Não consigo encontrar uma maneira de contornar isso além de criar um usuário para o login para cada banco de dados e, em seguida, conceder permissões às tabelas do sistema explicitamente. Isso apresenta um novo conjunto de desafios para todos os bancos de dados futuros. Estou faltando alguma coisa ou não há uma maneira simples de conceder esse acesso geral a todos os bancos de dados sem conceder a função de nível de servidor "sysadmin"?
A partir do SQL Server 2014, a nova
CONNECT ANY DATABASE
permissão pode ser usada para fazer issoVocê não precisa conceder permissões nas tabelas do sistema , elas são visíveis para qualquer usuário. Mas a visibilidade dos objetos que eles contêm depende das permissões que o usuário tem: ele pode ver apenas os objetos nos quais ele tem permissão: Configuração de visibilidade de metadados
E isso pode ser resolvido dando a sua
VIEW ANY DEFINITION
permissão de loginAlém disso, não houve necessidade de conceder
VIEW ANY DATABASE TO
permissão porque já foi concedido ao público eVIEW SERVER STATE TO
não é necessário para os metadados que você descreveu como recuperação.Então, tudo que você precisa são essas permissões:
CONNECT ANY DATABASE
para acessar todos os bancos de dadosVIEW DATABASE STATE
para consultarsys.dm_db_partition_stats
VIEW ANY DEFINITION
por ter os direitos sobre quaisquer metadadosEm vez de criar o usuário em cada banco de dados, você pode criar esse usuário no banco de dados mestre e
GRANT VIEW ANY DEFINITION TO <USERNAME>
. Isso permitirá a visibilidade de metadados para o usuário especificado em todos os bancos de dados.