
Kit de Captura e Monitoramento Passivo de DNS
Estamos explorando uma solução SaaS gerenciada para o dnsmonster! Ajude a moldar o futuro do monitoramento passivo de DNS compartilhando seu feedback e requisitos: Participe da nossa pesquisa rápida
Índice
Framework de monitoramento passivo de DNS construído em Golang.
dnsmonster implementa um farejador de pacotes para tráfego DNS. Ele pode aceitar tráfego de um arquivo pcap, uma interface ativa ou um socket dnstap,
e pode ser usado para indexar e armazenar centenas de milhares de consultas DNS por segundo, pois mostrou-se capaz de indexar mais de 200 mil consultas DNS por segundo em um computador comum. Ele visa ser escalável, simples e fácil de usar, e ajudar
equipes de segurança a entender os detalhes sobre o tráfego DNS de uma empresa. O dnsmonster não busca seguir conversas DNS, mas sim indexar pacotes DNS assim que eles chegam. Ele também não visa violar a privacidade dos usuários finais, com a capacidade de mascarar IPs de Camada 3 (IPv4 e IPv6), permitindo que as equipes realizem análises de tendências em dados agregados sem conseguir rastrear as consultas até um indivíduo. Blogpost
O código anterior à versão 1.x é considerado de qualidade beta e está sujeito a mudanças significativas. Visite as notas de versão de cada tag para ver a lista de cenários de quebra entre cada versão e como mitigar possíveis perdas de dados.```mermaid graph TD subgraph Input B1["network input"] B2["pcap file"] B3["dnstap socket"] end
subgraph "Process"
C1["Sampling based of ratio"]
C2["Packet Process"]
C3["Dispatcher"]
O11["Output1"]
O12["Domain Skip (optional)"]
O13["Domain Allow (optional)"]
O21["Output2"]
O22["Domain Skip (optional)"]
O23["Domain Allow (optional)"]
O31["Output3"]
O32["Domain Skip (optional)"]
O33["Domain Allow (optional)"]
end
B1 --> Process
B2 --> Process
B3 --> Process
C1 --> C2
C2 --> C3
C3 --> O11
C3 --> O21
C3 --> O31
O11 --> O12 --> O13
O21 --> O22 --> O23
O31 --> O32 --> O33
subgraph Output
Splunk
Syslog
H["ClickHouse"]
Postgres
Kafka
I["JSON File"]
Influx
Elastic
J["stdout"]
Parquet
Sentinel
end
O13 --> H
O23 --> I
O33 --> J
# Principais funcionalidades
- Capacidade de usar a captura de pacotes `afpacket` e de cópia zero do Linux.
- Suporta BPF
- Capacidade de mascarar o endereço IP para melhorar a privacidade
- Capacidade de ter uma taxa de amostragem de pré-processamento
- Capacidade de ter uma lista de 'skip' `fqdn`s para evitar escrever alguns domínios/sufixos/prefixos no armazenamento
- Capacidade de ter uma lista de domínios 'allow', usada para registrar acesso a determinados domínios
- Recarga a quente de arquivos/urls de domínios skip e allow
- Saída modular com lógica configurável por fluxo de saída.
- Política automática de retenção de dados usando o atributo TTL do ClickHouse
- Painel Grafana integrado para saída do ClickHouse.
- Capacidade de ser distribuído como um binário único, vinculado estaticamente
- Capacidade de ser configurado usando variáveis de ambiente, opções de linha de comando ou arquivo de configuração
- Capacidade de amostrar saídas usando a capacidade SAMPLE do ClickHouse
- Capacidade de enviar métricas usando `prometheus` e `statstd`
- Alta taxa de compressão graças ao armazenamento LZ4 integrado do ClickHouse
- Suporta DNS sobre TCP, DNS Fragmentado (udp/tcp) e IPv6
- Suporta [dnstap](https://github.com/dnstap/golang-dnstap) via soquete Unix ou TCP
- Integração SIEM integrada com Splunk e Microsoft Sentinel
# Instalação
## Linux
A melhor maneira de começar com `dnsmonster` é baixar o binário da seção de releases. O binário é compilado estaticamente contra `musl`, portanto deve funcionar imediatamente em muitas distribuições. Para suporte a `afpacket`, você deve usar kernel 3.x+. Qualquer distribuição Linux moderna (CentOS/RHEL 7+, Ubuntu 14.0.4.2+, Debian 7+) vem com uma versão 3.x+, então deve funcionar imediatamente. Se sua distribuição não estiver funcionando com a versão pré-compilada, envie um problema com os detalhes e compile o `dnsmonster` manualmente usando esta seção [Compilar Manualmente](#build-manually).
### Contêiner
Como o `dnsmonster` usa funcionalidade de captura bruta de pacotes, o daemon Docker/Podman deve conceder a capacidade ao contêiner```
sudo docker run --rm -it --net=host --cap-add NET_RAW --cap-add NET_ADMIN --name dnsmonster ghcr.io/mosajjal/dnsmonster:latest --devName lo --stdoutOutputType=1
libpcap:
Certifique-se de ter os pacotes go, libpcap-devel e linux-headers instalados. O nome dos pacotes pode variar de acordo com sua distribuição. Depois disso, basta clonar o repositório e executar `go build ./cmd/dnsmonster````sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster ./cmd/dnsmonster- sem `libpcap`:
`dnsmonster` usa apenas uma função do `libpcap`, que é converter os filtros no estilo `tcpdump` em bytecode BPF. Se você pode viver sem suporte BPF, pode compilar o `dnsmonster` sem `libpcap`. Note que para qualquer outra plataforma, a captura de pacotes recai para o `libpcap`, então ele se torna uma dependência obrigatória (*BSD, Windows, Darwin)```sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster -tags nolibpcap ./cmd/dnsmonster
A build acima também funciona em ARMv7 (RPi4) e AArch64.