Анализ сетевого трафика - это та область, где ставка на один инструмент чаще всего проигрывает. Wireshark силён в декодировании пакетов, но не предназначен для долгосрочного хранения. Zeek блестяще генерирует структурированные логи событий, но не строит дашбордов. Suricata ловит вторжения по сигнатурам, но не агрегирует данные. Чтобы собрать из этого зоопарка единую систему, специалисту приходится самому склеивать компоненты, настраивать общие хранилища, писать скрипты обмена данными. Альтернатива всему этому ручному труду существует - проект Malcolm от Idaho National Laboratory.

Malcolm объединяет лучшие открытые инструменты сетевой безопасности под одной крышей. Внутри живут Arkime для индексации полнопакетных захватов, Zeek для генерации логов сессий, Suricata для обнаружения вторжений, OpenSearch и Logstash для хранения и обработки данных, Kibana-подобные дашборды для визуализации, ClamAV с YARA для проверки извлечённых файлов. Всё это упаковано в Docker-контейнеры и собирается через docker-compose буквально одной командой запуска. Получается готовая SOC-платформа, которую раньше можно было найти только в проприетарных решениях за серьёзные деньги.

В материале разбирается полный цикл развёртывания Malcolm на сервере с Ubuntu 22.04. Создание выделенного системного пользователя, клонирование репозитория, прохождение интерактивного установщика с настройкой системных параметров ядра, конфигурация компонентов, генерация SSL-сертификатов и админских учёток, выкачивание Docker-образов и финальный запуск всего стека. К концу статьи читатель получает рабочую установку с веб-интерфейсами для анализа трафика и управления системой.

Создание выделенной системной учётной записи под нужды Malcolm и проверка минимальных требований к ресурсам сервера

Перед началом любых установок нужно трезво оценить, потянет ли сервер такое хозяйство. Malcolm - не лёгковесный инструмент. Минимальные требования говорят о 16 гигабайтах оперативной памяти и четырёх процессорных ядрах, и эти цифры лучше воспринимать как нижнюю планку, а не как комфортный режим. На реальных нагрузках стек прожорливее. OpenSearch один способен сожрать восемь гигабайт памяти, Logstash добавит ещё три, остальные контейнеры по гигабайту тут, по полгигабайта там. Если ставить Malcolm на хилую виртуалку, разочарование наступит быстро.

Дисковое пространство тоже стоит спланировать заранее. Полнопакетные захваты могут расти быстро - на гигабитном линке за сутки набегает порядка десяти терабайт сырых данных, если писать всё подряд. Поэтому большинство инсталляций используют фильтры захвата и ограничивают глубину хранения, но даже с такими ограничениями диска понадобится много.

Под нужды Malcolm создаётся отдельный системный пользователь. Это правильный паттерн - приложение работает в своей песочнице, не пересекается с остальными учётками, а его файлы лежат в собственном каталоге.

useradd -m -d /opt/malcolm -s /bin/bash -G sudo malcolm

Команда useradd с целым набором флагов делает несколько вещей разом. Флаг -m создаёт домашний каталог пользователя, -d /opt/malcolm задаёт нестандартное расположение этого каталога в /opt вместо привычного /home, -s /bin/bash указывает оболочку для входа, а -G sudo включает учётку в группу sudo с правами на повышение привилегий. Расположение в /opt тут не случайно - туда традиционно ставятся сторонние приложения, а Malcolm как раз стороннее решение, которое держит свои файлы отдельно от системных.

Дальше задаётся пароль для свежесозданного пользователя.

passwd malcolm

Утилита запросит новый пароль дважды для подтверждения. На боевом сервере он должен быть длинным и случайным, никаких qwerty123 - этот аккаунт получит права на управление всей сетевой аналитикой компании.

Полезно убедиться, какой UID присвоен пользователю - эта цифра пригодится при настройке Docker-контейнеров.

id malcolm

Стандартный вывод показывает идентификаторы пользователя, его основной группы и дополнительных групп.

uid=1000(malcolm) gid=1000(malcolm) groups=1000(malcolm),27(sudo)

Цифры 1000 для UID и GID - типовые значения для первого созданного пользователя в системе. Malcolm-инсталлятор будет спрашивать про эти числа, чтобы корректно выставить владельцев на файлах внутри контейнеров.

Клонирование официального репозитория Malcolm с GitHub и запуск интерактивного установщика для подготовки окружения

После создания учётной записи переключение в её контекст и переход к скачиванию самого приложения.

su - malcolm
git clone https://github.com/idaholab/Malcolm

Команда su с дефисом запускает новый shell от имени указанного пользователя с полной инициализацией окружения - переменные, рабочий каталог, всё как при обычном логине. Без дефиса просто меняется UID, но окружение остаётся от исходного пользователя, что часто приводит к странным эффектам.

Клонирование с GitHub скачивает весь исходный код проекта вместе с историей коммитов. Файл репозитория не маленький, но большую часть веса составляют тестовые данные и документация. Сама установка требует не так много места.

После завершения клонирования происходит переход в каталог проекта и запуск инсталлятора.

cd Malcolm
sudo ./scripts/install.py

Sudo тут необходим, потому что инсталлятор будет ставить системные пакеты, править файлы в /etc и выполнять прочие операции, требующие root-привилегий. Скрипт написан на Python и проводит пользователя через ряд интерактивных вопросов, на каждом из которых нужно осознанно ответить.

Installing required packages: ['apache2-utils', 'make', 'openssl', 'python3-dialog']

"docker info" failed, attempt to install Docker? (Y/n): Y

Attempt to install Docker using official repositories? (Y/n): Y
Installing required packages: ['apt-transport-https', 'ca-certificates', 'curl', 'gnupg-agent', 'software-properties-common']


Installing docker packages: ['docker-ce', 'docker-ce-cli', 'containerd.io']
Installation of docker packages apparently succeeded

Add a non-root user to the "docker" group?: Y

Enter user account: malcolm

Add another non-root user to the "docker" group?: n

"docker-compose version" failed, attempt to install docker-compose? (Y/n): Y

Install docker-compose directly from docker github? (Y/n): Y
Download and installation of docker-compose apparently succeeded


fs.file-max increases allowed maximum for file handles
fs.file-max= appears to be missing from /etc/sysctl.conf, append it? (Y/n): Y


fs.inotify.max_user_watches increases allowed maximum for monitored files
fs.inotify.max_user_watches= appears to be missing from /etc/sysctl.conf, append it? (Y/n): Y


fs.inotify.max_queued_events increases queue size for monitored files
fs.inotify.max_queued_events= appears to be missing from /etc/sysctl.conf, append it? (Y/n): Y


fs.inotify.max_user_instances increases allowed maximum monitor file watchers
fs.inotify.max_user_instances= appears to be missing from /etc/sysctl.conf, append it? (Y/n): Y

vm.max_map_count increases allowed maximum for memory segments
vm.max_map_count= appears to be missing from /etc/sysctl.conf, append it? (Y/n): Y


net.core.somaxconn increases allowed maximum for socket connections
net.core.somaxconn= appears to be missing from /etc/sysctl.conf, append it? (Y/n): Y

vm.dirty_background_ratio defines the percentage of system memory fillable with "dirty" pages before flushing
vm.dirty_background_ratio= appears to be missing from /etc/sysctl.conf, append it? (Y/n): Y

vm.dirty_ratio defines the maximum percentage of dirty system memory before committing everything
vm.dirty_ratio= appears to be missing from /etc/sysctl.conf, append it? (Y/n): Y

/etc/security/limits.d/limits.conf increases the allowed maximums for file handles and memlocked segments
/etc/security/limits.d/limits.conf does not exist, create it? (Y/n): Y

Происходящее заслуживает разбора. Инсталлятор сначала проверяет наличие Docker и docker-compose - без них Malcolm не запустится, потому что весь стек упакован в контейнеры. Если Docker не найден, скрипт предлагает поставить его из официальных репозиториев. Согласие на это обычно правильный выбор, потому что официальные пакеты от Docker свежее, чем те, что лежат в дистрибутивных репозиториях Ubuntu.

После установки Docker инсталлятор предлагает добавить пользователя malcolm в группу docker. Это позволит запускать контейнеры без sudo, что критично для нормальной работы. Без этого членства команды docker будут требовать постоянного повышения привилегий.

Дальше идёт длинная серия вопросов о системных параметрах ядра. Каждый параметр напрямую влияет на работу Malcolm, и согласие со всеми изменениями оправдано. Параметр fs.file-max увеличивает общий лимит файловых дескрипторов в системе - OpenSearch и Logstash открывают огромное количество файлов одновременно, и стандартного лимита им не хватает. Серия параметров fs.inotify.* поднимает пределы для механизма уведомлений об изменениях файлов - это нужно для отслеживания новых PCAP-файлов и автоматической их обработки.

Параметр vm.max_map_count прямо упомянут в требованиях OpenSearch - без его увеличения база отказывается стартовать, ругаясь на нехватку memory map areas. Параметры vm.dirty_background_ratio и vm.dirty_ratio управляют поведением страничного кеша при записи на диск - правильные значения уменьшают всплески дисковой активности при больших объёмах поступающих данных.

Файл /etc/security/limits.d/limits.conf задаёт лимиты для процессов через PAM - максимальное число открытых файлов, размер заблокированной в памяти области и так далее. Без этих лимитов JVM-процессы Java-компонентов стека упадут с OutOfMemoryError при первой серьёзной нагрузке.

После завершения работы инсталлятора система готова к следующему этапу - конфигурации самого Malcolm.

Тонкая настройка компонентов Malcolm через интерактивный режим конфигуратора и выбор сценариев захвата трафика

Установка нужных пакетов и системных параметров - это только полдела. Дальше предстоит выбрать, как именно Malcolm будет работать. Объёмы памяти под OpenSearch и Logstash, режим работы за прокси или напрямую, какие порты выставлять наружу, использовать ли LDAP, чем сканировать извлечённые файлы и куда их складывать. Все эти решения принимаются через специальный режим конфигуратора.

sudo ./scripts/install.py --configure

Скрипт снова заваливает пользователя вопросами, и на каждый нужно дать осознанный ответ. Разбор типовых решений выглядит так.

Подтверждение UID 1000 и GID 1000 - это те самые цифры из вывода команды id. Malcolm-процессы внутри контейнеров будут запускаться от этого пользователя, чтобы создаваемые ими файлы оказались доступны и для хост-системы.

Объём памяти под OpenSearch предлагается выставить в 10 гигабайт, под Logstash - 3 гигабайта. Это разумные значения для сервера с 16 гигабайтами RAM. Если памяти больше, цифры можно поднять для лучшей производительности при больших объёмах данных.

Три рабочих процесса Logstash - адекватная цифра для четырёхъядерной машины. Каждый воркер обрабатывает свой поток событий параллельно с остальными.

Перезапуск Malcolm при перезагрузке системы или Docker-демона стоит включить - вариант unless-stopped означает, что контейнеры будут возрождаться автоматически, если только их не остановили вручную.

Настройка HTTPS обязательна для боевой инсталляции. Malcolm генерирует self-signed сертификаты автоматически, но их можно заменить на нормальные от Let's Encrypt позже.

Работа за прокси - нет. Это дополнительный слой, который имеет смысл только в сложных корпоративных средах с обязательным проксированием всего трафика.

LDAP-аутентификация - нет, для начальной настройки достаточно локальных учёток. Подключить LDAP можно потом, когда станет понятно, как Malcolm используется в команде.

Локальное хранение снапшотов индексов OpenSearch в /opt/malcolm/Malcom/opensearch-backup - да. Это резервные копии индексов, которые позволят восстановить данные при катастрофе.

Сжатие снапшотов индексов - однозначно да. Это экономит дисковое пространство в разы при минимальных накладных расходах на CPU.

Удаление старых индексов при переполнении - решение зависит от стратегии хранения. На небольшом диске лучше включить, чтобы система не упала из-за нехватки места.

Reverse DNS lookup - нет. Каждый запрос к DNS добавляет задержку при индексации, а на большом потоке трафика это превращается в серьёзную нагрузку.

Hardware vendor OUI lookups - да. По первым трём байтам MAC-адреса Malcolm определит производителя оборудования, что часто помогает в анализе - сразу видно, какие устройства в сети.

Скоринг случайности строк - да. Помогает выявлять подозрительные имена файлов, доменов и хостов, генерируемых вредоносным ПО. Случайные строки - частый признак автоматически сгенерированного контента.

Внешний доступ к OpenSearch и Logstash - нет. Эти сервисы должны слушать только localhost, наружу торчит только веб-интерфейс через nginx.

Извлечение файлов через Zeek - да. Когда сетевые сессии передают файлы, Zeek может выдернуть их и сохранить для анализа. Поведение выбирается interesting - извлекаются только подозрительные типы. Метод сохранения quarantine изолирует файлы в отдельном каталоге.

Сканирование извлечённых файлов через ClamAV, YARA и Capa - да на все три. Это три разных подхода к анализу. ClamAV ищет известные вирусные сигнатуры, YARA применяет правила на основе паттернов, Capa определяет возможности исполняемых файлов через анализ кода. Вместе они дают многослойную защиту.

VirusTotal lookup - нет, без явной необходимости. Эта функция отправляет хеши файлов во внешний сервис, что может быть нежелательно по соображениям конфиденциальности.

Периодическое обновление сигнатур сканеров - да. Без этого через месяц защита станет бесполезной против свежих угроз.

Захват трафика в PCAP-файлы - да, это базовая функция системы. Без неё Malcolm превращается в обычный SIEM без полнопакетной аналитики.

Интерфейс захвата eth0 - имя меняется в зависимости от конкретной системы. Утилита ip a покажет реальные имена интерфейсов перед настройкой.

Захват через netsniff-ng - да. Это эффективный инструмент для записи на скоростях гигабит и выше. Tcpdump оставляется в стороне как альтернатива.

Фильтр захвата задаётся для исключения служебного трафика самого Malcolm - запросов к Elasticsearch на 9200 порту, Logstash на 5044 и Arkime на 8005. Без такого фильтра Malcolm начнёт записывать собственные запросы, создавая бесконечный цикл данных.

Отключение hardware offloading и подстройка размеров кольцевого буфера - нет, для начальной установки. Эти оптимизации нужны при работе с трафиком близким к производительности интерфейса, на средних нагрузках стандартные настройки работают нормально.

После прохождения всех вопросов нужна перезагрузка системы для применения настроек ядра.

sudo reboot

Генерация административной учётной записи и SSL-сертификатов через скрипт auth_setup для безопасного доступа к интерфейсам

После перезагрузки нужно создать административный аккаунт для входа в веб-интерфейсы Malcolm. Это делается отдельным скриптом из комплекта поставки.

su - malcolm
cd ~/Malcolm

Возврат в контекст пользователя malcolm и переход в каталог проекта - стандартное начало работы с Malcolm после любого нового подключения к серверу.

./scripts/auth_setup

Скрипт ведёт через серию шагов настройки безопасности. Первое предложение - сохранить локально логин и пароль администратора. Согласие на это активирует встроенный механизм аутентификации. Затем задаётся имя и пароль администратора - они станут учётными данными для входа во все веб-интерфейсы Malcolm.

Дальше предлагается генерация self-signed SSL-сертификатов для веб-трафика. Согласие создаёт пару ключ-сертификат для шифрования HTTPS-соединений. Самоподписанный сертификат вызовет предупреждение в браузере при первом подключении, но трафик при этом всё равно шифруется. Для продакшена позже его можно заменить на сертификат от доверенного центра.

Аналогичный шаг для удалённых отправителей логов - если планируется собирать данные с других машин и отправлять их на этот Malcolm-сервер, согласие нужно. Сертификаты будут использоваться для аутентификации удалённых агентов.

Хранение учётных данных для пересылки логов на внешний OpenSearch - не требуется в одиночной инсталляции. То же самое с настройками email-уведомлений - их можно подключить позже, когда станет понятна структура алертинга.

Загрузка готовых Docker-образов всех компонентов системы из официального реестра проекта

Конфигурация готова, остаётся скачать сами Docker-образы со всеми компонентами Malcolm. Это самая долгая часть установки, потому что суммарный объём образов превышает девять гигабайт.

docker-compose pull

Команда читает файл docker-compose.yml в текущем каталоге, выбирает оттуда все упомянутые образы и начинает параллельно их скачивать. На быстром канале процесс занимает 15 - 30 минут, на медленном растягивается на час и больше. Прогресс выводится в терминал по каждому образу отдельно.

После завершения загрузки полезно убедиться, что все нужные образы действительно появились в локальном реестре.

docker images

Список получится внушительный.

REPOSITORY                        TAG       IMAGE ID       CREATED       SIZE
malcolmnetsec/filebeat-oss        6.2.0     5e9fa4c8ea2d   11 days ago   648MB
malcolmnetsec/arkime              6.2.0     4f4e6025c82d   11 days ago   793MB
malcolmnetsec/zeek                6.2.0     5b117ad2b4bb   11 days ago   1.4GB
malcolmnetsec/dashboards          6.2.0     9dcaff859eec   11 days ago   1.13GB
malcolmnetsec/logstash-oss        6.2.0     cf4d75dcf4af   11 days ago   1.64GB
malcolmnetsec/file-monitor        6.2.0     26227c3c7dc9   11 days ago   589MB
malcolmnetsec/nginx-proxy         6.2.0     3b8b5413b52e   11 days ago   121MB
malcolmnetsec/file-upload         6.2.0     2c704be24433   11 days ago   263MB
malcolmnetsec/api                 6.2.0     90f964b5d728   11 days ago   148MB
malcolmnetsec/suricata            6.2.0     cbdb091d2df4   11 days ago   274MB
malcolmnetsec/htadmin             6.2.0     2b55630700d1   11 days ago   242MB
malcolmnetsec/opensearch          6.2.0     9ccb4665bd6c   11 days ago   1.25GB
malcolmnetsec/pcap-monitor        6.2.0     d957d803bdbb   11 days ago   214MB
malcolmnetsec/freq                6.2.0     3959a9daa952   11 days ago   131MB
malcolmnetsec/dashboards-helper   6.2.0     7da9699a72b3   11 days ago   168MB
malcolmnetsec/pcap-capture        6.2.0     df63e8daa369   11 days ago   121MB
malcolmnetsec/name-map-ui         6.2.0     6bd6c7c58d36   11 days ago   120MB

Каждый образ выполняет свою роль в общей архитектуре. OpenSearch и dashboards отвечают за хранение и визуализацию данных. Logstash принимает поток событий и обогащает его перед отправкой в OpenSearch. Arkime индексирует полнопакетные захваты для быстрого поиска. Zeek и Suricata анализируют сетевой трафик в реальном времени. Filebeat собирает логи и отправляет их в Logstash. Nginx-proxy выступает фронтом для всех веб-интерфейсов. File-monitor, file-upload и pcap-monitor управляют жизненным циклом файлов с трафиком и извлечёнными артефактами. Freq и api - вспомогательные сервисы для скоринга строк и API-доступа.

Запуск всего стека контейнеров и проверка работоспособности компонентов через Docker и сетевые утилиты

Вся подготовительная работа закончена, можно запускать систему.

./scripts/start

Этот скрипт - удобная обёртка над docker-compose up, которая дополнительно делает несколько подготовительных шагов специфичных для Malcolm. Запуск всех контейнеров в правильном порядке занимает несколько минут. Сначала поднимается OpenSearch, потом Logstash подключается к нему, затем стартуют сборщики данных и веб-интерфейсы. На слабых машинах процесс может затянуться до десяти минут.

После старта проверка состояния контейнеров через стандартную docker-команду.

docker ps -a

Вывод показывает полную картину работающих компонентов.

CONTAINER ID   IMAGE                                   COMMAND                  CREATED          STATUS                             PORTS                                                                                            NAMES
840ea2b0e9ad   malcolmnetsec/nginx-proxy:6.2.0         "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          0.0.0.0:443->443/tcp, 127.0.0.1:5601->5601/tcp, 0.0.0.0:488->488/tcp, 127.0.0.1:9200->9200/tcp   malcolm-nginx-proxy-1
dd5c8c63816c   malcolmnetsec/suricata:6.2.0            "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)                                                                                                           malcolm-suricata-1
3112e1bd8f73   malcolmnetsec/filebeat-oss:6.2.0        "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          127.0.0.1:5045->5045/tcp                                                                         malcolm-filebeat-1
c93cfe93ad7e   malcolmnetsec/file-upload:6.2.0         "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          80/tcp, 127.0.0.1:8022->22/tcp                                                                   malcolm-upload-1
18ee20b46f3c   malcolmnetsec/dashboards:6.2.0          "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          5601/tcp                                                                                         malcolm-dashboards-1
2c34206c06e4   malcolmnetsec/zeek:6.2.0                "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)                                                                                                           malcolm-zeek-1
41103ef99ce1   malcolmnetsec/logstash-oss:6.2.0        "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          9001/tcp, 127.0.0.1:5044->5044/tcp, 9600/tcp                                                     malcolm-logstash-1
0408f42a76c3   malcolmnetsec/dashboards-helper:6.2.0   "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          28991/tcp                                                                                        malcolm-dashboards-helper-1
3e78024620de   malcolmnetsec/arkime:6.2.0              "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          8000/tcp, 8005/tcp, 8081/tcp                                                                     malcolm-arkime-1
58cd869beced   malcolmnetsec/pcap-monitor:6.2.0        "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          30441/tcp                                                                                        malcolm-pcap-monitor-1
1040fa8bd6df   malcolmnetsec/file-monitor:6.2.0        "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          3310/tcp, 8440/tcp                                                                               malcolm-file-monitor-1
25c83f14413d   malcolmnetsec/zeek:6.2.0                "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes                                                                                                                       malcolm-zeek-live-1
b321a96c0362   malcolmnetsec/api:6.2.0                 "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          5000/tcp                                                                                         malcolm-api-1
0f1f4ac023f9   malcolmnetsec/name-map-ui:6.2.0         "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          8080/tcp                                                                                         malcolm-name-map-ui-1
ba4d553cf6b5   malcolmnetsec/suricata:6.2.0            "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes                                                                                                                       malcolm-suricata-live-1
e4637d0ec04d   malcolmnetsec/opensearch:6.2.0          "/usr/local/bin/dock…"   17 minutes ago   Up 13 minutes (health: starting)   9200/tcp, 9300/tcp, 9600/tcp, 9650/tcp                                                           malcolm-opensearch-1
ac002e31d9be   malcolmnetsec/htadmin:6.2.0             "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          80/tcp                                                                                           malcolm-htadmin-1
7223d5244a7b   malcolmnetsec/pcap-capture:6.2.0        "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes                                                                                                                       malcolm-pcap-capture-1
971931b21788   malcolmnetsec/freq:6.2.0                "/usr/local/bin/dock…"   17 minutes ago   Up 17 minutes (unhealthy)          10004/tcp                                                                                        malcolm-freq-1

Статусы unhealthy в первые минуты после старта - это нормально. Healthcheck'и контейнеров часто проверяют сложные условия вроде доступности OpenSearch индексов, и пока система не прогрелась, они показывают предупреждения. Через 10 - 15 минут после полного старта большинство сервисов перейдёт в healthy.

Проверка слушающих портов через ss подтверждает корректную привязку сервисов.

ss -atlnp | grep -i docker
LISTEN 0      65535      127.0.0.1:5601       0.0.0.0:*    users:(("docker-proxy",pid=7480,fd=4))   
LISTEN 0      65535        0.0.0.0:488        0.0.0.0:*    users:(("docker-proxy",pid=7519,fd=4))   
LISTEN 0      65535      127.0.0.1:9200       0.0.0.0:*    users:(("docker-proxy",pid=7443,fd=4))   
LISTEN 0      65535      127.0.0.1:5044       0.0.0.0:*    users:(("docker-proxy",pid=6247,fd=4))   
LISTEN 0      65535      127.0.0.1:5045       0.0.0.0:*    users:(("docker-proxy",pid=7063,fd=4))   
LISTEN 0      65535      127.0.0.1:8022       0.0.0.0:*    users:(("docker-proxy",pid=6826,fd=4))   
LISTEN 0      65535        0.0.0.0:443        0.0.0.0:*    users:(("docker-proxy",pid=7567,fd=4))

Картина показательная. Только два порта слушают на всех интерфейсах (0.0.0.0) - 443 для HTTPS и 488 для управления учётками. Все остальные сервисы привязаны к 127.0.0.1, что значит доступ только с самой машины. Это правильная архитектура - наружу торчит минимум, всё внутреннее остаётся внутренним.

Работа с веб-интерфейсами Malcolm и обзор практической ценности развёрнутой системы для команд сетевой безопасности

Запущенный Malcolm предоставляет несколько веб-интерфейсов, каждый со своей задачей. Открыв в браузере адрес https://your-server-ip/dashboards/, посетитель попадает в OpenSearch Dashboards - аналог Kibana, специально настроенный под визуализацию сетевых данных. Перед входом запрашиваются учётные данные администратора, заданные на этапе auth_setup.

После успешной авторизации открывается главный дашборд с обзорной статистикой по сети - топ протоколов, активные хосты, географическое распределение соединений, временные графики трафика. Дашбордов десятки, и каждый заточен под свой сценарий анализа. Расследование инцидентов, поиск аномалий, профилирование пользовательского поведения, анализ DNS-запросов, работа с извлечёнными файлами.

Адрес https://your-server-ip/upload/ ведёт на интерфейс загрузки PCAP-файлов и архивов с логами. Через него можно скармливать Malcolm уже собранный трафик с других источников - например, дампы с edge-маршрутизаторов или захваты от внешних сенсоров. Загруженные файлы автоматически разбираются всеми компонентами стека и попадают в общие индексы.

По адресу https://your-server-ip/name-map-ui/ доступен редактор маппингов имён хостов и подсетей. Полезная штука для среды, где IP-адреса не несут смысла без контекста. Можно прописать, что подсеть 192.168.10.0/24 - это бухгалтерия, а 192.168.20.0/24 - разработка, и в дальнейшем все отчёты будут показывать осмысленные имена вместо безликих цифр.

Управление учётными записями вынесено на отдельный порт https://your-server-ip:488/. Здесь администратор создаёт новых пользователей, меняет пароли, настраивает права. Отделение этой функции от основного интерфейса - типичная практика для систем с повышенными требованиями к безопасности.

Получившаяся установка - это полноценная платформа для сетевой аналитики, которую обычно покупают за десятки тысяч долларов в год у коммерческих вендоров. Команды реагирования на инциденты получают инструмент для расследования атак, инженеры по сетевой безопасности - средство мониторинга подозрительной активности, аналитики - песочницу для глубокого изучения трафика. Особую ценность Malcolm представляет для индустриальных сетей и систем критической инфраструктуры, где замкнутые контуры не позволяют использовать облачные SIEM-решения. Идахо-ская национальная лаборатория, разработавшая проект, изначально создавала его именно под такие задачи - анализ трафика в SCADA-сетях электростанций, нефтепроводов и других объектов, где данные не могут покинуть периметр организации. Освоение этой системы открывает специалисту дорогу в редкую и востребованную нишу - индустриальную кибербезопасность, где открытые инструменты ценятся выше любых проприетарных продуктов.