Skip to content

Commit ed57477

Browse files
author
Lukas Fischer
committed
#1838 Move trivy-sbom to its own scanner
Keeping SBOM creation as part of the original trivy scanner created a whole bunch of problems, all related to the fact that we decided that SBOMs should get their own parser instead of reusing the existing trivy parser. Since nothing in the project structure assumes that scanners can have more than one parser, making the Makefile targets work with it was pretty inconvenient. The release process, orchestrated by a GitHub Workflow, also cannot work with multiple parsers. This extracts all SBOM related functionality from the trivy scanner to a new trivy-sbom scanner, which then works again with the usual project structure. The parser is still a generic CycloneDX parser, although adding Syft and then reusing the parser needs resturcturing again (or copy-pasting of code). Signed-off-by: Lukas Fischer <lukas.fischer@iteratec.com>
1 parent 71069d4 commit ed57477

26 files changed

Lines changed: 697 additions & 182 deletions

scanners/trivy-sbom/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# SPDX-FileCopyrightText: the secureCodeBox authors
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
*.tar
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{{- /*
2+
SPDX-FileCopyrightText: the secureCodeBox authors
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/ -}}
6+
7+
{{- define "extra.docsSection" -}}
8+
---
9+
title: "Trivy SBOM"
10+
category: "scanner"
11+
type: "Container"
12+
state: "released"
13+
appVersion: "{{ template "chart.appVersion" . }}"
14+
usecase: "Container Dependency Scanner"
15+
---
16+
{{- end }}
17+
18+
{{- define "extra.dockerDeploymentSection" -}}
19+
## Supported Tags
20+
- `latest` (represents the latest stable release build)
21+
- tagged releases, e.g. `{{ template "chart.appVersion" . }}`
22+
{{- end }}
23+
24+
{{- define "extra.chartAboutSection" -}}
25+
## What is Trivy SBOM?
26+
27+
`Trivy` (`tri` pronounced like **tri**gger, `vy` pronounced like en**vy**) is a simple and comprehensive vulnerability scanner for containers and other artifacts.
28+
A software vulnerability is a glitch, flaw, or weakness present in the software or in an Operating System.
29+
`Trivy` detects vulnerabilities of OS packages (Alpine, RHEL, CentOS, etc.) and application dependencies (Bundler, Composer, npm, yarn, etc.).
30+
`Trivy` is easy to use. Just install the binary, and you're ready to scan. All you need to do for scanning is to specify a target such as an image name of the container.
31+
32+
To learn more about the Trivy scanner itself visit [Trivy's GitHub Repository](https://github.com/aquasecurity/trivy).
33+
34+
This chart uses Trivy's SBOM support to generate Software Bills of Material in CycloneDX format for container images.
35+
{{- end }}
36+
37+
{{- define "extra.scannerConfigurationSection" -}}
38+
## Scanner Configuration
39+
40+
The following SBOM generation configuration example is based on the [Trivy Documentation](https://aquasecurity.github.io/trivy/), please take a look at the original documentation for more configuration examples.
41+
42+
Currently we support the following scanType, corresponding to the trivy scanning modes:
43+
- scanType: "trivy-sbom-image"
44+
- parameters: `[YOUR_IMAGE_NAME]`
45+
46+
Simply specify an image name (and a tag) when you use the scanType `trivy-sbom-image`.
47+
A complete example is listed below in our [example docs section](https://www.securecodebox.io/docs/scanners/trivy/#examples).
48+
{{- end }}
49+
50+
{{- define "extra.chartConfigurationSection" -}}
51+
{{- end }}
52+
53+
{{- define "extra.scannerLinksSection" -}}
54+
{{- end }}
55+

scanners/trivy-sbom/.helmignore

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# SPDX-FileCopyrightText: the secureCodeBox authors
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
# Patterns to ignore when building packages.
5+
# This supports shell glob matching, relative path matching, and
6+
# negation (prefixed with !). Only one pattern per line.
7+
.DS_Store
8+
# Common VCS dirs
9+
.git/
10+
.gitignore
11+
.bzr/
12+
.bzrignore
13+
.hg/
14+
.hgignore
15+
.svn/
16+
# Common backup files
17+
*.swp
18+
*.bak
19+
*.tmp
20+
*~
21+
# Various IDEs
22+
.project
23+
.idea/
24+
*.tmproj
25+
.vscode/
26+
# Node.js files
27+
node_modules/*
28+
package.json
29+
package-lock.json
30+
src/*
31+
config/*
32+
Dockerfile
33+
.dockerignore
34+
*.tar
35+
parser/*
36+
scanner/*
37+
integration-tests/*
38+
examples/*
39+
docs/*
40+
Makefile

scanners/trivy-sbom/Chart.yaml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# SPDX-FileCopyrightText: the secureCodeBox authors
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
apiVersion: v2
6+
name: trivy-sbom
7+
description: A Helm chart for the trivy-sbom security scanner that integrates with the secureCodeBox.
8+
9+
type: application
10+
# version - gets automatically set to the secureCodeBox release version when the helm charts gets published
11+
version: v3.1.0-alpha1
12+
appVersion: "0.45.0"
13+
kubeVersion: ">=v1.11.0-0"
14+
annotations:
15+
versionApi: https://api.github.com/repos/aquasecurity/trivy/releases/latest
16+
supported-platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/s390x
17+
keywords:
18+
- security
19+
- trivy
20+
- sbom
21+
- cyclonedx
22+
- image-scanning
23+
- scanner
24+
- secureCodeBox
25+
home: https://www.securecodebox.io/docs/scanners/trivy-sbom
26+
icon: https://www.securecodebox.io/img/integrationIcons/Trivy.svg
27+
sources:
28+
- https://github.com/secureCodeBox/secureCodeBox
29+
maintainers:
30+
- name: iteratec GmbH
31+
email: secureCodeBox@iteratec.com

scanners/trivy-sbom/Makefile

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/usr/bin/make -f
2+
#
3+
# SPDX-FileCopyrightText: the secureCodeBox authors
4+
#
5+
# SPDX-License-Identifier: Apache-2.0
6+
#
7+
8+
include_guard = set
9+
scanner = trivy-sbom
10+
11+
include ../../scanners.mk

scanners/trivy-sbom/README.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
---
2+
title: "Trivy SBOM"
3+
category: "scanner"
4+
type: "Container"
5+
state: "released"
6+
appVersion: "0.45.0"
7+
usecase: "Container Dependency Scanner"
8+
---
9+
10+
<!--
11+
SPDX-FileCopyrightText: the secureCodeBox authors
12+
13+
SPDX-License-Identifier: Apache-2.0
14+
-->
15+
<!--
16+
.: IMPORTANT! :.
17+
--------------------------
18+
This file is generated automatically with `helm-docs` based on the following template files:
19+
- ./.helm-docs/templates.gotmpl (general template data for all charts)
20+
- ./chart-folder/.helm-docs.gotmpl (chart specific template data)
21+
22+
Please be aware of that and apply your changes only within those template files instead of this file.
23+
Otherwise your changes will be reverted/overwritten automatically due to the build process `./.github/workflows/helm-docs.yaml`
24+
--------------------------
25+
-->
26+
27+
<p align="center">
28+
<a href="https://opensource.org/licenses/Apache-2.0"><img alt="License Apache-2.0" src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"/></a>
29+
<a href="https://github.com/secureCodeBox/secureCodeBox/releases/latest"><img alt="GitHub release (latest SemVer)" src="https://img.shields.io/github/v/release/secureCodeBox/secureCodeBox?sort=semver"/></a>
30+
<a href="https://owasp.org/www-project-securecodebox/"><img alt="OWASP Lab Project" src="https://img.shields.io/badge/OWASP-Lab%20Project-yellow"/></a>
31+
<a href="https://artifacthub.io/packages/search?repo=securecodebox"><img alt="Artifact HUB" src="https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/securecodebox"/></a>
32+
<a href="https://github.com/secureCodeBox/secureCodeBox/"><img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/secureCodeBox/secureCodeBox?logo=GitHub"/></a>
33+
<a href="https://twitter.com/securecodebox"><img alt="Twitter Follower" src="https://img.shields.io/twitter/follow/securecodebox?style=flat&color=blue&logo=twitter"/></a>
34+
</p>
35+
36+
## What is Trivy SBOM?
37+
38+
`Trivy` (`tri` pronounced like **tri**gger, `vy` pronounced like en**vy**) is a simple and comprehensive vulnerability scanner for containers and other artifacts.
39+
A software vulnerability is a glitch, flaw, or weakness present in the software or in an Operating System.
40+
`Trivy` detects vulnerabilities of OS packages (Alpine, RHEL, CentOS, etc.) and application dependencies (Bundler, Composer, npm, yarn, etc.).
41+
`Trivy` is easy to use. Just install the binary, and you're ready to scan. All you need to do for scanning is to specify a target such as an image name of the container.
42+
43+
To learn more about the Trivy scanner itself visit [Trivy's GitHub Repository](https://github.com/aquasecurity/trivy).
44+
45+
This chart uses Trivy's SBOM support to generate Software Bills of Material in CycloneDX format for container images.
46+
47+
## Deployment
48+
The trivy-sbom chart can be deployed via helm:
49+
50+
```bash
51+
# Install HelmChart (use -n to configure another namespace)
52+
helm upgrade --install trivy-sbom secureCodeBox/trivy-sbom
53+
```
54+
55+
## Scanner Configuration
56+
57+
The following SBOM generation configuration example is based on the [Trivy Documentation](https://aquasecurity.github.io/trivy/), please take a look at the original documentation for more configuration examples.
58+
59+
Currently we support the following scanType, corresponding to the trivy scanning modes:
60+
- scanType: "trivy-sbom-image"
61+
- parameters: `[YOUR_IMAGE_NAME]`
62+
63+
Simply specify an image name (and a tag) when you use the scanType `trivy-sbom-image`.
64+
A complete example is listed below in our [example docs section](https://www.securecodebox.io/docs/scanners/trivy/#examples).
65+
66+
## Requirements
67+
68+
Kubernetes: `>=v1.11.0-0`
69+
70+
## Values
71+
72+
| Key | Type | Default | Description |
73+
|-----|------|---------|-------------|
74+
| cascadingRules.enabled | bool | `false` | Enables or disables the installation of the default cascading rules for this scanner |
75+
| imagePullSecrets | list | `[]` | Define imagePullSecrets when a private registry is used (see: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/) |
76+
| parser.affinity | object | `{}` | Optional affinity settings that control how the parser job is scheduled (see: https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/) |
77+
| parser.env | list | `[]` | Optional environment variables mapped into each parseJob (see: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) |
78+
| parser.image.pullPolicy | string | `"IfNotPresent"` | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images |
79+
| parser.image.repository | string | `"docker.io/securecodebox/parser-cyclonedx"` | Parser image repository |
80+
| parser.image.tag | string | defaults to the charts version | Parser image tag |
81+
| parser.resources | object | { requests: { cpu: "200m", memory: "100Mi" }, limits: { cpu: "400m", memory: "200Mi" } } | Optional resources lets you control resource limits and requests for the parser container. See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ |
82+
| parser.scopeLimiterAliases | object | `{}` | Optional finding aliases to be used in the scopeLimiter. |
83+
| parser.tolerations | list | `[]` | Optional tolerations settings that control how the parser job is scheduled (see: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) |
84+
| parser.ttlSecondsAfterFinished | string | `nil` | seconds after which the Kubernetes job for the parser will be deleted. Requires the Kubernetes TTLAfterFinished controller: https://kubernetes.io/docs/concepts/workloads/controllers/ttlafterfinished/ |
85+
| scanner.activeDeadlineSeconds | string | `nil` | There are situations where you want to fail a scan Job after some amount of time. To do so, set activeDeadlineSeconds to define an active deadline (in seconds) when considering a scan Job as failed. (see: https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup) |
86+
| scanner.affinity | object | `{}` | Optional affinity settings that control how the scanner job is scheduled (see: https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/) |
87+
| scanner.backoffLimit | int | 3 | There are situations where you want to fail a scan Job after some amount of retries due to a logical error in configuration etc. To do so, set backoffLimit to specify the number of retries before considering a scan Job as failed. (see: https://kubernetes.io/docs/concepts/workloads/controllers/job/#pod-backoff-failure-policy) |
88+
| scanner.env | list | `[]` | Optional environment variables mapped into each scanJob (see: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) |
89+
| scanner.extraContainers | list | `[]` | Optional additional Containers started with each scanJob (see: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/) |
90+
| scanner.extraVolumeMounts | list | `[]` | Optional VolumeMounts mapped into each scanJob (see: https://kubernetes.io/docs/concepts/storage/volumes/) |
91+
| scanner.extraVolumes | list | `[]` | Optional Volumes mapped into each scanJob (see: https://kubernetes.io/docs/concepts/storage/volumes/) |
92+
| scanner.image.pullPolicy | string | `"IfNotPresent"` | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images |
93+
| scanner.image.repository | string | `"docker.io/aquasec/trivy"` | Container Image to run the scan |
94+
| scanner.image.tag | string | `nil` | defaults to the charts appVersion |
95+
| scanner.nameAppend | string | `nil` | append a string to the default scantype name. |
96+
| scanner.podSecurityContext | object | `{}` | Optional securityContext set on scanner pod (see: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) |
97+
| scanner.resources | object | `{}` | CPU/memory resource requests/limits (see: https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/, https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/) |
98+
| scanner.securityContext | object | `{"allowPrivilegeEscalation":false,"capabilities":{"drop":["all"]},"privileged":false,"readOnlyRootFilesystem":false,"runAsNonRoot":false}` | Optional securityContext set on scanner container (see: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) |
99+
| scanner.securityContext.allowPrivilegeEscalation | bool | `false` | Ensure that users privileges cannot be escalated |
100+
| scanner.securityContext.capabilities.drop[0] | string | `"all"` | This drops all linux privileges from the container. |
101+
| scanner.securityContext.privileged | bool | `false` | Ensures that the scanner container is not run in privileged mode |
102+
| scanner.securityContext.readOnlyRootFilesystem | bool | `false` | Prevents write access to the containers file system |
103+
| scanner.securityContext.runAsNonRoot | bool | `false` | Enforces that the scanner image is run as a non root user |
104+
| scanner.suspend | bool | `false` | if set to true the scan job will be suspended after creation. You can then resume the job using `kubectl resume <jobname>` or using a job scheduler like kueue |
105+
| scanner.tolerations | list | `[]` | Optional tolerations settings that control how the scanner job is scheduled (see: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) |
106+
| scanner.ttlSecondsAfterFinished | string | `nil` | seconds after which the Kubernetes job for the scanner will be deleted. Requires the Kubernetes TTLAfterFinished controller: https://kubernetes.io/docs/concepts/workloads/controllers/ttlafterfinished/ |
107+
108+
## License
109+
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
110+
111+
Code of secureCodeBox is licensed under the [Apache License 2.0][scb-license].
112+
113+
[scb-owasp]: https://www.owasp.org/index.php/OWASP_secureCodeBox
114+
[scb-docs]: https://www.securecodebox.io/
115+
[scb-site]: https://www.securecodebox.io/
116+
[scb-github]: https://github.com/secureCodeBox/
117+
[scb-twitter]: https://twitter.com/secureCodeBox
118+
[scb-slack]: https://join.slack.com/t/securecodebox/shared_invite/enQtNDU3MTUyOTM0NTMwLTBjOWRjNjVkNGEyMjQ0ZGMyNDdlYTQxYWQ4MzNiNGY3MDMxNThkZjJmMzY2NDRhMTk3ZWM3OWFkYmY1YzUxNTU
119+
[scb-license]: https://github.com/secureCodeBox/secureCodeBox/blob/master/LICENSE
120+

scanners/trivy-sbom/docs/.gitkeep

Whitespace-only changes.

0 commit comments

Comments
 (0)