Индустриальные сети требуют аккуратного подхода: невнимательный сканер может нарушить работу контроллеров, а недостаточно глубокий — пропустить критические уязвимости. Мы разработали Industrial Network Scanner на языке Go, чтобы получить инструмент для аудита ICS/SCADA, который сочетает в себе скорость, стабильность и минимальную вероятность негативного воздействия на оборудование. В статье расскажем, почему выбор пал на Go, как устроена архитектура сканера и какие результаты показали первые тесты.
Почему мы выбрали Go для сканера
Go обеспечивает низкую задержку и высокую параллельность при сравнительно небольшой сложности кода. С помощью горутин и каналов мы добились простого управления большим количеством одновременных подключений, что критично при сканировании сетей с сотнями и тысячами устройств. Плюс статическая компиляция и минимальные зависимости упрощают развертывание на полевых ноутбуках и серверных машинах.
Ещё одно важное преимущество — богатая стандартная библиотека для работы с сетью и возможность легко интегрировать C-библиотеки при необходимости. Производительность и предсказуемое потребление памяти сделали Go удачным выбором для проекта, где важна скорость без жертв в стабильности.
Безопасность и бережный режим сканирования
При работе с промышленными контроллерами критично избегать агрессивных сценариев. Мы реализовали несколько уровней «бережного» поведения: контроль частоты запросов, адаптивные тайм-ауты и возможность пассивного обнаружения. Включив щадящий режим, аудитор может снизить риск перегрузки PLC и сетевого оборудования. Кроме того, сканер поддерживает «симуляцию» запросов, позволяющую идентифицировать устройства по ответам на безопасные запросы протоколов Modbus, OPC UA, DNP3 и IEC 104. Это даёт баланс между информативностью и безопасностью операции.
Архитектура и ключевые компоненты
Мы спроектировали сканер модульно: ядро отвечает за планирование задач и управление горутинами, сетевые модули реализуют взаимодействие с протоколами, а отдельный модуль анализирует и нормализует результаты. Такая структура упрощает добавление новых протоколов и тестовых сценариев без переработки всего кода. Для хранения результатов используется лёгкая встроенная база или экспорт в форматы CSV/JSON, что облегчает интеграцию с системами учёта уязвимостей и SIEM. Важно, что весь трафик можно логировать подробно или в кратком виде — в зависимости от требований аудита.
Поддерживаемые протоколы и расширяемость
На старте мы реализовали поддержку Modbus/TCP, OPC UA (основные кейсы), DNP3 и базовые распознавания для Siemens S7 и других популярных PLC. Архитектура плагинов позволяет добавлять новые протоколы и проверки без правки ядра: плагин регистрирует обработчики, тестовые векторы и правила безопасности. Также реализованы шаблоны проверки на распространённые ошибки: открытые порты, стандартные пароли, устаревшие версии стеков.
Это ускоряет аудит и даёт понятные отчёты заказчику.
Тестирование, результаты и дальнейшие планы
Мы проводили тесты в изолированной лаборатории с реальными контроллерами и эмуляторами. Сканер показал высокую скорость обнаружения и сопоставимую с коммерческими решениями глубину анализа при значительно меньшем потреблении ресурсов. Благодаря адаптивным тайм-аутам мы минимизировали ложные положительные реакции и снизили риск нарушения работы оборудования. В планах — расширить поддержку OPC UA, добавить глубокую инспекцию телеграмм для выявления логических уязвимостей, интеграцию с системами управления инцидентами и удобный веб-интерфейс для визуализации карт сети. Мы также работаем над набором безопасных тестовых кейсов для эмуляции бо́льшего числа сценариев без риска для производства.
Итог: использование Go помогло нам создать быстрый, надёжный и отзывчивый инструмент аудита для ICS/SCADA-сетей, который можно безопасно применять в полевых условиях и легко развивать под новые требования заказчиков.