Acho que preciso de algumas dicas de segurança no SQL Server. Estou tentando impedir que alguns de nossos usuários finais tenham acesso a determinadas colunas (ou seja, SSN) em uma tabela.
Achei que poderia usar a segurança no nível da coluna para restringir o acesso às colunas. Isso evitou com sucesso que os usuários acessassem a tabela diretamente, mas fiquei surpreso ao ver que eles ainda podiam acessar essas colunas por meio de uma exibição que acessava essa tabela.
Segui as dicas aqui: http://www.mssqltips.com/sqlservertip/2124/filtering-sql-server-columns-using-column-level-permissions/ Essas foram muito úteis, mas quando criei uma view no final , o estagiário conseguiu acessar essa coluna por padrão
Eu li que as exibições são a melhor maneira de fazer isso, mas realmente não quero mudar todas as exibições e o aplicativo front-end herdado. Prefiro apenas restringi-lo uma vez na tabela e, se uma exibição tentar acessar essa coluna, ela simplesmente falhará.
Isso é possível ou estou entendendo mal como a segurança funciona no SQL Server?
A segurança no nível da coluna não funciona dessa maneira. Não conheço nenhum mecanismo para negar globalmente o acesso a uma determinada coluna para um determinado usuário. O GRANT/DENY só funciona em instruções específicas como SELECT, UPDATE e assim por diante em combinação com um determinado objeto.
Portanto, no seu caso, se você removeu o acesso em SELECT para a coluna X na tabela Y, o usuário ainda pode executar exibições "selecionar *" nessa tabela porque a exibição é um objeto diferente e não é afetado por essa configuração de segurança!
A boa notícia é que você também pode usar permissões de coluna em visualizações. Funciona da mesma forma que com as tabelas, mas você precisa definir a permissão em todas as exibições que incluem a coluna SSN.
Observe que no SQL 2016+ há um recurso de mascaramento de dados, que pode ocultar todos os detalhes de colunas específicas. Isso pode impedir que os usuários vejam os valores reais de determinadas colunas, a menos que tenham permissões específicas de "desmascarar".
Observe que os usuários ainda podem encontrar dados indiretamente por meio de cláusulas WHERE -- por exemplo, mesmo se "Salário" fosse mascarado, você ainda poderia consultar usuários com Salário entre X e Y.
Por exemplo:
ALTER COLUMN [Social Security Number] ADD MASKED WITH (FUNCTION = 'partial(0,"XXX-XX-",4)')
Documentação: https://learn.microsoft.com/en-us/sql/relational-databases/security/dynamic-data-masking?view=sql-server-2016