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

Материал из ALT Linux Wiki
Нет описания правки
Нет описания правки
 
(не показаны 4 промежуточные версии этого же участника)
Строка 13: Строка 13:
# <b>cve-history</b> — осуществляет выборку незакрытых уязвимостей по текущему состоянию БДУ и сохраняет их в отдельной таблице с целью обеспечения возможности сравнения будущего состояния БДУ с этим сохранённым состоянием;
# <b>cve-history</b> — осуществляет выборку незакрытых уязвимостей по текущему состоянию БДУ и сохраняет их в отдельной таблице с целью обеспечения возможности сравнения будущего состояния БДУ с этим сохранённым состоянием;
# <b>cve-download</b> — осуществляет загрузку списков уязвимостей, предоставляемых NVD и ФСТЭК, а также загрузку CPE словаря, ACL пакетов исследуемых репозиториев, файлов с хронологией сборок каждого пакета, а также загрузку списков пакетов дистрибутивов;
# <b>cve-download</b> — осуществляет загрузку списков уязвимостей, предоставляемых NVD и ФСТЭК, а также загрузку CPE словаря, ACL пакетов исследуемых репозиториев, файлов с хронологией сборок каждого пакета, а также загрузку списков пакетов дистрибутивов;
# <b>cve-import</b> — осуществляет 1) чтение списков RPM-пакетов указанных репозиториев, или формирование списка установленных пакетов локальной системы (далее в предложении - <i>"пакетов"</i>, из репозиториев или локальной системы), 2) чтение ACL пакетов, 3) чтение файлов с хронологией сборок пакетов, 4) чтение загруженных списков уязвимостей и CPE словаря, 5) извлечение URL и идентификаторов исправленных уязвимостей из метаданных пакетов, 6) внесение собранных таким образом данных в БДУ;
# <b>cve-import</b> — осуществляет 1) чтение списков RPM-пакетов указанных репозиториев, или формирование списка установленных пакетов локальной системы (далее в предложении - <i>"пакетов"</i>, из репозиториев или локальной системы), 2) чтение ACL пакетов, 3) чтение файлов с хронологией сборок пакетов, 4) чтение загруженных списков уязвимостей и CPE словаря, 5) извлечение URL и идентификаторов исправленных уязвимостей из метаданных пакетов, 6) чтение [https://www.altlinux.org/ALTRepo#Errata ALT Linux errata], 7) внесение собранных таким образом данных в БДУ;
# <b>cpe-map</b> — осуществляет установление соответствия импортированных в БД названий исходных пакетов рассматриваемых репозиториев и 1) названий программных продуктов из импортированного в БД CPE словаря, а также 2) названий программных продуктов из импортированного в БД списка уязвимостей ФСТЭК;
# <b>cpe-map</b> — осуществляет установление соответствия импортированных в БД названий исходных пакетов рассматриваемых репозиториев и 1) названий программных продуктов из импортированного в БД CPE словаря, а также 2) названий программных продуктов из импортированного в БД списка уязвимостей ФСТЭК;
# <b>cve-issues</b> — осуществляет установление соответствия между данными, внесёнными в БД с помощью модулей <i>cve-import</i> и <i>cpe-map</i>, а именно — формирует записи в БД вида <code><идентификатор уязвимости>, <идентификатор пакета>, <уязвимая версия программного продукта>, <статус уязвимости></code>, где <code><статус уязвимости></code> — значение из следующего набора (или комбинация данных значений):
# <b>cve-issues</b> — осуществляет установление соответствия между данными, внесёнными в БД с помощью модулей <i>cve-import</i> и <i>cpe-map</i>, а именно — формирует записи в БД вида <code><идентификатор уязвимости>, <идентификатор пакета>, <уязвимая версия программного продукта>, <статус уязвимости></code>, где <code><статус уязвимости></code> — значение из следующего набора (или комбинация данных значений):
Строка 21: Строка 21:
#* <i>L</i> (от <i>lesser ver</i>) — версия пакета в репозитории меньше данной уязвимой версии;
#* <i>L</i> (от <i>lesser ver</i>) — версия пакета в репозитории меньше данной уязвимой версии;
#* <i>V</i> (от <i>vulnerable</i>) — версия пакета в репозитори совпадает с уязвимой версией программного продукта и устранение данной уязвимости не зафиксировано;
#* <i>V</i> (от <i>vulnerable</i>) — версия пакета в репозитори совпадает с уязвимой версией программного продукта и устранение данной уязвимости не зафиксировано;
#* <i>a</i> — версия пакета в репозитории больше указанной в ALT Linux errata уязвимой версии;
#* <i>A</i> — версия пакета в репозитори совпадает c указанной в ALT Linux errata уязвимой версией;
#* <i>?</i> — сравнение текущей версии пакета и указанной уязвимой версии программного продукта не удалось осуществить.
#* <i>?</i> — сравнение текущей версии пакета и указанной уязвимой версии программного продукта не удалось осуществить.
# <b>cve-monitor</b> — предназначен для посылки запросов выборки из таблиц БДУ и выдачи результатов (отчётов), например формирование списка всех пакетов с имеющимися незакрытыми уязвимостями или списка всех закрытых уязвимостей одной ветви, которые не закрыты в другой; Формируемые отчёты могут рассылаться на задаваемые адреса электронной почты; Отчёты предоставляются в собственном формате (см. подраздел [[CVE-Manager#Мониторинг_уязвимостей_пакетов|<i>Мониторинг уязвимостей пакетов</i>]]), в перспективе - дополнительная возможность их получения в формате XML и JSON.
# <b>cve-monitor</b> — предназначен для посылки запросов выборки из таблиц БДУ и выдачи результатов (отчётов), например формирование списка всех пакетов с имеющимися незакрытыми уязвимостями или списка всех закрытых уязвимостей одной ветви, которые не закрыты в другой; Формируемые отчёты могут рассылаться на задаваемые адреса электронной почты; Отчёты предоставляются в собственном формате (см. подраздел [[CVE-Manager#Мониторинг_уязвимостей_пакетов|<i>Мониторинг уязвимостей пакетов</i>]]), в перспективе - дополнительная возможность их получения в формате XML и JSON.
Строка 34: Строка 36:
Установка только клиентской части:
Установка только клиентской части:
:<code>apt-get install cve-monitor</code>
:<code>apt-get install cve-monitor</code>
Пользователь может установить <i>cve-monitor</i> (не устанавливая при этом <i>cve-manager</i>) и делать запросы к <i>cve-manager</i>, установленному на удалённом сервере.


== Настройка ==
== Настройка ==
Строка 75: Строка 79:
#* <i>master_branch</i> — название основной ветви, значения времени сборки пакетов которой будут учитываться при определении соответствия имён исходных пакетов и имён уязвимых программных продуктов;
#* <i>master_branch</i> — название основной ветви, значения времени сборки пакетов которой будут учитываться при определении соответствия имён исходных пакетов и имён уязвимых программных продуктов;
#* <i>basealt</i> — путь к каталогу, в который смонтирован корневой каталог alt-сервера;
#* <i>basealt</i> — путь к каталогу, в который смонтирован корневой каталог alt-сервера;
#* <i>excluded_vulsrc</i> — источники списков уязвимостей, исключаемые из рассмотрения (возможные значения - <i>nvd</i> и <i>fstec</i>).
#* <i>always_verify_tls_certificate</i> — флаг, который следует установить равным <i>1</i> для запрета установления незащищённого соединения для загрузки данных модулем <i>cve-dowload</i>, или же раным <i>0</i> для допущения установления незащищённого соединения;
#* <i>excluded_vulsrc</i> — источники списков уязвимостей, исключаемые из рассмотрения (возможные значения - <i>nvd</i> и <i>fstec</i>);
#* <i>distro_lists_src</i> — обозначение нахождения списков исходных пакетов, из которых собираются бинарные пакеты дистрибутивов, в виде пути к каталогу в файловой системе или в виде адреса репозитория (<i>git</i>-протокол);
#* <i>distro_lists_bin</i> — обозначение нахождения списков бинарных пакетов дистрибутивов в виде пути к каталогу в файловой системе или в виде адреса репозитория (<i>git</i>-протокол).
 
Параметры <i>download</i> и <i>master_branch</i> являются обязательными.
Параметры <i>download</i> и <i>master_branch</i> являются обязательными.


Строка 152: Строка 160:


Пакет <i><b>cve-manager-inner-knowledge</b></i> содержит ряд файлов с данными, которые могут быть отредактированы пользователем с целью оказания влияния на процесс формирования БДУ:
Пакет <i><b>cve-manager-inner-knowledge</b></i> содержит ряд файлов с данными, которые могут быть отредактированы пользователем с целью оказания влияния на процесс формирования БДУ:
:*<code>cpe-excluded.csv</code> (<code>/etc/cve-manager/cpe-excluded.csv</code>) — определяет CPE, исключённые из рассмотрения;
:*<code>cpe-excluded.csv</code> и <code>fstec-excluded.csv</code> (<code>/etc/cve-manager/cpe-excluded.csv</code> и <code>/etc/cve-manager/fstec-excluded.csv</code>) — определяют упоминаемые в списках уязвимостей программные продукты, которые должны быть исключены из рассмотрения;
:*<code>cpe-mapping.csv</code> (<code>/etc/cve-manager/cpe-mapping.csv</code>) — предопределяет соответствие имён на начальном этапе работы модуля <i>cpe-map</i>;
:*<code>cpe-mapping.csv</code> и <code>fstec-mapping.csv</code> (<code>/etc/cve-manager/cpe-mapping.csv</code> и <code>/etc/cve-manager/fstec-mapping.csv</code>) — предопределяют соответствие имён на начальном этапе работы модуля <i>cpe-map</i>;
:*<code>cpe-mapping-ignore.csv</code> (<code>/etc/cve-manager/cpe-mapping-ignore.csv</code>) — определяет пары имён, которые исключаются из результатов работы модуля <i>cpe-map</i>;
:*<code>cpe-mapping-ignore.csv</code> и <code>fstec-mapping-ignore.csv</code> (<code>/etc/cve-manager/cpe-mapping-ignore.csv</code> и <code>/etc/cve-manager/fstec-mapping-ignore.csv</code>) — определяют пары имён, которые должны быть исключены из результатов работы модуля <i>cpe-map</i>;
:*<code>cpe-relatives.txt</code> (<code>/etc/cve-manager/cpe-relatives.txt</code>) — предопределяет набор родственных CPE (если какое-то название продукта из набора родственных CPE было поставлено в соответствие какому-то названию пакета, то каждое название продукта из всех прочих CPE данного набора будет на равных правах поставлено в соответствие данному названию пакета в случае, если данное название продукта не было поставлено в соответствие какому-то другому названию пакета);
:*<code>cpe-relatives.txt</code> и <code>fstec-relatives.txt</code> (<code>/etc/cve-manager/cpe-relatives.txt</code> и <code>/etc/cve-manager/fstec-relatives.txt</code>) — предопределяют набор упоминаемых в списках уязвимостей родственных продуктов (если какое-то название продукта из набора было поставлено в соответствие какому-то названию пакета, то каждое название продукта из всех прочих названий продуктов данного набора будет на равных правах поставлено в соответствие данному названию пакета в случае, если данное название продукта не было поставлено в соответствие какому-то другому названию пакета);
:*<code>excluded-issues.csv</code> (<code>/etc/cve-manager/excluded-issues.csv</code>) — определяет уязвимости, которые не следует считать незакрытыми для указанного пакета указанного репозитория начиная с указанной версии пакета (используется модулем <i>cve-issues</i>);
:*<code>excluded-issues.csv</code> (<code>/etc/cve-manager/excluded-issues.csv</code>) — определяет уязвимости, которые не следует считать незакрытыми для указанного пакета указанного репозитория начиная с указанной версии пакета (используется модулем <i>cve-issues</i>);
:*<code>groups.csv</code> (<code>/etc/cve-manager/groups.csv</code>) — определяет группы, в которые, в соответствии с заданными в этом файле условиями, в ходе работы программы будут включены пакеты и программные продукты из списков уязвимостей (названию пакета одной группы не может быть поставлено в соответствие название программного продукта другой группы).
:*<code>groups.csv</code> (<code>/etc/cve-manager/groups.csv</code>) — определяет группы, в которые, в соответствии с заданными в этом файле условиями, в ходе работы программы будут включены пакеты и программные продукты из списков уязвимостей (названию пакета одной группы не может быть поставлено в соответствие название программного продукта другой группы).


Каждая строка файла <i>cpe-excluded.csv</i> должна быть записана в следующем формате (здесь и далее под вендором и названием программного продукта подразумеваются соответствующие составляющие CPE - обозначений программного обеспечения, которые используются NVD, а само словосочетание <i>"программный продукт"</i> представлено сокращённой записью <i>"пп"</i>):
Каждая строка файлов <i>cpe-excluded.csv</i> и <i>fstec-excluded.csv</i> должна быть записана в следующем формате (здесь и далее под вендором и названием программного продукта подразумеваются соответствующие составляющие CPE или обозначения продуктов из данных от ФСТЭК, само словосочетание <i>"программный продукт"</i> представлено сокращённой записью <i>"пп"</i>):
:<code><вендор пп>, <названия пп через пробел></code>
:<code><вендор пп>, <названия пп через пробел></code>


При этом в качестве названия программного продукта может быть помещён символ <code>*</code>, означающий <i>"все названия продуктов данного вендора"</i>, а также могут быть помещены названия программных продуктов с префиксом <code>!</code>, означающим <i>"все названия продуктов данного вендора, за исключением данного названия"</i>:
При этом в качестве вендора или названия программного продукта может быть помещён символ <code>*</code>, означающий, соответственно, <i>"все продукты с данным названием продукта"</i> или <i>"все названия продуктов данного вендора"</i>, а также могут быть помещены названия программных продуктов с префиксом <code>!</code>, означающим <i>"все названия продуктов данного вендора, за исключением данного названия"</i>:
:<code><вендор пп1>, *</code>
:<source lang="text">
:<code><вендор пп2>, !<название пп21> !<название пп22> !<название пп23></code>
*, <название_пп0>
<вендор пп1>, *
<вендор пп2>, !<название пп21> !<название пп22> !<название пп23>
</source>
 
Также в файлах <i>cpe-excluded.csv</i> и <i>fstec-excluded.csv</i> возможно использование регулярных выражений. Регулярное выражение должно начинаться с символа <code>r</code> и быть заключено в одинарные или двойные кавычки:
:<source lang="text">
*, r'for_windows$'
r"^apple[^A-Za-z]?", *
</source>
 
В виду того, что составляющие обозначений продуктов ФСТЭК не имеют строгого формата (в них могут быть использованы как заглавные, так и строчные буквы, а в качестве разделителей могу быть использованы различные символы), к списку <i>fstec-excluded.csv</i> применяются дополнительные правила, облегчающие задание исключённых продуктов, а именно:
:*Регистр не учитывается;
:*Символ <code>_</code> обозначает наличие какого-либо разделителя;
:*Символ <code>~</code> обозначает возможное наличие какого-либо разделителя.
 
Так, например, первая строка подойдёт для описания как продукта <i>"Some product"</i>, так и для описания продукта <i>"Some_product"</i> и <i>"SomeProduct"</i>, а вторая строка — только для описания продуктов <i>"Some Product"</i> и <i>"Some_product"</i> (из трёх приведённых названий продуктов):
:<source lang="text">
*, some~product
*, some_product
</source>


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


Каждая строка файла <i>cpe-relatives.txt</i> представляет собой последовательность CPE, разделённых пробелами, каждое CPE при этом записывается в следующем формате:
Каждая строка файлов <i>cpe-relatives.txt</i> и <i>fstec-relatives.txt</i> представляет собой последовательность обозначений программных продуктов, разделённых пробелами, каждое обозначение программного продукта при этом записывается в следующем формате:
:<code><вендор пп>:<название пп></code>
:<code><вендор пп>:<название пп></code>


Строка 178: Строка 206:
:<code><условное название группы>, <префиксы пакетов>, <вендоры пп>, <префиксы названий пп>, <суффиксы названий пп>, <url адреса пакетов и пп></code>
:<code><условное название группы>, <префиксы пакетов>, <вендоры пп>, <префиксы названий пп>, <суффиксы названий пп>, <url адреса пакетов и пп></code>


Для того чтобы изменения списка <i>cpe-excluded.csv</i> вступили в действие, следует запустить формирование БДУ начиная с шага, не ранее чем шаг импорта данных:
Для того чтобы изменения списка <i>cpe-excluded.csv</i> или <i>fstec-excluded.csv</i> вступили в действие, следует запустить формирование БДУ начиная с шага, не ранее чем шаг импорта данных:
:<code>cve-manager -b import</code>
:<code>cve-manager -b import</code>


Строка 272: Строка 300:
|-
|-
|<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>alt_errata_fixed</code> / <code>alt_errata_unfixed</code> / <code>all</code>)
|-
|-
|<code>-t ISSUES_TYPE, --itype ISSUES_TYPE</code>
|<code>-t ISSUES_TYPE, --itype ISSUES_TYPE</code>
Строка 310: Строка 338:
|Запись сформированных отчётов в файл <code><out_dir>/<title>_<branch>:<distro>_<YYYY-MM-DD>_<hh:mm:ss></code>, гдe <code><out_dir></code> - абсолютный путь, указанный в качестве параметра <i>out_dir</i> в файле настройки <i>cve-monitor</i>, <code><title></code> — название отчёта (см. <code>--title</code>), <code><branch></code> и <code><distro></code> - репозиторий и дистрибутив (опционально) для которых сформирован отчёт, <code><YYYY-MM-DD></code> и <code><hh:mm:ss></code> — дата и время в соответствующем формате
|Запись сформированных отчётов в файл <code><out_dir>/<title>_<branch>:<distro>_<YYYY-MM-DD>_<hh:mm:ss></code>, гдe <code><out_dir></code> - абсолютный путь, указанный в качестве параметра <i>out_dir</i> в файле настройки <i>cve-monitor</i>, <code><title></code> — название отчёта (см. <code>--title</code>), <code><branch></code> и <code><distro></code> - репозиторий и дистрибутив (опционально) для которых сформирован отчёт, <code><YYYY-MM-DD></code> и <code><hh:mm:ss></code> — дата и время в соответствующем формате
|-
|-
|<code>-m, --mail</code>
|<code>-m [CONTENT_TYPE], --mail [CONTENT_TYPE]</code>
|Почтовая рассылка результатов выполняемого запроса на адреса, которые указаны в соответствующем конфигурационном файле (см. подраздел [[CVE-Manager#Настройка_клиентской_части|<i>Настройка клиентской части</i>]]) и которые соответствуют заданной цели (см. <code>--title</code>)
|Почтовая рассылка результатов выполняемого запроса на адреса, которые указаны в соответствующем конфигурационном файле (см. подраздел [[CVE-Manager#Настройка_клиентской_части|<i>Настройка клиентской части</i>]]) и которые соответствуют заданной цели (см. <code>--title</code>), значение параметра определяет тип содержимого - простой текст (<code>plain</code>, является значением по-умолчанию), или HTML (<code>html</code>)
|-
|-
|<code>--title NAME</code>
|<code>--title NAME</code>

Текущая версия от 15:46, 15 августа 2024

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

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

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

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

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

  1. cve-manager — предоставляет пользовательский интерфейс для запуска процесса формирования БДУ и осуществляет организацию и контроль данного процесса путём последовательного запуска остальных модулей в установленном порядке в автоматическом режиме;
  2. cve-backup — осуществляет резервное копирование/восстановление ранее сформированной БДУ;
  3. cve-history — осуществляет выборку незакрытых уязвимостей по текущему состоянию БДУ и сохраняет их в отдельной таблице с целью обеспечения возможности сравнения будущего состояния БДУ с этим сохранённым состоянием;
  4. cve-download — осуществляет загрузку списков уязвимостей, предоставляемых NVD и ФСТЭК, а также загрузку CPE словаря, ACL пакетов исследуемых репозиториев, файлов с хронологией сборок каждого пакета, а также загрузку списков пакетов дистрибутивов;
  5. cve-import — осуществляет 1) чтение списков RPM-пакетов указанных репозиториев, или формирование списка установленных пакетов локальной системы (далее в предложении - "пакетов", из репозиториев или локальной системы), 2) чтение ACL пакетов, 3) чтение файлов с хронологией сборок пакетов, 4) чтение загруженных списков уязвимостей и CPE словаря, 5) извлечение URL и идентификаторов исправленных уязвимостей из метаданных пакетов, 6) чтение ALT Linux errata, 7) внесение собранных таким образом данных в БДУ;
  6. cpe-map — осуществляет установление соответствия импортированных в БД названий исходных пакетов рассматриваемых репозиториев и 1) названий программных продуктов из импортированного в БД CPE словаря, а также 2) названий программных продуктов из импортированного в БД списка уязвимостей ФСТЭК;
  7. cve-issues — осуществляет установление соответствия между данными, внесёнными в БД с помощью модулей cve-import и cpe-map, а именно — формирует записи в БД вида <идентификатор уязвимости>, <идентификатор пакета>, <уязвимая версия программного продукта>, <статус уязвимости>, где <статус уязвимости> — значение из следующего набора (или комбинация данных значений):
    • c (от changelog) — устранение данной уязвимости обозначено в changelog-секции пакета;
    • e (от excluded) — отсутствие данной уязвимости обозначено в файле /etc/cve-manager/cpe-excluded.csv (поставляется пакетом cve-manager-inner-knowledge);
    • b (от bigger ver) — версия пакета в репозитории больше данной уязвимой версии;
    • L (от lesser ver) — версия пакета в репозитории меньше данной уязвимой версии;
    • V (от vulnerable) — версия пакета в репозитори совпадает с уязвимой версией программного продукта и устранение данной уязвимости не зафиксировано;
    • a — версия пакета в репозитории больше указанной в ALT Linux errata уязвимой версии;
    • A — версия пакета в репозитори совпадает c указанной в ALT Linux errata уязвимой версией;
    • ? — сравнение текущей версии пакета и указанной уязвимой версии программного продукта не удалось осуществить.
  8. cve-monitor — предназначен для посылки запросов выборки из таблиц БДУ и выдачи результатов (отчётов), например формирование списка всех пакетов с имеющимися незакрытыми уязвимостями или списка всех закрытых уязвимостей одной ветви, которые не закрыты в другой; Формируемые отчёты могут рассылаться на задаваемые адреса электронной почты; Отчёты предоставляются в собственном формате (см. подраздел Мониторинг уязвимостей пакетов), в перспективе - дополнительная возможность их получения в формате XML и JSON.

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

Установка

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

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

apt-get install cve-manager

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

apt-get install cve-monitor

Пользователь может установить cve-monitor (не устанавливая при этом cve-manager) и делать запросы к cve-manager, установленному на удалённом сервере.

Настройка

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

Для работы 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 версии 8.*, здесь и далее):
mysql> CREATE USER 'user-name'@'localhost' IDENTIFIED WITH mysql_native_password BY 'user-passwd';
mysql> GRANT ALL ON *.* TO 'user-name'@'localhost';
где user-name — имя пользователя, user-passwd — пароль пользователя;
6. Добавить пользователя MySQL, от имени которого будут осуществляться запросы на чтение записей БД (мониторинг):
mysql> CREATE USER 'monitor'@'localhost' IDENTIFIED WITH mysql_native_password BY 'monitor';
mysql> GRANT SELECT ON *.* TO 'monitor'@'localhost';

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

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

  1. db_connection, в которой указываются параметры соединения с базой данных MySQL (host, user, password, database);
  2. common, включающая следующие параметры:
    • download — путь к каталогу, в который cve-download загружает входные данные и откуда cve-import их импортирует в БДУ;
    • master_branch — название основной ветви, значения времени сборки пакетов которой будут учитываться при определении соответствия имён исходных пакетов и имён уязвимых программных продуктов;
    • basealt — путь к каталогу, в который смонтирован корневой каталог alt-сервера;
    • always_verify_tls_certificate — флаг, который следует установить равным 1 для запрета установления незащищённого соединения для загрузки данных модулем cve-dowload, или же раным 0 для допущения установления незащищённого соединения;
    • excluded_vulsrc — источники списков уязвимостей, исключаемые из рассмотрения (возможные значения - nvd и fstec);
    • distro_lists_src — обозначение нахождения списков исходных пакетов, из которых собираются бинарные пакеты дистрибутивов, в виде пути к каталогу в файловой системе или в виде адреса репозитория (git-протокол);
    • distro_lists_bin — обозначение нахождения списков бинарных пакетов дистрибутивов в виде пути к каталогу в файловой системе или в виде адреса репозитория (git-протокол).

Параметры download и master_branch являются обязательными.

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

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

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

Для анализа локальной системы в файл настройки следует добавить секцию с особым названием - local_sys. При этом название репозитория, который используется локальной системой, задаётся параметром branch (значение данного параметра по-умолчанию соответствует значению параметра master_branch секции common).

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

[db_connection]
host     = "localhost:3306"
user     = some_username
password = some_password
database = some_dbname

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

[Sisyphus]

[p8]

[local_sys]
branch = p8

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

[some_branch]
bin_list = "/some_branch/lists/bin.list"
srpms_dir = "/some_branch/SRPMS/"
rpms_dirs = "/some_branch/x86_64/RPMS/", "/some_branch/noarch/RPMS/"

Файл настройки принадлежит пользователю 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), например:

[p9]
seniors = Sisyphus

[p8]
seniors = ${p9:seniors}, p9

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

[smtp_connection]
host = some_host.com
port = 25
user = some_mail_account
password = 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 --title daily

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

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

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

Каждая строка файлов cpe-excluded.csv и fstec-excluded.csv должна быть записана в следующем формате (здесь и далее под вендором и названием программного продукта подразумеваются соответствующие составляющие CPE или обозначения продуктов из данных от ФСТЭК, само словосочетание "программный продукт" представлено сокращённой записью "пп"):

<вендор пп>, <названия пп через пробел>

При этом в качестве вендора или названия программного продукта может быть помещён символ *, означающий, соответственно, "все продукты с данным названием продукта" или "все названия продуктов данного вендора", а также могут быть помещены названия программных продуктов с префиксом !, означающим "все названия продуктов данного вендора, за исключением данного названия":

*, <название_пп0>
<вендор пп1>, *
<вендор пп2>, !<название пп21> !<название пп22> !<название пп23>

Также в файлах cpe-excluded.csv и fstec-excluded.csv возможно использование регулярных выражений. Регулярное выражение должно начинаться с символа r и быть заключено в одинарные или двойные кавычки:

*, r'for_windows$'
r"^apple[^A-Za-z]?", *

В виду того, что составляющие обозначений продуктов ФСТЭК не имеют строгого формата (в них могут быть использованы как заглавные, так и строчные буквы, а в качестве разделителей могу быть использованы различные символы), к списку fstec-excluded.csv применяются дополнительные правила, облегчающие задание исключённых продуктов, а именно:

  • Регистр не учитывается;
  • Символ _ обозначает наличие какого-либо разделителя;
  • Символ ~ обозначает возможное наличие какого-либо разделителя.

Так, например, первая строка подойдёт для описания как продукта "Some product", так и для описания продукта "Some_product" и "SomeProduct", а вторая строка — только для описания продуктов "Some Product" и "Some_product" (из трёх приведённых названий продуктов):

*, some~product
*, some_product

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

<название пакета>, <названия пп через пробел>

Каждая строка файлов cpe-relatives.txt и fstec-relatives.txt представляет собой последовательность обозначений программных продуктов, разделённых пробелами, каждое обозначение программного продукта при этом записывается в следующем формате:

<вендор пп>:<название пп>

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

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

Каждая строка файла groups.csv должна быть записана в следующем формате (каждый столбец, описанный существительным во множественном числе, допускает внесения последовательности слов, разделённых пробелами):

<условное название группы>, <префиксы пакетов>, <вендоры пп>, <префиксы названий пп>, <суффиксы названий пп>, <url адреса пакетов и пп>

Для того чтобы изменения списка cpe-excluded.csv или fstec-excluded.csv вступили в действие, следует запустить формирование БДУ начиная с шага, не ранее чем шаг импорта данных:

cve-manager -b import

В остальных случаях, для того чтобы обозначенные настройки установления соответствия имён вступили в действие, следует заново запустить модуль 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 -b map

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

Формат списка пакетов исследуемого репозитория (не относится к анализу локальной системы)

Список пакетов исследуемого репозитория может быть задан в одном из двух форматов. Первый формат соответствует формату списков бинарных пакетов ALT Linux (alt:/ALT/<branch>/files/list/bin.list), а второй формат исключает всю ненужную информацию:

Формат Пример
<bin_package_short_name> <*> <*> <*> <src_package_full_name> libcve-manager 0.33.1-alt1 x86_64 libcve-manager-0.33.1-alt1.x86_64.rpm cve-manager-0.33.1-alt1.src.rpm
<bin_package_short_name> <src_package_full_name> libcve-manager cve-manager-0.33.1-alt1
<*> — любая комбинация символов, не включающая пробелы;
<bin_package_short_name> — название бинарного пакета без версии и релиза;
<src_package_full_name> — полное название исходного пакета, включающее версию и релиз (наличие расширения 'src.rpm' не обязательно).

Требование к наличию RPM-пакетов (не относится к анализу локальной системы)

Для выполнения импорта необходимых данных в БДУ для каждого набора наименований RPM-пакетов {src_i, {bin_i0, .. , bin_ij}} (где src_i — название исходного пакета; {bin_i0, .., bin_ij} — названия бинарных пакетов, собранных из src_i) пользователь должен предоставить либо а) исходный пакет, соответствующий src_i, либо б) один из бинарных пакетов, соответствующих {bin_i0, .., bin_ij}. Пути к каталогам, в которых были помещены данные пакеты, должны быть заданы в файле настроек /etc/cve-manager/cve-manager.conf в качестве значений параметров srpms_dir и rpms_dirs соответственно, при этом, бинарные пакеты могут быть расположены в нескольких каталогах, которые в таком случае должны быть перечислены через запятую как это показано в примере файла настройки (см. подраздел Настройка серверной части).

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

Запуск процесса формирования БДУ:

cve-manager [-h] [-a] [-b MODULE_NAME] [-e MODULE_NAME] [-r N_REPEATED_ATTEMPTS] [-o] [-l] [--plain] [--silent]
Параметр Описание
-h, --help Вывод справки
-a, --run_all Выполнить все шаги формирования БДУ
-b MODULE_NAME, --beginning_step MODULE_NAME Начальный шаг запускаемого процесса формирования БДУ (название модуля без приставки cve- / cpe-)
-e MODULE_NAME, --ending_step MODULE_NAME Конечный шаг запускаемого процесса формирования БДУ (название модуля без приставки cve- / cpe-)
-r N_REPEATED_ATTEMPTS, --retry N_REPEATED_ATTEMPTS Количество попыток перезапуска последнего выполняемого модуля в случае его неуспешного выполнения
-o, --offline Не запускать модуль cve-download в процессе формирования БДУ
-l, --list_modules Вывод списка доступных модулей (вместе с их описаниями)
--plain Упрощенный вывод (следует использовать, например, при перенаправлении вывода в файл)
--silent Запрет вывода

Пример команды запуска формирования БДУ, при котором автоматически, в установленном порядке, один за другим будут запущены все прочие модули:

cve-manager -a --plain 2>&1 1>$HOME/cve-manager.log

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

cve-manager -b download --plain 2>&1 1>$HOME/cve-manager.log

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

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

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

<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 ...]] [--distro_list_src DISTRO_NAME] [--distro_list_bin DISTRO_NAME] [-y YEAR [YEAR ...]] [-v VUL_ID [VUL_ID ...]] [--group] [--cure] [--patch] [-w] [-m] [--title NAME] [--unite]
Параметр Описание
-h, --help Вывод справки
--show WHAT_YOU_WANT_TO_SEE Вывод списка уязвимостей (issues, является значением по умолчанию), или вывод новых незакрытых уязвимостей (history), или вывод сравнительного списка по уязвимостям указанных ветвей Sisyphus (comp, требует задания значения параметра --branches, при этом первая указанная ветвь сравнивается с последующими), или вывод полных описаний уязвимостей (vul_desc), или вывод установленного соответствия между названиями пакетов и названиями, используемыми в описаниях уязвимостей (map), или вывод примеров использования (ex)
-f FIX_STATUS, --fix_status FIX_STATUS Фильтрация результатов по состоянию уязвимостей (fixed / unfixed / alt_errata_fixed / alt_errata_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 ...]
Фильтрация результатов по названиям указанных исходных пакетов
--distro_list_src DISTRO_NAME Фильтрация результатов по названиям исходных пакетов, перечисленных в списке пакетов указанного дистрибутива (поиск файла со списком пакетов дистрибутива осуществляется сначала в каталоге, имеющем название, которое совпадает с названием указанного репозитория — <download>/distro_lists_src/<branch>, после чего — в каталоге на уровень выше — <download>/distro_lists_src)
--distro_list_bin DISTRO_NAME Фильтрация результатов по названиям бинарных пакетов, перечисленных в списке пакетов указанного дистрибутива (окончание ".bnames" в названии файла со списком пакетов дистрибутива может быть отброшено, поиск данного файла при этом осуществляется сначала по указанному названию дистрибутива в каталоге, имеющем название, совпадающее с названием указанного репозитория — <download>/distro_lists_bin/<branch>, после чего — в каталоге на уровень выше — <download>/distro_lists_bin, после чего — в том же порядке и в тех же каталогах, но уже с подставленным окончанием ".bnames" в название дистрибутива)
-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 Дополнение отчёта колонкой со списком ссылок на патчи, которые предположительно закрывают данную уязвимость (ссылки извлекаются из входных списков уязвимостей)
-w, --write_files Запись сформированных отчётов в файл <out_dir>/<title>_<branch>:<distro>_<YYYY-MM-DD>_<hh:mm:ss>, гдe <out_dir> - абсолютный путь, указанный в качестве параметра out_dir в файле настройки cve-monitor, <title> — название отчёта (см. --title), <branch> и <distro> - репозиторий и дистрибутив (опционально) для которых сформирован отчёт, <YYYY-MM-DD> и <hh:mm:ss> — дата и время в соответствующем формате
-m [CONTENT_TYPE], --mail [CONTENT_TYPE] Почтовая рассылка результатов выполняемого запроса на адреса, которые указаны в соответствующем конфигурационном файле (см. подраздел Настройка клиентской части) и которые соответствуют заданной цели (см. --title), значение параметра определяет тип содержимого - простой текст (plain, является значением по-умолчанию), или HTML (html)
--title NAME Название отчёта, каждому названию может быть поставлена в соответствие какая-то группа адресатов почтовой рассылки
--unite Объединение отчётов по рассматриваемым ветвям (репозиториям) в единственный отчёт при осуществлении почтовой рассылки (см. -m) или записи в файл (см. -w).

Примеры команд и значения полей формируемых отчётов:

  • cve-monitor --show issues -f unfixed -b Sisyphus p9 --group --cure -m -w --title <some_group_of_recipients> — запрос всех неисправленных уязвимостей ветвей Sisyphus и p9 с группировкой записей по именам пакетов, с предложениями по устранению и отправкой отчётов по электронной почте группе адресатов <some_group_of_recipients> и записью отчётов в файлы внутри каталога, указанного в качестве значения параметра out_dir в файле настройки cve-monitor;
  • cve-monitor --show issues -f unfixed -b Sisyphus p9 --order package --cure --patch -m --title <some_group_of_recipients> — запрос детального отчёта (без группировки по именам пакетов -- каждая строка отводится отдельной уязвимости, наличие которой установлено для отдельного пакета), записи которого упорядочены по именам пакетов, с предложениями по устранению и ссылками на страницы, которые могут содержать патчи для устранения соответствующих уязвимостей, также с отправкой по электронной почте;
  • cve-monitor --show history -b p9 — запрос списка новых уязвимостей пакетов ветви p9, обнаруженных с момента последнего запуска модуля cve-history.
Поле Значение
PACKAGE NAME-VER-REL Название пакета, его версия и релиз
MAPPED NAME Название программного продукта, поставленное в соответствие названию данного пакета
VULNERABLE VER Указанные уязвимые версии, или интервалы версий (наличие версии, обозначенной символом *, означает, что набор уязвимых версий точно не установлен)
QTY Количество уязвимостей, наличие которых установленно для данного пакета
CVSS2/3 Оценка данной уязвимости по метрике CVSS ver.2 и CVSS ver.3
MAX CVSS2/3 Максимальная оценка по метрике CVSS ver.2 и CVSS ver.3 из всех оценок уязвимостей данного пакета
ACL Cписок пользователей и групп пользователей, имеющих право на сборку данного пакета в данный репозиторий с помощью git.alt
FIX Состояние данной уязвимости ([NO FIX] - не закрыта, changelog — о закрытии говорит запись в chagelog пакета, excluded- об отсутствии данной уязвимости говорит запись в файле /etc/cve-manager/cpe-excluded.csv, bigger ver / [lesser ver] — версия пакета больше/меньше указанных уязвимых версий, unresolved — сравнение версий не удалось осуществить)
CURE Ветви Sisyphus, в которых данный пакет не имеет всех или части (указывается особо) уязвимостей, наличие которых установлено для данного пакета
PATCH Ссылки на страницы, которые могут содержать патчи для устранения соответствующей уязвимостей

Ссылки

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