Теперь main — это единый источник правды для проекта.
Один и тот же scanner_report.py используется в трех сценариях:
- CLI:
python scanner_report.py - Windows: запуск собранного
ScannerReport.exe - Linux: запуск через
run_scanner_report.sh
Идея такая:
- функционал отчета меняется один раз в
scanner_report.py; - Windows и Linux отличаются только способом запуска и упаковкой;
- новые доработки логики нужно вносить в
main, а не разносить по отдельным копиям файла.
Скрипт для сборки HTML-отчетов по результатам работы СКАНЕР-ВС 7.2.
Проект объединяет три типа данных:
- поиск уязвимостей;
- подбор паролей;
- аудит конфигурации.
На вход можно подавать как отдельные CSV, так и ZIP-архивы выгрузок из сканера. На выходе скрипт формирует человекочитаемые HTML-отчеты, поддерживает фильтрацию по CVE, активу и ПО, а также умеет строить diff-отчет по уязвимостям "до/после".
Основной сценарий такой:
- В
СКАНЕР-ВС 7.2выгружаются отчеты по нужным задачам. - Скрипт автоматически распознает тип входных файлов.
- Данные нормализуются, группируются по активам и частично дедуплицируются.
- Формируется итоговый HTML-отчет или специализированный отчет по запросу.
Поддерживаемые типы данных:
vuln— данные по уязвимостям;pass— результаты подбора паролей;audit— результаты аудита конфигурации.
По инструкции из папки Инструкция/СКАНЕРВС7 Инструкция по работе с отчетами.docx для нормальной работы нужно подготовить в сканере три базовые задачи:
- поиск уязвимостей;
- подбор паролей;
- аудит конфигурации.
Важно:
- после исследования сети для актива нужно настроить подключение по
ssh/telnet/winrmчерез раздел секретов и подключений; - выгрузка может быть как по одному активу в
CSV, так и по группе активов вZIP; - структуру
ZIP-архива менять нельзя; - архивы не нужно распаковывать вручную.
Требования:
Python 3;- любой современный браузер для открытия
HTML; - для Windows удобно использовать
VS Code, но это не обязательное требование.
Запуск:
python scanner_report.pyЕсли скрипт запущен без аргументов, он попросит ввести пути к файлам или архивам построчно.
Также можно передать пути сразу:
python scanner_report.py vuln.csv pass.csv audit.csv
python scanner_report.py report_after_without_astra.zip audit.csv pass.csv
python scanner_report.py .Справка по параметрам:
python scanner_report.py --helpПосле загрузки данных доступны пункты:
- общий HTML-отчет;
- поиск по конкретной уязвимости (
CVE/BDU); - поиск по активу (
IP,FQDN, имя хоста); - поиск по ПО;
- diff-отчет по уязвимостям "до/после";
- выход.
Скрипт поддерживает CLI-режим без входа в интерактивное меню:
python scanner_report.py --html report.html vuln.csv pass.csv audit.csv
python scanner_report.py --cve CVE-2023-1234 vuln.csv pass.csv audit.csv
python scanner_report.py --asset 10.10.10.5 vuln.csv pass.csv audit.csv
python scanner_report.py --software openssl vuln.csv
python scanner_report.py astra_do.csv --vuln-after astra_after.csvПараметры:
--html— сразу сформировать общий HTML-отчет;--cve— сформировать выборку по конкретной уязвимости;--asset— сформировать выборку по конкретному активу;--software— искать уязвимости по названию пакета/ПО;--vuln-after— построить дифф по уязвимостям между двумя выгрузками.
По коду и пользовательской инструкции проект формирует:
- сводку по всем загруженным данным;
- список источников данных;
- фильтр по
CVE; - фильтр по уязвимому ПО;
- фильтр по активу;
- агрегированную статистику по уязвимостям;
- данные по аудиту конфигурации;
- найденные пароли с возможностью скрыть/показать их в интерфейсе;
- режимы печати;
- отдельные HTML-отчеты по
CVEи активу; - дифф-отчет с новыми и закрытыми уязвимостями.
Файлы, которые обычно генерируются:
report.html— общий отчет;report_cve_<id>.html— отчет по одной уязвимости;report_asset_<name>.html— отчет по одному активу;report_vuln_diff.html— дифф по уязвимостям.
- scanner_report.py — основной и фактически единственный production-скрипт;
- Инструкция — пользовательская инструкция;
- старые версии — архив прошлых итераций;
- тест — черновые тестовые файлы и альтернативные варианты скрипта;
- корень репозитория — примеры входных данных и уже сгенерированные HTML/ZIP/CSV.
Текущее решение построено как один большой Python-скрипт примерно на 2400+ строк, целиком на стандартной библиотеке.
Основные блоки:
- чтение и определение формата
CSV; - чтение
ZIP-архивов и поиск вложенныхCSV; - нормализация идентификаторов активов;
- агрегация уязвимостей, паролей и аудита;
- генерация HTML с встроенными
CSSиJavaScript; - CLI и интерактивное меню.
Из полезного:
- нет внешних зависимостей;
- можно запускать на чистом
Python 3; - поддерживаются и одиночные выгрузки, и архивы;
- логика приближена к реальному рабочему процессу пользователя, а не к "идеальному" учебному примеру.
Проект практичный и живой. Видно, что он вырос из реальной потребности быстро сводить результаты сканера в один понятный отчет, а не из попытки построить "правильную архитектуру с нуля". В этом его сильная сторона: скрипт сразу полезен, дает результат и закрывает реальный ручной процесс.
Сильные стороны:
- полезная предметная автоматизация;
- поддержка
ZIPбез ручной распаковки; - понятный прикладной CLI;
- отчеты ориентированы на эксплуатацию: фильтрация, печать, отдельные выборки;
- использование только стандартной библиотеки упрощает перенос между машинами.
Слабые стороны и технический долг:
- весь проект сосредоточен в одном большом файле, поэтому его трудно сопровождать;
- бизнес-логика, HTML, CSS, JavaScript и CLI сильно перемешаны;
- нет явного набора автотестов;
- нет
requirements.txt,pyproject.tomlили отдельного описания окружения; - в репозитории смешаны исходники, примеры данных, готовые отчеты, тестовые артефакты и старые версии;
- часть логики дублируется между интерактивным режимом и CLI;
- проект сложно расширять без риска что-то сломать.
Если говорить совсем прямо: как рабочий внутренний инструмент проект уже полезен, но как репозиторий для долгой совместной разработки он пока тяжеловат. Он скорее "крепкий прикладной скрипт", чем оформленный программный продукт.
- Разбил бы
scanner_report.pyна модулиio,normalize,summary,reports,cli. - Вынес бы HTML-шаблоны отдельно, чтобы не держать всю верстку внутри Python-строк.
- Добавил бы минимальные автотесты на классификацию CSV, дедупликацию, diff-логику и поиск по активу.
- Очистил бы корень репозитория от артефактов и вынес примеры в
examples/. - Добавил бы подробную проектную документацию по запуску и рабочему процессу.
- Добавил бы предупреждения по безопасности, потому что отчеты могут содержать пароли.
Часть этих пунктов этот README уже закрывает, но архитектурно проекту все еще есть куда расти.
- качество результата зависит от структуры выгрузок из сканера;
- определение типа файла завязано на названия колонок;
- дедупликация выполнена эвристически и может не покрыть все кейсы;
- при работе с чувствительными данными нужно аккуратно хранить
HTML-отчеты и CSV/ZIP; - большие объемы данных будут обрабатываться целиком в памяти.
Проект работает с чувствительными данными:
- уязвимости;
- результаты аудита;
- найденные пароли;
- сведения об активах.
Рекомендуется:
- не публиковать сгенерированные отчеты во внешние системы без зачистки;
- ограничить доступ к каталогу с выгрузками и HTML;
- использовать режим скрытия паролей при печати и демонстрации;
- не хранить тестовые артефакты рядом с боевыми данными дольше, чем нужно.
Это хороший внутренний инструмент для операционной работы с отчетами СКАНЕР-ВС 7.2. Его главная ценность не в "красоте кода", а в том, что он реально экономит время на сведении результатов сканирования и подготовке понятных HTML-отчетов.
Если проект планируется развивать дальше, следующий логичный шаг — не переписывать все заново, а аккуратно разнести существующую рабочую логику по модулям и добавить тесты вокруг уже полезного поведения.
Теперь проект можно запускать не только через терминал, но и как локальное веб-приложение:
python scanner_report.py --webЧто происходит:
- поднимается локальный HTTP-сервер на
127.0.0.1; - автоматически открывается браузер;
- пользователь загружает
CSVи/илиZIPчерез форму; - после нажатия кнопки создается HTML-отчет;
- на стартовой странице доступен и diff-режим
до/после; - отчет сохраняется в папку
generated_reportsрядом со скриптом или.exe; - в браузере открывается отдельная страница просмотра отчета;
- готовый HTML можно не только открыть, но и скачать как файл через кнопку
Скачать HTML-файл.
Дополнительные параметры веб-режима:
python scanner_report.py --web --port 8780
python scanner_report.py --web --no-browserДля сборки portable-версии добавлен скрипт:
.\build_portable_exe.ps1Результат сборки:
dist/ScannerReport.exe
Особенность portable-сборки:
- если запустить
ScannerReport.exeбез аргументов, он сразу откроет локальный веб-интерфейс; - консоль пользователю не нужна;
- браузер откроется автоматически;
- для завершения работы можно нажать кнопку
Завершить программув веб-интерфейсе.
Для Linux добавлен отдельный launcher-скрипт:
chmod +x run_scanner_report.sh
./run_scanner_report.shЧто он делает:
- находит
python3илиpython; - запускает
scanner_report.py --web; - поднимает локальный веб-интерфейс на
127.0.0.1:8765; - открывает браузер через встроенную Python-логику;
- если браузер не открылся, в консоли будет показан локальный URL.
Можно переопределить host и port через переменные окружения:
SCANNER_REPORT_PORT=8780 ./run_scanner_report.sh
SCANNER_REPORT_HOST=127.0.0.1 ./run_scanner_report.shМожно передавать и дополнительные аргументы Python-режима:
./run_scanner_report.sh --no-browser