Как читать авторский курс и нормативные материалы
Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.
П26. Лицензионная классификация
Зачем эта практика Лицензий сотни, и держать в голове каждую невозможно. Но обязательства сводятся к небольшому числу поведенческих классов — и вердикт зависит от класса, а не от имени. Эта практика — без инструментов: вы берёте сырые строки
licensesиз реального SBOM и руками раскладываете их на классы, превращая хаос строк в таблицу с предсказуемыми обязательствами. Это фундамент, на котором затем работают автоматы П11/П12 и заключения П27.
Цель
Из набора лицензионных выражений (из готового SBOM соисполнителя или учебного списка) построить классификатор: каждое выражение → класс → обязательство при распространении → итоговая зона (разрешено / риск / запрещено / требуется заключение). Проверяемый результат — заполненная таблица, где для каждой строки указан класс и зона, а все NOASSERTION/LicenseRef-* вынесены в отдельную очередь, а не помечены «зелёным».
Команда или действие
Это аналитическое упражнение. Источник — поле licenses из SBOM. Извлечь список можно так (CycloneDX JSON):
# Уникальные лицензионные выражения из CycloneDX-SBOM
jq -r '.components[].licenses[]? | (.expression // .license.id // .license.name)' \
sbom.cdx.json | sort | uniq -c | sort -rn
Дальше — ручная классификация по эталонной матрице (заполняется самостоятельно):
| Выражение | Класс | Обязательство при распространении | Триггер copyleft | Зона |
|---|---|---|---|---|
MIT |
permissive | сохранить текст лицензии и атрибуцию | нет | разрешено |
Apache-2.0 |
permissive | атрибуция + патентный грант | нет | разрешено |
LGPL-3.0-or-later |
weak copyleft | открыть изменения самого компонента | статическая линковка | риск |
MPL-2.0 |
weak copyleft | открыть изменённые файлы | пофайлово | риск |
GPL-3.0-only |
strong copyleft | открыть весь производный продукт | линковка в одно произведение | требуется заключение |
AGPL-3.0-only |
network copyleft | открыть исходники даже при работе по сети | сетевое взаимодействие | запрещено* |
(MIT OR GPL-2.0-only) |
dual → выбрать MIT | выбор одной из двух | — | разрешено (при выборе MIT) |
LicenseRef-custom-eula |
проприетарная/кастом | условия читать вручную | — | требуется заключение |
NOASSERTION |
unknown | вердикт невозможен | — | очередь доразметки |
NOASSERTION— это не «зелёный» Пустая или нераспознанная лицензия опаснее «плохой, но понятной»: пока класс неизвестен, вердикта нет, а значит компонент юридически не готов к выпуску. Не сворачивайтеNOASSERTIONв «вероятно MIT» — это отдельная зона «требуется доразметка» с ответственным и сроком. То же касаетсяLicenseRef-*: их нет в SPDX License List, автоматика их пропускает.
Что вы должны увидеть
После jq-среза — таблица частот выражений, например:
31 MIT
12 Apache-2.0
5 ISC
3 BSD-3-Clause
2 LGPL-3.0-or-later
1 GPL-3.0-only
1 NOASSERTION
После классификации — заполненная матрица, где видно распределение по зонам. Ориентир для типичного npm/pypi-дерева: подавляющее большинство (80–95%) попадает в permissive, единицы — в weak/strong copyleft, и почти всегда есть хотя бы один NOASSERTION или нестандартное выражение. Если в вашей таблице нет ни одной строки в зонах «риск/требуется заключение/доразметка» — скорее всего вы пропустили dual licensing (OR прочитан как «обе действуют») или не заметили транзитивную copyleft-зависимость.
Разбор спорного выражения
MIT OR GPL-2.0-only— это выбор, а не сумма: Организация имеет право взять MIT и не брать на себя copyleft. Ошибка чтения «обе лицензии действуют» приводит к добровольному принятию лишних обязательств. В таблице такая строка идёт в зону «разрешено» с явной пометкой «выбран MIT» — выбор должен быть зафиксирован, иначе аудитор не поймёт, на каком основании компонент разрешён.
Если не получилось
Типичные ошибки - Классификация по имени, а не по поведению —
BSDбез номера двусмыслен (2-Clause/3-Clause/4-Clause);GPL-2.0устарел, нужноGPL-2.0-onlyлибо-or-later, и это разные вердикты (можно ли уйти на GPL-3.0). -ORпрочитан какAND— dual licensing даёт право выбора; трактовка «обе действуют» завышает обязательства. -NOASSERTIONпомечен «разрешено» — самая дорогая ошибка: непроверенный компонент выпущен как чистый. - Учтены только прямые зависимости — транзитивные под copyleft не попали в таблицу. Вердикт нужен и им; берите полное дерево из SBOM, а не толькоdependenciesверхнего уровня.
Критерий зачёта
Показать преподавателю заполненную классификационную таблицу по реальному (или учебному) набору лицензий, где: (1) каждое выражение отнесено к поведенческому классу; (2) проставлена итоговая зона; (3) все NOASSERTION/LicenseRef-* вынесены в очередь доразметки, а не в «разрешено»; (4) разобран минимум один dual-licensing-кейс с зафиксированным выбором. Таблица из одних permissive-строк без единого спорного случая не засчитывается — нужно показать умение распознавать риск.
Нормативная связка
- Модуль: М07 Лицензионная чистота и юридический workflow
- Смежные практики: П11. ScanCode для лицензий · П12. ORT и license policy · П27. Юридическое заключение и реестр лицензий · П30. Исключения и принятие риска
- Нормативка: SPDX ISO/IEC 5962 · OpenChain ISO/IEC 5230
- Шаблоны: Политика лицензионной чистоты · Порядок работы с неизвестной лицензией