none
Negar acesso todas as tabelas RRS feed

  • Pergunta

  • Pessoal,

    Como nego acesso a TODAS as tabelas, com excessao de apenas 1 ?

    Alem disso, faco pra este usuario apenas enxergar na estrutura do banco de dados, a unica tabela que tem acesso, nao mostrando as demais tabelas ?

    Abracos

    sexta-feira, 26 de julho de 2013 18:28

Todas as Respostas

  • Boa tarde AGA,

    Quando você cria um login e usuário, o SQL Server automaticamente insere o princípio de "Menor privilégio possível" e concede a Server role deste usuário como public. Se esse usuário não possui permissão de db_datareader (atenção, é uma permissão a nível de banco, não servidor) no banco em questão ele por padrão não enxerga nada, basta que você conceda um GRANT na tabela que você quer que ele veja e pronto.

    Vamos chamar esse usuário de 'vaiVerApenasUmaTabela'...

    USE Northwind -- Banco de exemplo

    GRANT SELECT ON dbo.Categories TO vaiVerApenasUmaTabela

    Fazendo assim, você garante que o usuário vai ver apenas a tabela em questão. As outras não são visualizadas na sessão deste usuário e muito menos pode fazer SELECT (haja visto o princípio de segurança mínimo) pois a role de server dele é public e por padrão ele não pode fazer nem ver nada.

    Agora, se o usuário possui a role de db_datareader, talvez você queira dar DENY em cada tabela e na única tabela que deve estar visível pra ele, você dê um GRANT. Isso não faz muito sentido na verdade, compensando tirar dele a permissão de reader. Fiz um código didático aqui que ilustra bem esse cenário. Está bem simples e usa o Northwind.

    -- Criando o login
     
    CREATE LOGIN vaiVerApenasUmaTabela WITH PASSWORD = 'vish1234$1_'
    
    
    -- Criando um usuário
    
    USE NORTHWIND
    GO
    CREATE USER vaiVerApenasUmaTabela FOR LOGIN vaiVerApenasUmaTabela
    
    --> Dá permissão pra tabela que ele quer ver
    
    GRANT SELECT ON dbo.Categories TO vaiVerApenasUmaTabela
    
    --> Nega acesso em todas as tabelas, EXCETO na que está no filtro. Detalhe: Você precisa executar
    -- na mão o que foi gerado pelo resultset do management Studio.
    
    SELECT
    	'DENY SELECT ON OBJECT::[dbo].['+t.NAME+ '] TO vaiVerApenasUmaTabela;' 
    FROM sys.tables t
    WHERE t.NAME <> 'Categories' /* A tabela que você quer que ele veja você exclui do DENY */
    
    /**
    
    Esse é o código gerado no Northwind. Execute
    
    DENY SELECT ON OBJECT::[dbo].[Customers] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[Shippers] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[Suppliers] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[Orders] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[Products] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[Order Details] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[CustomerCustomerDemo] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[CustomerDemographics] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[Region] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[Territories] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[EmployeeTerritories] TO vaiVerApenasUmaTabela;
    DENY SELECT ON OBJECT::[dbo].[Employees] TO vaiVerApenasUmaTabela;
    
    **/
    
    
    -- Personificando 
    
    EXECUTE AS USER =  'vaiVerApenasUmaTabela'
    
    -- Comprovando que você está "personificando" o login/usuário vaiVerApenasUmaTabela
    
    SELECT SUSER_SNAME() -- retorna vaiVerApenasUmaTabela
    
    -- Testar SELECT, encarnando o usuário alvo, e é pra dar certo 
    
    SELECT * FROM Northwind.dbo.Categories
    
    -- Testar SELECT em uma tabela com DENY. Opa, não vai dar. 
    -- Escute a sonoridade daquele barulho do Windows, aquele do erro, mentalmente. PAM!
    
    SELECT * FROM Northwind.dbo.Employees
    GO
    SELECT * FROM Northwind.dbo.Territories
    
    
    -- Volta pro seu login/usuário
    
    REVERT
    
    SELECT SUSER_SNAME() -- Comprove
    
    --> Limpezade login/user
    
    drop login vaiVerApenasUmaTabela
    drop USER vaiVerApenasUmaTabela

    Lembrando que se o usuário for um SA é impossível negar qualquer ato, só tirando o login do tio/tia. Nesse caso, o que se deve fazer é avaliar a necessidade e a segurança que está sendo aplicada neste servidor e/ou instância em relação ao acesso/permissionamento de usuários.

    Espero ter ajudado.


    -





    sexta-feira, 26 de julho de 2013 20:10