Skip to content

Latest commit

 

History

History
275 lines (191 loc) · 18.8 KB

commands.md

File metadata and controls

275 lines (191 loc) · 18.8 KB

Справочник команд

Все команды вызываются как efs <команда>. Глобальный флаг -v, --verbose включает подробный вывод и доступен для любой команды, -V, --version печатает версию.

Без установки: python -m efs.cli <команда>.

Автодополнение

efs --install-completion      # установить для текущей оболочки
efs --show-completion         # показать скрипт, не устанавливая

Дополняются имена команд, пути к файлам и значения перечислений: --format (oss, container), --tool (cdxgen, trivy), --gost-default (yes, no, indirect). Эти же значения проверяются при запуске — неверное отвергается с указанием допустимых. Входные файлы проверяются на существование до начала работы.

efs scan

Генерация SBOM внешним сканером — cdxgen или trivy. Настройки берутся из секции scanner конфига, аргументы командной строки их перекрывают.

Конфиг нужен не всегда: если передать --tool (а при необходимости --target и --output), команда отработает и без него. Мастер efs init запускается только когда нет ни конфига, ни аргументов и команда выполняется в терминале; в CI вместо мастера выводится подсказка.

efs scan [--tool cdxgen|trivy] [--target PATH] [--output FILE] [--config PATH]
Аргумент Описание
--tool Инструмент: cdxgen или trivy
--target Путь к исходникам или имя образа
--output, -o Выходной файл SBOM
--config Путь к .efs-config.json

Аргументы командной строки перекрывают значения из конфига.

{
  "scanner": {
    "tool": "trivy",
    "output": "bom.json",
    "target": ".",
    "options": {
      "command": "fs",
      "args": ["--scanners", "license"]
    }
  }
}

Для cdxgen содержимое options записывается в .cdxgenrc. Для trivy: command — подкоманда (fs, image, repo), args — дополнительные аргументы CLI.

Файл .cdxgenrc.example в репозитории показывает настройки cdxgen, с которыми efs работает по умолчанию: спецификация 1.6, профиль generic, только обязательные поля, без формуляций и криптоданных. Скопируйте его в проект, если хотите править настройки cdxgen напрямую, минуя конфиг.

efs config

Работа с единым конфигом. Подробности о структуре — в описании конфига.

efs config init

Собрать конфиг из SBOM: все purl попадают в components, язык программирования подставляется по экосистеме.

efs config init <sbom.json> [-o PATH] [-i EXTRA...]
Аргумент Описание
sbom.json Входной SBOM
-i, --extra-input Дополнительные SBOM (несколько сервисов в одном конфиге)
-o, --output Путь к конфигу (по умолчанию .efs-config.json)

Повторный запуск сохраняет уже сделанные настройки: добавляет новые компоненты и удаляет исчезнувшие. Если рядом лежит конфиг под прежним именем .sbom-config.json, настройки переносятся из него.

efs config status

Показать, что осталось незаполненным.

efs config status [--config PATH] [--all]

Выводит количество компонентов с VCS, с provided_by, исключённых, без языка и без источника, а также таблицу проблемных. С флагом --all показывает и заполненные.

efs config find-vcs

Найти ссылки на репозитории для компонентов, у которых их нет, и записать в конфиг.

efs config find-vcs [--config PATH] [--workers N]

Источники: ecosyste.ms, PyPI, npm, Maven Central, RubyGems, NuGet, Debian Sources, а также предсказуемые адреса репозиториев дистрибутивов (Fedora, CentOS Stream, Rocky, ALT, Salsa, Launchpad). Каждый найденный адрес проверяется на то, что это действительно репозиторий. Результаты кешируются в ~/.cache/efs.

Компоненты, помеченные exclude или имеющие provided_by, пропускаются.

efs config migrate

Перенести старые файлы маппингов в единый конфиг.

efs config migrate [--vcs PATH] [--gost PATH] [--exclude PATH] [-o PATH]

Читает .purl_to_vcs.json, .purl_to_gost.json, .purl_exclude.json из текущей директории (или по указанным путям) и объединяет их в .efs-config.json.

efs postprocess

Приведение сырого вывода сканера к перечню: очистка лишних полей, применение конфига, нормализация ГОСТ-свойств, удаление исключённых компонентов.

efs postprocess <input.json> <output.json> [--config PATH]
                [--app-name X] [--app-version Y] [--manufacturer Z]
                [--gost-default yes|no|indirect] [--strip-only] [--keep-all-fields]
                [--provided-by NAME] [--pretty/--no-pretty]
                [--purl-to-vcs FILE] [--purl-to-gost FILE] [--purl-exclude FILE]
Аргумент Описание
input Входной BOM (JSON)
output Выходной файл
--config PATH Путь к конфигу; по умолчанию ищется в текущей директории
--app-name Название продукта (metadata.component.name)
--app-version Версия продукта
--manufacturer Организация-изготовитель
--gost-default Значение ГОСТ-свойств по умолчанию (no)
--strip-only Только очистить лишние поля, не трогать metadata
--keep-all-fields Не удалять необязательные поля компонентов
--provided-by NAME Проставить GOST:provided_by листовым компонентам без него
--pretty / --no-pretty Форматировать JSON (по умолчанию да)

Три последних аргумента (--purl-to-*) читают старые файлы маппингов и оставлены для совместимости. Конфиг имеет приоритет над ними.

Если конфиг найден, команда дописывает в него компоненты, которых там ещё нет, сразу подставляя язык по экосистеме — так новые зависимости не теряются между обновлениями SBOM. Существующие настройки не меняются, записи не удаляются, и файл не создаётся, если его не было.

Язык программирования проставляется в перечень независимо от конфига: он следует из purl.

efs postprocess bom.json result.json \
  --app-name "МойПродукт" --app-version "1.0.0" --manufacturer "ООО МояКомпания"

efs check

Валидация по JSON Schema (CycloneDX 1.6 с ГОСТ-ограничениями) и проверка заполненности перечня.

efs check <file.json> [--check-vcs] [--check-vcs-leaf-only] [--check-source-distribution]
          [--format oss|container] [-e N]
Аргумент Описание
file.json Проверяемый файл
--check-vcs Проверить, что URL типа vcs ведёт на git/svn/hg/fossil-репозиторий
--check-vcs-leaf-only То же, но только для листовых компонентов
--check-source-distribution Проверить, что URL типа source-distribution существует и указывает на архив

Проверки ссылок ходят в сеть, поэтому команда печатает, сколько ссылок предстоит проверить, и отмечает прогресс на длинных перечнях.

Валидация линейна по числу компонентов: перечень на 1370 компонентов проверяется примерно за секунду, на 100 000 — меньше минуты. Флаг -e 0 выводит все замечания и на больших файлах заметно медленнее из-за самого вывода. | --format | oss (по умолчанию) или container | | -e, --errors N | Сколько замечаний печатать (0 — все, по умолчанию 10) |

Проверка готовности перечня

Схема не требует ни ГОСТ-свойств, ни ссылки на исходный код, поэтому формально корректный файл может оказаться непригодным для сдачи. efs check дополнительно проверяет:

  • заглушки TODO в названии, версии и организации-изготовителе продукта;
  • компоненты без GOST:attack_surface или GOST:security_function;
  • компоненты без GOST:source_langs;
  • компоненты, у которых нет ни ссылки на репозиторий, ни GOST:provided_by — ссылка-заглушка TODO считается отсутствующей;
  • образы контейнеров без назначения (description) — при --format container.

Отдельного флага нет, результат виден по коду возврата:

Код Значение
0 Файл соответствует схеме и заполнен
1 Ошибки схемы или недоступные ссылки
2 Ошибка вызова: неверный аргумент или отсутствующий файл
3 Схема в порядке, но перечень не заполнен

В конце печатается сводка по видам замечаний.

efs merge

Объединение нескольких SBOM в один.

efs merge <in1.json> [in2.json ...] <out.json> --app-name X --app-version Y --manufacturer Z

Режим обычных SBOM

Каждый входной файл становится одним компонентом результата: берётся его metadata.component, а ГОСТ-свойства агрегируются из компонентов файла по правилу yes > indirect > no. Так собирается перечень уровня продукта из перечней отдельных сервисов.

Языки собираются иначе — объединением: компонент-сервис получает все языки своих компонентов, включая вложенные (важно для контейнерных SBOM), по одному свойству GOST:source_langs на язык. Если у metadata.component исходного файла язык уже указан, он сохраняется как есть.

Режим сырых отчётов trivy

Если все входные файлы — сырые отчёты trivy, объединение идёт иначе: компоненты, зависимости и уязвимости сливаются в один SBOM без предварительной обработки.

Режим определяется по metadata.tools: запись trivy при отсутствии отметки efs. efs postprocess записывает туда себя, поэтому обработанный файл — уже перечень, и он сливается обычным способом: один компонент продукта на файл.

trivy fs --format cyclonedx --output frontend.json ./frontend
trivy fs --format cyclonedx --output backend.json ./backend
efs merge frontend.json backend.json merged.json \
  --app-name "МойПродукт" --app-version "1.0.0" --manufacturer "ООО МояКомпания"
Операция Поведение
Компоненты-манифесты Удаляются (package-lock.json, uv.lock — trivy добавляет их как application без purl)
Дедупликация По purl; разные версии одного пакета остаются отдельными компонентами
Свойства дубликатов Объединяются, свойства aquasecurity:trivy:* сохраняются как есть
Уязвимости Дедуплицируются по идентификатору CVE, списки affects объединяются
Зависимости Ссылки на схлопнутые дубликаты пересопоставляются, записи с одинаковым ref объединяются
Висячие ссылки Отбрасываются — ссылки на удалённые манифесты и корни входных файлов в результат не попадают

Смешивать сырые отчёты trivy с обычными SBOM в одном вызове нельзя. Результат объединения trivy-отчётов — сырой SBOM: для перечня пропустите его через efs postprocess.

efs update

Обогащение SBOM: поиск ссылок на репозитории, добавление ГОСТ-свойств, перенос метаинформации из предыдущей версии перечня.

efs update <input.json> <output.json> [--ref] [--props] [--gost] [--fix-all]
           [--app-name X] [--app-version Y] [--manufacturer Z]
           [--purl-to-vcs PATH] [--purl-to-gost PATH] [--update OLD]
Аргумент Описание
--ref Заполнить externalReferences на основе purl
--props Добавить GOST:attack_surface и GOST:security_function
--gost Проставить ГОСТ-свойства из файла маппинга
--fix-all Применить всё сразу, пустые поля заполнить значением TODO

--props, --gost и --fix-all попутно проставляют GOST:source_langs по типу purl, если язык ещё не указан, — чтобы результат проходил efs check. | --update OLD | Перенести метаинформацию из перечня предыдущей версии |

Для новых проектов предпочтительнее конфиг: efs config init плюс efs config find-vcs делают то же самое, но результат сохраняется между обновлениями SBOM. Команда update полезна, когда конфига нет или нужно перенести данные из старого перечня.

efs export

Выгрузка перечня в документ.

efs export csv <input.json> <output.csv>
efs export odt <input.json> <output.odt> [--format oss|container] [-t]
Аргумент Описание
--format oss (по умолчанию) или container — форма для перечня образов контейнеров (только ODT)
-t, --pa-fb-ontop Поместить записи «ПА» и «ФБ» в начало таблицы (только ODT)

Если у компонента несколько свойств GOST:source_langs, в документ попадают все языки через запятую.

Графа «Адрес веб-ресурса, на котором расположен исходный код компонента» заполняется ссылкой на репозиторий или дистрибутив исходного кода. Если ссылки нет, но указан GOST:provided_by, в графу попадает название сертифицированного СЗИ — пустой она не остаётся.

Для --format container графа «Назначение» берётся из поля description образа; efs postprocess сохраняет его для компонентов типа container.

efs init

Интерактивный мастер: выбор сканера, генерация SBOM, создание конфига, поиск ссылок на репозитории, постобработка.

efs init

Шесть шагов: выбор сканера → генерация SBOM → создание конфига → поиск ссылок → постобработка → проверка готовности. Результат постобработки по умолчанию пишется в отдельный файл (bom.result.json), исходный SBOM не перезаписывается.

Подходит для первого запуска в новом проекте. Всё, что делает мастер, доступно и отдельными командами.