Skip to content
This repository was archived by the owner on Dec 20, 2024. It is now read-only.

Commit bec6480

Browse files
committed
sbom-guide: clarify relationship in CDX
Signed-off-by: Jan Kowalleck <[email protected]>
1 parent 27407fb commit bec6480

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

guides/sbom/relationships.md

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,26 @@ page_nav:
2525
---
2626

2727
# Establishing Relationships in CycloneDX
28+
2829
CycloneDX has a rich set of relationships that provide additional context and information about the objects in the BOM's
2930
inventory. All relationships in CycloneDX are expressed explicitly. Some relationships are declared through the natural
3031
use of the CycloneDX format. These include assemblies, dependencies, and pedigree. Other relationships are formed via
31-
references to the object's identity in the BOM, referred to as `bom-ref`. The combination of these two approaches
32-
dramatically simplifies the specification, providing necessary guardrails to prevent deviation of its usage and providing
32+
references to the object's identity in the BOM, referred to as `bom-ref`. The combination of these two approaches
33+
dramatically simplifies the specification, providing necessary guardrails to prevent deviation of its usage and providing
3334
an easy path to supporting enveloped signing and other advanced usages.
3435

3536
## Component Assemblies
36-
Components in a BOM can be nested to form an assembly. An assembly is a collection of components that are included in a
37-
parent component. As an analogy, an automotive dashboard contains an instrument panel component. And the instrument panel
38-
component contains a speedometer component. This nested relationship is called an assembly in CycloneDX.
3937

40-
Software assemblies that can be represented in CycloneDX can range from large enterprise solutions comprising multiple
41-
systems, to cloud-native deployments containing extensive collections of related micro-services.
38+
Components in a BOM can be nested to form an assembly. An assembly is a collection of components that are included in a
39+
parent component. As an analogy, an automotive dashboard contains an instrument panel component. And the instrument panel
40+
component contains a speedometer component. This nested relationship is called an assembly in CycloneDX.
41+
42+
Software assemblies that can be represented in CycloneDX can range from large enterprise solutions comprising multiple
43+
systems, to cloud-native deployments containing extensive collections of related micro-services.
4244
Assemblies can also describe simpler inclusions, such as software packages that contain supporting files.
4345

44-
> Assemblies, or leaves within an assembly, can independently be signed. BOMs comprising component assemblies from
45-
> multiple suppliers can benefit from this capability. Each supplier can sign their respective assembly. The creator of
46+
> Assemblies, or leaves within an assembly, can independently be signed. BOMs comprising component assemblies from
47+
> multiple suppliers can benefit from this capability. Each supplier can sign their respective assembly. The creator of
4648
> final goods can then sign the BOM as a whole.
4749
4850
The following example illustrates a simple component assembly. In this case, Acme Commerce Suite includes two other
@@ -82,18 +84,19 @@ Component D and E. If Component C depends on either D or E, dependency relations
8284
![Assemblies](../../../theme/assets/images/guides/SBOM/assemblies.svg)
8385

8486
## Service Assemblies
87+
8588
Services also have assemblies and work identically to those of components. While component assemblies describe a component
86-
that _includes_ another component, service assemblies describe a service with other services _behind_ it. A common cloud
87-
pattern is the use of API gateways which proxy and orchestrate connections to relevant microservices. The microservices
88-
themselves may not be directly accessible; rather, they are accessed exclusively through the API gateway. For this
89+
that _includes_ another component, service assemblies describe a service with other services _behind_ it. A common cloud
90+
pattern is the use of API gateways which proxy and orchestrate connections to relevant microservices. The microservices
91+
themselves may not be directly accessible; rather, they are accessed exclusively through the API gateway. For this
8992
scenario, the API gateway service may contain an assembly of microservices behind it.
9093

9194
## Dependencies
92-
CycloneDX provides the ability to describe components and their dependency on other components. This relies on a
93-
component's `bom-ref` to associate the component with the dependency element in the graph. The only requirement for bom-ref
94-
is that it is unique within the BOM. Package URL (PURL) is an ideal choice for bom-ref as it will be both unique and
95-
readable. If PURL is not an option or not all components represented in the BOM contain a PURL, then UUID is recommended.
96-
A dependency graph is typically one node deep and capable of representing both direct and transitive relationships.
95+
96+
CycloneDX provides the ability to describe components and their dependency on other components.
97+
This relies on a component's `bom-ref` to associate the component with the dependency element in the graph. The only requirement for `bom-ref`
98+
is that it is unique within the BOM. Package URL (PURL) is an ideal choice for `bom-ref` as it will be both unique and readable. If PURL is not an option or not all components represented in the BOM contain a PURL, then UUID is recommended.
99+
A general dependency graph is unspecified deep and capable of representing both direct and transitive relationships. In CycloneDX representation `dependencies`, a dependency graph SHOULD be codified to be one node deep, meaning no nested child-graphs but all relations on the same level.
97100

98101
![Sample Dependency Graph](../../../theme/assets/images/guides/SBOM/dependency-graph.svg)
99102

@@ -130,8 +133,8 @@ The dependency graph above can be codified with the following:
130133
]
131134
```
132135

133-
> Components that do not have dependencies MUST be declared as empty elements within the graph. Components not
134-
> represented in the dependency graph MAY have unknown dependencies. It is RECOMMENDED that implementations assume this
136+
> Components that do not have dependencies MUST be declared as empty elements within the graph. Components not
137+
> represented in the dependency graph MAY have unknown dependencies. It is RECOMMENDED that implementations assume this
135138
> to be opaque and not an indicator of a component being dependency-free.
136139
137140
<div style="page-break-after: always; visibility: hidden">

0 commit comments

Comments
 (0)