Bloqueio por IP

Bloqueio por IP

Nesta documentação você aprenderá sobre:

Visão Geral

O sistema SinOMS implementa um mecanismo de controle de acesso baseado em endereços IP, permitindo restringir o acesso à API apenas para IPs previamente autorizados. Esta funcionalidade oferece uma camada adicional de segurança, permitindo que contas específicas configurem quais endereços IP podem acessar o sistema.

Só será feita a validação para usuários que não são SINTESE e que existir o parâmetro LOGIN_IP_PERMITIDOS

A validação de IP é executada automaticamente em todas as requisições autenticadas através do filtro de autorização CustomAuthorizeAttribute, garantindo que apenas IPs permitidos tenham acesso aos recursos protegidos. E também no login.


Localização do Código

Projeto(s):

  • SinOMS.API - Filtro de autorização;

  • SinOMS.BLL - Lógica de validação.

Arquivo(s):

  • SinOMS.API/Filters/CustomAuthorizeAttribute.cs - Filtro que aplica a validação;

  • SinOMS.BLL/Functions/Util.cs - Métodos de validação de IP.

Namespace(s):

  • SinOMS.API.Filters

  • SinOMS.BLL.Functions

Classe(s):

  • CustomAuthorizeAttribute - Filtro de autorização;

  • Util - Classe utilitária com métodos de validação.

Métodos Principais:

  • LiberaAcessoPeloIP() - Método principal que verifica se o IP está permitido;

  • ValidaIpEmFaixaCidr(string ipPermitido) - Valida IP único ou múltiplos IPs;

  • ValidaIpUnico(string ipValidar, string ipPermitido) - Valida IP fixo ou CIDR;

  • ObterIpAcesso() - Obtém o IP do cliente da requisição;

  • LogAcessoIp() - Registra tentativas de acesso negadas.


Arquitetura e Design

Padrões Utilizados

  • Filter Pattern: Utiliza IAuthorizationFilter para interceptar requisições antes da execução dos controllers;

  • Strategy Pattern: Suporta múltiplas formas de validação (IP fixo, CIDR, múltiplos IPs);

  • Fail-Safe Default: Em caso de erro na validação, permite acesso para não bloquear o sistema.

Fluxo de Execução

  1. Interceptação da Requisição

    • O filtro CustomAuthorizeAttribute intercepta todas as requisições autenticadas.

    • Verifica se o endpoint permite acesso anônimo (AllowAnonymousAttribute).

    • Se o usuário está autenticado, prossegue com a validação.

  2. Validação de Usuário Sintese

    • Usuários com role CONTAS:SINTESE são isentos da validação de IP.

    • Para outros usuários, a validação é obrigatória, se existir o parâmetro LOGIN_IP_PERMITIDOS.

  3. Busca do Parâmetro de Configuração

    • Busca o parâmetro LOGIN_IP_PERMITIDOS no cache.

    • O parâmetro pode ser configurado por conta (específico) ou globalmente.

    • Se o parâmetro estiver vazio, permite acesso (comportamento padrão).

  4. Obtenção do IP do Cliente

    • Tenta obter o IP do header X-Client-IP.

    • Se não encontrar, tenta obter do header X-Forwarded-For.

    • Remove IPs de proxy conhecidos (ex: 3.137.127.228).

  5. Validação do IP

    • Se o parâmetro contém múltiplos IPs (separados por ;), valida cada um.

    • Para cada IP, verifica se é formato CIDR ou IP fixo.

    • Se algum IP bater, libera acesso.

    • Se nenhum IP bater, nega acesso e registra log.

  6. Resposta

    • Se IP permitido: continua com a requisição normal.

    • Se IP negado: retorna HTTP 403 (Forbidden) com mensagem "IP não permitido".


Configurações

Parâmetros de Sistema

O mecanismo de restrição por IP depende do parâmetro LOGIN_IP_PERMITIDOS. É importante destacar que este parâmetro não existe por padrão na base de dados e deve ser criado manualmente quando houver a necessidade de aplicar o controle de acesso.

image-20260429-180728.png

Parâmetro

Tipo

Descrição

Valor atual

Valores possíveis (separar valor por ;)

Nome exibição Web

 

Parâmetro

Tipo

Descrição

Valor atual

Valores possíveis (separar valor por ;)

Nome exibição Web

 

LOGIN_IP_PERMITIDOS

Varchar

Lista de IPs ou faixas CIDR permitidas para acesso ao OMS. Pode ser configurado globalmente ou por conta específica.

Vazio (permite todos por padrão). Caso contrário, preencha com os IPs a serem filtrados.

192.168.1.100; 10.0.0.0/8; 172.16.0.0/16

LOGIN_IP_PERMITIDOS

 

Formato do Parâmetro LOGIN_IP_PERMITIDOS

O parâmetro aceita os seguintes formatos:

1. IP Fixo (Único)

192.168.1.100
  • Permite acesso apenas deste IP específico

  • Comparação exata, case-insensitive

2. Formato CIDR (Faixa de Rede)

192.168.1.0/24
  • Permite acesso de todos os IPs na faixa especificada

  • Formato: [IP_REDE]/[PREFIXO]

  • Prefixo pode ser de 0 a 32

  • Exemplos comuns:

    • /32 = 1 IP (192.168.1.100/32 = apenas 192.168.1.100)

    • /24 = 256 IPs (192.168.1.0/24 = 192.168.1.0 a 192.168.1.255)

    • /16 = 65.536 IPs (192.168.0.0/16 = toda a rede 192.168.x.x)

    • /8 = 16.777.216 IPs (192.0.0.0/8 = toda a rede 192.x.x.x)

3. Múltiplos IPs ou Faixas (Separados por Ponto e Vírgula)

192.168.1.100; 10.0.0.0/8; 172.16.0.50; 177.76.215.0/24
  • Permite combinar IPs fixos e faixas CIDR

  • Separador: ponto e vírgula (;)

  • Espaços em branco são ignorados

  • Se qualquer IP/faixa corresponder, o acesso é liberado

Exemplos de Configuração

Exemplo 1: IP Fixo Único

Valor: 177.76.215.100

Permite acesso apenas do IP 177.76.215.100

Exemplo 2: Faixa CIDR

Valor: 177.76.215.0/24

Permite acesso de todos os IPs de 177.76.215.0 a 177.76.215.255

Exemplo 3: Múltiplos IPs Fixos

Valor: 192.168.1.100; 192.168.1.101; 192.168.1.102

Permite acesso de três IPs específicos

Exemplo 4: Combinação de IP Fixo e Faixas CIDR

Valor: 192.168.1.100; 10.0.0.0/8; 172.16.0.0/16

Permite acesso de:

  • IP fixo: 192.168.1.100

  • Toda a rede privada 10.x.x.x (10.0.0.0 a 10.255.255.255)

  • Toda a rede privada 172.16.x.x (172.16.0.0 a 172.16.255.255)

Exemplo 5: Rede Interna Completa

Valor: 192.168.0.0/16; 10.0.0.0/8; 172.16.0.0/12

Permite acesso de todas as redes privadas padrão (RFC 1918)

Configuração por Conta

O parâmetro LOGIN_IP_PERMITIDOS pode ser configurado de duas formas:

  1. Globalmente: Aplicado a todas as contas que não possuem configuração específica

  2. Por Conta: Configuração específica para uma conta, sobrepondo a configuração global

Como Configurar:

  • Acesse o cadastro de parâmetros do sistema

  • Busque ou crie o parâmetro LOGIN_IP_PERMITIDOS

  • Para configuração global: deixe o campo "Conta" vazio

  • Para configuração por conta: selecione a conta específica

  • Preencha o valor conforme os formatos descritos acima

Configurações de Aplicação

Não são necessárias configurações adicionais em appsettings.json ou Web.config. A funcionalidade utiliza apenas o parâmetro do banco de dados.

Configurações de Banco de Dados

Não foram criadas novas tabelas, stored procedures ou functions. A funcionalidade utiliza a estrutura existente de parâmetros do sistema.


Validação de IP

IP Fixo

Validação por comparação exata do endereço IP:

  • Formato: 192.168.1.100

  • Comparação case-insensitive

  • Deve corresponder exatamente ao IP do cliente

Formato CIDR (Classless Inter-Domain Routing)

Validação por faixa de rede usando notação CIDR:

  • Formato: 192.168.1.0/24

  • Permite definir uma faixa de IPs permitidos

  • Prefixo pode variar de 0 a 32 bits

  • Exemplos:

    • /24 = 256 IPs (192.168.1.0 a 192.168.1.255)

    • /16 = 65.536 IPs (192.168.0.0 a 192.168.255.255)

    • /32 = 1 IP (equivalente a IP fixo)

Múltiplos IPs

Suporte para múltiplos IPs ou faixas CIDR separados por ponto e vírgula:

  • Formato: 192.168.1.100; 10.0.0.0/8; 172.16.0.50

  • Valida cada IP/faixa individualmente

  • Se qualquer um corresponder, libera acesso

  • Espaços em branco são ignorados

Dependências

Serviços Internos

  • Util: Classe utilitária com métodos de validação;

  • ParametrosService: Serviço para buscar parâmetros do sistema (com cache);

  • LogCentralizado: Serviço para registro de logs de segurança.

Bibliotecas Externas

  • System.Net: Para parsing e validação de endereços IP (IPAddress);

  • Microsoft.AspNetCore.Mvc.Filters: Para implementação de filtros de autorização.


Tratamento de Erros

Erro na Validação

  • Em caso de exceção durante a validação, o sistema permite acesso por padrão;

  • Erro é registrado no log centralizado para análise;

  • Mensagem de log: "Erro ao validar acesso por IP: {ex.Message}";

  • Este comportamento evita bloqueios acidentais do sistema.

IP Inválido

  • Se o IP do cliente não puder ser parseado, a validação retorna false;

  • Se o formato CIDR estiver incorreto, a validação retorna false;

  • Tentativas de acesso negadas são registradas em log.

Log de Acesso Negado

Quando um acesso é negado, o sistema registra:

  • Conta do usuário;

  • IP que tentou acessar;

  • IPs configurados no parâmetro;

  • Controller e Action acessados;

  • Headers da requisição (exceto Authorization).


Performance e Otimizações

Cache de Parâmetros

  • Parâmetros são buscados do cache (BuscarValorParametroCacheAsync);

  • Reduz consultas ao banco de dados;

  • Melhora performance em requisições frequentes.

Validação Eficiente

  • Validação de IP fixo é O(1) - comparação direta;

  • Validação CIDR é O(1) - operações bitwise otimizadas;

  • Suporte a múltiplos IPs interrompe na primeira correspondência.


Segurança

Isenção para Usuários Sintese

  • Usuários com role CONTAS:SINTESE não são validados por IP;

  • Permite acesso administrativo mesmo de IPs não configurados.

Headers de Proxy

  • Sistema verifica headers X-Client-IP e X-Forwarded-For;

  • Remove IPs de proxy conhecidos da string;

  • Suporta ambientes com load balancers e proxies reversos.

Logs de Auditoria

  • Todas as tentativas de acesso negadas são registradas;

  • Facilita investigação de tentativas de acesso não autorizadas;

  • Inclui informações completas da requisição.


Testes

Instruções e Pré-requisitos para Testes:

  • Ambiente de desenvolvimento/homologação configurado

  • Acesso ao sistema de cadastro de parâmetros

  • Conta de teste configurada (não pode ser usuário Sintese)

  • Conhecimento do IP atual da máquina de teste

  • Ferramenta para fazer requisições HTTP (Postman, curl, ou similar)

  • Token de autenticação válido

Como Obter o IP Atual

Windows (PowerShell):

(Invoke-WebRequest -Uri "https://api.ipify.org").Content

Linux/Mac:

curl https://api.ipify.org

Navegador: Acesse: What Is My IP Address? See Your Current Public IP

Cenários de Teste

Teste 1: Acesso Permitido - IP Fixo

Objetivo: Validar que um IP fixo configurado permite acesso

Passos para Execução:

  1. Obtenha o IP atual da máquina de teste

  2. Configure o parâmetro LOGIN_IP_PERMITIDOS com o IP fixo (ex: 192.168.1.100)

  3. Faça uma requisição autenticada para qualquer endpoint da API

  4. Verifique que a requisição retorna status 200 (sucesso)

Resultado Esperado:

  • Requisição é processada normalmente

  • Nenhum erro 403 (Forbidden)

Critérios de Aceite

  • Requisição retorna status 200

  • Dados são retornados corretamente

  • Nenhum log de acesso negado é gerado

Teste 2: Acesso Negado - IP Não Configurado

Objetivo: Validar que um IP não configurado é bloqueado

Passos para Execução:

  1. Configure o parâmetro LOGIN_IP_PERMITIDOS com um IP diferente do atual (ex: 192.168.1.200)

  2. Faça uma requisição autenticada para qualquer endpoint da API

  3. Verifique a resposta

Resultado Esperado:

  • Requisição retorna status 403 (Forbidden)

  • Mensagem: "IP não permitido"

  • Log de acesso negado é registrado

Critérios de Aceite:

  • Requisição retorna status 403

  • Mensagem de erro é clara

  • Log de acesso negado é registrado no sistema

Teste 3: Acesso Permitido - Formato CIDR

Objetivo: Validar que faixas CIDR funcionam corretamente

Passos para Execução:

  1. Obtenha o IP atual (ex: 192.168.1.100)

  2. Configure o parâmetro com faixa CIDR que inclua o IP (ex: 192.168.1.0/24)

  3. Faça uma requisição autenticada

  4. Repita com diferentes prefixos CIDR (/32, /24, /16, /8)

Resultado Esperado:

  • Requisições são processadas normalmente

  • Todos os prefixos que incluem o IP permitem acesso

Critérios de Aceite:

  • /24 permite acesso quando IP está na faixa

  • /16 permite acesso quando IP está na faixa

  • /32 permite acesso apenas para IP exato

  • Prefixos que não incluem o IP bloqueiam acesso

Teste 4: Acesso Permitido - Múltiplos IPs

Objetivo: Validar que múltiplos IPs separados por ponto e vírgula funcionam

Passos para Execução:

  1. Obtenha o IP atual

  2. Configure o parâmetro com múltiplos IPs, incluindo o atual (ex: 192.168.1.50; 192.168.1.100; 192.168.1.200)

  3. Faça uma requisição autenticada

  4. Teste com IP que está na lista e outro que não está

Resultado Esperado:

  • IP na lista permite acesso

  • IP fora da lista bloqueia acesso

Critérios de Aceite:

  • Múltiplos IPs fixos funcionam corretamente

  • Combinação de IPs fixos e CIDR funciona

  • Espaços em branco são ignorados

Teste 5: Isenção para Usuário Sintese

Objetivo: Validar que usuários Sintese não são validados por IP

Passos para Execução:

  1. Configure o parâmetro LOGIN_IP_PERMITIDOS com um IP diferente do atual

  2. Faça login com usuário que possui role CONTAS:SINTESE

  3. Faça requisições autenticadas

Resultado Esperado:

  • Acesso é permitido mesmo com IP não configurado

  • Nenhuma validação de IP é executada

Critérios de Aceite:

  • Usuário Sintese acessa normalmente

  • Não há validação de IP para este usuário

Teste 6: Parâmetro Vazio (Permite Todos)

Objetivo: Validar comportamento quando parâmetro não está configurado

Passos para Execução:

  1. Remova ou deixe vazio o parâmetro LOGIN_IP_PERMITIDOS

  2. Faça requisições autenticadas de qualquer IP

Resultado Esperado:

  • Todos os IPs têm acesso permitido

  • Sistema funciona normalmente

Critérios de Aceite:

@2024 Síntese, uma empresa LWSA