A segurança em nível de linha (RLS) é um controle de acesso a banco de dados que limita quais linhas de uma tabela um usuário pode ler ou alterar com base em sua identidade, função ou contexto de sessão.
Em vez de restringir o acesso a tabelas inteiras ou colunas específicas, o RLS filtra os dados linha por linha. O mecanismo do banco de dados aplica o filtro automaticamente no momento da consulta, de modo que a mesma regra se aplica independentemente de qual ferramenta o usuário utilize para acessar os dados.
O RLS faz parte do controle de acesso refinado, juntamente com:
Por exemplo, um vendedor pode consultar a tabela de pedidos da empresa, mas ver apenas os pedidos da sua região atribuída, mesmo que a tabela contenha os dados de todas as regiões. O usuário escreve uma instrução SELECT normal, e o mecanismo retorna apenas as linhas que ele tem permissão para ver.
O RLS é agora um componente fundamental para SaaS multi-tenant, segregação de dados regionais e casos de uso de conformidade. Este artigo aborda como o RLS funciona, onde ele ajuda, onde deixa a desejar e como funciona na plataforma Databricks.
A segurança em nível de linha funciona aplicando uma regra de filtro, frequentemente chamada de política ou predicado, a uma tabela. Quando um usuário executa uma consulta, o mecanismo do banco de dados aplica automaticamente esse filtro e retorna apenas as linhas que o usuário tem permissão para ver.
Na prática, o RLS geralmente funciona em três etapas:
CURRENT_USER, uma variável de sessão definida pelo aplicativo ou uma tabela de mapeamento que conecta usuários e grupos aos dados permitidos.TRUE para as linhas que o usuário pode ver e FALSE para todo o resto. Apenas as linhas que passam pelo predicado são retornadas.Como a aplicação ocorre na camada de banco de dados, a mesma regra se aplica de forma consistente em todos os caminhos de acesso, incluindo painéis de BI, notebooks, SQL ad-hoc, APIs e ferramentas de terceiros. Essa consistência é o que torna o RLS poderoso: uma única regra, aplicada em todos os lugares, imposta pelo mecanismo.
A maioria dos mecanismos também distingue entre a aplicação do lado de leitura e do lado de gravação. Um predicado de leitura controla o que uma consulta SELECT retorna. Um predicado de gravação, frequentemente definido separadamente com uma cláusula WITH CHECK, controla quais linhas um usuário pode inserir, atualizar ou excluir.
Os dois predicados podem ser iguais, mas não precisam ser. Por exemplo, um usuário pode ter permissão para ler linhas de todas as regiões, mas apenas inserir linhas para sua própria região. Definir ambos os lados é importante quando uma tabela aceita gravações, pois ignorar a verificação de gravação é uma das maneiras mais comuns pelas quais as equipes configuram incorretamente o RLS em produção.
O RLS é um dos vários controles de acesso refinados e, em produção, quase sempre é combinado com outros. A tabela abaixo mostra como cada controle se encaixa.
| Controle | O que ele restringe | Caso de uso típico |
|---|---|---|
| Segurança em nível de linha (RLS) | Linhas específicas em uma tabela | Limitar os usuários à sua região, tenant ou departamento |
| Segurança em nível de coluna (CLS) | Colunas específicas em uma tabela | Ocultar colunas de salário, SSN ou PII de analistas |
| Segurança em nível de objeto (OLS) | Tabelas inteiras, views ou medidas | Bloquear completamente o acesso a um conjunto de dados sensível |
| Mascaramento de dados | Valores visíveis dentro de uma coluna | Mostrar apenas os últimos 4 dígitos de um número de cartão |
| GRANT / REVOKE | Permissões de leitura/gravação em nível de tabela | Permitir ou negar acesso à tabela como um todo |
Esses controles são projetados para funcionar em camadas. Uma configuração típica usa permissões em nível de tabela para controlar quem pode acessar uma tabela, RLS para definir o escopo de quais linhas ficam visíveis e segurança em nível de coluna ou mascaramento de dados para proteger campos confidenciais nessas linhas. Tratá-los como uma pilha, em vez de um menu de alternativas, torna a governança auditável e resiliente. Uma configuração incorreta em uma camada não compromete as outras.
O RLS é a forma padrão de impor quem pode ver o que dentro de uma tabela compartilhada, filtrando as linhas com base nos atributos de um usuário em relação a uma coluna de chaveamento, como região, tenant ou classificação. A maioria das equipes recorre a ele quando um único conjunto de dados precisa atender a vários públicos com regras de visibilidade diferentes.
O padrão geral é consistente entre as plataformas, com a sintaxe específica do fornecedor preenchida onde necessário.
tenant_id, region ou owner_id. Se essa coluna ainda não existir, planeje um preenchimento retroativo antes que a política entre em vigor e considere indexar a coluna para manter o predicado de baixo custo.Mover a lógica de acesso para a camada de dados traz vantagens de várias maneiras práticas. Em resumo, o banco de dados se torna a fonte da verdade para o acesso, em vez de cada aplicativo que toca os dados.
A RLS é poderosa, mas apresenta armadilhas conhecidas para as quais as equipes devem se planejar. A maioria delas surge apenas em produção ou durante uma auditoria, o que faz com que valha a pena conhecê-las com antecedência.
Em muitos bancos de dados, os proprietários das tabelas e administradores com altos privilégios fazem o bypass da RLS por padrão. O PostgreSQL, por exemplo, exige a configuração FORCE ROW LEVEL SECURITY para aplicar políticas ao proprietário da tabela, e configurações semelhantes existem em outros mecanismos. Esta é uma descoberta comum de auditoria: assuma que os usuários privilegiados veem todas as linhas, a menos que sua configuração force explicitamente a aplicação da política a eles. Teste a política a partir de uma sessão privilegiada, e não apenas de uma sessão comum, antes de aprová-la.
A RLS filtra linhas, mas não oculta colunas nem bloqueia resultados agregados. Um analista impedido de ver registros individuais da EU ainda pode executar SELECT COUNT(*) na tabela não filtrada se a RLS não estiver associada a restrições de coluna ou de agregação. Combine a RLS com segurança em nível de coluna ou mascaramento de dados para fechar essa lacuna, e considere se as próprias consultas agregadas precisam ser governadas para as tabelas mais confidenciais.
Toda consulta tem o predicado RLS aplicado, o que pode prejudicar o desempenho se a lógica do filtro for complexa ou se a coluna de chaveamento não estiver indexada. Indexe as colunas que a política referencia e mantenha o predicado o mais simples possível. Prefira expressões CASE diretas em vez de subconsultas ou buscas em tabelas de mapeamento dentro do filtro. Se o mecanismo for compatível, materialize o mapeamento de usuários para linhas em uma tabela pequena e bem indexada, em vez de computá-lo dinamicamente.
Conjuntos de resultados vazios causados pela RLS parecem idênticos a "nenhum dado correspondente". Os desenvolvedores que buscam uma linha ausente geralmente passam horas antes de perceberem que a política a filtrou. Registre a identidade do usuário efetivo e a versão da política durante o desenvolvimento, ofereça aos engenheiros uma maneira de confirmar se a RLS está ativa quando os resultados parecerem incorretos e documente a política no mesmo local que o esquema da tabela para que ela possa ser encontrada facilmente.
As políticas de RLS geralmente têm dois lados: uma cláusula USING que filtra o que os usuários podem ler e uma cláusula WITH CHECK que controla o que eles podem inserir ou atualizar. Definir uma sem a outra é um erro clássico: a filtragem de leitura sem verificação de gravação permite que os usuários insiram ou atualizem linhas que não deveriam possuir. Sempre defina ambos os lados quando a tabela aceitar gravações e execute um teste do lado da gravação como parte da revisão da política.
Na plataforma Databricks, a segurança em nível de linha é gerenciada por meio de filtros de linha no Unity Catalog, a camada de governança unificada da Databricks para dados e IA. O padrão é simples: defina uma função SQL definida pelo usuário que retorne verdadeiro para as linhas que um determinado usuário tem permissão para ver e, em seguida, anexe-a à tabela de destino. O filtro é executado automaticamente no momento da consulta, usando a identidade do usuário atual ou o contexto da sessão para determinar quais linhas retornar.
Os filtros de linha são aplicados de forma consistente no Databricks SQL, notebooks, jobs e ferramentas de BI conectadas, sem a necessidade de lógica personalizada por superfície. Eles funcionam em conjunto com máscaras de coluna para um controle de acesso refinado completo, e cada consulta que toca em uma tabela filtrada é capturada nos logs de linhagem e auditoria do Unity Catalog, para que as equipes de governança e segurança possam ver exatamente quais políticas se aplicam a quais tabelas e quais usuários consultaram o quê.
O que é segurança dinâmica em nível de linha? A RLS dinâmica avalia a regra de acesso no momento da consulta usando a identidade do usuário atual ou o contexto da sessão, de modo que a mesma política retorna resultados diferentes para usuários diferentes. Todas as implementações modernas de RLS funcionam dessa maneira, incluindo as políticas ABAC da Databricks, filtros de linha e exibições dinâmicas.
Qual é a diferença entre segurança em nível de linha e segurança em nível de coluna? A RLS restringe quais linhas um usuário pode ver; a segurança em nível de coluna restringe quais colunas, normalmente para ocultar campos confidenciais, como salário ou números de identificação pessoal. A maioria das implantações em produção usa ambas em conjunto.
A segurança em nível de linha é suficiente por si só para proteger dados confidenciais? Não. A RLS gerencia a visibilidade das linhas, mas não mascara os valores das colunas, não bloqueia consultas agregadas nem substitui o gerenciamento de identidade e acesso. Combine-a com segurança em nível de coluna, concessões em nível de tabela e registro de auditoria como parte de uma estratégia de defesa em profundidade.
Como a Databricks implementa a segurança em nível de linha? Por meio do Unity Catalog, com três opções: políticas ABAC, filtros de linha em nível de tabela e exibições dinâmicas. O ABAC é recomendado para governança em escala; os filtros de linha e as exibições dinâmicas estão disponíveis para necessidades mais personalizadas.
A segurança em nível de linha afeta o desempenho da consulta? Sim, mas o impacto geralmente é gerenciável. Mantenha a lógica da política simples, indexe as colunas que a política referencia e prefira UDFs SQL em vez de UDFs Python. Analise o perfil das consultas antes e depois das alterações de política para detectar regressões com antecedência.
A segurança em nível de linha é mais eficaz como parte de um modelo de governança mais amplo que também abrange colunas, mascaramento, linhagem e auditoria. Veja como o Unity Catalog une a segurança em nível de linha, o mascaramento de colunas e a governança unificada na plataforma Databricks.
(Esta publicação no blog foi traduzida utilizando ferramentas baseadas em inteligência artificial) Publicação original
Assine nosso blog e receba os posts mais recentes diretamente na sua caixa de entrada.