
Инструментарий для пассивного захвата и мониторинга DNS
Мы изучаем возможность создания управляемого SaaS-решения для dnsmonster! Помогите сформировать будущее пассивного мониторинга DNS, поделившись своими отзывами и требованиями: Пройдите наш короткий опрос
Содержание
Фреймворк пассивного мониторинга DNS, написанный на Golang.
dnsmonster реализует сниффер пакетов для DNS-трафика. Он может принимать трафик из файла pcap, с живого интерфейса или через сокет dnstap
и способен индексировать и хранить сотни тысяч DNS-запросов в секунду: доказано, что на обычном компьютере он индексирует более 200 000 запросов в секунду. Инструмент ориентирован на масштабируемость, простоту и удобство использования, помогая
командам безопасности понимать детали DNS-трафика предприятия. dnsmonster не стремится отслеживать DNS-диалоги; скорее, он индексирует DNS-пакеты по мере их поступления. Также он не нарушает
конфиденциальность конечных пользователей, позволяя маскировать IP-адреса L3 (IPv4 и IPv6), что даёт возможность проводить анализ трендов на агрегированных данных без возможности связать запросы с конкретным пользователем. Пост в блоге
Код до версии 1.x считается бета-версией и может содержать критические изменения. Пожалуйста, ознакомьтесь с примечаниями к каждому тегу, чтобы увидеть список возможных поломок между релизами и способы предотвращения потери данных.```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
# Основные возможности
- Возможность использования `afpacket` и захвата пакетов с нулевым копированием в Linux.
- Поддержка BPF
- Возможность маскировки IP-адреса для повышения конфиденциальности
- Возможность задания коэффициента предварительной выборки (sampling)
- Возможность задания списка `fqdn` для пропуска, чтобы избежать записи определённых доменов/суффиксов/префиксов в хранилище
- Возможность задания списка "разрешённых" доменов для логирования доступа к определённым доменам
- «Горячая» перезагрузка файлов/ссылок со списками пропуска и разрешённых доменов
- Модульный вывод с настраиваемой логикой для каждого потока вывода.
- Автоматическая политика хранения данных с использованием атрибута TTL в ClickHouse
- Встроенная панель Grafana для вывода в ClickHouse.
- Возможность распространения в виде одного статически скомпонованного бинарного файла
- Возможность настройки через переменные окружения, параметры командной строки или конфигурационный файл
- Возможность семплирования (SAMPLE) результатов с помощью ClickHouse
- Возможность отправки метрик через `prometheus` и `statstd`
- Высокая степень сжатия благодаря встроенному хранилищу LZ4 в ClickHouse
- Поддержка DNS поверх TCP, фрагментированного DNS (udp/tcp) и IPv6
- Поддержка [dnstap](https://github.com/dnstap/golang-dnstap) через Unix-сокет или TCP
- Встроенная интеграция с SIEM через Splunk и Microsoft Sentinel
# Установка
## Linux
Лучший способ начать работу с `dnsmonster` — загрузить бинарный файл из раздела релизов. Бинарный файл статически собран с использованием `musl`, поэтому он должен работать «из коробки» во многих дистрибутивах. Для поддержки `afpacket` необходимо использовать ядро версии 3.x+. Любой современный дистрибутив Linux (CentOS/RHEL 7+, Ubuntu 14.0.4.2+, Debian 7+) поставляется с версией ядра 3.x+, поэтому всё должно работать «из коробки». Если предварительно скомпилированная версия не работает в вашем дистрибутиве, пожалуйста, создайте issue с подробностями и соберите `dnsmonster` вручную, используя раздел [Сборка вручную](#build-manually).
### Контейнер
Поскольку `dnsmonster` использует возможность захвата сырых пакетов, Docker/Podman демон должен предоставить контейнеру соответствующее разрешение (capability).```
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:
Убедитесь, что у вас установлены пакеты go, libpcap-devel и linux-headers. Названия пакетов могут отличаться в зависимости от вашего дистрибутива. После этого просто клонируйте репозиторий и выполните `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- без `libpcap`:
`dnsmonster` использует только одну функцию из `libpcap`, и это преобразование фильтров стиля `tcpdump` в байт-код BPF. Если вы можете обойтись без поддержки BPF, вы можете собрать `dnsmonster` без `libpcap`. Обратите внимание, что на любой другой платформе захват пакетов возвращается к `libpcap`, поэтому он становится жесткой зависимостью (*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
Приведённая выше сборка также работает на ARMv7 (RPi4) и AArch64.