Controlo de Acessos e Row-Level Security no SQL Server
Uma das perguntas mais simples, e frequentemente mais complexas de responder com rigor, numa auditoria de segurança é: “Quem tem acesso a quê na nossa base de dados?” No SQL Server, a resposta assenta num modelo de segurança estruturado em camadas. Compreender estas camadas não é apenas um exercício de administração de sistemas: é a base para tomar decisões informadas sobre limitação de privilégios e contenção do impacto em caso de incidente.
Série: Segurança SQL Server — Artigo 3 de 3
Este é o terceiro e último artigo da nossa série sobre proteção de bases de dados. Caso tenha perdido os artigos anteriores, pode ler sobre Data Discovery & Classification e Transparent Data Encryption (TDE).
A distinção fundamental: Logins vs. Users no SQL Server
Muitas falhas na gestão de permissões começam na confusão entre estes dois conceitos. No SQL Server, a autenticação e a autorização estão divididas em dois níveis distintos:
Autenticação ao nível da Instância
Permite a ligação ao servidor SQL Server. Pode ser um SQL Login (utilizador + palavra-passe), um Windows/Active Directory Login ou uma Entra Managed Identity (no Azure SQL).
Autorização dentro da Base de Dados
Representa o mapeamento do Login dentro de uma base de dados específica. É ao User que se atribuem as permissões de leitura, escrita ou execução. Sem User mapeado, o Login não acede aos dados.
-- 1. Criar o login ao nível da instância/servidor CREATE LOGIN AppUser_Login WITH PASSWORD = 'P@ssw0rd!ForteExemplo'; -- 2. Na base de dados pretendida, criar o utilizador associado ao login USE MinhaBaseDados; CREATE USER AppUser FOR LOGIN AppUser_Login;
Também é possível ter contained users (utilizadores sem Login associado na instância), uma abordagem muito utilizada no Azure SQL para facilitar a mobilidade de bases de dados entre servidores.
Securables: A hierarquia de objetos protegidos
No ecossistema SQL Server, um securable é qualquer recurso sobre o qual se podem atribuir ou negar permissões. Os securables estão organizados de forma hierárquica, o que significa que permissões concetualmente atribuídas num nível superior herdam para os níveis inferiores:
Configurações globais, logins, criação de bases de dados. Exemplo: ALTER ANY DATABASE
Tabelas, views, stored procedures e funções. Exemplo: SELECT, EXECUTE
Agrupamento lógico de objetos. Atribuir permissões ao nível do schema simplifica drasticamente a manutenção.
Boa Prática de Arquitetura: Aconselha-se a gestão de acessos ao nível do Schema em vez de configurar permissões tabela a tabela. Definir regras objeto a objeto torna o modelo ingovernável à medida que a aplicação cresce.
-- Abordagem correta: Permissões centralizadas por Schema GRANT SELECT ON SCHEMA::vendas TO AppUser; GRANT EXECUTE ON SCHEMA::api TO AppUser; -- Prática a evitar: Granularidade excessiva objeto a objeto GRANT SELECT ON dbo.Clientes TO AppUser; GRANT SELECT ON dbo.Encomendas TO AppUser; -- (...repetir manualmente para dezenas de tabelas)
Database Roles: Gestão de permissões em escala
Atribuir direitos diretamente a utilizadores individuais é uma fonte constante de problemas operacionais. Quando um colaborador muda de funções ou abandona a empresa, rastrear e revogar privilégios torna-se uma tarefa morosa e propensa a erros.
A estratégia recomendada passa pela utilização de Database Roles (perfis de grupo). As permissões são associadas à Role uma única vez; depois, basta adicionar ou remover os utilizadores dessa Role.
-- Criar uma role para leitura de relatórios e atribuir permissão CREATE ROLE leitura_relatorios; GRANT SELECT ON SCHEMA::relatorios TO leitura_relatorios; -- Adicionar utilizadores à role ALTER ROLE leitura_relatorios ADD MEMBER AppUser; ALTER ROLE leitura_relatorios ADD MEMBER AnalyticUser;
Alerta de Segurança: A role nativa db_owner concede privilégios totais sobre a base de dados. Em auditorias, encontramos frequentemente esta role associada a contas de aplicação web em produção, quase sempre por ser a solução mais rápida na fase de desenvolvimento, ficando esquecida sem a devida contenção.
O Princípio do Menor Privilégio (Least Privilege)
Cada aplicação, serviço ou utilizador deve operar estritamente com as permissões necessárias para desempenhar as suas tarefas funcionais. Na prática, a segmentação deve ser desenhada assim:
Aplicação Web / API
SELECT · INSERT · UPDATE
Raramente privilégios de DELETE. Nunca permissões de ALTER ou estatuto de db_owner.
Plataformas de BI & Analytics
SELECT
Acesso restrito a schemas analíticos ou views dedicadas. Sem acesso às tabelas operacionais em bruto.
Administradores (DBA)
Contas Nominais Separadas
Separação clara entre o utilizador do dia a dia e a conta administrativa. sysadmin reservado a momentos pontuais.
Para mapear e auditar a atribuição atual de privilégios na sua base de dados, pode utilizar a seguinte consulta T-SQL:
-- Consulta de auditoria: Mapear utilizadores e respetivas Roles na base de dados
SELECT
r.name AS role_name,
m.name AS member_name,
m.type_desc AS member_type
FROM sys.database_role_members rm
JOIN sys.database_principals r ON rm.role_principal_id = r.principal_id
JOIN sys.database_principals m ON rm.member_principal_id = m.principal_id
ORDER BY r.name, m.name;
Row-Level Security (RLS): Segurança ao nível do registo
Existem cenários empresariais em que o controlo por tabela não é suficiente: aplicações multi-tenant, sistemas de RH onde cada gestor só deve ver os colaboradores da sua equipa, ou plataformas comerciais segmentadas por zona geográfica. Delegar a filtragem exclusivamente no código do software envolve riscos, pois qualquer bug na query da aplicação pode expor registos não autorizados.
O Row-Level Security (RLS) transfere essa inteligência de filtragem para o próprio motor de base de dados. A restrição é aplicada transparentemente pelo SQL Server, independentemente da aplicação ou utilizador que executa a consulta.
-- 1. Função de Predicado: Valida se o cliente da sessão coincide com o registo CREATE FUNCTION seguranca.fn_filtro_encomendas(@ClienteID INT) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS resultado WHERE @ClienteID = CAST(SESSION_CONTEXT(N'ClienteID') AS INT); -- 2. Política de Segurança: Associa o filtro automaticamente à tabela CREATE SECURITY POLICY EncomendaPolicy ADD FILTER PREDICATE seguranca.fn_filtro_encomendas(ClienteID) ON dbo.Encomendas WITH (STATE = ON);
Assim que esta política é ativada, uma instrução genérica como SELECT * FROM dbo.Encomendas devolve unicamente as linhas autorizadas ao contexto da sessão. O RLS permite também a configuração de predicados BLOCK, impedindo a inserção ou atualização de registos fora do âmbito do utilizador.
Dynamic Data Masking (DDM): Proteção de visualização
Como camada complementar ao controlo de acessos, o Dynamic Data Masking (DDM) permite ocultar dados sensíveis no momento em que a query é devolvida, sem alterar o valor original armazenado no disco. É uma solução ideal para equipas de suporte ou ambientes de staging, onde o operador precisa de consultar a base de dados mas não deve visualizar e-mails, NIFs ou números de cartão de crédito na íntegra.
-- Configurar mascaramento na coluna de e-mail ALTER TABLE dbo.Clientes ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()'); -- Utilizador sem permissão UNMASK visualiza: eXXX@XXXX.com -- Utilizador com privilégio UNMASK visualiza: email_real@empresa.com
Recurso Técnico de Referência
A Microsoft disponibiliza um infográfico detalhado que mapeia toda a árvore de permissões, escopos e securables do SQL Server e Azure SQL Database.
Nota: Elaborado originalmente para a versão SQL Server 2017, este esquema mantém-se conceptualmente exato para compreender a herança de direitos no motor de dados.
4 Questões críticas para os responsáveis de TI
“Existe uma matriz atualizada de permissões para produção?”
A resposta deve assentar num relatório extraído em tempo real da base de dados e não numa lista estática num documento de projeto antigo.
“As contas de serviço das aplicações operam com permissões restritas?”
É essencial validar se as aplicações não estão a correr sob privilégios excessivos como db_owner ou sysadmin.
“Os ambientes de desenvolvimento e staging acedem a dados higienizados?”
A utilização de dados reais de produção em instâncias não protegidas de desenvolvimento continua a ser uma das maiores fontes de fuga de informação.
“Nas arquiteturas multi-tenant, a separação de dados é garantida pelo motor?”
Implementar Row-Level Security garante a estanquidade dos dados dos clientes mesmo em caso de falha na camada aplicacional.
Database Roles
Least Privilege
Row-Level Security (RLS)
Dynamic Data Masking (DDM)
Conclusão
O modelo de permissões do SQL Server é robusto e extremamente granular. No entanto, a acumulação histórica de privilégios, contas partilhadas e a ausência de auditoria contínua podem degradar a postura de segurança. Proteger a informação crítica da empresa não é um projeto pontual com data de fim, mas sim uma prática contínua de governança e revisão de acessos.
Precisa de auditar e reforçar a segurança do seu SQL Server?
A Singular Data realiza auditorias de segurança em bases de dados: revisões de permissões, eliminação de privilégios excessivos e implementação de políticas avançadas como RLS e DDM.