Segurança e Conformidade

Logins, Users e Row-Level Security no SQL Server

Setembro 30, 2026 por Michael Antunes

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:

Login

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).

User

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:

ÂMBITO
Servidor

Configurações globais, logins, criação de bases de dados. Exemplo: ALTER ANY DATABASE

ÂMBITO
Base de Dados

Tabelas, views, stored procedures e funções. Exemplo: SELECT, EXECUTE

RECOMENDADO
Schema

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.

Transferir Infográfico de Permissões (PDF) →

4 Questões críticas para os responsáveis de TI

1

“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.

2

“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.

3

“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.

4

“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.

Logins & Users
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.