Marcio Cunha

Políticas de Acesso Dinâmicas em Microsserviços com Open Policy Agent

Aprenda a implementar controle de acesso baseado em atributos dinâmicos em arquiteturas distribuídas usando o Open Policy Agent, desacoplando a lógica de segurança das suas aplicações.

Marcio Cunha•5 min
Também disponível em:EnglishEspañol
Resumo
  • O Open Policy Agent centraliza regras de autorização em um formato declarativo independente da linguagem de programação.
  • Atributos dinâmicos consideram o contexto em tempo real, como horário, localização geográfica e carga do sistema.
  • O desacoplamento da lógica de segurança reduz a duplicação de código e simplifica auditorias de conformidade.
  • O uso de sidecars garante latência mínima e alta disponibilidade para as consultas de autorização nos microsserviços.
  • A linguagem Rego permite expressar políticas complexas de forma legível e testável antes de irem para produção.

O Desafio do Controle de Acesso em Arquiteturas Distribuídas

Quando dividimos um sistema monolítico em vários microsserviços independentes, um dos maiores quebra-cabeças que encontramos é responder a uma pergunta simples: quem pode fazer o quê? Em sistemas tradicionais, a verificação de permissões costuma ficar espalhada pelo código de cada aplicação, misturando regras de negócio com checagens de segurança. Na prática, isso significa que alterar uma simples regra de acesso exige mexer em dezenas de serviços diferentes, gerar novas versões e torcer para que nada quebre no caminho.

Além disso, o mundo real mudou. Hoje em dia, dizer se um usuário pode acessar um dado não depende apenas de ele ser um 'administrador' ou um 'gerente'. Precisamos olhar para o contexto do momento: qual é o horário da requisição, de qual país o cliente está acessando, qual é o nível de criticidade da informação e até mesmo o estado atual de saúde da infraestrutura. Essa abordagem é chamada de controle de acesso baseado em atributos, ou ABAC, onde as decisões são tomadas analisando um conjunto rico de variáveis em tempo real, em vez de depender apenas de papéis fixos pré-definidos.

Conhecendo o Open Policy Agent e a Linguagem Rego

Para resolver o problema de espalhar regras de segurança por toda a parte, a comunidade de tecnologia criou o Open Policy Agent, comumente chamado de OPA. Na prática, ele funciona como um motor centralizado e independente que toma decisões de autorização para qualquer sistema que precise dele. Em vez de programar if/else dentro do seu microsserviço em Java, Go ou Node.js, você envia uma pergunta em formato JSON para o OPA, e ele responde com um simples 'permitido' ou 'negado' com base nas regras que você configurou.

Essas regras são escritas em uma linguagem específica chamada Rego, desenhada justamente para consultar dados estruturados de forma muito eficiente. O Rego permite que você declare o que a política de segurança deve ser, sem precisar se preocupar com os detalhes de programação de baixo nível sobre como percorrer listas ou filtrar objetos. Para quem está de fora, ler uma regra em Rego se parece bastante com ler uma frase lógica bem clara, o que facilita muito a colaboração entre desenvolvedores, arquitetos e equipes de segurança da informação.

Arquitetura de Implantação e o Modelo Sidecar

Colocar um componente central para decidir a segurança de todo o sistema levanta um alerta importante sobre desempenho e confiabilidade. Se o OPA cair ou demorar muito para responder, o sistema inteiro para de funcionar. Para evitar esse gargalo na arquitetura, a estratégia mais comum e recomendada é implantar o OPA no modelo chamado sidecar, que significa rodar uma instância dele bem ao lado de cada microsserviço, geralmente dentro do mesmo ambiente de execução ou no mesmo cluster de servidores.

Na prática, isso significa que quando a API do seu microsserviço recebe uma requisição HTTP, ela faz uma consulta ultrarrápida para o OPA local que está rodando na mesma máquina virtual ou no mesmo pod. Como a comunicação acontece internamente via loopback ou rede local, a latência costuma ser de poucos milissegundos. Além disso, as políticas de segurança são baixadas previamente pelo OPA local a partir de um servidor central de gerenciamento, garantindo que, mesmo se houver uma falha temporária na rede externa, o microsserviço continue operando e tomando decisões de segurança de forma autônoma.

Implementando Atributos Dinâmicos na Prática

Vamos imaginar um cenário real onde um sistema médico precisa liberar o prontuário de um paciente. A regra de negócio diz que um médico só pode ver o prontuário se estiver no hospital durante seu turno de plantão, e se o paciente estiver sob seus cuidados diretos naquele momento. Para resolver isso com o OPA, enviamos um pacote JSON contendo todos esses atributos dinâmicos: o ID do médico, a localização atual obtida pelo crachá inteligente, a escala de trabalho e o vínculo com o paciente.

O código abaixo mostra um exemplo simples de uma política em Rego que valida essas condições combinadas, avaliando o horário, a localização e a relação profissional para autorizar o acesso aos dados sensíveis.

package hospital.authz

default allow = false

allow {
    input.user.role == "doctor"
    input.context.location == input.patient.assigned_hospital
    input.context.is_on_duty == true
    input.user.id == input.patient.current_attending_physician
}

Esse formato garante que a lógica de negócio complexa fique totalmente isolada do código principal da aplicação. Se o hospital decidir mudar a regra e permitir o acesso remoto em caso de emergência, basta atualizar o arquivo de política no OPA, sem precisar recompilar ou reiniciar o microsserviço de prontuários médicos.

Considerações Operacionais e Monitoramento

Adotar uma ferramenta de políticas centralizadas traz um ganho enorme de agilidade, mas exige disciplina na operação do dia a dia. Como as decisões de segurança passam a ser tomadas por um motor externo, qualquer erro na escrita de uma regra em Rego pode bloquear o acesso de usuários legítimos ou, pior ainda, deixar brechas indesejadas. Por isso, é fundamental tratar as políticas de segurança exatamente como tratamos o código de programação tradicional: usando controle de versão, testes automatizados de unidade para as regras do OPA e pipelines de integração contínua.

Além disso, a observabilidade se torna o coração da operação segura. O OPA oferece métricas detalhadas sobre o tempo de resposta, quantidade de requisições avaliadas e falhas de sintaxe. Monitorar esses indicadores de perto permite identificar rapidamente se uma nova política está gerando gargalos de desempenho ou se há tentativas suspeitas de acesso que merecem investigação da equipe de segurança. Com logs estruturados e alertas bem configurados, a equipe ganha total visibilidade sobre o comportamento do sistema em tempo real.

Considerações Finais

A implementação de políticas de acesso baseadas em atributos dinâmicos com o Open Policy Agent transforma a maneira como os microsserviços lidam com a segurança da informação. Ao tirar a lógica de autorização de dentro das aplicações e centralizá-la em um motor declarativo, ganhamos flexibilidade para adaptar regras de negócio rapidamente sem comprometer a estabilidade do sistema. A combinação de uma arquitetura distribuída com sidecars garante a performance necessária para ambientes de alta escala.

Em última análise, essa abordagem promove uma divisão clara de responsabilidades entre equipes de desenvolvimento e segurança. Os desenvolvedores focam em entregar funcionalidades de alto valor para o usuário, enquanto os especialistas em segurança governam as políticas de acesso de forma transparente e auditável. O resultado é um ecossistema de software mais resiliente, preparado para atender a requisitos rigorosos de conformidade sem sacrificar a velocidade de entrega.