Outra - Web, Mobile & Software
| Orçamento: Aberto |
Publicado: |
Propostas: 4
Este documento descreve, em detalhes, o escopo completo do desenvolvimento de um pacote/módulo para pfSense baseado em FreeBSD 15.x. O objetivo é criar um proxy HTTPS transparente capaz de inspecionar o IP de origem e o hostname (via SNI) para aplicar políticas de bloqueio/liberação com registro de logs e integração futura à interface web do pfSense.
Visão Geral
- **Nome do pacote:** `sni_filter_proxy`
- **Plataforma alvo:** pfSense 2.8.1 (FreeBSD 14.x)
- **Linguagens preferenciais:** C/C++ (alternativamente Go/Rust, desde que compatível e com bom desempenho)
- **Funcionamento:** Proxy TLS transparente (porta 443) que captura o ClientHello, extrai o SNI, cruza com o IP de origem e aplica regras do tipo allow/block. Todas as decisões devem ser registradas em log.
- **Requisito crítico:** o serviço precisa rodar como daemon e possuir script rc.d completo (start/stop/reload/status) para garantir persistência após reboots.
---
## Requisitos Funcionais
### 1. Core do Proxy
- Interceptar conexões TCP/443 (HTTPS) via redirecionamento `pf`.
- Ler a mensagem TLS ClientHello para extrair o hostname (SNI).
- Registrar IP de origem e SNI e checar contra as regras definidas.
- Aplicar **allow** ou **block** com prioridade para allow; ausência de regra implica allow.
- Ao bloquear, encerrar a conexão rapidamente (RST) sem alertar o usuário.
### 2. Regras e Configurações
- Arquivo principal: `/usr/local/etc/sni_filter/access_rules.txt`.
- Formato da linha: `[tipo];[ip de origem/cidr ou *];[hostname ou *]`.
- Suporte a IPv4/IPv6 e hostnames com wildcard (`*.dominio.com`).
- Implementar recarga das regras em runtime via sinal `SIGHUP`.
- Manter estrutura thread-safe ou processos múltiplos conforme necessário para atender a várias conexões.
### 3. Logs
- Local padrão: `/var/log/sni_filter_proxy.log`.
- Cada entrada precisa conter: timestamp, IP de origem, hostname e ação final (allow/block/erros).
- Manter o log rotativo via `newsyslog` (documentar sugestões) e garantir permissões corretas.
---
Fases de Entrega
### Fase 1 – Daemon + Serviço rc.d
1. Implementar o daemon (processo CLI executável em FreeBSD) com:
- Proxy TCP transparente.
- Parser de TLS ClientHello/SNI.
- Engine de regras conforme formato acima.
- Logging estruturado.
- Tratamento de sinais (SIGHUP ? reload, SIGTERM ? shutdown limpo).
2. Entregar script rc.d completo em `/usr/local/etc/rc.d/sni_filter_proxy` com funções `start/stop/restart/status/reload`.
3. Produzir documentação detalhando:
- Dependências.
- Comandos de build (`make`/`gmake`).
- Instalação manual (copiar binário + configs + script rc.d).
- Como configurar regras e testar com `openssl s_client`.
Fase 2 – Integração GUI no pfSense
1. Criar arquivos xml/php necessários para expor o serviço em **Services > SNI Filter Proxy**:
- Formulário para editar as regras (`access_rules.txt`), campos de configuração (porta, timeout etc.).
- Botões para `start/stop/reload/status` e visualização das últimas linhas do log.
2. Integrar com o `config.xml` do pfSense:
- Salvar as regras na seção própria e sincronizá-las com o arquivo físico.
- Garantir que o `rc.d` seja acionado conforme o usuário aplica mudanças.
3. Descrever, em documentação, como empacotar o módulo (Makefile do pacote, `pkg-descr`, `pkg-plist`) para distribuição pelo Package Manager do pfSense.
Instruções para os Desenvolvedores
1. **Referência:** utilizar o pacote `e2guardian` para pfSense como base de estrutura e boas práticas (organização, integração com GUI, scripts de instalação).
2. **Organização do código:** manter padrão profissional com diretórios `src/`, `include/`, `scripts/`, `docs/`, `config/`.
3. **Testes:**
- Fornecer testes unitários/automatizados quando aplicável (ex.: parser de regras, parser SNI).
- Documentar testes manuais com `openssl s_client` simulando cenários allow/block e recarga.
4. **Segurança:** validar inputs (regras, hostnames) para evitar crashes; tratar conexões sem SNI com bloqueio seguro.
Entregáveis Esperados
1. Código-fonte completo do daemon (C/C++ ou Go/Rust) com instruções de build.
2. Script rc.d funcional para instalação em `/usr/local/etc/rc.d/`.
3. Arquivo de regras de exemplo e instruções para criação de diretórios/configs.
4. Documentação Fase 1:
- Passo a passo de build/instalação/teste.
- Comandos para start/stop/reload e verificação de logs.
5. Documentação Fase 2:
- Guia de implementação dos arquivos xml/php e do package para pfSense.
- Descrição de como a GUI salva/aplica regras e interage com o daemon.
6. Checklist de testes (CLI e GUI) para validar o comportamento antes da entrega final.
Critérios de Aceite
- Daemon roda estavelmente no pfSense 2.8.1, reiniciando automaticamente via rc.d.
- Regras são aplicadas corretamente (allow prioritário, block quando aplicável, fallback allow).
- Logs registram todas as conexões analisadas, ações e recargas.
- `SIGHUP` recarrega as regras sem interromper conexões em andamento.