Перейти к содержимому

Отчёты

enodia export пишет отчёт в одном из трёх форматов. Все три принимают --from (читать существующий инвентарь вместо сбора) и -o/--output (путь к файлу, либо - для stdout — по умолчанию).

Окно терминала
enodia export --format json
enodia export --format prometheus
enodia export --format html -o report.html

Встроенный дефолт --format — json, но export.default_format в settings.yaml переопределяет его, когда сам --format не передан — явный --format всегда побеждает, тот же приоритет, что уже используют render.default_view/html.view. См. Конфигурацию.

Каждый observation и каждый assessment, целиком — --view игнорируется. Это формат для тех, кто хочет применить собственную политику severity поверх фактов enodia (см. Концепции).

Если настроен блок cve:, каждый assessment также несёт массив cves — по записи на каждую находку в каждом источнике (CVE, который есть и в БДУ, и в NVD, встречается дважды; из NVD — по разу на каждый подошедший CPE):

{
"Source": "bdu",
"AdvisoryID": "BDU:2026-11879",
"CVEIDs": ["CVE-2026-19478"],
"Title": "Уязвимость программной платформы … GitLab EE/ CE …",
"Severity": "Высокий уровень опасности (базовая оценка CVSS 2.0 составляет 9,7) …",
"MatchedName": "Gitlab",
"RangeText": "от 19.2.0 до 19.2.4",
"FixStatus": "Уязвимость устранена",
"CVSS": { "Version": "3.1", "Score": 9.4, "Severity": "CRITICAL" }
}

Severity и RangeText — собственный текст источника, дословно; CVSS — одна оценка, разобранная из него: в первую очередь CVSS 3.1/3.0, затем 4.0, затем 2.0 — версия 3.x есть почти у каждого CVE в обоих источниках, поэтому оценки в одном списке остаются в одной шкале. Колонка CVES в табличных представлениях считает различные CVE по этим записям, а не сами записи. Находки из собственных данных вендора (см. Собственные данные вендоров) имеют ту же форму, с Source, равным mariadb, atlassian, postgresql или nginx.

Находки по пакетам для Linux-хостов (см. Сопоставление с CVE) имеют ту же форму: Source — debian, oval или alpine, MatchedName — имя пакета, и ещё четыре поля: InstalledVersion, FixedVersion (версия, которая закрывает все CVE из CVEIDs), AdvisoryURL и Advisories (все бюллетени, которых не хватает пакету). Сам инвентарь для таких хостов тоже растёт: каждое наблюдение несёт карту packages (пакет → установленная версия), а на хостах семейства RHEL ещё и modules (потоки AppStream) — десятки КБ на хост.

Prometheus textfile, рассчитанный на textfile-коллектор node_exporter — пишите его туда, куда node_exporter настроен сканировать, по расписанию, как любую другую textfile-метрику. Находки CVE в метрики не выгружаются.

Один самодостаточный файл. Встроенного веб-сервера нет — сама enodia его не отдаёт (см. Концепции); направьте на него nginx и пересобирайте его по cron или systemd-таймеру. enodia serve (см. Справочник CLI) — альтернатива, если нужно, чтобы отчёт отдавался автоматически, по собственному расписанию.

--view ограничивает отчёт одним представлением вместо всех четырёх секций подряд. html.view из settings.yaml делает то же самое, когда флаг не передан.

html.assets из settings.yaml управляет тем, что нужно сгенерированному файлу:

  • inline (по умолчанию) — ноль внешних ресурсов. Проверено: ни одного <script во всём выводе и ничего, загружаемого по http(s)://, — такие адреса встречаются только в обычных ссылках (футер, страницы NVD/cve.org/БДУ в списке CVE). Рендерится одинаково внутри полностью закрытой сети.
  • cdn — грузит Bootstrap и тему Bootswatch с CDN и добавляет заметное предупреждение прямо на странице о том, что для стилизованного рендера нужен интернет. html.theme выбирает тему (none, default, либо любая из 26 настоящих тем Bootswatch); html.cdn выбирает CDN — auto (по умолчанию) устраивает гонку между jsdelivr и cdnjs через HEAD-запрос к каждому и переключается на того, кто ответил первым, так что блокировка одного CDN в конкретной сети не роняет стили отчёта целиком. Самый первый рендер всегда использует jsdelivr; гонка только обновляет стиль уже после этого. Кроме того, в отчёте есть выбор темы, который запоминается для каждого зрителя в localStorage браузера, и так же запоминается закрытие предупреждения: закрытое один раз, оно больше не показывается в этом браузере и в пересобранных отчётах.

Полный пример settings.yaml см. в Конфигурации.

Если настроен блок cve:, ячейка CVES в секциях compact и drift становится ссылкой, открывающей список CVE этого таргета: одна строка на CVE, самые опасные сверху, со ссылками на NVD, cve.org и, для находок из БДУ, на страницу bdu.fstec.ru, а оценка — цветными бейджами (CRITICAL · CVSS 3.1 9.8). Описание — русский текст из БДУ, если CVE есть в БДУ, иначе английский из NVD. Находки по пакетам — одна строка на пакет (linux 6.12.107-1 → 6.12.111-1), со ссылкой на бюллетень с исправлением и свёрнутым под ней списком CVE пакета. Всё сделано на чистом CSS (модальное окно через :target), поэтому одинаково работает и в режиме inline, совсем без скриптов.

С html.assets: cdn каждая строка получает контекстный класс Bootstrap — красный для недоступного инстанса, зелёный для доступного — в той теме, что настроена, а не жёстко заданный enodia цвет на каждую тему отдельно:

<table class="table table-striped table-hover table-sm align-middle">
<thead><tr><th>PRODUCT</th><th>VERSION</th><th>STATUS</th><th>COUNT</th><th>INSTANCES</th></tr></thead>
<tbody>
<tr class="table-danger"><td>gitlab</td><td>(unknown)</td><td>auth</td><td>1</td><td>gitlab-2</td></tr>
<tr class="table-success"><td>gitlab</td><td>18.2.1</td><td>ok</td><td>1</td><td>gitlab-1</td></tr>
<tr class="table-danger"><td>jira</td><td>(unknown)</td><td>unreachable</td><td>1</td><td>jira-staging</td></tr>
<tr class="table-success"><td>jira</td><td>10.3.1</td><td>ok</td><td>1</td><td>jira-3</td></tr>
<tr class="table-success"><td>jira</td><td>10.3.2</td><td>ok</td><td>2</td><td>jira-1, jira-2</td></tr>
</tbody>
</table>

Футер каждого сгенерированного отчёта ссылается обратно на проект на GitHub, а также на enodia.sh и docs.enodia.sh — обычные <a href>, не загрузка ресурса, так что это никак не влияет на офлайн-гарантию режима inline (она конкретно про загружаемые ресурсы, не про инертный текст ссылки). Оба режима также получают favicon для вкладки: inline встраивает небольшую base64-копию apple-touch-icon.png с enodia.sh прямо в файл (не полный многоразмерный favicon.ico, который добавил бы примерно полмегабайта к каждому отчёту ради иконки вкладки); режим cdn вместо этого ссылается на живые иконки на enodia.sh — этому режиму и так уже нужен интернет, чтобы отрендериться вообще.

html.assets: cdn грузит Bootstrap и, если не выставлено html.theme: none, тему Bootswatch — обе лицензии MIT — с jsdelivr или cdnjs в момент, когда кто-то открывает отчёт в браузере. Ни одна из них не встроена ни в саму enodia, ни в артефакты релиза; каждый отчёт в CDN-режиме указывает авторство обеих со ссылкой на лицензию прямо в собственном футере.

enodia collect -o "$(date +%F).jsonl" по расписанию уже даёт почти всё, что нужно enodia history — директорию датированных инвентарей. history --dir <эта директория> читает каждый *.jsonl-файл в ней и оценивает каждый на момент его собственного сбора, выстраивая одну временную шкалу на каждый ID таргета. См. Справочник CLI.