CVE-Manager: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Нет описания правки
Строка 124: Строка 124:
{| class="wikitable" style="width: 100%;"
{| class="wikitable" style="width: 100%;"
|-
|-
! style="width: 35%" | Команда
! style="width: 30%" | Команда
! style="width: 65%" | Описание
! style="width: 70%" | Описание
|-
|-
|<code>-h, --help</code>
|<code>-h, --help</code>
Строка 162: Строка 162:
=== Мониторинг уязвимостей пакетов ===
=== Мониторинг уязвимостей пакетов ===
Запуск модуля <i>cve-monitor</i>:<br>
Запуск модуля <i>cve-monitor</i>:<br>
:<code>cve-monitor [-h] [-x] [-f FIX_STATUS] [-c CMP_BRANCH [CMP_BRANCH ...]] [-t ISSUES_TYPE] [-g] [--cure] [-o ORDER_BY] [-b BRANCH_NAME [BRANCH_NAME ...]] [-p PACKAGE_NAME [PACKAGE_NAME ...]] [-y PACKAGE_NAME [PACKAGE_NAME ...]] [-v VUL_ID [VUL_ID ...]] [--map] [--fixes] [--mail REPORT_CATEGORY [REPORT_CATEGORY ...]]</code>
:<code>cve-monitor [-h] [--show WHAT_YOU_WANT_TO_SEE] [-f FIX_STATUS] [-t ISSUES_TYPE] [-o ORDER_BY] [-b BRANCH_NAME [BRANCH_NAME ...]] [-p PACKAGE_NAME [PACKAGE_NAME ...]] [-y YEAR [YEAR ...]] [-v VUL_ID [VUL_ID ...]] [--group] [--cure] [--patch] [-m REPORT_CATEGORY [REPORT_CATEGORY ...]]</code>


{| class="wikitable" style="width: 100%;"
{| class="wikitable" style="width: 100%;"
|-
|-
! style="width: 35%" | Команда
! style="width: 30%" | Команда
! style="width: 65%" | Описание
! style="width: 70%" | Описание
|-
|-
|<code>-h, --help</code>
|<code>-h, --help</code>
|Вывод справки
|Вывод справки
|-
|-
|<code>-x, --examples</code>
|<code>--show WHAT_YOU_WANT_TO_SEE</code>
|Вывод примеров использования
|Вывод списка уязвимостей (<code>issues</code>, является значением по-умолчанию), или вывод новых незакрытых уязвимостей (<code>history</code>), или вывод сравнительного списка по уязвимостям указанных ветвей Sisyphus (<code>comp</code>, требует задания значения параметра <code>--branches</code>, при этом первая указанная ветвь сравнивается с последующими), или вывод полных описаний уязвимостей (<code>vul_des</code>), или вывод установленного соответствия между названиями пакетов и названиями, используемыми в описаниях уязвимостей (<code>map</code>), или вывод примеров использования (<code>ex</code>)
|-
|-
|<code>-f FIX_STATUS, --fix_status FIX_STATUS</code>
|<code>-f FIX_STATUS, --fix_status FIX_STATUS</code>
|Фильтрация результатов по состоянию уязвимостей (<code>fixed</code> / <code>unfixed</code> / <code>all</code>)
|Фильтрация результатов по состоянию уязвимостей (<code>fixed</code> / <code>unfixed</code> / <code>all</code>)
|-
|<code>-c CMP_BRANCH [CMP_BRANCH ...], --compare CMP_BRANCH [CMP_BRANCH ...]</code>
|Осуществление сравнения перечисленных репозиториев с репозиторием, указанным в качестве первого значения данного параметра
|-
|-
|<code>-t ISSUES_TYPE, --itype ISSUES_TYPE</code>
|<code>-t ISSUES_TYPE, --itype ISSUES_TYPE</code>
|Фильтрация результатов по типу источника записей об уязвимостях (<code>nvd</code> / <code>fstec</code>)
|Фильтрация результатов по типу источника записей об уязвимостях (<code>nvd</code> / <code>fstec</code>)
|-
|<code>-g, --group</code>
|Осуществление группировки результатов по именнам пакетов (работает только при запуске с параметром <code>-f unfixed</code>)
|-
|<code>--cure</code>
|Дополнение отчёта колонкой с названиями ветвей <i>Sisyphus</i> более высокого порядка (например, <i>p9</i> для <i>p8</i>), в которых данная уязвимость не наблюдается
|-
|-
|<code>-o ORDER_BY, --order ORDER_BY</code>
|<code>-o ORDER_BY, --order ORDER_BY</code>
|Осуществление упорядочения результатов по идентификаторам уязвимостей (<code>id</code>), иманам пакетов (<code>package</code>), CVSS оценке (<code>score</code>) или текущему состоянию уязвимости (<code>fix</code>)
|Осуществление упорядочения результатов по идентификаторам уязвимостей (<code>id</code>), иманам пакетов (<code>package</code>), оценке CVSS ver.2 (<code>score2</code>), оценке CVSS ver.3 (<code>score3</code>), или текущему состоянию уязвимости (<code>fix</code>)
|-
|-
|<code>-b BRANCH_NAME [BRANCH_NAME ...], --branches BRANCH_NAME [BRANCH_NAME ...]</code>
|<code>-b BRANCH_NAME [BRANCH_NAME ...],<br>--branches BRANCH_NAME [BRANCH_NAME ...]</code>
|Фильтрация результатов по названиям репозиториев
|Фильтрация результатов по названиям репозиториев
|-
|-
|<code>-p PACKAGE_NAME [PACKAGE_NAME ...], --packages PACKAGE_NAME [PACKAGE_NAME ...]</code>
|<code>-p PACKAGE_NAME [PACKAGE_NAME ...],<br>--packages PACKAGE_NAME [PACKAGE_NAME ...]</code>
|Фильтрация результатов по названиям пакетов
|Фильтрация результатов по названиям пакетов
|-
|-
Строка 202: Строка 193:
|Фильтрация результатов по датам уязвимостей
|Фильтрация результатов по датам уязвимостей
|-
|-
|<code>-d, --desc</code>
|<code>-v VUL_ID [VUL_ID ...],<br>--vul_ids VUL_ID [VUL_ID ...]</code>
|Вывод подробной информации по уязвимостям для данных пакетов (значения параметра <code>-p</code> должны быть определены)
|Фильтрация результатов по идентификаторами уязвимостей
|-
|-
|<code>-v VUL_ID [VUL_ID ...], --vulid VUL_ID [VUL_ID ...]</code>
|<code>--group</code>
|Вывод подробной информации по уязвимостям с данными идентификаторами
|Осуществление группировки результатов по именнам пакетов (работает только при запуске с параметром <code>-f unfixed</code>)
|-
|-
|<code>--map</code>
|<code>--cure</code>
|Вывод установленного соответствия между названиями пакетов и названиями, используемыми в описаниях уязвимостей
|Дополнение отчёта колонкой с названиями ветвей <i>Sisyphus</i> более высокого порядка (например, <i>p9</i> для <i>p8</i>), в которых данная уязвимость не наблюдается
|-
|-
|<code>--fixes</code>
|<code>--patch</code>
|Вывод записей об исправлениях уязвимостей, которые (записи) извлечены из changelog-а spec-файлов исследуемых пакетов
|Список ссылок на патчи, предположительно закрывающие данную уязвимость (ссылки извлекаются из спсиок уязвимостей)
|-
|-
|<code>--mail REPORT_CATEGORY [REPORT_CATEGORY ...]</code>
|<code>-m REPORT_CATEGORY [REPORT_CATEGORY ...],<br>--mail REPORT_CATEGORY [REPORT_CATEGORY ...]</code>
|Осуществить почтовую рассылку с формируемым результатом на адреса, указанные в соответствующем конфигурационном файле (см. <i>Настройка клиентской части</i>)
|Осуществить почтовую рассылку с формируемым результатом на адреса, указанные в соответствующем конфигурационном файле (см. <i>Настройка клиентской части</i>)
|}
|}

Версия от 20:51, 21 декабря 2019

cve-manager - консольная программа, предназначенная 1) для формирования базы данных уязвимостей (БДУ) программ, входящих в состав заданных репозиториев rpm-пакетов, а также 2) для осуществления анализа записей сформированной БДУ и подготовки отчётов на основе результатов этого анализа (в том числе с осуществлением рассылки по электронной почте).

Основными входными данными программы являются списки исходных и бинарных пакетов рассматриваемых репозиториев, а также списки известных уязвимостей. На данный момент поддерживается два источника списков известных уязвимостей - NVD (National Vulnerability Database) и ФСТЭК (Федеральная служба по техническому и экспортному контролю).

Программа имеет модульную структуру, написана на Python и C++, использует MySQL. Распространяется по лицензии GPLv3.0.

Структура программы

cve-manager состоит из следующих модулей:

  1. cve-manager - диалоговый интерфейс для запуска всех остальных модулей, в том числе для последовательного запуска модулей в автоматическом режиме (автоматический режим стоит считать предпочтительным, т.к. в автоматическом режиме часть операций выполняется параллельно с задействованием всех доступных микропроцессорных ядер);
  2. cve-backup - осуществляет резервное копирование/восстановление ранее сформированной БДУ;
  3. cve-history - осуществляет выборку неисправленных (актуальных) уязвимостей по текущему состоянию БДУ и сохраняет их в отдельной таблице с целью обеспечения возможности сравнения будущего состояния БДУ с этим сохранённым состоянием;
  4. cve-download - осуществляет загрузку по HTTPS списков уязвимостей, предоставляемых NVD и ФСТЭК, а также CPE словаря;
  5. cve-import - осуществляет для выбранных репозиториев внесение списка пакетов, которые размещены на alt-сервере (например /ALT/p8/files/list/src.list и /ALT/p8/files/list/bin.list для ветви p8), а также внесение загруженных списков уязвимостей и CPE словаря в БД MySQL; Имеет возможность фильтрации импортируемых списков пакетов в соответствии с содержимым предоставляемого текстового файла, каждая строка которого является названием пакета, информация о котором должна быть учтена в БДУ;
  6. cve-fixes - извлекает 'Fixes' записи и URL из метаданных всех исходных пакетов рассматриваемых репозиториев, использует gb-x-parse-vulns-from-changelog;
  7. cpe-map - осуществляет установление соответствия импортированных в БД названий исходных пакетов рассматриваемых репозиториев и 1) названий программных продуктов из импортированного в БД CPE словаря, а также 2) названий программных продуктов из импортированного в БД списка уязвимостей ФСТЭК;
  8. cve-issues - осуществляет установление соответствия между данными, внесёнными в БД с помощью модулей cve-import, cpe-map и cve-fixes, а именно - формирует записи в БД вида <CVE/ФСТЭК идентификатор>, <название пакета>, <CPE/ФСТЭК название уязвимого программного продукта>, <версия пакета>, <уязвимая версия программного продукта>, <fix-status>, где <fix-status> - значение из следующего набора (или комбинация из данных значений):
    1. changelog - устранение данной уязвимости обозначено в changelog-секции пакета;
    2. bigger ver - версия пакета в репозитории больше данной уязвимой версии;
    3. [lesser ver] - версия пакета в репозитории меньше данной уязвимой версии;
    4. [NO FIX] - версия пакета в репозитори совпадает с уязвимой версией программного продукта и устранение данной уязвимости не зафиксировано.
  9. cve-monitor - предназначен для посылки запросов выборки из таблиц БДУ и выдачи результатов (отчётов), например формирование списка всех пакетов с имеющимися незакрытыми уязвимостями или списка всех закрытых уязвимостей одной ветви, которые не закрыты в другой; Формируемые отчёты могут рассылаться на задаваемые адреса электронной почты; На данный момент (версия 0.28.0) отчёты предоставляются в собственном формате (см. подраздел Мониторинг уязвимостей пакетов), в перспективе возможность их получения в формате XML и JSON.

Все модули кроме cve-import написаны на Python, cve-import написан на C++.

Установка

cve-manager собран в репозиторий Sisyphus.

Установка полной версии (серверная и клиентская часть):

apt-get install cve-manager

Установка только клиентской части:

apt-get install cve-monitor

Настройка

Настройка серверной части

Параметры cve-manager определяются файлом ini-формата /etc/cve-manager/cve-manager.conf. Данный ini-файл включает следующие обязательные секции:

  1. database, в которой указываются параметры соединения с базой данных MySQL (server, user, passwd, schema);
  2. common, в которой указывается путь к корневому каталогу alt-сервера (basealt), путь к каталогу, в который cve-download загружает входные данные и откуда cve-import их импортирует в БД (download), а также источники списков уязвимостей, исключаемые из рассмотрения (excluded_vulsrc с возможными значениями nvd и fstec).

Прочие секции файла настройки воспринимаются как названия ветвей Sisyphus, информация об уязвимостях которых должна быть помещена в БДУ. Каждая из таких секций может включать определение следующих параметров:

  • base_dir - название основного каталога данного репозитория;
  • src_list - путь к списку исходных пакетов (src.list) данного репозитория;
  • bin_list - путь к списку бинарных пакетов (bin.list) данного репозитория;
  • srpms_dir - путь к каталогу с исходными пакетами (SRPMS) данного репозитория.

По-умолчанию значения перечисленных параметров соответствуют структуре каталогов alt-сервера. ВНИМАНИЕ - названия секций должны состоять только из латинских символов и цифр. В случае, если название репозитория включает прочие символы, следует воспользоваться переменной base_dir (см. пример, секция x81).

Пример файла настройки:

[database]
server  = "localhost:3306"
user    = some_username
passwd  = some_passwd
schema  = some_dbname

[common]
basealt = /space/
download = ~/.cve-manager/
excluded_vulsrc = fstec

[Sisyphus]

[p8]

[x81]
base_dir = /space/ALT/x8.1/

[some_custom_branch]
src_list = /some_custom_branch/lists/src.list
bin_list = /some_custom_branch/lists/bin.list
srpms_dir = /some_custom_branch/SRPMS/

Файл настройки принадлежит пользователю root, относится к группе cve и имеет режим rw-rw----. Также группе cve принадлежат все модули, кроме модуля cve-monitor. Таким образом вносить изменения в БДУ помимо пользователя root могут только члены группы cve. Добавить пользователя в группу cve можно с помощью следующей команды:

usermod -a -G cve <user-name>

Настройка клиентской части

cve-monitor имеет свой файл настройки /etc/cve-manager/cve-monitor.conf, позволяющий пользователям, не являющимся членами группы cve, осуществлять соединение с БДУ с правом только на чтение (SQL-запрос SELECT) - структура данного файла повторяет структуру файла cve-manager.conf (см. подраздел Настройка серверной части), при этом секция common, а также параметры ветвей ни на что не влияют, за исключением дополнительного параметра ветвей seniors, в котором перечисляются старшие ветви по отношению к данной, и которые будут использованы при формировании предложений по устранению существующих в данной ветви уязвимостей (при передаче флага --cure модулю cve-monitor), например:

[p8]
seniors = "Sisyphus", "p9"

Для настройки почтовой рассылки cve-monitor существует другой конфигурационной файл - /etc/cve-manager/cve-mail.conf, содержащий настройки соединения с почтовым сервером и списки адресатов, которые задаются группами в секции recipients; При запуске cve-monitor с флагом --mail следует передать название группы адресатов; Так, например, пусть файл настройки почтовой рассылки имеет следующее содержимое

[connection]
host = some_host.com
port = 25
username = some_mail_account
passwd = password_of_the_mail_account
raddress = some_mail_account@some_host.com

[recipients]
weekly = "some_email1@altlinux.org", "some_email2@basealt.ru", "some_email3@basealt.ru"
daily  = "some_email4@altlinux.org", "some_email5@basealt.ru"
some_other_group_of_recipients = "some_other_email@some_other_host.com"

Тогда, например, для того чтобы результаты команды cve-monitor --show issues unfixed --group после формирования были отправлены группе адресатов daily следует исполнить следующую команду:

cve-monitor --show issues unfixed --group --mail daily

Внутренние знания cve-manager

Пакет cve-manager-inner-knowledge содержит ряд файлов с данными, которые могут быть отредактированы пользователем с целью оказания влияния на процесс формирования БДУ:

  • cpe-mapping.csv (/etc/cve-manager/cpe-mapping.csv) - предопределяет соответствие имён на начальном этапе работы модуля cpe-map;
  • cpe-mapping-ignore.csv (/etc/cve-manager/cpe-mapping-ignore.csv) - определят пары имён, которые исключаются из результатов работы модуля cpe-map;
  • excluded-issues.csv (/etc/cve-manager/excluded-issues.csv) - определяет уязвимости, которые не следует считать незакрытыми для указанного пакета указанного репозитория начиная с указнной версии пакета (используется модулем cve-issues).

Каждая строка файлов cpe-mapping.csv и cpe-mapping-ignore.csv должна быть записана в следующем формате:

<название пакета>, <название программного продуката, используемое NVD>

Каждая строка файла excluded-issues.csv должна быть записана в следующем формате:

<ветвь Sisyphus, 'all' если все ветви>, <id уязвимости>, <название пакета>, <версия пакета>

Для того чтобы обозначенные настройки установления соответствия имён вступили в действие следует запустить модуль cpe-map заново для соответствующих ветвей (cpe-map -b [<branch_name> ...]), или для всех ветвей (cpe-map -e); При этом следует заново запустить модуль cve-issues для данных ветвей (cve-issues -b [<branch_name> ...]), или для всех ветвей (cve-issues -b all); В случае, если допустима обработка всех ветвей, запуск модулей cpe-map и cve-issues можно осуществить путём запуска автоматического формирования БДУ начиная с шага установления соответствия имён:

cve-manager -a -b map.

Использование

Подготовка базы данных уязвимостей

Запуск модуля cve-manager:

cve-manager [-h] [-a [-b MODULE_NAME] [-e MODULE_NAME]] [-m] [-t] [--plain] [--silent]
Команда Описание
-h, --help Вывод справки
-a, --auto Запуск модулей один за другим в автоматическом режиме
-b MODULE_NAME, --beginning_step MODULE_NAME Запуск работы в автоматическом режиме с указанного шага (название модуля без приставки cve- / cpe-)
-e MODULE_NAME, --ending_step MODULE_NAME Запуск работы в автоматическом режиме до указанного шага, включительно (название модуля без приставки cve- / cpe-)
-t, --timer Задействование таймера, который измеряет интервалы времени исполнения запускаемых модулей
--plain Упрощенный вывод (следует использовать, например, при перенаправлении вывода в файл)
--silent Запрет вывода
-m, --multithreading Создание отдельных вычислительных потоков для каждой исследуемой ветви при запуске модулей cve-fixes, cpe-map и cve-issues в автоматическом режиме (флаг -a)

При запуске без параметра -a cve-manager работает в диалоговом режиме - на каждом шаге выводится справочная информация о возможных действиях. На первом шаге следует выбрать нужный для использования в данный момент модуль, при выборе модуля выводится справочная информация данного модуля. При начале работы с нуля следует запускать модули в том порядке, в котором они перечислены в разделе "Структура программы".

Каждый модуль пакета cve-manager является самостоятельной программой и может быть запущен напрямую, например:

cve-download --everything
cve-import --prepare

Вывод справочной информации модуля:

<module-name> --help

Мониторинг уязвимостей пакетов

Запуск модуля cve-monitor:

cve-monitor [-h] [--show WHAT_YOU_WANT_TO_SEE] [-f FIX_STATUS] [-t ISSUES_TYPE] [-o ORDER_BY] [-b BRANCH_NAME [BRANCH_NAME ...]] [-p PACKAGE_NAME [PACKAGE_NAME ...]] [-y YEAR [YEAR ...]] [-v VUL_ID [VUL_ID ...]] [--group] [--cure] [--patch] [-m REPORT_CATEGORY [REPORT_CATEGORY ...]]
Команда Описание
-h, --help Вывод справки
--show WHAT_YOU_WANT_TO_SEE Вывод списка уязвимостей (issues, является значением по-умолчанию), или вывод новых незакрытых уязвимостей (history), или вывод сравнительного списка по уязвимостям указанных ветвей Sisyphus (comp, требует задания значения параметра --branches, при этом первая указанная ветвь сравнивается с последующими), или вывод полных описаний уязвимостей (vul_des), или вывод установленного соответствия между названиями пакетов и названиями, используемыми в описаниях уязвимостей (map), или вывод примеров использования (ex)
-f FIX_STATUS, --fix_status FIX_STATUS Фильтрация результатов по состоянию уязвимостей (fixed / unfixed / all)
-t ISSUES_TYPE, --itype ISSUES_TYPE Фильтрация результатов по типу источника записей об уязвимостях (nvd / fstec)
-o ORDER_BY, --order ORDER_BY Осуществление упорядочения результатов по идентификаторам уязвимостей (id), иманам пакетов (package), оценке CVSS ver.2 (score2), оценке CVSS ver.3 (score3), или текущему состоянию уязвимости (fix)
-b BRANCH_NAME [BRANCH_NAME ...],
--branches BRANCH_NAME [BRANCH_NAME ...]
Фильтрация результатов по названиям репозиториев
-p PACKAGE_NAME [PACKAGE_NAME ...],
--packages PACKAGE_NAME [PACKAGE_NAME ...]
Фильтрация результатов по названиям пакетов
-y YEAR [YEAR ...], --years YEAR [YEAR ...] Фильтрация результатов по датам уязвимостей
-v VUL_ID [VUL_ID ...],
--vul_ids VUL_ID [VUL_ID ...]
Фильтрация результатов по идентификаторами уязвимостей
--group Осуществление группировки результатов по именнам пакетов (работает только при запуске с параметром -f unfixed)
--cure Дополнение отчёта колонкой с названиями ветвей Sisyphus более высокого порядка (например, p9 для p8), в которых данная уязвимость не наблюдается
--patch Список ссылок на патчи, предположительно закрывающие данную уязвимость (ссылки извлекаются из спсиок уязвимостей)
-m REPORT_CATEGORY [REPORT_CATEGORY ...],
--mail REPORT_CATEGORY [REPORT_CATEGORY ...]
Осуществить почтовую рассылку с формируемым результатом на адреса, указанные в соответствующем конфигурационном файле (см. Настройка клиентской части)

Разворачивание инфраструктуры базы данных уязвимостей

Для работы cve-manager нет необходимости устанавливать MySQL сервер и создавать БДУ в своём окружении - в настройках cve-manager может быть указан адрес удалённого сервера. Тем не менее, это можно сделать, выполнив следующие шаги:

1. Установить MySQL сервер:
apt-get install MySQL-server
Также можно воспользоваться альтернативой (все остальные пункты данного руководства при этом остаются в силе):
apt-get install mariadb-server
2. Внести изменения в файл настройки MySQL сервера /etc/my.cnf.d/server.cnf:
[mysqld]
...
loose-local-infile = 1
#skip-networking
bind-address = 127.0.0.1
3. Перезапустить MySQL сервер и запустить MySQL консоль:
su -l -c 'service mysqld restart'
mysql -u root
4. Задать пароль пользователя MySQL с именем root:
mysql> SET PASSWORD FOR 'root'@'localhost' = 'root-passwd';
, где root-passwd - задаваемый пароль пользователя root;
5. Добавить пользователя MySQL, от имени которого будет осуществляться формирование БД:
MySQL server ver 8.* MySQL server ver 5.*
mysql> CREATE USER 'user-name'@'localhost' IDENTIFIED WITH mysql_native_password BY 'user-passwd';
mysql> GRANT ALL ON *.* TO 'user-name'@'localhost';
mysql> GRANT ALL PRIVILEGES ON *.* to 'user-name'@'localhost' IDENTIFIED BY 'user-passwd';
, где user-name - имя пользователя, user-passwd- пароль пользователя;
6. Добавить пользователя MySQL, от имени которого будут осуществляться запросы на чтение записей БД (мониторинг):
MySQL server ver 8.* MySQL server ver 5.*
mysql> CREATE USER 'monitor'@'localhost' IDENTIFIED WITH mysql_native_password BY 'monitor';
mysql> GRANT SELECT ON *.* TO 'monitor'@'localhost';
mysql> GRANT SELECT ON *.* TO 'monitor'@'localhost' IDENTIFIED BY 'monitor';
7. При использовании MySQL-server версии >= 5.7 может возникнуть его несовместимость с используемыми C++ и Python MySQL-фреймворками; Для исправления этого следует (например, для совместимости с версией 5.6):
7.1. Задать режим обратной совместимости в mysql консоли:
mysql -u root -p
mysql> set @@global.show_compatibility_56=ON;
7.2. Добавить в файл /etc/my.cnf.d/server.cnf строку:
show_compatibility_56 = 1

Ссылки

Проект на git.altlinux.org
cve-manager-inner-knowledge