Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
ioc2rpz — ioc2rpz é o lugar onde a inteligência de ameaças encontra o DNS. | Kitploit
Ferramentas/GitHubGitHub/homas/ioc2rpz
Ferramentas DefensivasGerenciamento de Indicadores de Comprometimento (IOC)Segurança de RedeAnálise de MalwareInteligência de AmeaçasDetecção de IntrusãoFuzzing de DNSResposta a IncidentesAnálise de DNS
GitHubhomas/ioc2rpz

ioc2rpz

ioc2rpz é o lugar onde a inteligência de ameaças encontra o DNS.

11621há 1 mêsRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Ver Repositório

ioc2rpz™ torna sua inteligência de ameaças acionável

License Erlang/OTP Docker Hub

Índice

  • Resumo
  • Visão geral
  • ioc2rpz™ é o ponto de encontro entre inteligência de ameaças e DNS
  • Visão geral da arquitetura
  • Como usar ioc2rpz™
  • Interface web do ioc2rpz™
  • Suporte a protocolos
    • Resumo de portas
    • UDP (Porta 53)
    • TCP (Porta 53)
    • DNS sobre TLS / DoT (Porta 853)
    • DNS sobre HTTPS / DoH (Porta 443/8443)
    • Limitação de taxa
    • DNS NOTIFY
  • ioc2rpz™ x ISC BIND x outros DNS
  • Instalação
  • Contêiner Docker
  • Variáveis de ambiente
  • Docker Compose
  • ioc2rpz™ na AWS
  • Configuração de certificados
  • Compilação a partir do código-fonte
  • Gerenciamento do ioc2rpz™
    • via DNS
    • via REST
  • Monitoramento e verificações de saúde
  • Solução de problemas
  • Arquivo de configuração
  • Valores de configuração predefinidos
  • Como os caches AXFR e IXFR são atualizados
  • Cache quente
  • Como experimentar o ioc2rpz™
  • Alguns feeds gratuitos de inteligência de ameaças
  • Documentação adicional
  • Referências
  • Apoio / Apoiadores
  • Fale conosco
  • Licença

Resumo

ioc2rpz™: A Solução de Segurança DNS - o ioc2rpz™ é um poderoso servidor DNS que transforma indicadores de ameaças em feeds acionáveis de Response Policy Zone (RPZ). Ele automatiza o processo de atualização, garantindo que sua rede esteja protegida contra as ameaças mais recentes, incluindo domínios maliciosos e endereços IP. Ao converter feeds de IOC em RPZs, o ioc2rpz™ atua como um elo crucial entre inteligência de ameaças e segurança de DNS, compatível com servidores DNS que suportam RPZ, como ISC Bind ou PowerDNS.

Visão geral

O DNS é o plano de controle da Internet. Normalmente, o DNS é usado para o bem, mas:

  • Pode ser usado para rastrear a localização dos usuários e seu comportamento;
  • O malware usa o DNS para comando e controle, exfiltração de dados ou redirecionamento de tráfego;
  • De acordo com o relatório anual de segurança da Cisco de 2016, 91,3% do malware usa DNS;
  • Empresas de publicidade geralmente usam domínios separados e obscuros para exibir anúncios;
  • Serviços DNS gratuitos (por exemplo, 1.1.1.1, 8.8.8.8, 9.9.9.9 etc.) podem ajudar você a resolver algumas preocupações, mas você não pode definir suas próprias configurações de proteção ou filtros de anúncios.

O ISC Bind é, de fato, um padrão de servidor de nomes. Com a introdução das Response Policy Zones no ISC BIND 9.8, monitorar e conter malware na camada de DNS tornou-se uma tarefa simples. O RPZ é suportado no PowerDNS recursor 4.0.0 e em versões posteriores. O Knot DNS também suporta RPZ parcialmente.

Em comparação com as soluções tradicionais de proteção de rede, um servidor DNS pode lidar com milhões de indicadores sem impacto no desempenho, mas não havia uma maneira automatizada e eficiente de manter as zonas de política de resposta nos servidores DNS primários.

Normalmente, os indicadores de comprometimento são distribuídos em texto simples, mas em formatos diferentes, e apenas alguns provedores de IOCs os disponibilizam via RPZ.

O ioc2rpz™ é um servidor DNS personalizado que converte automaticamente indicadores (por exemplo, FQDNs maliciosos, IPs) de diversas fontes em feeds RPZ e os mantém/atualiza automaticamente. Os feeds podem ser distribuídos para qualquer servidor DNS de código aberto e/ou comercial que suporte RPZ, por exemplo, ISC Bind, PowerDNS. Você pode executar seu próprio servidor DNS com filtragem RPZ em um roteador, desktop, servidor e até mesmo em um Raspberry Pi. A memória do sistema é a única limitação.

Com o ioc2rpz™, você pode definir seus próprios feeds, ações e evitar comunicações indesejadas.

ioc2rpz™ é o ponto de encontro entre inteligência de ameaças e DNS

O ioc2rpz™ transforma feeds de IOC em zonas de política de resposta (RPZ). Você pode combinar feeds para gerar uma única RPZ ou várias RPZs. Domínios e IPs confiáveis podem ser colocados na lista de permissões. O ioc2rpz™ suporta a expiração de indicadores e reconstrói as zonas de acordo.
Alt ioc2rpz™ A versão atual suporta: arquivos locais, arquivos/solicitações via http/https/ftp e scripts de shell para acessar outros tipos de recursos. Você pode usar qualquer formato de arquivo se puder escrever uma REGEX para extrair indicadores e se os indicadores estiverem separados por quebra de linha ou/e retorno de carro (/n, /r, /r/n).

Visão geral da arquitetura

O ioc2rpz é construído sobre Erlang/OTP com uma árvore de supervisão que garante tolerância a falhas e recuperação automática. Consulte docs/architecture.md para obter detalhes completos.``` ioc2rpz_app (application) └── ioc2rpz_sup (supervisor) ├── ioc2rpz_db_sup — ETS table heir process ├── ioc2rpz_tcp_sup — TCP listener pool (5 workers) ├── ioc2rpz_udp_sup — UDP listener ├── ioc2rpz_tls_sup — TLS/DoT listener pool (5 workers) [if cert configured] └── ioc2rpz_rest_sup — Cowboy HTTPS (REST API + DoH) [if cert configured]

root@kitploit:~
Key modules:

| Module | Responsabilidade |
|--------|---------------|
| `ioc2rpz.erl` | Worker DNS TCP/TLS — aceitar, analisar, validar, responder |
| `ioc2rpz_udp.erl` | Listener DNS UDP — consultas SOA |
| `ioc2rpz_conn.erl` | Obtenção de fontes IOC (HTTP/HTTPS/arquivo/shell) |
| `ioc2rpz_db.erl` | Cache de zonas e pacotes baseado em ETS |
| `ioc2rpz_sup.erl` | Supervisor principal, carregamento de configuração, agendamento de zonas |
| `ioc2rpz_rest.erl` | API de gerenciamento REST (Cowboy) |
| `ioc2rpz_doh.erl` | Manipulador DNS-over-HTTPS |

## Como usar o ioc2rpz™
Você pode usar o ioc2rpz™ com qualquer servidor DNS que suporte Response Policy Zones, por exemplo, versões recentes do ISC BIND, PowerDNS e qualquer servidor DNS comercial baseado nesses produtos (por exemplo, Infoblox, Blue Cat, Efficient IP). Um arquivo de configuração de exemplo do BIND (named.conf) é fornecido na pasta cfg.
<p align="center"><a href="http://www.youtube.com/watch?feature=player_embedded&v=bvhyMFa_mBM" target="_blank"><img src="https://raw.githubusercontent.com/Homas/ioc2rpz/master/ioc2rpz_demo.png"></a></p>

## Interface web do ioc2rpz™
[ioc2rpz.gui](https://github.com/Homas/ioc2rpz.gui) é uma interface web de gerenciamento desenvolvida como um projeto separado. Ela não é necessária para executar o ioc2rpz™.

## Suporte a Protocolos

O ioc2rpz™ escuta em múltiplos protocolos de transporte. Todos os transportes compartilham o mesmo pipeline de processamento de consultas: limitação de taxa (rate limiting), validação TSIG, consulta de zona e geração de resposta. Consulte [docs/protocols.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/protocols.md) para a documentação completa dos protocolos.

### Resumo de Portas

| Porta | Protocolo | Serviço | Condição |
|------|----------|---------|-----------|
| 53 | UDP | Consultas DNS (somente SOA) | Sempre |
| 53 | TCP | Consultas DNS, transferências de zona AXFR/IXFR, gerenciamento | Sempre |
| 853 | TCP+TLS | DoT — igual ao TCP, porém criptografado | Exige configuração `cert` |
| 443/8443 | TCP+TLS | DoH (`/dns-query`) e API REST | Exige configuração `cert` |

### UDP (Porta 53)

O UDP é usado para consultas DNS leves, principalmente pesquisas SOA. Respostas que excedem 512 bytes (ou o tamanho de buffer anunciado pelo EDNS0) definem o bit TC (truncamento) conforme RFC 1035 §4.2.1, levando os clientes a tentarem novamente via TCP. Comandos de gerenciamento não são suportados via UDP.```bash
dig @127.0.0.1 zone.ioc2rpz SOA -y hmac-sha256:keyname:base64key

TCP (Porta 53)

O TCP lida com transferências de zona (AXFR/IXFR), consultas SOA e comandos de gerenciamento. Um pool de 5 workers accept pré-instanciados lida com conexões recebidas.```bash

AXFR zone transfer

dig @127.0.0.1 zone.ioc2rpz AXFR +tcp -y hmac-sha256:keyname:base64key

IXFR incremental transfer

dig @127.0.0.1 zone.ioc2rpz IXFR=12345 +tcp -y hmac-sha256:keyname:base64key

root@kitploit:~
### DNS sobre TLS / DoT (Porta 853)

ioc2rpz™ suporta distribuição de RPZ sobre DoT. O listener TLS inicia automaticamente na porta 853 quando um registo `cert` está presente na configuração. DoT suporta as mesmas operações que TCP (AXFR, IXFR, SOA, gestão).

- Versões de TLS suportadas: 1.2 e 1.3 (`?TLSVersion = 'tlsv1.2-1.3'`)
- Reutilização de ligação suportada conforme RFC 7858 §3.4 (múltiplas consultas por sessão TLS, tempo limite de inatividade de 30 segundos)
- TLS PIN não é suportado
- Mensagens DNS NOTIFY são enviadas sem encriptação (UDP simples)
- Os certificados são atualizados automaticamente quando os ficheiros são substituídos no disco (atraso de até ~2 minutos devido à cache SSL do Erlang)

Para configuração de certificados, consulte [Configuração de Certificados](#certificate-setup).```bash
# SOA query over DoT
kdig @127.0.0.1 -p 853 zone.ioc2rpz SOA +tls -y hmac-sha256:keyname:base64key

# AXFR over DoT
dig @127.0.0.1 -p 853 zone.ioc2rpz AXFR +tls +tcp -y hmac-sha256:keyname:base64key

DNS sobre HTTPS / DoH (Porta 443/8443)

O DoH fornece resolução de DNS por HTTPS através do endpoint /dns-query. Métodos suportados:

  • GET com mensagem DNS codificada em base64url no parâmetro de consulta ?dns=
  • POST com corpo Content-Type: application/dns-message (máximo de 4096 bytes; cargas maiores recebem HTTP 413)

As respostas usam Content-Type: application/dns-message. O DoH transporta a mensagem DNS completa no formato wire e é processado pelo mesmo caminho que Do53/DoT, portanto herda a mesma autenticação TSIG; transferências de zona (AXFR/IXFR) permanecem somente via TCP e não são servidas por DoH.```bash

DoH GET request

curl -H "Accept: application/dns-message"
"https://127.0.0.1:443/dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB" -k

DoH POST request

curl -X POST -H "Content-Type: application/dns-message"
--data-binary @dns_query.bin "https://127.0.0.1:443/dns-query" -k

root@kitploit:~
### Limitação de Taxa

As consultas DNS são limitadas por taxa usando uma chave inteligente (híbrida) para que clientes legítimos de várias zonas não sejam penalizados enquanto o abuso por variação de nome de consulta é bloqueado:

- **Zona provisionada + QTYPE suportado** (`SOA`/`AXFR`/`IXFR`, classe `IN`) e **comandos de gerenciamento reconhecidos** (classe `CHAOS`/`TXT`) são rastreados por `{client_IP, query_name, query_type}` — de modo que um secundário que consulta/transfere várias zonas (ex.: `rpz1`, `rpz2`, `rpz3`) além do gerenciamento a partir de um único IP é contado de forma independente por zona+tipo.
- **Todo o resto** (zona desconhecida/não provisionada, tipo de consulta não suportado, classe incorreta ou um nome de gerenciamento não reconhecido) é agregado por `{client_IP}`, de modo que um invasor não pode contornar o limite variando o nome da consulta.

Quando o limite é excedido, o servidor retorna uma resposta DNS `REFUSED`.

| Parâmetro | Padrão | Macro |
|-----------|---------|-------|
| Janela | 10 segundos | `?RATE_LIMIT_WINDOW` (10000 ms) |
| Máximo de requisições por janela (granular: zona+tipo conhecidos / gerenciamento) | 1 | `?MAX_REQUESTS_PER_WINDOW` |
| Máximo de requisições por janela (agregado: zona desconhecida / tipo não suportado) | 1 | `?MAX_UNKNOWN_REQUESTS_PER_WINDOW` |

A limitação de taxa se aplica a todos os transportes de consulta DNS (UDP, TCP, TLS, DoH). A janela e o limite são configuráveis por meio de macros em `include/ioc2rpz.hrl`.

### DNS NOTIFY

Após uma atualização de zona (AXFR ou IXFR), o ioc2rpz™ envia mensagens DNS NOTIFY ([RFC 1996](https://tools.ietf.org/html/rfc1996)) via UDP para os endereços IP configurados na `NotifyList` do RPZ. Isso leva os servidores DNS secundários a verificar o serial SOA da zona e iniciar uma transferência se o serial tiver mudado.```erlang
%% NotifyList in RPZ config — last field before whitelists
{rpz, {"zone.ioc2rpz", ..., ["source1"], ["10.0.0.1", "10.0.0.2"], []}}.

ioc2rpz™ vs ISC BIND vs outros DNS:

  • ioc2rpz™ foi criado para lidar apenas com distribuição de RPZ;
  • ioc2rpz™ suporta DoT (DNS over TLS) para que ninguém possa facilmente bisbilhotar suas RPZs/indicadores;
  • ioc2rpz™ suporta DoH (DNS over HTTPS) para clientes DNS modernos;
  • ioc2rpz™ suporta quantas RPZs você precisar;
  • ioc2rpz™ suporta zonas ativas/não armazenadas em cache. Ele cria zonas por meio de uma solicitação recebida;
  • indicadores podem ser coletados de diferentes fontes e por meio de diferentes protocolos (por exemplo, via chamadas de API REST);
  • as RPZs são atualizadas automaticamente;
  • o tempo de expiração de IOC é usado para remover indicadores expirados em tempo hábil;
  • otimizações de desempenho e de tempo/tamanho/pacotes de transferência de zona.

Instalação

A maneira mais fácil de implantar o serviço é usando containers Docker no Docker Hub. Como fazer a implantação no Docker você pode encontrar na wiki do ioc2rpz™.

Container Docker

ioc2rpz™ está disponível no Docker Hub. Basta procurar por ioc2rpz™. Pré-requisitos:

  • ioc2rpz™ não contém um arquivo de configuração; você precisa montar /opt/ioc2rpz/cfg em um diretório no sistema host com o arquivo de configuração (ioc2rpz.conf);
  • ioc2rpz™ usa as portas 53/udp (somente solicitações SOA), 53/tcp (AXFR, IXFR, SOA, MGMT), 853/tcp (AXFR, IXFR, SOA, MGMT) e 8443/tcp (API REST, DoH). As portas devem ser expostas ao sistema host;
  • ioc2rpz™ salva o banco de dados ETS em arquivos para inicialização mais rápida. Você pode montar /opt/ioc2rpz/db em um diretório no sistema host para preservar o banco de dados entre reinicializações; Você pode iniciar o ioc2rpz™ com o seguinte comando:``` sudo docker run -d --name ioc2rpz --log-driver=syslog --restart always --mount type=bind,source=/home/ioc2rpz/cfg,target=/opt/ioc2rpz/cfg --mount type=bind,source=/home/ioc2rpz/db,target=/opt/ioc2rpz/db -p53:53 -p53:53/udp -p853:853 -p8443:8443 pvmdel/ioc2rpz
root@kitploit:~
onde os diretórios /home/ioc2rpz/cfg, /home/ioc2rpz/db em um sistema host.  
Você pode passar um nome de arquivo de configuração personalizado através do parâmetro ``-e``. Ex.: ``-e CONF=./cfg/ioc2rpz2.conf``

## Variáveis de Ambiente

As seguintes variáveis de ambiente são usadas pelo ioc2rpz™, relevantes principalmente para implantações Docker. Elas são definidas em `config/sys.config.src` e `config/vm.args`.

| Variável | Padrão | Descrição |
|----------|---------|-------------|
| `IPv4` | — | Endereço de bind IPv4 |
| `IPv6` | — | Endereço de bind IPv6 |
| `CONF` | — | Caminho para o arquivo de configuração (ex.: `./cfg/ioc2rpz.conf`) |
| `DB` | `/opt/ioc2rpz/db` | Diretório do banco de dados para persistência ETS |
| `CD` | `/opt/ioc2rpz` | Diretório de trabalho |
| `NODE_NAME` | `ioc2rpz` | Nome curto do nó Erlang |
| `IO2Cookie` | `ioc2rpz` | Cookie distribuído Erlang |

Passe variáveis de ambiente para o Docker com `-e`:```bash
docker run -d --name ioc2rpz -e CONF=./cfg/custom.conf -e NODE_NAME=mynode ...

Docker Compose

Você pode implantar ioc2rpz™ e ioc2rpz.gui usando docker compose. O arquivo docker-compose.yml canônico pode ser encontrado no repositório ioc2rpz.dc.

Abaixo está um exemplo de docker-compose.yml mostrando ioc2rpz com a interface web e um sidecar certbot Let's Encrypt:```yaml version: "3.8" services: ioc2rpz: image: pvmdel/ioc2rpz container_name: ioc2rpz restart: always logging: driver: syslog ports: - "53:53/tcp" - "53:53/udp" - "853:853/tcp" - "8443:8443/tcp" volumes: - ./cfg:/opt/ioc2rpz/cfg - ./db:/opt/ioc2rpz/db - letsencrypt-certs:/opt/ioc2rpz/ssl:ro

ioc2rpz-gui: image: pvmdel/ioc2rpz.gui container_name: ioc2rpz-gui restart: always ports: - "443:443" depends_on: - ioc2rpz

certbot: image: certbot/certbot container_name: certbot volumes: - letsencrypt-certs:/etc/letsencrypt - letsencrypt-www:/var/www/certbot entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew --quiet; sleep 12h; done'"

volumes: letsencrypt-certs: letsencrypt-www:

root@kitploit:~
Atualize seu `ioc2rpz.conf` para referenciar o caminho do certificado montado:```erlang
{cert, {"ssl/live/ns1.rpz-proxy.com/fullchain.pem", "ssl/live/ns1.rpz-proxy.com/privkey.pem", ""}}.

ioc2rpz™ na AWS

Você pode executar o ioc2rpz™ e o ioc2rpz.gui na AWS. Para implantações relativamente pequenas (várias centenas de milhares de indicadores), até mesmo o nível gratuito é suficiente. O vídeo abaixo mostra como configurar o ioc2rpz™ e o ioc2rpz.gui na AWS usando ECS.

Configuração de Certificado

Certificados TLS são necessários para DoT (porta 853), API REST (porta 8443) e DoH. O mesmo certificado é usado para todos os serviços TLS. Consulte docs/deployment.md para obter detalhes completos.

Certificado Autoassinado (Desenvolvimento)```bash

openssl req -x509 -newkey rsa:2048 -keyout cfg/ioc2rpz_dot.key
-out cfg/ioc2rpz_dot.crt -days 365 -nodes -subj "/CN=ioc2rpz"

root@kitploit:~
### Let's Encrypt (Produção)```bash
# Obtain certificate
sudo certbot certonly --standalone -d ns1.rpz-proxy.com

# Copy to ioc2rpz cfg directory
cp /etc/letsencrypt/live/ns1.rpz-proxy.com/fullchain.pem cfg/ioc2rpz_dot.crt
cp /etc/letsencrypt/live/ns1.rpz-proxy.com/privkey.pem cfg/ioc2rpz_dot.key

Renovação Automática```bash

/etc/cron.d/ioc2rpz-cert-renew

0 3 * * * root certbot renew --quiet --deploy-hook "cp /etc/letsencrypt/live/ns1.rpz-proxy.com/fullchain.pem /opt/ioc2rpz/cfg/ioc2rpz_dot.crt && cp /etc/letsencrypt/live/ns1.rpz-proxy.com/privkey.pem /opt/ioc2rpz/cfg/ioc2rpz_dot.key"

root@kitploit:~
Os certificados também são recarregados explicitamente durante uma recarga de configuração (`ioc2rpz-reload-cfg`): quando o ioc2rpz detecta que os arquivos de certificado mudaram, ele reinicia os listeners TLS com o novo certificado imediatamente, em vez de aguardar o cache SSL Erlang de ~2 minutos. Adicione uma etapa `ioc2rpz-reload-cfg` ao seu hook de renovação para aplicar novos certificados sem indisponibilidade.

### Montagem de Volumes Docker

Ao executar em Docker, monte o diretório de certificados a partir do host:```bash
docker run -d --name ioc2rpz \
  --mount type=bind,source=/etc/letsencrypt/live/ns1.rpz-proxy.com,target=/opt/ioc2rpz/ssl,readonly \
  ...

Referência em ioc2rpz.conf:```erlang {cert, {"ssl/fullchain.pem", "ssl/privkey.pem", ""}}.

root@kitploit:~
O Erlang detecta automaticamente os arquivos de certificado substituídos em cerca de ~2 minutos. Os certificados também são explicitamente recarregados durante o recarregamento da configuração (`ioc2rpz-reload-cfg`). Não deixe os certificados expirarem — renove antes da expiração para um serviço ininterrupto.

## Compilando a partir do Código-Fonte

> **Nota:** A compilação a partir do código-fonte é destinada a **desenvolvimento e testes**. Para produção, **Docker é o método de implantação recomendado** — consulte [Docker Compose](#docker-compose) e o repositório [ioc2rpz.dc](https://github.com/Homas/ioc2rpz.dc).

### Pré-requisitos

- **Erlang/OTP 24 ou mais recente** (`erl -version` para verificar) e um [rebar3](https://www.rebar3.org) correspondente.
- Uma toolchain C (para compilar dependências) e `git`.

### Compilar e Executar```bash
# 1. Clone the repository
git clone https://github.com/Homas/ioc2rpz.git
cd ioc2rpz

# 2. Build a release
rebar3 release

# 3. Edit the configuration (see the minimal example below)
$EDITOR cfg/ioc2rpz.conf

# 4. Start the server (foreground console, or 'start' for background)
_build/default/rel/ioc2rpz/bin/ioc2rpz console
# or: _build/default/rel/ioc2rpz/bin/ioc2rpz start

Por padrão, o ioc2rpz™ lê a sua configuração de ./cfg/ioc2rpz.conf, escuta em todas as interfaces de rede e grava o backup do seu banco de dados em ./db. Os padrões de tempo de compilação (portas, caminhos, temporizadores) estão em include/ioc2rpz.hrl.

Configuração Mínima

Uma configuração mínima de cfg/ioc2rpz.conf com uma chave TSIG, uma fonte de arquivo e uma zona RPZ:```erlang %% Server NS record, admin mailbox, management key(s), and management ACL {srv,{"ns1.example.com","hostmaster.example.com",["mgmtkey"],["127.0.0.1","::1"]}}.

%% A TSIG key (name, algorithm, base64 secret) used for management / zone transfers {key,{"mgmtkey","sha256","5Yvt70eJnf95+LJeI8H3TgKGeVparmMB7udA0pv/JRE="}}.

%% An IOC source: a local file parsed as a full (AXFR) feed of domains {source,{"sample","file:cfg/small_ioc.txt","[:AXFR:]","^([0-9A-Za-z.-]+\.[0-9A-Za-z.-]+)$","",0,0,0,"mixed",true}}.

%% An RPZ zone built from the source, served with the nxdomain action {rpz,{"rpz.example.com",86400,3600,2592000,7200,"true","true","nxdomain",["mgmtkey"],"mixed",604800,86400,["sample"],[],[]}}.

root@kitploit:~
Consulte [docs/configuration.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/configuration.md) para a referência autoritativa campo a campo (layout da tupla source/RPZ, temporizadores SOA, grupos de chaves, certificados, etc.). Para habilitar DoT (porta 853), DoH e a API REST HTTPS, adicione uma entrada `{cert,{...}}` — consulte [Configuração de Certificados](#certificate-setup).

### Shell de Desenvolvimento (somente desenvolvimento/testes)

Os seguintes comandos são para desenvolvimento e testes locais — não para uso em produção:```bash
# Compile only (no release)
rebar3 compile

# Run the EUnit test suite
rebar3 eunit
# Run tests for a single module
rebar3 eunit --module=ioc2rpz_fun

# Start an interactive shell with the application and all deps loaded
rebar3 shell

Em rebar3 shell você pode exercitar o sistema em execução diretamente, por exemplo:```erlang %% Inspect the listener pools and ETS tables supervisor:which_children(ioc2rpz_sup). ets:info(cfg_table, size). ets:info(rpz_hotcache_table, size).

%% Trigger a configuration reload / forced zone update ioc2rpz_sup:reload_config3(reload). ioc2rpz_sup:update_all_zones(true).

root@kitploit:~
## Gerenciamento do ioc2rpz™
### via DNS
O ioc2rpz™ suporta gerenciamento via DNS/TCP ou DoT. Recomenda-se usar DoT ou API REST em vez de DNS/TCP. A versão atual do ioc2rpz™ não suporta um IP/interface de gerenciamento separado. Em qualquer caso, é altamente recomendável criar uma chave TSIG designada (ou chaves) que será usada apenas para gerenciamento. Você pode desativar o gerenciamento via DNS.  
Ações suportadas:
- Status atual do ioc2rpz™. Solicite ``ioc2rpz-status``, classe ``CHAOS``, registro ``TXT``. ex.:```
dig +tcp -y dnsmkey_1:ayVnL+h2QKMszRVohrngagcEuIpN3RkecXKdwSa5WsHD5N4Y5R3NUMGM W8sIGv36gPkAtWtgarqKzN9tmHqEnA== @127.0.0.1 ioc2rpz-status TXT -c CHAOS
  • Recarregar arquivo de configuração. Nome de RR ioc2rpz-reload-cfg, Classe de RR CHAOS, Tipo de RR TXT
  • Atualizar chaves TSIG. Nome de RR ioc2rpz-update-tkeys, Classe de RR CHAOS, Tipo de RR TXT
  • Atualização completa de todas as zonas. Nome de RR ioc2rpz-update-all-rpz, Classe de RR CHAOS, Tipo de RR TXT
  • Atualização completa de uma zona. Nome de RR zone_name, Classe de RR CHAOS, Tipo de RR TXT. Ex.: a atualização completa de dga.ioc2rpz pode ser invocada por:``` dig +tcp -y dnsmkey_1:ayVnL+h2QKMszRVohrngagcEuIpN3RkecXKdwSa5WsHD5N4Y5R3NUMGM W8sIGv36gPkAtWtgarqKzN9tmHqEnA== @127.0.0.1 dga.ioc2rpz TXT -c CHAOS
root@kitploit:~
- Parar ioc2rpz™. RR Name ``ioc2rpz-terminate``, RR Class ``CHAOS``, RR Type ``TXT``
- Solicitar uma zona de exemplo. RR Name ``sample-zone.ioc2rpz``, RR Class ``IN``, RR Type ``AXFR``
### via REST
A API REST (porta 8443/tcp) é a interface de gerenciamento preferida. Por razões de segurança, todo o tráfego de gerenciamento deve ser criptografado e a API REST não é iniciada se não houver certificado SSL. Todos os endpoints aceitam tanto métodos GET quanto POST.

A autenticação HTTP Basic é usada para autenticar requisições. Chaves TSIG de gerenciamento são usadas para autenticação de requisições. Um nome de chave TSIG é usado como nome de usuário HTTP e a chave TSIG como senha. O acesso à API REST é restrito pela ACL definida no registro `srv`.

O segmento de versão da API suporta tanto `v1` quanto `v1.0` (por exemplo, `/api/v1/stats/serv` ou `/api/v1.0/stats/serv`).

A API REST suporta saída JSON (padrão) e texto simples com base no cabeçalho `Accept`:
- `application/json` — saída JSON (padrão)
- `text/plain` — saída em texto simples```bash
# Example: plain text output
curl -u "keyname:base64key==" -k -H "Accept: text/plain" https://127.0.0.1:8443/api/v1/mgmt/update_tkeys

As respostas de texto usam o formato:``` status: ok msg: TSIG keys were updated

root@kitploit:~
#### Parâmetros de Caminho

| Parâmetro | Descrição |
|-----------|-------------|
| `:rpz_name` | Nome da zona RPZ (ex.: `dga.ioc2rpz`) |
| `:source_name` | Nome da fonte de IOC (ex.: `sample_fqdn`) |
| `:ioc` | Indicador a consultar (FQDN ou IP, ex.: `baddomain.com`) |

#### Endpoints de Estatísticas

`/api/v1/stats/serv` — Estatísticas do servidor (nome do nó, total de regras, uso de memória)```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/stats/serv
root@kitploit:~
{
  "srv": {
    "node_name": "ioc2rpz@hostname",
    "srv_total_rules": 15000,
    "hot_cache_mem": "12.5 Mb",
    "axfr_table_mem": "45.2 Mb",
    "ixfr_table_mem": "8.1 Mb"
  },
  "rpz": [...],
  "sources": [...]
}

/api/v1/stats/rpz — estatísticas da zona RPZ```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/stats/rpz

root@kitploit:~
```json
{
  "rpz": [
    {
      "name": "malware.ioc2rpz",
      "status": "ready",
      "rule_count": 5000,
      "ioc_count": 4500,
      "serial": 1709000000,
      "serial_ixfr": 1708990000,
      "update_time": 1709000000,
      "ixfr_update_time": 1708995000,
      "ixfr_nz_update_time": 1708995000
    }
  ]
}

O campo status (ready, updating, forceAXFR, notready) indica se os contadores/serial relatados estão atualizados; quando updating ou forceAXFR, eles refletem a última atualização concluída. Os contadores e o serial são preservados em uma recarga de configuração em vez de serem redefinidos para zero.

/api/v1/stats/source — Estatísticas da fonte```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/stats/source

root@kitploit:~
```json
{
  "sources": [
    {"name": "sample_fqdn", "ioc_count": 150}
  ]
}

Endpoints de Gerenciamento

/api/v1/mgmt/reload_cfg — Recarregar arquivo de configuração```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/mgmt/reload_cfg

root@kitploit:~
Sucesso: `{"status":"ok","msg":"Configuration reloaded"}`
Erro (HTTP 520): `{"status":"error","msg":"Configuration reload error"}`

`/api/v1/mgmt/update_tkeys` — Recarregar chaves TSIG da configuração```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/mgmt/update_tkeys

Sucesso: {"status":"ok","msg":"TSIG keys were updated"} Erro (HTTP 520): {"status":"error","msg":"TSIG keys update error"}

/api/v1/mgmt/terminate — Encerramento gracioso do servidor```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/mgmt/terminate

root@kitploit:~
Sucesso: `{"status":"ok","msg":"Terminating"}`

#### Endpoints de Atualização de Zonas

`/api/v1/update/all_rpz` — Força a atualização completa de todas as zonas RPZ```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/update/all_rpz

Sucesso: {"status":"ok","msg":"All RPZ zones will be updated"}

/api/v1/update/:rpz_name — Força a atualização completa de uma zona específica```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/update/dga.ioc2rpz

root@kitploit:~
Sucesso: `{"status":"ok","msg":"RPZ dga.ioc2rpz will be updated"}`
Erro (HTTP 520): `{"status":"error","msg":"RPZ dga.ioc2rpz not found"}`

#### Endpoints de Gerenciamento de Cache

`/api/v1/cache/sources/clear/all` — Remove todas as fontes do cache ativo```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/cache/sources/clear/all

Sucesso: {"status":"ok","msg":"All sources were removed from the hotcache"}

/api/v1/cache/sources/clear/:source_name — Remove uma fonte específica do hot cache```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/cache/sources/clear/sample_fqdn

root@kitploit:~
Success: `{"status":"ok","msg":"sample_fqdn source was removed from the hot cache"}`

`/api/v1/cache/sources/load/all` — Recarregar todas as fontes no cache quente```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/cache/sources/load/all

Sucesso: {"status":"ok","msg":"All sources will loaded to the hot cache"}

Endpoints de consulta de Feed e IOC

/api/v1/feed/:rpz_name — Obter indicadores de um feed RPZ

Parâmetro de consulta: ?type=fqdn|ip|both (padrão: both)```bash curl -u "keyname:base64key==" -k "https://127.0.0.1:8443/api/v1/feed/malware.ioc2rpz?type=fqdn"

root@kitploit:~
Sucesso:```json
{
  "status": "ok",
  "rpz": "malware.ioc2rpz",
  "iocs": ["baddomain.com", "evil.example.org"]
}

Erro (HTTP 520): {"status":"error","msg":"RPZ malware.ioc2rpz not found"}

/api/v1/ioc/:ioc — Verifica se um indicador está bloqueado por algum feed RPZ

Parâmetro de consulta: ?tkey=keyname — limita a pesquisa a zonas acessíveis por essa chave (opcional)```bash curl -u "keyname:base64key==" -k "https://127.0.0.1:8443/api/v1/ioc/baddomain.com?tkey=dnsproxykey_1"

root@kitploit:~
Sucesso:```json
{
  "ioc": "baddomain.com",
  "tkey": "dnsproxykey_1",
  "data": [
    {
      "ioc": "baddomain.com",
      "feeds": [
        {
          "feed": "malware.ioc2rpz",
          "wildcard": "true",
          "type": "fqdn",
          "rpz_serial": 1709000000,
          "ioc_expiration": 0,
          "sources": ["abuse-ch", "internal-list"]
        }
      ]
    }
  ]
}

Erro: {"status":"error", "ioc": "nonexistent.com"}

O campo aditivo sources lista o(s) nome(s) da(s) fonte(s) contribuinte(s) por feed quando o rastreamento de fontes está habilitado; ele é null quando o rastreamento está desabilitado ou a atribuição é desconhecida. Consulte Atribuição de Fontes de IOC para configuração e semântica.

Endpoints Não Suportados

Qualquer caminho não reconhecido retorna HTTP 200 com:```json {"status":"error","msg":"Unsupported request"}

root@kitploit:~
## Monitoramento e Verificações de Saúde

### Estatísticas da API REST```bash
# Server statistics
curl -u "keyname:key==" -k https://127.0.0.1:8443/api/v1/stats/serv

# RPZ zone statistics (indicator counts, serials, update times)
curl -u "keyname:key==" -k https://127.0.0.1:8443/api/v1/stats/rpz

# Source statistics
curl -u "keyname:key==" -k https://127.0.0.1:8443/api/v1/stats/source

Verificações do Erlang Shell

Se estiver executando em um shell interativo ou anexado a um nó em execução:```erlang %% Check supervisor children supervisor:which_children(ioc2rpz_sup). supervisor:count_children(ioc2rpz_tls_sup_v6). supervisor:count_children(ioc2rpz_tcp_sup_v6).

%% Check ETS table sizes (memory usage) ets:info(cfg_table, size). ets:info(rpz_hotcache_table, size). ets:info(rate_limits, size).

root@kitploit:~
### Verificações de Integridade do DNS```bash
# SOA query over UDP
dig @localhost -p 53 your-zone.rpz SOA +short

# Zone transfer over TCP
dig @localhost -p 53 your-zone.rpz AXFR +tcp -y hmac-sha256:keyname:base64key

# DoT query
dig @localhost -p 853 +tls your-zone.rpz SOA

# Sample zone (built-in test zone)
dig @localhost sample-zone.ioc2rpz AXFR +tcp

Consulte docs/deployment.md para referência completa de monitoramento e logs.

Solução de problemas

Consulte docs/deployment.md para solução de problemas detalhada.

Arquivo de configuração

O arquivo de configuração é um arquivo Erlang. Cada opção de configuração é um termo Erlang, portanto a configuração deve estar em conformidade com a sintaxe Erlang. O servidor valida as entradas de configuração no carregamento/recarregamento: codificação da chave TSIG, existência do arquivo de certificado, compilação de regex e sintaxe de URL. Entradas inválidas são registradas e ignoradas. Consulte docs/configuration.md para a referência completa de configuração.

O ioc2rpz™ suporta os seguintes parâmetros de configuração:

  • um único registro srv (obrigatório);
  • um único registro cert (opcional);
  • zero ou mais registros key (opcional);
  • zero ou mais registros whitelist (opcional);
  • um ou mais registros source (no mínimo uma fonte é obrigatória);
  • um ou mais registros rpz (no mínimo um rpz é obrigatório).

Registro srv

O registro srv é usado para definir valores padrão do servidor. Ele consiste em:

  • Nome do servidor NS usado no registro SOA;
  • um endereço de e-mail para o registro SOA (no formato SOA);
  • lista de chaves TSIG de gerenciamento (apenas nomes). Consulte a seção de gerenciamento para obter detalhes.
  • lista de endereços IP ACL para controle de acesso à API REST.
  • (opcional) TrackSources — o padrão global de nível de servidor para atribuição de origem: off | auto | on (padrão off). Aplicado a qualquer feed cujo próprio track_sources não esteja definido. Consulte Atribuição de Origem IOC.

Exemplo de registro srv:``` {srv,{"ns1.example.com","support.email.example.com",["dnsmkey_1","dnsmkey_2","dnsmkey_3"],["acl_ip1","acl_ip2"]}}.

%% With the optional global source-tracking default (5-field form): {srv,{"ns1.example.com","support.email.example.com",["dnsmkey_1"],["acl_ip1"],auto}}.

root@kitploit:~
O formulário de 4 campos continua válido e define `TrackSources` como `off` por padrão.
### Registro **cert**
O registro **cert** é usado para definir um certificado e uma chave privada para comunicações DNS over TLS, REST API e DoH. Para geração e gerenciamento de certificados, consulte [Configuração de Certificado](#certificate-setup).

É composto por:
- caminho para um arquivo contendo um certificado;
- caminho para um arquivo contendo uma chave privada codificada em PEM;
- caminho para um arquivo com certificados de CA codificados em PEM.  

Exemplo de registro **cert**:```
{cert,{"cfg/cert.pem", "cfg/key.pem",	"cfg/cacerts.pem"}}.

include record

include record permite dividir a configuração do ioc2rpz™ em vários arquivos.

Exemplo de include record:``` {include,"cfg/tkeys.include.cfg"}.

root@kitploit:~
### Registro **key**
As chaves TSIG são usadas para autenticação e autorização. É recomendado usar chaves TSIG diferentes para o gerenciamento do ioc2rpz™ e transferências de zonas.  
O registro **key** consiste em:
- Nome da chave TSIG;
- algoritmo. ``md5``, ``sha256`` e ``sha512`` são suportados;
- a chave;
- (opcional) lista de grupos de chaves aos quais ela pertence.

Exemplo de registros **key**:```
{key,{"key_name_1","md5","ayVnL+h2QKMszRVohrngagcEuIpN3RkecXKdwSa5WsHD5N4Y5R3NUMGM W8sIGv36gPkAtWtgarqKzN9tmHqEnA=="}}.
{key,{"key_name_2","sha256","5Yvt70eJnf95+LJeI8H3TgKGeVparmMB7udA0pv/JRE="}}.
{key,{"key_name_3","sha512","03uuaGl9kqfenjRgIeCv6e29lVvMwviB1+cDX1I0jcVOcTU4jWFwRkfo3ULRMD+NGDfwzYvXkJ94FNEaAW4vzw==",["customers","public"]}}.

O utilitário dnssec-keygen pode ser usado para gerar chaves TSIG:```bash

MD5 (512-bit)

dnssec-keygen -a HMAC-MD5 -b 512 -n USER tsig-key

SHA-256 (256-bit)

dnssec-keygen -a HMAC-SHA256 -b 256 -n USER tsig-key

SHA-512 (512-bit)

dnssec-keygen -a HMAC-SHA512 -b 512 -n USER tsig-key

root@kitploit:~
Consulte a documentação "dnssec-keygen" para obter detalhes. As chaves podem ser atribuídas a grupos para autorização baseada em grupos no controle de acesso de zonas RPZ.

### **key_group** registro
Os grupos de chaves fornecem autorização baseada em grupos para transferências e gerenciamento de zonas. Em vez de listar chaves individuais em registros `rpz` ou `srv`, você pode atribuir chaves a grupos nomeados e referenciar o grupo.

Há duas maneiras de atribuir chaves a grupos:
1. Inline, através do campo opcional de 4ª posição do registro `key`: `{key, {Name, Alg, Secret, [Groups]}}`
2. Explicitamente, através de um registro `key_group` (mostrado abaixo)```erlang
{key_group, {GroupName, [KeyName1, KeyName2, ...]}}.
CampoTipoDescrição
GroupNamestringNome do grupo (ex.: "customers")
Keyslista de stringsLista de nomes de chaves TSIG pertencentes a este grupo

Exemplo de registros key_group:```erlang {key_group, {"customers", ["dnsproxykey_1", "dnsproxykey_2"]}}. {key_group, {"public", ["dnsproxykey_3"]}}.

root@kitploit:~
Grupos são referenciados nos registros `rpz` e `srv` usando a tupla `{groups, ["group1", "group2"]}` na lista de chaves:```erlang
{rpz, {"zone.ioc2rpz", 7202, 3600, 2592000, 7200, "true", "true", "nxdomain",
       ["dnsproxykey_1", {groups, ["customers", "public"]}],
       "fqdn", 86400, 3600, ["source1"], [], []}}.

whitelist registro

As whitelists são usadas para evitar possíveis erros e o bloqueio de domínios e endereços IP confiáveis. Os IOCs incluídos na whitelist são removidos das zonas de política de resposta. O ioc2rpz™ verifica apenas correspondência exata, portanto não dividirá nem descartará uma rede se um endereço IP da whitelist estiver incluído em uma sub-rede bloqueada e vice-versa. Uma whitelist é um arquivo de texto ou um feed de dados de texto. Os indicadores devem ser separados por caracteres de nova linha (/n,/r ou ambos /n/r). As whitelists devem conter FQDNs válidos e/ou endereços IP. O ioc2rpz™ suporta um número ilimitado de indicadores.
O registro de whitelists consiste em:

  • nome da whitelist;
  • caminho da whitelist. URLs (http/https/ftp) e arquivos locais são suportados. O prefixo "file:" é usado para arquivos locais;
  • REGEX usada para extrair indicadores. Uma expressão regular deve ser incluída entre aspas duplas. Se você especificar uma REGEX vazia (""), uma REGEX padrão será usada ("^([A-Za-z0-9][A-Za-z0-9\-\._]+)[^A-Za-z0-9\-\._]*.*$"). none é usado se nenhuma REGEX for necessária (a fonte já fornece os dados no formato exigido).

Exemplo de registro whitelist:``` {whitelist,{"whitelist_1","file:cfg/whitelist1.txt",none}}.

root@kitploit:~
### **source** registro
Um source é um feed de indicadores maliciosos. FQDNs, endereços IPv4 e IPv6 são suportados. Um source é um arquivo de texto ou um feed de dados de texto. Os indicadores devem ser separados por caracteres de nova linha/retorno de carro (/n,/r ou ambos /r/n). O ioc2rpz™ suporta uma contagem ilimitada de indicadores.  
**source** registro consiste em:
- nome do source;
- caminho do source para transferência completa do source (AXFR). URLs(http/https/ftp), arquivos locais e scripts são suportados. O prefixo **file:** é usado para arquivos locais. O prefixo **shell:** é usado para executar um script/comando local em um host/contêiner que deve retornar indicadores e data de expiração opcional para STDOUT;
- caminho do source para transferência incremental do source (IXFR). Caminhos AXFR,IXFR suportam palavras-chave para encurtar URLs e fornecer timestamps de atualização de zona:
  - **[:AXFR:]** - caminho AXFR completo. Só pode ser usado em caminhos IXFR;
  - **[:FTimestamp:]** - timestamp de quando o source foi atualizado pela última vez  (ex.: 1507946281)
  - **[:ToTimestamp:]** - timestamp atual;
- REGEX usada para extrair indicadores e seu tempo de expiração. A primeira correspondência é um indicador, a segunda correspondência é um tempo de expiração. O tempo de expiração é um parâmetro opcional. Uma expressão regular deve ser incluída entre aspas duplas. Se você especificar uma REGEX vazia (`""`), uma REGEX padrão será usada (`"^([A-Za-z0-9][A-Za-z0-9\-\._]+)[^A-Za-z0-9\-\._]*.*$"`). `none` é usado se nenhuma REGEX for necessária (o source já fornece dados no formato exigido).
Parâmetros opcionais (todos ou nenhum devem ser usados):
- UserID (usado internamente).
- Número máximo de IoCs.
- Atualização completa do source, tempo de hot cache (em segundos).
- Atualização incremental do source, tempo de hot cache (em segundos).

Downloads de sources via HTTPS verificam o certificado TLS do servidor remoto. Sources com certificados inválidos ou autoassinados falharão no download. Para certificados autoassinados, use um source `shell:` com `curl --insecure`.

**Restrições de arquivo local:** caminhos `file:` que contenham `..` (travessia de diretório pai) são rejeitados por segurança; use um caminho sem `..` (dentro do diretório de trabalho/dados).

**Restrições de comando shell:** o executável de cada segmento do pipeline deve ser um caminho absoluto (ex.: `/usr/bin/curl`) ou um utilitário de texto seguro de nome simples (`sort`, `uniq`, `grep`, `sed`, `awk`, `gawk`, etc.); comandos destrutivos e shells (`rm`, `bash`, `sh`, etc.) são bloqueados, e substituição de comando (`$(...)`, crases) e redirecionamento de saída (`>`, `>>`) são rejeitados. Comandos rejeitados não são executados e são registrados via evento CEF 151 (comandos executados via 150). Consulte [docs/configuration.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/configuration.md#shell-command-restrictions) para o conjunto completo de regras.

Se um source retornar menos de 50% da contagem anterior de indicadores, a atualização é rejeitada e os dados anteriores são mantidos. Isso evita que feeds degradados reduzam a cobertura do RPZ. Configurável via macro `?SOURCE_MIN_IOC_RATIO`.

Exemplo de registro **source**:```
%% Local file source — indicators without expiration
{source,{"sample_fqdn","file:cfg/sample_ioc_fqdn.txt","[:AXFR:]",none}}.

%% Local file source — indicators with expiration timestamps (tab-separated)
{source,{"sample_expire","file:cfg/sample_ioc_expire.txt","[:AXFR:]","^([A-Za-z0-9][A-Za-z0-9\-\._]+)\t([0-9TZ:\-]+)$"}}.

%% Shell source — fetch RPZ via AXFR and extract CNAMEs
{source,{"base.rpz1","shell:/usr/bin/dig -y KEYNAME:TSIGKEY @127.0.0.1 base.rpz.ioc2rpz.local axfr | /bin/grep -e CNAME | /bin/grep -v '*.' | /usr/bin/awk -F '.base.rpz' '{print $1}'","",none}}.

A fonte shell: é usada para estender as opções de conectividade do ioc2rpz™, que são nativamente um pouco limitadas. O contêiner ioc2rpz™ inclui dig, grep, awk e python. Por exemplo, você pode misturar diferentes feeds RPZ ou buscar dados de um banco de dados.

Restrições de Comandos Shell: Todos os executáveis devem usar caminhos absolutos (por exemplo, /usr/bin/curl e não curl). Comandos destrutivos (rm, bash, sh, etc.) são bloqueados. Substituição de comandos ($(...), crases) e redirecionamento de saída (>, >>) são rejeitados. Consulte docs/configuration.md para obter detalhes completos.

Segurança de Arquivos Locais: Caminhos de arquivo que contenham .. (travessia de diretório pai) são rejeitados por segurança.

registro rpz

O termo RPZ define uma zona de política de resposta.
O registro rpz consiste em:

  • nome rpz;
  • tempo de refresh SOA em segundos;
  • tempo de retry SOA em segundos;
  • tempo de expiração SOA em segundos;
  • TTL de NXDomain SOA em segundos;
  • Cache. Valores possíveis: true ou false. true define que o RPZ deve ser armazenado em cache, false - não armazenado em cache, fontes de zona ativas são baixadas e um RPZ é gerado por solicitação AXFR. Zonas "ativas" não suportam transferência incremental de zona. Se o feed RPZ não for armazenado em cache, ele será, ainda assim, temporariamente guardado em um cache quente. Caso uma solicitação expire por timeout de um cliente, poderemos responder na próxima vez. O tempo AXFR será usado para determinar a vida útil do cache;
  • Curingas. Valores possíveis: true ou false. Define se regras curinga devem ser geradas;
  • Ação. Consulte a tabela de Ações RPZ abaixo;
  • Lista de chaves TSIG e grupos de chaves;
  • Tipo de IOCs usados no RPZ: mixed, fqdn, ip. É usado para otimização.
  • Tempo de atualização completa da zona em segundos (Tempo AXFR). Atualização e reconstrução completas da zona se o MD5 dos IOCs for diferente;
  • Tempo de atualização incremental da zona (Tempo IXFR). As fontes devem suportar atualizações incrementais. "0" significa nenhuma atualização incremental de zona;

Ações RPZ

Várias ações locais podem ser combinadas em uma lista: [{"local_a","127.0.0.1"},{"local_aaaa","fe80::1"},{"local_txt","Blocked"}]

Exemplo de registro rpz:``` {rpz,{"zone_name",soa_refresh, soa_update_retry,soa_expire,soa_nxdomain_ttl,"cache","wildcards","action",["key1","key2"],"Zone_type",AXFT_Time, IXFR_Time,["source1","source2"],["notify_ip1","notify_ip2"],["whitelist_1","whitelist_2"]}}.

{rpz,{"zone_name",soa_refresh, soa_update_retry,soa_expire,soa_nxdomain_ttl,"cache","wildcards","action",["key1","key2",{groups,["group1","group2"]}],"Zone_type",AXFT_Time, IXFR_Time,["source1","source2"],["notify_ip1","notify_ip2"],["whitelist_1","whitelist_2"]}}.

{rpz,{"mixed.ioc2rpz",7202,3600,2592000,7200,"true","true","passthru",["dnsproxykey_1","dnsproxykey_2"],"mixed",86400,3600,["sample_fqdn","sample_expire","sample_ip"],[],["whitelist_1","whitelist_2"]}}.

{rpz,{"mixed.ioc2rpz",7202,3600,2592000,7200,"true","true","passthru",["dnsproxykey_1","dnsproxykey_2",{groups,["public","ip2"]}],"mixed",86400,3600,["sample_fqdn","sample_expire","sample_ip"],[],["whitelist_1","whitelist_2"]}}.

%% With explicit per-feed source tracking (16-field form; trailing auto): {rpz,{"mixed.ioc2rpz",7202,3600,2592000,7200,"true","true","passthru",["dnsproxykey_1"],"mixed",86400,3600,["sample_fqdn","sample_expire","sample_ip"],[],["whitelist_1"],auto}}.

root@kitploit:~
### Atribuição de Fonte de IOC
Um feed RPZ é construído mesclando indicadores de múltiplas fontes. A atribuição de fonte permite que a API de consulta de IOC informe **quais fonte(s) dentro de um feed** contribuíram com um indicador — útil para triar um falso positivo relatado. O rastreamento está **desativado por padrão** e é controlado por feed, com um padrão global opcional no nível do servidor.

**Configuração**

- Por feed: o elemento `TrackSources` opcional final (16º) da tupla `{rpz,{...}}` — `auto | true | false`.
- Padrão global do servidor: o elemento `TrackSources` opcional final (5º) da tupla `{srv,{...}}` — `off | auto | on` (padrão `off`).

Ambos são opcionais e compatíveis com versões anteriores: arquivos de configuração existentes (`rpz` de 15 campos, `srv` de 4 campos) são carregados inalterados e se comportam como off.

**Precedência de resolução** — o estado efetivo de um feed é resolvido como:
1. o valor `track_sources` explícito do feed, se definido;
2. caso contrário, o padrão global do servidor;
3. caso contrário, o padrão interno `off`.

`auto` significa: rastrear apenas feeds **de múltiplas fontes**. Feeds de fonte única nunca são mascarados — o nome da sua única fonte é retornado diretamente (sem custo de rastreamento).

**API — o campo aditivo `sources`**

A resposta `/api/v1/ioc/:ioc` ganha um novo campo `sources` em cada objeto de feed. Ele é **aditivo e compatível com versões anteriores**: todos os campos existentes permanecem inalterados, então clientes antigos que o ignoram continuam funcionando.

- Feed rastreado com múltiplas fontes: um array JSON dos nomes das fontes contribuintes.
- Feed de fonte única: um array de um único elemento com o nome dessa fonte.
- Rastreamento desativado ou atribuição desconhecida (ex.: uma linha em cache anterior à atualização, antes da reconstrução única via AXFR): `null` (JSON) / `(disabled)` ou `(unavailable)` (TXT).```json
{
  "feed": "mixed.ioc2rpz",
  "wildcard": "true",
  "type": "fqdn",
  "rpz_serial": 1709000000,
  "ioc_expiration": 0,
  "sources": ["abuse-ch", "internal-list"]
}

Feed de fonte única: "sources": ["sample_fqdn"]. Rastreamento desativado/desconhecido: "sources": null.

Implantação (desativada por padrão)

Atualizar o binário não muda nada — sem rastreamento, sem reconstruções de zona, API inalterada — até que um valor de track_sources seja definido. Os feeds são gerenciados pela GUI; a GUI/site da comunidade gravará esses valores de configuração opcionais e exibirá sources em uma atualização posterior. Ativar o rastreamento para um feed em cache aciona uma reconstrução AXFR única para popular as máscaras de origem.

Limitações

  • A atribuição está disponível apenas para feeds em cache (cache = "true"), pois a consulta à API lê a tabela de cache IXFR.
  • As máscaras são autoritativas após uma reconstrução AXFR completa. Em atualizações IXFR, as máscaras para indicadores recém-adicionados são definidas corretamente, mas uma alteração de máscara para um indicador já presente (uma segunda fonte começa a listar um IOC existente) pode ser reconciliada apenas no próximo AXFR.
  • As máscaras de origem são posicionais por zona (bit i = i-ésima fonte). Reordenar ou editar a lista de fontes de uma zona força uma reconstrução AXFR única (detectado por uma verificação de assinatura de fonte) para que as máscaras sejam recalculadas.
  • Feeds com mais de 63 fontes usam uma máscara de bitmap binário mais ampla (padrão) para que a atribuição permaneça correta.
Arquivo de configuração de exemplo (clique para expandir)```erlang {srv,{"ns1.rpz-proxy.com","support.rpz-proxy.com",["dnsmkey_3"],["127.0.0.1","10.42.0.10"]}}. {cert,{"cfg/ioc2rpz_dot.crt", "cfg/ioc2rpz_dot.key", ""}}.

{key,{"dnsproxykey_1","md5","apXqLsDs90H213eV6LS9ryYp5tY8YTpkttOkRCve7dp1Zeob3SGAbaVU9BShpsW25MmR8mTiX5OY0Qetv977Yw=="}}. {key,{"dnsproxykey_2","sha512","03uuaGl9kqfenjRgIeCv6e29lVvMwviB1+cDX1I0jcVOcTU4jWFwRkfo3ULRMD+NGDfwzYvXkJ94FNEaAW4vzw=="}}. {key,{"dnsmkey_3","sha512","03uuaGl9kqfenjRgIeCv6e29lVvMwviB1+cDX1I0jcVOcTU4jWFwRkfo3ULRMD+NGDfwzYvXkJ94FNEaAW4vzw=="}}.

{whitelist,{"whitelist_1","file:cfg/sample_whitelist.txt",none}}. {whitelist,{"whitelist_2","file:cfg/whitelist2.txt",""}}.

{source,{"sample_fqdn","file:cfg/sample_ioc_fqdn.txt","[:AXFR:]",none}}. {source,{"sample_expire","file:cfg/sample_ioc_expire.txt","[:AXFR:]","^([A-Za-z0-9][A-Za-z0-9\-\._]+)\t([0-9TZ:\-]+)$"}}. {source,{"sample_ip","file:cfg/sample_ioc_ip.txt","[:AXFR:]",none}}.

{rpz,{"localdata.ioc2rpz",7202,3600,2592000,7200,"false","true",[{"local_aaaa","fe80::1"},{"local_a","127.0.0.1"},{"local_a","127.0.0.2"},{"local_a","127.0.0.3"},{"local_a","127.0.0.4"},{"local_cname","www.example.com"},{"local_txt","Text Record www.example.com"},{"local_txt","Text Record 2"}],["dnsproxykey_1", "dnsproxykey_2"],"mixed",30,30,["sample_fqdn"],[],["whitelist_1","whitelist_2"]}}. {rpz,{"dga.ioc2rpz",7202,3600,2592000,7200,"true","true","nodata",["dnsproxykey_1","dnsproxykey_2"],"fqdn",172800,3600,["sample_expire"],[],[]}}. {rpz,{"mixed.ioc2rpz",7202,3600,2592000,7200,"true","true","passthru",["dnsproxykey_1", "dnsproxykey_2"],"mixed",86400,3600,["sample_fqdn","sample_expire"],[],["whitelist_1","whitelist_2"]}}. {rpz,{"ip-block.ioc2rpz",7202,3600,2592000,7200,"false","true","nxdomain",["dnsproxykey_1","dnsproxykey_2"],"ip",172800,0,["sample_ip"],[],[]}}.

root@kitploit:~
</details>

## Valores de configuração predefinidos - include/ioc2rpz.hrl
include/ioc2rpz.hrl contém parâmetros pré-compilados.

Parâmetros padrão:
- ``MGMToDNS`` (true/false) - habilita gerenciamento por DNS/TCP;
- ``DBStorage`` (ets) - define o armazenamento do banco de dados para caches AXFR e IXFR. A versão atual suporta apenas ETS;
- ``SaveETS`` (true/false) - define se as tabelas ETS AXFR/IXFR devem ser salvas em disco;
- ``Port`` (valor numérico, 1 - 65535) - define a porta DNS na qual o serviço está em execução;
- ``PortTLS`` (valor numérico, 1 - 65535) - define uma porta DoT na qual o serviço está em execução;
- ``PortREST`` (valor numérico, 1 - 65535) - define uma porta HTTPs na qual o serviço está em execução;
- ``TTL`` (valor numérico, em segundos) - TTL padrão para registros DNS/regras RPZ.
- ``DefConf`` (string) - arquivo de configuração padrão;
- ``DefDB`` (string) - caminho do banco de dados padrão;
- ``logTS`` - se definido, um timestamp é adicionado às mensagens de log;
- ``debug`` - se definido, mensagens de log de depuração são impressas;
- ``TLSVersion`` ('tlsv1.2-1.3') - versões TLS suportadas para DoT e API REST;

Parâmetros de otimização:
- ``DNSPktMax`` (valor numérico, 100 - 65535) - tamanho máximo de pacote. Valores recomendados:
  - 16384 - tamanho mínimo de transferência de zona;
  - 65535 - quantidade mínima de pacotes DNS;
- ``Compression`` (valor numérico, 0 - 9) - Nível de compressão (0 - sem compressão, 9 - compressão máxima). O cache AXFR e as tabelas em disco armazenam dados compactados;
- ``ZoneRefTime`` (valor numérico, em milissegundos) - define o intervalo de verificação de atualização da zona;
- ``TCPTimeout`` (valor numérico, em milissegundos) - define o timeout da sessão TCP;
- ``HotCacheTime`` (valor numérico, em segundos) - Tempo de cache quente para IOCs, Rules, Packets. Zonas em tempo real (live zones) são armazenadas em um cache quente;
- ``HotCacheTimeIXFR`` (valor numérico, em segundos) - Tempo de cache quente para IOCs IXFR em um cache quente. Por padrão, os indicadores IXFR são armazenados em cache por um minuto (mesmo se definido como 0) porque o serial atual é sempre arredondado para o minuto anterior;
- ``RATE_LIMIT_WINDOW`` (valor numérico, em milissegundos, padrão 10000) - duração da janela de limite de taxa por IP;
- ``MAX_REQUESTS_PER_WINDOW`` (valor numérico, padrão 1) - máximo de requisições DNS por IP por janela de limite de taxa;
- ``ShellMaxRespSize`` (valor numérico, padrão 2 GiB) - tamanho máximo de resposta para fontes de comando shell;
- ``SourcePullTimeout`` (valor numérico, em milissegundos, padrão 300000) - timeout para downloads de fontes (5 minutos);

## Como os caches AXFR (completo) e IXFR (incremental) são atualizados
- O cache AXFR sempre contém zonas pré-construídas sem registros SOA/NS/TSIG. Pré-construídas significa que todos os registros são divididos por pacotes e os rótulos foram encurtados/compactados.
- Se um servidor recebe uma requisição AXFR, ele recupera pacotes do cache AXFR, adiciona registros SOA/NS e TSIG se necessário.
- A atualização de zonas AXFR deve ser considerada um procedimento de limpeza, que deve ocorrer periodicamente. Apenas para garantir que não haja dessincronização entre as fontes e o cache.
- Para zonas grandes, as atualizações AXFR devem ser agendadas com pouca frequência para minimizar o impacto no desempenho do servidor e na quantidade de dados transferidos para todos os clientes.
- Todas as alterações, se possível, devem ser feitas por meio de atualizações incrementais de zona. Nesse caso, o cache AXFR será reconstruído somente se uma zona foi atualizada.
- [TODO] Devido a uma otimização, apenas o último pacote será reconstruído para novos IOCs e pacotes relevantes e correspondentes para os IOCs expirados.
- O cache IXFR contém apenas IOCs e datas de expiração. [TODO] e IDs de pacotes (para possibilitar a reconstrução rápida da zona).
- O registro RPZ contém o Serial atual da zona e Serial_IXFR. Serial_IXFR serve como um serial mínimo de zona incremental que está disponível para uma transferência incremental de zona.
- O cache IXFR é limpo após a atualização completa da zona (AXFR). Serial_IXFR = Serial. Os clientes receberão a atualização completa da zona em qualquer caso, por isso é importante ter a transferência de zona AXFR com pouca frequência.
- Quando o cache IXFR é atualizado, o cache AXFR deve ser reconstruído.
- Se uma zona não suporta atualizações IXFR -> ela não é salva na tabela IXFR.
- Zonas em tempo real (live zones) não são armazenadas em cache nos caches AXFR, IXFR, mas as fontes (IOCs) podem ser armazenadas em cache no cache quente.

## Cache quente
Todos os IOCs, Rules, Packets, incluindo RPZs em tempo real, são armazenados no cache quente. Os parâmetros pré-compilados ``HotCacheTime``, ``HotCacheTimeIXFR`` definem o tempo de armazenamento.

## Como experimentar o ioc2rpz™ (ou feeds RPZ de amostra e gratuitos hospedados pelo ioc2rpz™)
### Aviso legal
O autor não assume responsabilidade ou obrigação por quaisquer erros ou omissões no conteúdo desses feeds RPZ. Os feeds são fornecidos "no estado em que se encontram" (as is), sem garantias de completude, precisão, utilidade ou atualidade, apenas para demonstrar a tecnologia ioc2rpz™. A distribuição do serviço de feeds RPZ pode ser interrompida ou encerrada sem aviso prévio. O autor não é responsável por quaisquer danos diretos ou indiretos causados pelo uso deste serviço.

### Feeds RPZ
Você pode testar a tecnologia ioc2rpz™ ao se registrar na [comunidade ioc2rpz™](https://ioc2rpz.net) com os seguintes feeds:
- [notracking](https://github.com/notracking/hosts-blocklists);
- [Phishtank](https://www.phishtank.com/).

### Configuração de exemplo do BIND```
options {
  #This is just options for RPZs. Add other options as required
  recursion yes;
  response-policy {
    ####FQDN only zones
    ####Mixed zones
    zone "phishtank.ioc2rpz" policy nxdomain;
    ####IP only zones
  } qname-wait-recurse no break-dnssec yes;
};

key "ioc2rpz-YOUR-UNIQUE-KEY-NAME"{
  algorithm hmac-sha256; secret "ioc2rpz-YOUR-UNIQUE-KEY";
};

zone "phishtank.ioc2rpz" {
  type slave;
  file "/var/cache/bind/phishtank.ioc2rpz";
  masters {94.130.30.123  key "ioc2rpz-YOUR-UNIQUE-KEY-NAME";};
};
Baixar ferramenta
ProblemaSolução
Porta já em usoVerifique com lsof -i :53 / lsof -i :853. {reuseaddr, true} está definido em sockets de escuta para reinicializações rápidas.
DoT não aceitando conexõesVerifique se {cert, ...} está configurado. Verifique os workers TLS: supervisor:count_children(ioc2rpz_tls_sup_v6). Verifique se a porta 853 não está bloqueada pelo firewall.
Falha na transferência de zona (incompatibilidade TSIG)Verifique se o nome da chave e o segredo correspondem entre cliente e servidor. Procure eventos CEF 104/105 nos logs.
Falhas no download de fontesVerifique a conectividade de rede. Procure por Error downloading feed nos logs. O servidor tenta novamente 3 vezes com atraso de 3s. Para fontes HTTPS, garanta um certificado TLS válido.
Alto uso de memóriaVerifique os tamanhos das tabelas ETS no shell Erlang. rate_limits e rpz_hotcache_table são limpos periodicamente. Considere reduzir ?HotCacheTime.
  • Lista das fontes;
  • Lista de servidores DNS (endereços IP) que devem ser notificados sobre atualizações de RPZ (consulte DNS NOTIFY);
  • Lista de whitelists.
  • (opcional) TrackSources — atribuição de fonte por feed: auto | true | false. Quando presente, substitui o padrão global do servidor. Quando omitido (formato de 15 campos), o feed herda o padrão do servidor (#srv TrackSources, off a menos que configurado). Consulte Atribuição de Fonte de IOC.
  • AçãoValor de ConfiguraçãoDescrição
    NXDOMAIN"nxdomain"Retorna NXDOMAIN (domínio não existe)
    NODATA"nodata"Retorna resposta vazia (domínio existe, sem registros)
    Passthru"passthru"Permite a consulta (regra de isenção)
    Descartar"drop"Descarta a consulta silenciosamente
    Somente TCP"tcp-only"Força o cliente a tentar novamente via TCP
    Bloquear NS"blockns"Bloqueia o servidor de nomes autoritativo
    Redirecionar (domínio){"redirect_domain","example.com"}Redireciona para um domínio especificado (alias para local_cname)
    Redirecionar (IP){"redirect_ip","127.0.0.1"}Redireciona para um IP especificado (alias para local_a/local_aaaa)
    Local A{"local_a","127.0.0.1"}Retorna um endereço IPv4 personalizado
    Local AAAA{"local_aaaa","fe80::1"}Retorna um endereço IPv6 personalizado
    Local CNAME{"local_cname","www.example.com"}Retorna um redirecionamento CNAME
    Local TXT{"local_txt","Text Record"}Retorna um registro TXT

    Exemplo de configuração do PowerDNS```

    rpzMaster("94.130.30.123", "phishtank.ioc2rpz", {defpol=Policy.NXDOMAIN, tsigname="ioc2rpz-YOUR-UNIQUE-KEY-NAME", tsigalgo="hmac-sha256", tsigsecret="ioc2rpz-YOUR-UNIQUE-KEY"})

    root@kitploit:~
    ### Exemplo de configuração Infoblox (arquivo de importação)```
    header-responsepolicyzone,fqdn*,zone_format*,rpz_policy,substitute_name,view,zone_type,external_primaries,grid_secondaries,priority
    responsepolicyzone,phishtank.ioc2rpz,FORWARD,Nxdomain,,default,responsepolicy,srv_1/94.130.30.123/FALSE/FALSE/TRUE/ioc2rpz-YOUR-UNIQUE-KEY-NAME/ioc2rpz-YOUR-UNIQUE-KEY/HMAC-SHA256,infoblox.localdomain/False/False/False,0
    

    Exemplo de DIG (para obter SOA)```

    dig @94.130.30.123 -y hmac-sha256:ioc2rpz-YOUR-UNIQUE-KEY-NAME:ioc2rpz-YOUR-UNIQUE-KEY phishtank.ioc2rpz SOA

    kdig @94.130.30.123 -y hmac-sha256:ioc2rpz-YOUR-UNIQUE-KEY-NAME:ioc2rpz-YOUR-UNIQUE-KEY phishtank.ioc2rpz SOA +tls

    root@kitploit:~
    ## Alguns feeds gratuitos de inteligência de ameaças
    - [Netlab](http://data.netlab.360.com)
    - [lista awesome-threat-intelligence no GitHub](https://github.com/hslatman/awesome-threat-intelligence)
    
    Você pode encontrar outros feeds de IOC na página wiki: https://github.com/Homas/ioc2rpz/wiki/IOC-Sources.
    
    ## Documentação Adicional
    
    Para documentação detalhada, veja o diretório `docs/`:
    
    - [docs/architecture.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/architecture.md) — árvore de supervisão OTP, responsabilidades dos módulos, tabelas ETS, fluxo de dados
    - [docs/configuration.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/configuration.md) — referência completa de configuração com todos os tipos de tuplas e opções
    - [docs/deployment.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/deployment.md) — instruções de build, implantação com Docker, certificados, monitoramento, solução de problemas
    - [docs/protocols.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/protocols.md) — suporte a protocolos (UDP/TCP/DoT/DoH), API REST, TSIG, limitação de taxa, DNS NOTIFY
    
    ## Referências
    - [RFC-6895 Domain Name System (DNS) IANA Considerations](https://tools.ietf.org/html/rfc6895)
    - [RFC-1035 Domain Names - Implementation and Specification](https://tools.ietf.org/html/rfc1035)
    - [RFC-1995 Incremental Zone Transfer in DNS](https://tools.ietf.org/html/rfc1995)
    - [DNS Response Policy Zones (RPZ)](https://tools.ietf.org/html/draft-ietf-dnsop-dns-rpz-00) + [vixie](https://tools.ietf.org/html/draft-vixie-dns-rpz-02)
    - [RFC-2845 Secret Key Transaction Authentication for DNS (TSIG)](https://tools.ietf.org/html/rfc2845)
    - [RFC-2104 HMAC: Keyed-Hashing for Message Authentication](https://tools.ietf.org/html/rfc2104)
    - [RFC-4635 HMAC SHA TSIG Algorithm Identifiers](https://tools.ietf.org/html/rfc4635)
    - [RFC-5966 DNS Transport over TCP - Implementation Requirements](https://tools.ietf.org/html/rfc5966)
    - [RFC-1996 A Mechanism for Prompt Notification of Zone Changes (DNS NOTIFY)](https://tools.ietf.org/html/rfc1996)
    - [Extension Mechanisms for DNS (EDNS(0))](https://tools.ietf.org/html/rfc6891) + [EDNS Option Codes](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-11)
    - [RFC-7873 Domain Name System (DNS) Cookies](https://tools.ietf.org/html/rfc7873)
    - [RFC-7858 Specification for DNS over Transport Layer Security (TLS)](https://tools.ietf.org/html/rfc7858)
    - [Cowboy Web Server](https://ninenines.eu)
    - [Rebar3](https://www.rebar3.org)
    
    <details>
    <summary><strong>Referência de Códigos de Evento CEF</strong> (clique para expandir)</summary>
    
    | Código | Severidade | Evento | Descrição |
    |------|----------|-------|-------------|
    | 101 | Baixa | Pacote DNS inválido | Pacote DNS malformado recebido |
    | 102 | Baixa | Requisição DNS inválida | Requisição DNS não analisável |
    | 103 | Média | Recusada | Requisição DNS recusada |
    | 104 | Média | Chave TSIG não encontrada | A requisição usou uma chave TSIG desconhecida |
    | 105 | Média | TSIG MAC inválido | Falha na verificação da assinatura TSIG |
    | 106 | Média | TSIG hora inválida | Timestamp TSIG fora do intervalo |
    | 107 | Média | Outro erro TSIG | Erro TSIG não classificado |
    | 108 | Média | Posição TSIG incorreta | Registro TSIG em posição inesperada |
    | 109 | Baixa | Resposta DNS recebida | Resposta DNS inesperada recebida |
    | 120 | Média | RPZ não encontrada | A zona RPZ solicitada não existe |
    | 121 | Baixa | RPZ não pronta | A zona RPZ ainda está carregando/atualizando |
    | 130 | Baixa | Erro de transferência RPZ | Erro durante a transferência de zona (somente transferência RPZ) |
    | 131 | Baixa | Transferência RPZ encerrada | A conexão remota foi encerrada durante a transferência (somente transferência RPZ) |
    | 140 | Alta | Falha na autenticação básica REST | Falha na autenticação básica da API REST |
    | 141 | Alta | Falha na autenticação REST | Falha na autorização da API REST |
    | 145 | Alta | MGMT REST negado | Requisição de gerenciamento REST negada pela ACL |
    | 146 | Alta | Falha na requisição MGMT | Falha no processamento da requisição de gerenciamento |
    | 147 | Alta | Requisição não suportada | Endpoint desconhecido da API REST |
    | 148 | Alta | Zona não encontrada | A API REST referenciou uma zona inexistente |
    | 150 | Baixa | Comando shell executado | Comando de origem shell executado (informação) |
    | 151 | Alta | Comando shell rejeitado | Comando de origem shell rejeitado (segurança) |
    | 201 | Baixa | Sucesso na transferência RPZ | Transferência de zona concluída |
    | 202 | Baixa | Consulta DNS | Consulta DNS padrão processada |
    | 221 | Baixa | Notificação DNS | Notificação enviada ao servidor secundário |
    | 222 | Média | Erro na notificação DNS | Falha ao enviar notificação |
    | 230 | Alta | Requisição MGMT | Operação de gerenciamento executada |
    | 301 | Alta | Requisição MGMT negada | Comando de gerenciamento DNS negado |
    | 429 | Alta | Muitas requisições | Limite de taxa excedido |
    | 501 | Alta | Possível DDoS | Padrão CVE-2004-0789 detectado |
    
    </details>
    
    # Quer apoiar o projeto?
    Você pode apoiar o projeto ioc2rpz™ e a comunidade ioc2rpz™ (https://ioc2rpz.net)  por meio do [GitHub Sponsor](https://github.com/sponsors/Homas) (pagamentos recorrentes). Para fazer uma doação única, você pode usar o [PayPal](https://paypal.me/ioc2rpz) ou Zelle (nosso e-mail: zelle [at] ioc2rpz [.] net).
    
    # Apoiadores
    Um agradecimento especial a **craSH** e **rrbone**, que apoiam meus projetos no [GitHub Sponsor](https://github.com/sponsors/Homas).
    
    # Contato
    Você pode nos contatar por e-mail: feedback(at)ioc2rpz[.]net ou no [Telegram](https://t.me/ioc2rpz).
    
    # Licença
    Copyright 2017 - 2025 Vadim Pavlov ioc2rpz[at]gmail[.]com
    
    Licenciado sob a Apache License, Versão 2.0 (a "Licença"); você não pode usar este arquivo exceto em conformidade com a Licença.
    Você pode obter uma cópia da Licença em  
    
        http://www.apache.org/licenses/LICENSE-2.0  
    
    A menos que exigido pela lei aplicável ou acordado por escrito, o software distribuído sob a Licença é distribuído em uma BASE "COMO ESTÁ", SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, expressas ou implícitas. Consulte a Licença para obter as permissões e limitações específicas que regem o uso do software.