Estou procurando a melhor maneira de desativar o acesso ao sys.tables
/Information Schema
para um usuário / grupo no SQL Server.
Encontrei este tópico de 2008
Ele mostra uma maneira de negar acesso da seguinte [sys].[something]
maneira:
DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole
GO
Mas não há como desativar o acesso no Information Schema
:
DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole
Isso parece não funcionar.
Como posso desativar o acesso ao information_schema?
E existe uma maneira mais fácil de desativar o acesso a todos sys
/ information_schema
?
Atualização: Na verdade, não consigo executar as duas declarações a seguir:
DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO
GO
Tentei executá-los no banco de dados específico onde o usuário existe e também tentei no "mestre".
Eu ainda posso correr:
SELECT * from
INFORMATION_SCHEMA.TABLES
-> ainda retorna resultados
SELECT * from
sys.TABLES
-> não há mais resultados
A inclusão SCHEMA::
na consulta tornou possível criar os protegíveis
DENY SELECT ON SCHEMA::[sys] TO reducedDBO
GO
DENY SELECT ON SCHEMA::INFORMATION_SCHEMA To reducedDBO
GO
Mas agora ainda posso selecionar todas as informações do banco de dados.
Dei uma olhada na guia "Securables" na janela de propriedades de usuários no Management Studio 2008, é assim:
Entrada que bloqueia a seleção de sys.tables
Esquema: sys, Nome: tables, Tipo: Visualizar
Permissões para sys.tables: Permissão: Selecionar, Concedente: dbo, Negar está marcada
Entrada que não bloqueia nenhuma seleção
Esquema :, Nome: INFORMATION_SCHEMA, Tipo: Esquema
Permissões para INFORMATION_SCHEMA: Permissão: Selecionar, Concedente: dbo, Negar NÃO está marcado (tentei verificar, mas não há chance ..)
Permissão: Selecionar, Concedente: INFORMATION_SCHEMA, Negar marcado
Tentei definir as permissões na GUI, mas recebo o mesmo erro de que as permissões de configuração seriam possíveis apenas no banco de dados mestre. Mas não tenho o usuário / login adicionado à segurança dos DBs principais.
Solução:
A única maneira de fazer o deny
trabalho information_schema
foi adicionar o usuário ao master-db e executá-lo deny select
no master:
DENY SELECT ON [sys].[tables] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA.TABLES To reducedDBO
GO
E, como neste código, ele só pode ser executado para tabelas únicas.
Respostas:
Você deve poder negar apenas as permissões em todo
sys
e oinformation_schema
esquema como um todo:Basicamente, isso deve impedir o usuário de fazer seleções nesses dois esquemas.
fonte
Em primeiro lugar, você está certo de que a maneira (ligeiramente contra-intuitiva) de impedir o acesso aos esquemas [sys] e [INFORMATION_SCHEMA] é primeiro garantir que o login (bem, principal no nível do servidor) exista como usuário (erm, principal no nível do banco de dados) no banco de dados mestre.
Suponha que você tenha um login SQL para simplificar:
Agora crie um usuário correspondente no banco de dados mestre:
Agora você deseja impedir que esse logon acesse qualquer uma das tabelas nos esquemas fornecidos pelo sistema - [sys] e [INFORMATION_SCHEMA].
Parece que houve uma alteração de comportamento entre o SQL Server 2008 R2 e o SQL Server 2012:
No SQL Server 2012 (e presumivelmente versões posteriores), a execução do seguinte no banco de dados [master] faz o que você esperaria:
No entanto, no SQL Server 2008 R2 (e presumivelmente nas versões anteriores), as declarações de concessão de ações que dão acesso a objetos nesses esquemas aos membros de [público] parecem substituir as declarações DENY acima, o que parece uma enorme falha para mim. Conseqüentemente, em 2008 R2, você precisa negar explicitamente a cada CONCESSÃO para [público]. Aqui está um script para fazer isso:
Execute o acima no banco de dados mestre e você removeu o acesso ao conteúdo desses esquemas.
Notas:
Se você comentar as duas linhas a seguir no script acima:
Isso terá o efeito de desfazer TODAS as GRANTs padrão para público. Isso impedirá o acesso a, por exemplo, sys.sp_tables e, portanto, interromperá, por exemplo, a capacidade do Microsoft Access de enumerar as tabelas, mas é útil em cenários de alta segurança fazer exatamente isso, para que o (s) usuário (s) obtenha (s) o acesso somente onde você concedeu explicitamente isto.
fonte
Não tenho certeza de quando esse truque ficou disponível - já que ninguém o mencionou - mas parece que ele funciona pelo menos desde o SQL Server 2008.
O procedimento acima funciona sem a necessidade de adicionar o usuário ao
master
banco de dados, conforme mencionado em algumas das outras respostas.fonte