.. SPDX-FileCopyrightText: 2026 cusy GmbH
..
.. SPDX-License-Identifier: BSD-3-Clause
Software Bill-of-Materials (SBOM)
=================================
Eine Software Bill-of-Materials (SBOM) ist ein Dokument zum Austausch von
Informationen über Software und deren Zusammensetzung. Dieses Format wird vor
allem im Sicherheitsbereich verwendet, um Software und ihre Abhängigkeiten
mithilfe von Schwachstellendatenbanken wie `CVE `_ und
`OSV `_ auf Schwachstellen zu überprüfen. Das vom
CPython-Projekt verwendete SBOM-Format ist `SPDX
`_, das
bei Bedarf in andere Formate konvertiert werden kann. Die SBOM-Datei für die in
CPython enthaltenen Abhängigkeiten wird unter `Misc/sbom.spdx.json
`_ verwaltet.
Die Datei wird erstellt mit `Tools/build/generate_sbom.py
`_.
SBOM-Datei erstellen
--------------------
… mit uv
~~~~~~~~
:term:`uv` bietet eine einfache Möglichkeit, eine SBOM-Datei im Format CycloneDX
v1.5 zu erstellen mit:
.. code-block:: console
$ uv export --format='cyclonedx1.5' > sbom.cdx.json
Die Datei enthält jedoch nur sehr rudimentäre Angaben, :abbr:`z. B. (zum
Beispiel)` für `cusy.tasks `_:
.. code-block:: json
"component": {
"type": "library",
"bom-ref": "cusy-tasks-1@26.2.0",
"name": "cusy-tasks",
"version": "26.2.0",
"properties": [
{
"name": "uv:package:is_project_root",
"value": "true"
}
]
}
Mit ``uv export --all-groups --format='cyclonedx1.5' > sbom.cdx.json`` könnt
ihr auch alle Dependency-Groups in die SBOM-Datei übernehmen.
… mit CycloneDX Python
~~~~~~~~~~~~~~~~~~~~~~
Deutlich umfangreicher ist die Ausgabe von `CycloneDX Python
`_:
.. code-block:: json
{
"bom-ref": "cusy-tasks==26.2.0",
"description": "",
"externalReferences": [
{
"comment": "PackageSource: Local",
"type": "distribution",
"url": "file:///Users/veit/cusy/prj/cusy.tasks"
},
{
"comment": "from packaging metadata Project-URL: Documentation",
"type": "documentation",
"url": "https://tasks.cusy.io/"
},
{
"comment": "from packaging metadata Project-URL: Mastodon",
"type": "other",
"url": "https://mastodon.social/@Python4DataScience"
},
{
"comment": "from packaging metadata Project-URL: GitHub",
"type": "vcs",
"url": "https://github.com/cusyio/cusy.tasks"
}
],
"licenses": [
{
"license": {
"acknowledgement": "declared",
"id": "BSD-3-Clause"
}
}
],
"name": "cusy-tasks",
"type": "library",
"version": "26.2.0"
}
Der Kommandozeilenaufruf zum Erstellen der Datei ist:
.. code-block:: console
$ uvx --from cyclonedx-bom cyclonedx-py environment .venv --output-file sbom.cdx.json
.. warning::
CycloneDX Python erstellt die SBOM-Datei aus dem aktuellen
:file:`.venv`-Verzeichnis. Ruft ihr ``cyclonedx-bom`` also in eurer
Entwicklungsumgebung auf, werdet ihr auch alle Entwicklungswerkzeuge in eurer
SBOM-Datei wiederfinden.
… mit sbomify
~~~~~~~~~~~~~
sbomify stellt eine GitHub Action zum Erstellen der SBOM-Datei bereit, die unter
der Haube CycloneDX Python verwendet. Mit `actions/attest-sbom
`_ kann die Datei dann attestiert
werden:
.. literalinclude:: sbomify.yml
:caption: .github/workflows/sbomify.yml
:language: yaml
In GitLab CI könnt ihr sbomify folgendermaßen verwenden:
.. literalinclude:: .gitlab-ci.yml
:caption: .gitlab-ci.yml
:language: yaml
:lines: 1-12, 32-
Ihr könnt auch Dependency Scanning integrieren:
.. literalinclude:: .gitlab-ci.yml
:caption: .gitlab-ci.yml
:language: yaml
:lines: 13-30
.. seealso::
* `SBOM Generation in CI/CD Pipelines `_
* `Dependency scanning by using SBOM
`_
PEP 770 – SBOMs in Python-Paketen
---------------------------------
:pep:`770` standardisiert die Einbindung von SBOMs in Python-Wheels über das
Verzeichnis :file:`.dist-info/sboms/`. Wenn ihr Python-Pakete auf :term:`PyPI`
veröffentlicht, bedeutet dies, dass eure User die SBOM-Datei automatisch
erhalten, wenn sie euer Paket installieren, :abbr:`z. B. (zum Beispiel)`:
.. code-block:: console
myapp-26.2.0.dist-info
├── METADATA
├── RECORD
└── sboms/
└── myapp.cdx.json
Build-Backends wie Hatchling≥1.28 unterstützen dies bereits mit der
``sbom-files``-Konfiguration:
.. code-block:: toml
:caption: pyproject.toml
[tool.hatch.build.targets.wheel]
sbom-files = ["myapp.cdx.json"]
Anstatt die SBOM-Datei beim Build von Grund auf neu zu generieren, kann eine
minimale CycloneDX-SBOM-Datei in das Repository eingecheckt werden:
.. code-block:: json
{
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"version": 1,
"metadata": {
"component": {
"type": "library",
"name": "mylib",
"version": "0.0.0-placeholder"
}
},
"components": []
}
Im :term:`CI`-Workflow wird die Platzhalter-SBOM-Datei dann mit dem Code
ausgecheckt. sbomify reichert sie dann mit den aktuellen Informationen an.
Anschließend baut hatchling das :term:`Wheel` mit der aktuellen SBOM-Datei und
schließlich wird das Wheel auf :term:`PyPI` veröffentlicht.
Analyse
-------
Zur Sicherheits- und Lizenzprüfung stehen zahlreiche Tools zur Verfügung, die
sich auf unterschiedliche Problembereiche konzentrieren. Zwei Open-Source-Tools
für die SBOM-Analyse sind `Dependency Track `_ und
`GUAC `_. Mit ``sbomify-action`` könnt ihr SBOMs aus der
CI-Pipeline direkt in eure Dependency Track-Instanz hochladen mit:
.. code-block:: yaml
UPLOAD_DESTINATIONS=dependency-track