Compare commits

...

238 Commits

Author SHA1 Message Date
Teppei Fukuda
bcfa0287b9 chore(release): bump up GoReleaser to v0.182.1 (#1299) 2021-10-16 06:48:44 +03:00
Teppei Fukuda
681ab1b889 fix(yarn): support quoted version (#1298) 2021-10-15 08:22:40 +03:00
Ankush K
46051d5ec8 feat(custom-forward): Forward the extended advisory data (#1247)
Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-10-14 21:57:30 +03:00
santhosh1729
d8d692b8ba feat(javascript) : Initialize npm driver for javascript packages (#1289) 2021-10-10 08:37:15 +03:00
besdollma
cc344dfbe3 fix(cli): fix incorrect comparision of DB metadata type. (#1286)
-- Incorrect Db metadata type comparision resulted in wrong
print in show version.

This fixes #1275.

Signed-off-by: Bes Dollma <besi7dollma@gmail.com>
2021-10-08 19:16:46 +03:00
Itay Shakury
0dec17fc3f docs: add footer to readme (#1281)
Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>
2021-10-07 10:18:38 +03:00
Teppei Fukuda
f12446d3ba feat(report): add package path (#1274) 2021-10-06 10:28:48 +03:00
Teppei Fukuda
1c9ccb5e03 feat(command): add rootfs command (#1271) 2021-10-04 21:03:34 +03:00
Huang Huang
a463e794ce fix: update fanal (#1272)
Fixes #1251 Fixes #1183 Fixes #1172
2021-10-04 17:47:00 +03:00
Teppei Fukuda
e0ca5eff38 feat(commands): remove deprecated options (#1270) 2021-10-04 15:49:04 +03:00
Masahiro331
1ebb3296ee Aggregate jar result for table (#1269)
Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>
2021-10-04 11:30:12 +03:00
Teppei Fukuda
b37f682ee2 BREAKING(report): migrate to new json schema (#1265) 2021-10-04 10:22:24 +03:00
Teppei Fukuda
da905108b4 feat: improve --skip-dirs and --skip-files (#1249) 2021-10-03 13:08:09 +03:00
Teppei Fukuda
bd57b4f9b5 fix(gobinary): skip large files (#1259) 2021-10-01 19:54:47 +03:00
Fabian Windheuser
9027dc3252 Disable library analyzer for OS only scan type (#1191) 2021-09-29 11:54:46 +03:00
fnishe
5750cc2e1a chore: update trivy version (#1252) 2021-09-29 10:56:44 +03:00
Eng Zer Jun
bbcce9f7b7 refactor: move from io/ioutil to io and os package (#1245)
The io/ioutil package has been deprecated as of Go 1.16, see
https://golang.org/doc/go1.16#ioutil. This commit replaces the existing
io/ioutil functions with their new definitions in io and os packages.

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
2021-09-29 10:17:02 +03:00
Minchao
6bcb4af10f fix: brew test command (#1253) 2021-09-27 07:25:30 +03:00
Naimuddin Shaik
8d13234554 fix:added layer info in packages (#1248)
* added layer info in packages

* fixed unit cases
2021-09-22 17:17:16 +03:00
Teppei Fukuda
982f35b424 fix(go/binary): improve debug messages (#1244) 2021-09-20 10:28:02 +03:00
洋仔
2e170cd15a Update db.go (#1199)
fix args name error
2021-09-19 20:38:22 +03:00
AndreyLevchenko
cc6c67d81c fix(deps): fix CVE-2021-32760 for github.com/containerd/containerd (#1243)
Closes #1226
2021-09-19 09:49:15 +03:00
Teppei Fukuda
669fd1fd1d feat(debian): support the versions that reached EOL (#1237)
* refactor(debian): aggregate oval and json api into salsa

* fix(vulnerability): use package-specific severity

* chore(mod): update trivy-db
2021-09-17 13:59:46 +03:00
Teppei Fukuda
8cd7de276e feat(alpine): support unfixed vulnerabilities (#1235) 2021-09-16 22:20:59 +03:00
Teppei Fukuda
3bf3a46cd4 feat(report): add image config (#1231)
* feat(report): add image config

* chore(mod): update fanal

* test(scanner): fix type
2021-09-15 22:19:37 +03:00
Ankush K
8edcc62a8d feat(nodejs): support package.json (#1225)
Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-09-15 14:23:35 +03:00
Teppei Fukuda
31c45ffc52 refactor: use testing DB instead of mock (#1234) 2021-09-15 10:06:01 +03:00
Ankush K
d8cc8b550b feat(ruby): support gemspec (#1224)
Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-09-14 23:16:19 +03:00
Ankush K
dbc7a83e8c feat(python): add packaging detector and respective hook (#1223)
Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-09-13 20:59:11 +03:00
Ankush K
19c0b70d26 feat(license): Added support to new License field of go-dep-parser's library (#1167) 2021-09-09 14:32:50 +03:00
afdesk
9d617777d5 fix(oracle): handle advisories contain ksplice versions (#1209)
* fix(oracle): handle advisories contain ksplice versions

Improve a handling of advisories contain ksplice versions:
* when one of them doesn't have ksplice, we'll also skip it
* extract kspliceX and compare it with kspliceY in advisories
* if kspliceX and kspliceY are different, we will skip the advisory.

Fixes #1205

* fix(oracle): handle advisories contain ksplice versions

simplify code and remove duplicated tests

Fixes #1205

* run go fmt
2021-09-05 11:29:13 +03:00
afdesk
5d57deaa4f fix(docs): remove OSVDB advisories (#1215)
Trivy no longer depends on OSVDB and can use "Ruby Advisory Database" for commercial usage.

Fixes #1208
2021-09-05 08:39:10 +03:00
Guilherme Macedo
b5955597a4 docs: fix typos in CONTRIBUTING.md (#1181)
* Fix typos in CONTRIBUTING.md

Fix small typos in CONTRIBUTING.md

* Fix typos in CONTRIBUTING.md

Fix small typos in CONTRIBUTING.md
2021-09-02 14:51:57 +03:00
Huang Huang
b1410b27b8 Update EOL of Debian 11 (#1180)
https://bits.debian.org/2021/08/bullseye-released.html
2021-09-02 14:32:47 +03:00
afdesk
0e777d386e fix(plugin): resolve a closure (#1207)
There is a closure inside a function for Action field: variable p always refers on the last plugin.
solution: redefine variable inside the for loop.

Fixes #1086
2021-09-02 14:29:54 +03:00
Pascal Borreli
b6d9c30eea docs: fix typo (#1206) 2021-09-01 18:03:14 +03:00
afdesk
5160a2eb53 fix(detector): change an argument for trivy-db getter (#1203)
use a package name instead of SrcName for getting of advisories
about Oracle packages.

Fixes #1170
2021-09-01 14:27:14 +03:00
Teppei Fukuda
40ed227c23 chore(mod): update fanal (#1179)
* chore(mod): update fanal

* test(integration): fix error message

* test(integration): skip reaper
2021-08-15 15:19:22 +03:00
santhosh1729
2a4400c147 Add license info to package data (#1176) 2021-08-15 13:05:37 +03:00
Tauseef
82eb630be7 feat(nuget): support packages.config (#1095)
Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>
2021-08-12 15:27:13 +03:00
AndreyLevchenko
4a8db20a9a feat(python): add support for requirements.txt (#1169) 2021-08-11 11:14:37 +03:00
thiago-gitlab
8db9b6a2a6 GitLab CI integration documentation (#1168)
Recommend the native GitLab integration.
2021-08-08 14:10:16 +03:00
AndreyLevchenko
c159501d0d chore(gorelease) change goreleaser config to include template examples (#1138)
Closes #1123
2021-07-28 11:05:14 +03:00
dependabot[bot]
76e63d1124 chore(deps): bump dmnemec/copy_file_to_another_repo_action (#1153)
Bumps [dmnemec/copy_file_to_another_repo_action](https://github.com/dmnemec/copy_file_to_another_repo_action) from 1.0.4 to 1.1.1.
- [Release notes](https://github.com/dmnemec/copy_file_to_another_repo_action/releases)
- [Commits](https://github.com/dmnemec/copy_file_to_another_repo_action/compare/v1.0.4...v1.1.1)

---
updated-dependencies:
- dependency-name: dmnemec/copy_file_to_another_repo_action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-07-28 10:57:32 +03:00
dependabot[bot]
79b6684840 chore(deps): bump actions/stale from 3 to 4 (#1152)
Bumps [actions/stale](https://github.com/actions/stale) from 3 to 4.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-07-28 10:56:09 +03:00
AndreyLevchenko
214fe82c7e feat(report): add end of service life flag to OS metadata (#1142)
Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-07-27 17:08:57 +03:00
Matthieu MOREL
c489e31f5d chore: set up Dependabot for github-actions and docker (#1128) 2021-07-27 16:03:43 +03:00
MaineK00n
efd812cb1a docs: fix typo (#1149) 2021-07-27 16:00:54 +03:00
Teppei Fukuda
3a920dc401 docs: add some external links (#1147) 2021-07-27 15:39:55 +03:00
AndreyLevchenko
7cb1598991 chore (release): add ubuntu esm versions to deploy script (#1151) 2021-07-26 12:49:42 +03:00
AndreyLevchenko
6a8800286e docs(troubleshooting) add urls which are required to download vuls db (#1137) 2021-07-21 11:07:57 +03:00
Simran Munot
f3f3029014 Updated the Alpine Image to 3.14 (latest) (#1130) 2021-07-20 13:27:43 +03:00
Simran Munot
0e52fde047 Added EOL for Ubuntu 21.10 (#1131)
As per (https://wiki.ubuntu.com/Releases) and (https://ubuntu.com/about/release-cycle), Ubuntu 21.10 is supported until July 2022
2021-07-20 13:25:01 +03:00
AndreyLevchenko
9b3fba04f9 fix(image): disabled scanning of config files within container images (#1133) 2021-07-20 10:15:45 +03:00
mustafa-rean
1101634f6a docs: fixed typo (#1124) 2021-07-18 12:18:39 +03:00
Niklas
499b7a6ecf update cyclonedx github action to v0.3.0 (#1127)
use version `^v0` instead of `latest` to avoid breaking the build when cyclonedx-gomod introduces breaking changes in a new major version. See https://github.com/CycloneDX/gh-gomod-generate-sbom/releases/tag/v0.3.0

Signed-off-by: nscuro <nscuro@protonmail.com>
2021-07-18 11:59:55 +03:00
Teppei Fukuda
cea9b0bc78 fix(policy): fix panic on the first run (#1116) 2021-07-12 21:38:20 +03:00
Teppei Fukuda
dea3428804 docs(misconf): add comparison with Conftest and tfsec (#1111) 2021-07-12 13:43:39 +03:00
Teppei Fukuda
47d600a9b4 feat(report): add schema version (#1110) 2021-07-12 12:27:27 +03:00
Teppei Fukuda
eae4bafff3 fix(scan): change unknown os from info to debug (#1109) 2021-07-12 12:26:48 +03:00
Teppei Fukuda
9e08bd44fb docs: add misconfiguration (#1101)
Co-authored-by: Itay Shakury <itay@itaysk.com>
2021-07-12 03:14:17 +03:00
Teppei Fukuda
d9883e4442 fix(config): rename include-successes with include-non-failures (#1107) 2021-07-11 16:55:13 +03:00
Teppei Fukuda
e6f7e556e8 feat(config): support --trace (#1106) 2021-07-11 16:07:30 +03:00
Teppei Fukuda
4b84e79cc3 fix(policy): reduce the Internet access (#1105)
* fix(policy): send a request only when it needs update

* fix(policy): update DownloadedAt after fetching image manifest
2021-07-10 23:17:04 +03:00
Teppei Fukuda
05ae22a85c chore: bump golangci-lint to v1.41.1 (#1104) 2021-07-10 21:23:00 +03:00
Teppei Fukuda
a0e5c3a2e2 feat: support config scanning (#931) 2021-07-09 08:18:53 +03:00
Teppei Fukuda
712f9eba35 feat(report): add artifact metadata (#1079) 2021-06-30 12:53:33 +03:00
Vinod Anandan
803b2f9a93 Generate SBOM (#1076)
* Generate SBOM

Generate and publish SBOM as part of the release.

* Publish bom.json

* Ignore SBOMs generated during CI
2021-06-22 09:53:08 +03:00
Teppei Fukuda
92f980f4b7 fix(db): multiple prefixed data sources (#1070) 2021-06-20 16:23:26 +03:00
Chris Novakovic
52e98f1bd9 Add EOL date for Alpine 3.14 (#1072)
Per https://alpinelinux.org/releases/, Alpine 3.14 is supported until
2023-05-01.

Closes #1071.
2021-06-20 11:15:22 +03:00
Dirk Mueller
6cd9a328a4 suse: mark sle 15.3 as maintained, add opensuse 15.3 (#1059)
SLE 15.3 is about to be released and will be maintained until
6 months after 15.4. this allows us to guess the 15 SP2 EOL date,
so updating that as well.
2021-06-17 12:09:46 +03:00
Teppei Fukuda
03a73667db docs: improve data sources (#1069)
* docs: improve data sources

* docs: add os data sources

* refactor
2021-06-16 16:43:42 +03:00
Teppei Fukuda
a29d6d8c5b chore(label): add kind/security-advisory (#1068) 2021-06-16 15:33:06 +03:00
Teppei Fukuda
2a08969ddc fix(asff): replace slice with substr (#1058) 2021-06-10 16:19:28 +03:00
Abhinav Khanna
3a94b7399b fix(helm-chart): parametrized ingress host path (#1049)
Signed-off-by: Abhinav Khanna <abhinav.khanna@salesforce.com>
2021-06-10 16:03:48 +03:00
Tauseef
41d000c97e feat: support Google Artifact Repository (#1055)
* Update Fanal library reference

This commit updates Fanal library version to latest which
includes support for Google artifact repository.

* chore(mod): tidy

Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-06-10 12:19:40 +03:00
David Wittman
78da283c1b Update ASFF template to use label for severity (#1047)
* Update ASFF template to use label for severity

Use of the `Normalized` and `Product` fields is deprecated in the [ASFF spec](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format-attributes.html#asff-severity). Instead, we should just provide the severity as a `Label`, which simplifies the logic in this template quite a bit as well.

* fix(asff): use severity var

Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-06-10 12:12:53 +03:00
Teppei Fukuda
e362843705 BREAKING: migrate to a new JSON schema (#782)
* feat: introduce a new JSON schema

* test: update

* chore(mod): update fanal

* refactor: add a comment

* test(report): fix

* refactor(writer): add omitempty

* refactor: replace url

* test(scanner): fix
2021-06-08 18:03:24 +03:00
David Wittman
097b8d4881 docs: Fix link to AWS Security Hub template (#1046) 2021-06-07 10:14:18 +03:00
Teppei Fukuda
3b6122f86d refactor(server): support gzip (#1045) 2021-06-06 17:54:12 +03:00
Teppei Fukuda
f75a36945c chore(rpc): update protoc and twirp (#1044) 2021-06-06 16:33:25 +03:00
tonaim
e4c32cdb77 Added support for list all packages flag in client (#1032)
* Added support for list all packages flag in client

This commit is to support --list-all_pkgs argument in client command
Example command: trivy -d client --list-all-pkgs --remote http://localhost:8080 ubuntu:18.04.

* Updated argument in client.md

* Fixed all format issues
2021-06-03 22:47:48 +03:00
Carol Valencia
fb19abd09a chore: chart with 0.18.3 (#1033)
Co-authored-by: krol3 <krol3@users.noreply.github.com>
2021-06-01 08:29:21 +03:00
bmagistro
d2afc206b2 feat: add gitlab codequality template (#895)
* Add gitlab codequality template

* add unit test for gitlab codequality template

* update line endings to msdos (\r\n) from unix

* update gitlab docs for codeclimate template
2021-05-31 11:20:59 +03:00
Teppei Fukuda
43ff5f93e8 feat(plugin): add aqua plugin (#1029) 2021-05-31 10:54:46 +03:00
rahul2393
5e6a50b2f9 fix(go): if patchedVersion is empty mark it as vulnerable (#1030)
* fix(go): if patchedVersion is empty mark it as vulnerable

* fix(go): skip checking for vulnerable version if empty

* fix(go): refactored empty check at start of match

* fix(go): added unit test for empty patched/vulnerable version
2021-05-30 15:43:14 +03:00
Teppei Fukuda
23b9533791 docs(ubuntu): fix supported versions (#1028) 2021-05-30 14:13:45 +03:00
Huang Huang
d1f8cfcfdc Support Ubuntu 21.04 (#1027) 2021-05-30 11:10:19 +03:00
Teppei Fukuda
aa2336be92 chore: remove codecov (#1016) 2021-05-27 09:25:37 +03:00
Tomoya Amachi
e64617212e fix typo on github-actions.md (#1022) 2021-05-27 09:10:46 +03:00
Teppei Fukuda
85e45cad95 chore(ci): change to more granular tokens (#1014) 2021-05-24 02:35:44 +03:00
rahul2393
9fa512a652 chore(ci): add Go scanning and update dependencies (#1001)
* Fixed dependency

* Scan repo action added

* only check for Critical with exit-code=1

* Fix vulnerability in go.sum

* more fixes
2021-05-23 11:21:23 +03:00
skovati
349371bbc9 docs: Add HIGH severity to Trivy command in GitLab CI example to match comment (#1013)
* Add HIGH severity to Trivy command in GitLab CI example to match comment

* Change comment to accurately reflect Trivy command that fails only on CRITICAL vulnerabilities
2021-05-23 04:55:46 +03:00
Teppei Fukuda
4446961167 fix(image): disable go.sum scanning (#1007) 2021-05-20 10:01:19 +03:00
Teppei Fukuda
04473ada48 fix(gomod): handle go.sum with an empty line (#1006) 2021-05-20 09:39:06 +03:00
Teppei Fukuda
1b66b77f69 feat: prepare for config scanning (#1005)
* temp: disable config scanning
2021-05-20 09:05:36 +03:00
gboer
8fc6ea6489 Clarify that dev dependencies are excluded (#986)
Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-05-19 05:47:05 +03:00
rahul2393
eaf2da20a6 Include target value in Sarif template ruleID (#991)
* Include target value in Sarif template ruleID

* Fix format
2021-05-13 20:10:34 +03:00
rahul2393
083c157b05 chore(mkdocs): allow workflow_dispatch (#989)
* Updated docs for go libraries.

* Add option to manually trigger doc publish
2021-05-12 19:57:14 +03:00
rahul2393
e26e39a7f8 fix(vuln) unique vulnerabilities from different data sources (#984)
* Fix duplicate Rule in sarif template

* Fix integration tests

* Fixed tests

* Update certs validity upto 2100

* Moved deduplication logic to Filter

* Fix linting issue

* Fix liniting issue

* fix: deduplicate vulnerabilities

* refactor

* fix: add installed versions to uniq keys

* Fix tests

* Fix Unit tests.

* Revert port change

Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-05-12 13:10:05 +03:00
rahul2393
04e7ccabea feat(go): added support of gomod analyzer (#978)
* Added support of gomod analyzer.

* add imports

* fix gocyclo

* Ran go fmt
2021-05-11 04:18:13 +03:00
rahul2393
415e1d8ea3 Upgrade fanal dependency (#976) 2021-05-01 13:14:08 +03:00
Teppei Fukuda
3bb8852ef7 docs: mention upx binaries (#974) 2021-05-01 04:39:42 +03:00
rahul2393
c0fddd9467 Upgrade alpine to fix git and libcurl vulnerabilities in trivy docker image scan (#971)
* Upgrade alpine to fix git and libcurl vulnerabilities in trivy docker image scan

* remove patch version
2021-04-30 11:06:57 +03:00
Teppei Fukuda
41c066d4c8 fix(fs): skip dirs (#969) 2021-04-30 07:50:07 +03:00
Teppei Fukuda
2316931e3b chore(ci): replace GITHUB_TOKEN with ORG_GITHUB_TOKEN (#965) 2021-04-29 21:57:43 +03:00
Teppei Fukuda
77f3d55149 chore(ci): clone trivy-repo after releasing binaries (#963) 2021-04-29 21:15:11 +03:00
Teppei Fukuda
b319579b78 docs: add golang support (#962) 2021-04-29 20:53:12 +03:00
Teppei Fukuda
0c0febe28a fix(table): skip zero vulnerabilities on java (#961) 2021-04-29 20:52:55 +03:00
Teppei Fukuda
d41736b828 chore(ci): create a release discussion (#959)
* chore(ci): create a release discussion

* chore(ci): bump up goreleaser version
2021-04-29 19:53:39 +03:00
Masahiro331
c88bbbd6cc feat(go): support binary scan (#948)
* feature(gobinary) support gobinary scan

* chore(mod): update fanal

* update(go.mod) update trivy-db

Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-04-29 19:47:50 +03:00
Masahiro331
d88b7cfb08 feat(java): support GitLab Advisory Database (#917)
* feature(maven) support requirements

* test(maven) fix test name

* update(go.mod) update fanal

* refactor(maven compare) fix test

* update(go.mod) update go-mvn-version
2021-04-29 18:40:51 +03:00
Teppei Fukuda
1385fa4190 feat: show help message when the context's deadline passes (#955) 2021-04-27 17:13:01 +03:00
Teppei Fukuda
0346a106f8 chore(mkdocs): replace github token (#954) 2021-04-27 14:43:54 +03:00
Yong Yan
60a4e7e5d4 Update SARIF report template (#935)
* Update SARIF repot template

* Update test data sarif.golden

* Fix golangci-lint issue

* Add test cases

* Address review feedbacks

* Inline value in assert statement

* Fix location Uri format issue
2021-04-19 13:35:30 -07:00
Henry Jenkins
39ab6bd630 Update install docs to make commands consistent (#933)
* Update install docs to make commands consistent

Removed `$` prefixes from code blocks to make them constant across the page and make the commands copypasta-able.

* Revert change on docs which need manual changes
2021-04-12 10:04:59 +03:00
Drew Robinson
0518d2785f Docker multi-platform image build with buildx, using Goreleaser (#915)
* Minimal WIP cross platform build with goreleaser

* Add Docker manifest, update docker image tags

* Update GH release workflow

* Comment out ECR image repo and RPM/DEB generation

* Enable and set up Docker Buildx for multi-platform builds

Also add caching of Go modules

* Add Docker Buildx support, re-enable parent repo workflows

* Add Docker Buildx support for multi-arch image builds

* Added Docker Buildx setup into `build-test` job of `test` workflow

Otherwise the `test` workflow will fail.
Also updated `setup-go` GH action to latest version, v2, per request
of @krol3
2021-03-29 11:53:28 +03:00
Paul T
a6b8ec3134 Fix JUnit template for AWS CodeBuild compatibility (#904)
* #902 ensure the number of tests matches the number of failures

* #902 tidy up the template and ensure test is aligned
2021-03-29 11:53:09 +03:00
Teppei Fukuda
6d22387727 break(cli): use StringSliceFlag for skip-dirs/files (#916)
* fix(cli): use StringSliceFlag for skip-dirs/files

* test(scanner): rename

* test(integration): fix
2021-03-29 10:25:30 +03:00
Teppei Fukuda
7221579340 docs: add white logo (#914) 2021-03-24 13:04:17 +02:00
rahul2393
ee29ffaf4f add package name in ruleID (#913) 2021-03-23 17:27:58 -07:00
Carol Valencia
8935aa6523 feat: gh-action for stale issues (#908)
* feat: gh-action for stale issues

* Update .github/workflows/stale-issues.yaml

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

Update .github/workflows/stale-issues.yaml

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

Update .github/workflows/stale-issues.yaml

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

Update .github/workflows/stale-issues.yaml

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

Update .github/workflows/stale-issues.yaml

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

Update .github/workflows/stale-issues.yaml

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

Co-authored-by: krol3 <krol3@users.noreply.github.com>
Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>
2021-03-21 17:39:59 +02:00
Teppei Fukuda
288481ffe1 chore(triage): add lifecycle/active label (#909) 2021-03-21 17:36:14 +02:00
Carol Valencia
f961e9912e feat: publish helm repository (#888)
* feat: publish helm repository

* chore: docs about helm installation

Co-authored-by: krol3 <krol3@users.noreply.github.com>
2021-03-19 11:00:51 +02:00
Stephan
0edf73bf3d Fix Documentation Typo (#901) 2021-03-19 10:59:19 +02:00
Teppei Fukuda
f5b060a9f1 docs: migrate README to MkDocs (#884)
* docs: slim README

* docs: add images

* docs: update README

* docs: add futher reading

* docs: add docs for maintainers

* docs: fix links

* docs: add notes

* Update docs/further.md

Co-authored-by: Daniel Pacak <pacak.daniel@gmail.com>

* Update docs/further.md

Co-authored-by: Daniel Pacak <pacak.daniel@gmail.com>

* Update docs/further.md

Co-authored-by: Daniel Pacak <pacak.daniel@gmail.com>

* Update docs/index.md

Co-authored-by: Daniel Pacak <pacak.daniel@gmail.com>

* Update docs/index.md

Co-authored-by: Daniel Pacak <pacak.daniel@gmail.com>

* Update docs/index.md

Co-authored-by: Daniel Pacak <pacak.daniel@gmail.com>

* docs: update mkdocs.yml

* chore: add a mkdocs target to Makefile

* docs(installation): use git.tag

* chore(Makefile): fix the tag of the mkdocs image

Co-authored-by: Daniel Pacak <pacak.daniel@gmail.com>
2021-03-17 07:19:34 +02:00
Teppei Fukuda
c26a3e481f refactor(internal): export internal packages (#887)
* refactor: export internal packages

* refactor(server): define Server

* refactor: fix lint issues

* test(integration): fix imports
2021-03-14 17:04:01 +02:00
Teppei Fukuda
8b3b5d0290 feat: support plugins (#878)
* fix(log): set the default logger

* feat: support plugins

* feat(plugin): add run command

* feat(plugin): add uninstall command

* test(plugin): add tests

* chore(ci): pin go version

* chore(ci): disable G204

* refactor: fix lint issues

* feat(plugin): skip downloading installed plugins

* feat: add TRIVY_RUN_AS_PLUGIN

* support Ubuntu 20.10 (#876)

* docs(README): update ubuntu versions (#877)

* add MkDocs implementation (#870)

* mkdocs: add top level nav

* mkdocs: add installation nav

* mkdocs: add quick-start nav

* mkdocs: add examples nav

* mkdocs: add CI nav

* mkdocs: add vuln-detection nav

* mkdocs: add comparison nav

* mkdocs: add usage nav

* mkdocs: add migration nav

* mkdocs: add FAQ nav

* mkdocs: add mkdocs.yml

* mkdocs: add github workflow

* docs: update documents

* fix links

* chore(ci): use ORG_GITHUB_TOKEN

* chore(mkdocs): use mike

* chore(ci): support dev

* chore(ci): documentation test

Co-authored-by: knqyf263 <knqyf263@gmail.com>

* docs: add plugins

* chore: remove stale workflow

* refactor: fix lint issues

Co-authored-by: Huang Huang <mozillazg101@gmail.com>
Co-authored-by: aprp <doelaudi@gmail.com>
2021-03-10 21:44:08 +02:00
Teppei Fukuda
37edc66418 chore(ci): deploy dev docs only for the main branch (#882)
* chore(ci): deploy dev docs only for the main branch

* chore(ci): add mkdocs.yml
2021-03-10 17:55:16 +02:00
aprp
becd5088df add MkDocs implementation (#870)
* mkdocs: add top level nav

* mkdocs: add installation nav

* mkdocs: add quick-start nav

* mkdocs: add examples nav

* mkdocs: add CI nav

* mkdocs: add vuln-detection nav

* mkdocs: add comparison nav

* mkdocs: add usage nav

* mkdocs: add migration nav

* mkdocs: add FAQ nav

* mkdocs: add mkdocs.yml

* mkdocs: add github workflow

* docs: update documents

* fix links

* chore(ci): use ORG_GITHUB_TOKEN

* chore(mkdocs): use mike

* chore(ci): support dev

* chore(ci): documentation test

Co-authored-by: knqyf263 <knqyf263@gmail.com>
2021-03-09 20:05:37 +02:00
Teppei Fukuda
e517bef17f docs(README): update ubuntu versions (#877) 2021-03-07 08:35:26 +02:00
Huang Huang
da2b28a3bb support Ubuntu 20.10 (#876) 2021-03-07 07:10:23 +02:00
Teppei Fukuda
965bb6d08a feat(cache): introduce versioned cache (#865)
* refactor(scan): rename image to artifact

* refactor(scan): trim version suffixes for debug info

* chore(mod): update fanal

* refactor: reduce complexity

* chore(mod): update fanal

* refactor(scan): early return
2021-02-28 12:18:56 +02:00
Teppei Fukuda
049728665f chore: bump up Go to 1.16 (#861)
* chore: bump up Go to 1.16

* chore(release): support darwin/arm64
2021-02-25 19:04:13 +02:00
Teppei Fukuda
fcb9a93d05 fix: allow the latest tag (#864)
* fix: allow the latest tag

* docs: update README
2021-02-25 16:23:11 +02:00
Teppei Fukuda
425eaf8a2a feat: disable analyzers (#846)
* feat: pass disabled analyzers

* refactor(run): split into functions

* feat(run): pass disabled analyzers

* chore(mod): update fanal

* chore(mod): update fanal

* refactor
2021-02-24 11:02:24 +02:00
Teppei Fukuda
47ce996d36 chore(ci): push the official image to public ECR (#855) 2021-02-23 07:35:31 +02:00
Teppei Fukuda
e890ae02c2 chore(ci): migrate CircleCI to GitHub Actions (#850) 2021-02-22 06:56:17 +02:00
shorty-at-next
9bc3565af1 adds example with multistage build (#853) 2021-02-21 08:42:38 +02:00
aprp
a0cd5d70ae remove SARIF helpUri if empty (#841) (#845)
* remove SARIF helpUri if empty (#841)

* add tests for primary url
2021-02-19 12:24:11 -08:00
Nils Bokermann
3170dc3e63 Add Sprig to Template Engine (#832)
* Add sprig template function to template writer

* gofmt corrected

* includes corrected

* GoFMT corrected

* Added accidentically removed template functions

* Corrected use of template-file

* Add sprig test

* Add short example for sprig.
2021-02-18 08:39:22 +02:00
Andreas Härpfer
10ad2edd3c Fix "GitLab CI using Trivy container" usage example (fixes #843) (#844) 2021-02-15 11:24:48 +02:00
Teppei Fukuda
c9f22f4e55 feat(java): support jar/war/ear (#837)
* refactor(server): remove Detect endpoint

* refactor(library): do not use interface

* refactor: add dbtest package

* test: add bolt fixtures

* feat: support jar scanning

* refactor: rename node to npm

* refactor: fix lint issues

* test(maven): remove some tests

* chore(mod): update fanal

* docs: update README

* chore(mod): update trivy-db

* fix(library/drive): add ecosystem

* fix: do not display 0 vulnerabilities

* refactor(table): split method

* Update README.md (#838)

* fix(app): increase the default value of timeout (#842)

* feat(maven): use go-mvn-version

* test(maven): update tests

* fix(scan): skip files and dirs before vulnerability detection

* fix: display log messages only once per type

* docs(README): add file suffixes

* chore(mod): update go-mvn-version

* feat(log): set go-dep-parser logger

* chore(mod): update fanal

* docs: update README

* docs(README): add java source

* test(maven): fix invalid case
2021-02-14 18:19:42 +02:00
Teppei Fukuda
3047c524d9 fix(app): increase the default value of timeout (#842) 2021-02-14 08:15:53 +02:00
Teppei Fukuda
89e5295421 Update README.md (#838) 2021-02-11 14:37:17 +02:00
Maximilian Schlosser
cdabe7fc9e Fix compatibility for Jenkins xunit plugin (#820)
* Compatibility for Jenkins xunit plugin

* fix test
2021-02-08 11:10:06 +02:00
Denis Pisarev
b0fe439309 README: add Gitlab job that uses a container with trivy (#823) 2021-02-08 11:08:57 +02:00
Teppei Fukuda
6685cd4e21 feat: support Podman (#825)
* docs(README): add Podman support

* chore(mod): update fanal

* docs: update README

* docs(README): add how to build images
2021-01-28 16:53:08 +02:00
Kota Kanbe
7a683bd02e fix(eol): update EOL dates (#824) 2021-01-27 07:46:22 +02:00
Teppei Fukuda
6ed03a83a5 fix(python): follow PEP 440 (#816)
* feat(python): replace go-version with go-pep440-version

* chore(mod): add go-pep440-version

* refactor: add trick for golangci-lint

* refactor: rename test functions
2021-01-25 14:44:07 +02:00
Huang Huang
182cb800a8 Support alpine 3.13 (#819) 2021-01-24 13:59:19 +02:00
Paul Mossman
2acd1cafd0 Changed the output string to "Using your github token". (#814) 2021-01-21 09:10:33 +02:00
Clemens Buchacher
dd35bfd1a1 Align comment with code (#812) 2021-01-21 09:09:42 +02:00
Christian Zunker
1f17e71dce Parse redis backend url (#804)
As suggested by the go-redis client, parse the url to get the config.
This will fix problems, when the url contains a username and/or password.

Fixes #798

Signed-off-by: Christian Zunker <christian.zunker@codecentric.cloud>
2021-01-21 09:08:53 +02:00
Teppei Fukuda
0954f6b1bb Update README.md (#810) 2021-01-19 06:06:12 +02:00
Carlos Tolon
6b29bf1c71 Added nodeSelector, affinity and tolerations to helm chart (#803)
* Added nodeSelector, affinity and tolerations to helm chart

* Updated helm README.md and bumped version
2021-01-11 16:33:35 +02:00
Oran Moshai
f6afdf0145 Fix readme typo in policy flag (#805)
Co-authored-by: oranmoshai <oran.moshai@aquasec.com>
2021-01-11 16:32:33 +02:00
Damien Carol
412847d6a2 Fix errors in SARIF format (#801)
* Fix errors in SARIF format

* Fix one golden file for integration tests

* Fix golden file

* Fix golden again :>

* Update sarif.tpl

* Update alpine-310.sarif.golden
2021-01-08 14:16:35 -08:00
Christian Zunker
5b2786213a Fix env variable for github token (#796)
Fixes #795

Signed-off-by: Christian Zunker <christian.zunker@codecentric.cloud>
2021-01-07 15:51:20 +02:00
Teppei Fukuda
6ed25c19e6 fix(vulnerability): set unknown severity for empty values (#793)
* fix(vulnerability): set unknown severity for empty values

* chore(mod): update trivy-db
2021-01-07 06:48:32 +02:00
Robert Jacob
e2c483f856 Remove global flags from filesystem command (#772)
* Remove global flags from subcommands

If the global flags are added to the subcommand as well as being used
globally, their value will be overwritten when the arguments for the
subcommand are parsed. This leads to the value passed to the flag at the
global position being lost.

* Update readme
2021-01-05 12:49:39 +02:00
Christian Zunker
5c5e0cb86d Add imagePullSecrets to helm Chart (#789)
* Add imagePullSecrets to helm Chart

Fixes #787

Signed-off-by: Christian Zunker <christian.zunker@codecentric.cloud>

* use only one imagePullSecret

Signed-off-by: Christian Zunker <christian.zunker@codecentric.cloud>

* Bugfix

Signed-off-by: Christian Zunker <christian.zunker@codecentric.cloud>
2021-01-05 12:41:42 +02:00
Christian Zunker
b9b84cd963 Add redis cache backend configuration options (#784)
You can now specify redis as caching as backend.
The default is still the filesystem.

In case redis is added as caching backend, the cache-dir is still
used for the vulnerability database.

Fixes #781

Signed-off-by: Christian Zunker <christian.zunker@codecentric.cloud>
2021-01-04 11:42:05 +02:00
justfortee
e517bcc2b2 Update README.md (#735)
Grammatical error.
2021-01-03 12:23:42 +02:00
Teppei Fukuda
7f5a6d479e feat(redhat): support modular packages (#790) 2020-12-31 19:40:25 +02:00
Christian Zunker
8de09ddf37 Fix formatting of log message (#785)
Signed-off-by: Christian Zunker <christian.zunker@codecentric.cloud>
2020-12-25 16:26:23 +02:00
Teppei Fukuda
e08ae8d01d chore(ci): migrate unit tests to GitHub Actions (#779) 2020-12-22 06:20:05 +02:00
Yashvardhan Kukreja
a00d719ed2 shifted: brews.github to brews.tap (#780) 2020-12-21 16:28:19 +02:00
Johannes
08ca1b00b7 Feat: NuGet Scanner (#686)
* Initial nuget advisory detector code.

Signed-off-by: Johannes Tegnér <johannes@jitesoft.com>

* Added nuget package to scan.go

Signed-off-by: Johannes Tegnér <johannes@jitesoft.com>

* Removed nuget advisory file and instead added csharp/nuget as a driver in driver.go.

Signed-off-by: Johannes Tegnér <johannes@jitesoft.com>

* Removed nuget package from driver. Added ghasnuget as a source in vulnerability.go

Signed-off-by: Johannes Tegnér <johannes@jitesoft.com>

* Updated nuget driver to use correct name and to initialize with the new generic scanner.

Signed-off-by: Johannes Tegnér <johannes@jitesoft.com>

* refactor: cut out to a separate method

* chore(mod): update trivy-db

* fix(driver): add a general driver

* test(ghsa): add nuget

* chore: update README

Co-authored-by: knqyf263 <knqyf263@gmail.com>
2020-12-21 10:17:15 +02:00
Teppei Fukuda
7b86f81e29 feat(cache): support Redis (#770)
* feat(config): add --cache-backend

* feat(operation): embed cache.Cache into operation.Cache

* feat(cache): support redis://

* test(integration): add redis test

* chore(README): add --cache-backend

* chore(mod): update

* chore: add disclaimer
2020-12-21 08:26:19 +02:00
Masahiro331
8cd4afeaf1 fix(redhat): skip module packages (#776)
* remove cbinding

* skip modular packages

* add debug log

* Fix clomatic complexity 11

* Add comment

* Fix test release

* chore(mod): update

* refactor(redhat): rename a method

* test(redhat): refactor

Co-authored-by: knqyf263 <knqyf263@gmail.com>
2020-12-18 07:52:13 +02:00
Teppei Fukuda
b606b621e5 chore: migrate from master to main (#778) 2020-12-17 17:27:36 +02:00
Teppei Fukuda
5c2b14b910 chore(circleci): remove gofmt (#777) 2020-12-17 15:35:11 +02:00
Teppei Fukuda
a19a023f1f chore(README): remove experimental (#775) 2020-12-16 06:06:17 +02:00
Simarpreet Singh
e6cef75162 NVD: Add timestamps. (#761)
* (feat): Add NVD published and modified dates

Signed-off-by: Simarpreet Singh <simar@linux.com>

* (test): Fix golden files.

Signed-off-by: Simarpreet Singh <simar@linux.com>

* (test): Fix registry_test.go golden files.

Signed-off-by: Simarpreet Singh <simar@linux.com>

* (test): Fix distroless-base-ignore-unfixed.json.golden with ignore-unfixed option.

Signed-off-by: Simarpreet Singh <simar@linux.com>

* (test): Fix fluentd-multiple-lockfiles.json.golden.

Signed-off-by: Simarpreet Singh <simar@linux.com>

* (test): Fix alpine-310.html.golden file.

Signed-off-by: Simarpreet Singh <simar@linux.com>

* fix(convert): fix disparency between standalone and client/server

* test(integration): update trivy.db

* test(integration): update golden files

* (test): Add a check for non nil date types.

Signed-off-by: Simarpreet Singh <simar@linux.com>

* (test): Add a unit test for ConvertFromRPCResults.

Signed-off-by: Simarpreet Singh <simar@linux.com>

* (test): Add a nil date case for ConvertFromRPCResults.

Signed-off-by: Simarpreet Singh <simar@linux.com>

* refactor: sort imports

Co-authored-by: knqyf263 <knqyf263@gmail.com>
2020-12-14 13:21:09 -08:00
Simarpreet Singh
1371f72cfb (fix): Make the table output less wide. (#763)
* (fix): Make the table output less wide.

Currently the table outupt can be as long as 200 characters wide in some
images like nginx:1.16

This PR merges the Title and the URL columns to shorten it.

With this change the longest column has reduced from 200 -> 162 (-19%).

Signed-off-by: Simarpreet Singh <simar@linux.com>

* (fix): Remove Debian TEMP-* links.

These links are quite wide. Removing them makes it 200 -> 143 (-28.5%) shorter for table output.

Signed-off-by: Simarpreet Singh <simar@linux.com>

* Revert "(fix): Remove Debian TEMP-* links."

This reverts commit 228540f7c3.
2020-12-08 11:08:30 -08:00
Christian Zunker
8ecaa2f057 Add gitHubToken to prevent rate limit problems (#769)
And remove unnecessary config parameters.

Fixes #768

Signed-off-by: Christian Zunker <christian.zunker@codecentric.cloud>
2020-12-08 09:39:22 +02:00
Christian Zunker
8132174754 Add helm chart to install trivy in server mode. (#751)
Fixes #688

Signed-off-by: Christian Zunker <christian.zunker@codecentric.cloud>
2020-12-06 13:21:19 +02:00
Jack Kelly
bcc285095d chore(docs): add nix install (#762) 2020-12-04 14:45:31 -08:00
irrandon
cb369727cd HTML template (#567)
* add html template

* test(integration): use JSONEq only for JSON folden files

Co-authored-by: knqyf263 <knqyf263@gmail.com>
2020-12-02 10:50:45 +02:00
Teppei Fukuda
9bdbeaba66 feat: remove rpm dependency (#753)
* chore(docker): remove rpm

* chore(README): remove rpm

* fix(scanner): replace rpmcmd with rpm

* chore(goreleaser): remove rpm

* chore(mod): update fanal

* chore(mod): update fanal
2020-12-02 07:24:43 +02:00
Teppei Fukuda
d85cb77123 fix(vulnerability): make an empty severity UNKNOWN (#759) 2020-12-02 07:24:02 +02:00
Teppei Fukuda
1bee83ccc4 chore(README): add TRIVY_INSECURE (#760)
* chore(README): add TRIVY_INSECURE

* chore(README): replace server with registry
2020-11-30 16:43:33 +02:00
Teppei Fukuda
4d1894327e feat(vulnerability): add primary URLs (#752)
* refactor(vulnerability): rename a method

* feat(vulnerability): add primary url

* fix(templates): add primary links

* feat(writer): add url

* refactor(convert): remove an unnecessary function

* feat(rpc): add primary_url

* test(integration): update golden files
2020-11-26 06:06:26 +02:00
Teppei Fukuda
1391b3bf47 fix(oracle): handle ksplice advisories (#745) 2020-11-18 20:14:01 +02:00
Teppei Fukuda
b6d5b82c48 fix: version comparison (#740)
* feat: add comparer

* refactor: rename lang with ecosystem

* feat(bundler): add comparer

* feat(node): add comparer

* feat(bundler): integrate comparer

* feat(cargo): integrate comparer

* feat(composer): add comparer

* feat(ghsa): integrate comparer

* feat(node): integrate comparer

* feat(python): integrate comparer

* test(bundler): add tests

* test(cargo): add tests

* test(composer): add tests

* test(ghsa): add tests

* test(node): add tests

* test(python): add tests

* refactor(utils): remove unnecessary functions

* test(utils): add tests

* test: rename bucket prefixes

* fix(detect): use string

* chore: update dependencies

* docs: add comments

* fix(cargo): handle unpatched vulnerability

* test(db): update trivy-db for integration tests

* test(integration): update a golden file

* test(cargo): Add a case for missing patched version

Signed-off-by: Simarpreet Singh <simar@linux.com>

* refactor(advisory): update comments

* refactor(node/advisory): change the receiver

* chore(mod): update dependencies

* refactor(comparer): unexport MatchVersion

* refactor: fix maligned structs

* test(node): add empty value

* refactor

* refactor: sort imports

* chore(mod): update trivy-db

Co-authored-by: Simarpreet Singh <simar@linux.com>
2020-11-17 11:38:58 +02:00
Gianni Carafa
9dfb0fe3a9 updated Readme.md (#737)
removed unused env var TRIVY_AUTH_URL
2020-11-12 21:16:42 -08:00
Dirk Mueller
455546975c Add suse sles 15.2 to the EOL list as well (#734)
without that you get this arning:
  WARN	This OS version is not on the EOL list: suse linux enterprise server 15.2

which is actually misleading because 15.2 is the most current release,
we just don't know when it ends. we can however assume that it runs
for at least another year.

Signed-off-by: Dirk Mueller <dirk@dmllr.de>
Signed-off-by: Dirk Mueller <dmueller@suse.com>
2020-10-30 16:42:48 -07:00
Sinith
c189aa6a0a Update README.md (#731) 2020-10-29 12:24:21 -07:00
Dax McDonald
8442528fa7 Warn when a user attempts to use trivy without a detectable lockfile (#729)
* Warn when a user attempts to use trivy without a detectable lockfile

* Update pkg/scanner/local/scan.go

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>
2020-10-29 12:45:59 +02:00
Dax McDonald
d09787e150 Add back support for FreeBSD & OpenBSD (#728)
Reverts 7fc94ad95c
2020-10-29 07:21:49 +02:00
Carlos Eduardo
0285a89c7c Add support for ppc64le architecture (#724) 2020-10-26 17:08:14 -07:00
Evgeniy Kosov
7d7784fecb Skip packages from unsupported repository (remi) (#695)
* Skip packages from unsupported repository (remi)

* Use HasSuffix instead of regexp match
2020-10-26 13:14:46 +02:00
Huang Huang
ca6f196001 Skip downloading DB if a remote DB is not updated (#717)
* Skip downloading DB if a remote DB is not updated

* Apply suggestions from code review

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

* update github.com/aquasecurity/trivy-db version

* fix lint

* Use UTC datetime

* display DownloadedAt info in debug log

* refactor(db): merge isLatestDB into isNewDB

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>
2020-10-26 09:07:30 +02:00
Huang Huang
e621cf2bc1 Sunsetting VendorVectors (#718) 2020-10-25 13:45:56 +02:00
Teppei Fukuda
906ab5483e Add GitHub Container Registry to README (#712) 2020-10-25 13:17:16 +02:00
Pascal Andy
1549c25709 update BUG_REPORT.md using H2 instead of bold formatting (#714) 2020-10-22 14:15:20 -07:00
Teppei Fukuda
fe1d07e58c fix(ci/deb): do not remove old packages for EOL versions (#706) 2020-10-22 06:52:42 +03:00
rahul2393
793a1aa3c8 Add linter check support (#679)
* add linter supports

* add only minor version

* use latest version

* Fix println with format issue

* Fix test

* Fix tests

* For slice with unknown length, preallocating the array

* fix code-coverage

* Removed linter rules

* Reverting linter fixes, adding TODO for later

* Ignore linter error for import

* Remove another err var.

* Ignore shadow error

* Fixes

* Fix issue

* Add back goimports local-prefixes

* Update local prefixes

* Removed extra spaces and merge the imports

* more refactoring

* Update photon.go

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>
2020-10-20 15:20:04 +03:00
Jeff Rescignano
4a94477532 Optimize images (#696) 2020-10-20 08:13:33 +03:00
Teppei Fukuda
9bc2b1949c Update triage.md (#701) 2020-10-20 08:12:47 +03:00
Aron Moore
49691ba85e ci(circle): update remote docker version (#683) 2020-10-13 15:39:01 +03:00
Dirk Mueller
87ff0c1bbc suse: update end of life dates for SLES service packs (#676)
All synced with https://www.suse.com/lifecycle/ as of today

Signed-off-by: Dirk Mueller <dirk@dmllr.de>
Signed-off-by: Dirk Mueller <dmueller@suse.com>
2020-10-11 10:30:28 +03:00
Karan Thanvi
de30c3f8d6 update readme for parallel run issue (#660)
* update readme for parallel run

* move to Q&A
2020-10-11 10:24:19 +03:00
Neha Viswanathan
4c3bfb89a4 fix link for Clear images section in README (#659) 2020-10-05 13:59:01 -07:00
Neha Viswanathan
8b21cfe7eb add link to Gitlab CI pipeline in README (#658) 2020-10-05 13:47:49 -07:00
Teppei Fukuda
46700f7b74 test: add tests for mux (#645) 2020-09-30 09:10:33 +03:00
Teppei Fukuda
014be7e143 chore: bump up Go to 1.15 (#646)
* chore: bump up Go to 1.15

* chore(goreleaser): ignore darwin/386
2020-09-24 08:00:08 +03:00
Alexander Lauster
b3ff2c35ea Add contrib/ to the release chain for Docker (#638)
* Add contrib/ to the release chain for Docker

Add the complete contrib/ folder to the release chain

* Include all template files to the tar.gz archives
2020-09-23 10:49:22 +03:00
Huang Huang
9c786de8f9 Add health check endpoint to trivy server (#644) 2020-09-21 16:30:45 +03:00
Teppei Fukuda
188e108d7c fix(cli): show help for subcommands (#629) 2020-09-21 14:03:25 +03:00
Huang Huang
7d7842f2f3 Add --skip-update option to fs and repo subcommand (#641) 2020-09-18 14:49:47 -07:00
Manuel Rüger
901a3715cb goreleaser.yml: Add all templates to archive (#636)
Fixes: https://github.com/aquasecurity/trivy/issues/631

Signed-off-by: Manuel Rüger <manuel@rueg.eu>
2020-09-15 16:09:38 -07:00
Masahiro331
095b5ce97c fix(cli): show help when no argument is passed (#628)
* Fix subcommands help

* refactor: call ShowAppHelpAndExit

* refactor: remove an unused error

* test: remove exit cases

Co-authored-by: knqyf263 <knqyf263@gmail.com>
2020-09-08 17:32:20 +03:00
Teppei Fukuda
1d3f70e07f chore(image): push the official image to GitHub Container Registry as well (#627) 2020-09-08 15:06:32 +03:00
Teppei Fukuda
5e308da81a feat(cli): add --skip-files option (#624)
* feat(cli): add --skip-files

* test(integration): add --skip-files and --skip-dirs

* chore(docs): update README

* chore(docs): correct a grammar mistake
2020-09-08 15:04:56 +03:00
Teppei Fukuda
2231e4068d chore(docs): update comparison table (#623)
* chore(docs): update README

* use 
2020-09-02 16:56:30 +03:00
Simarpreet Singh
b3680f0016 logo: Add new Trivy logo (#615)
Signed-off-by: Simarpreet Singh <simar@linux.com>
2020-09-02 12:41:11 +03:00
Carol Valencia
89527796f6 fix(Readme) - Results using a template (#622)
Co-authored-by: Carol Valencia <krol3@users.noreply.github.com>
2020-09-02 12:40:05 +03:00
Chris Aumann
165d593fdb Improve Gitlab CI installation step in README (#621)
This improves the installation step in `.gitlab-ci.yml`. 

- Removes unnecessary installation and use of `curl` (replaces it with `wget`)
- Removes storing the intermediate file by using a pipe to `tar`
2020-09-02 12:39:05 +03:00
Teppei Fukuda
d8b09628f0 feat(rpc): add CWE-ID (#614) 2020-09-02 07:42:32 +03:00
Alexander Lauster
d35e8ec351 Add all templates to the docker image (#619)
Before this change, only a subset of templates were included in the docker image.
Now all templates which are part of the git repo will be included when the docker image will be build, a future commit for every new template is not needed anymore
2020-08-31 11:16:22 +03:00
Teppei Fukuda
f50b0ce8af feat(library): support a custom data source (#613)
* chore(mod): update trivy-db

* refactor(detector/library): use programming language instead of package
manager

* feat(library): add general advisory

* test(utils): add a util function initializing DB

* test(advisory): add tests

* chore: use aquasecurity/bolt-fixtures

* refactor: add comments

* chore(mod): revert fanal version

* chore(mod): update trivy-db

* refactor: update the comment
2020-08-30 10:11:32 +03:00
Teppei Fukuda
ed8607b710 fix(alpine): use source package (#607)
* chore(mod): update fanal

* fix(integration): support -update flag

* fix(alpine): use source package for vulnerability detection

* test(integration): update golden files

* chore(mod): update fanal
2020-08-25 13:01:49 +03:00
Teppei Fukuda
ea28d3b6f3 test(vulnerability): fix usages of new trivy-db refactor changes (#611)
* mod: Update trivy-db

Signed-off-by: Simarpreet Singh <simar@linux.com>

* vulnerability_test: Fix usages of new trivy-db refactor changes

Signed-off-by: Simarpreet Singh <simar@linux.com>

* chore(mod): update trivy-db

Co-authored-by: Simarpreet Singh <simar@linux.com>
2020-08-25 12:21:15 +03:00
Teppei Fukuda
827cea3245 refactor(bundler): remove unnecessary code (#610) 2020-08-24 13:22:11 +03:00
Simarpreet Singh
b2a0d83518 codecov: Move into root directory (#608)
Signed-off-by: Simarpreet Singh <simar@linux.com>
2020-08-20 10:21:52 -07:00
rahul2393
85e0139f32 Fix: fullDescription field in SARIF output is not correctly escaped (#605)
* Fixed sarif template fullDescription escape

* Added fix to other possible places

* Added test for escaping character
2020-08-19 10:23:04 -07:00
Teppei Fukuda
80d5df0ceb chore(docs): add AWS Security Hub (#598)
* chore(docs): add AWS Security Hub

* Update docs/integration/security-hub.md

Co-authored-by: Simarpreet Singh <simar@linux.com>

* Update README.md

Co-authored-by: Liz Rice <liz@lizrice.com>

Co-authored-by: Simarpreet Singh <simar@linux.com>
Co-authored-by: Liz Rice <liz@lizrice.com>
2020-08-19 13:19:24 +03:00
Teppei Fukuda
3a54e5b644 refactor(writer): define the constructor for TemplateWriter (#597) 2020-08-17 09:06:50 +03:00
Simarpreet Singh
acc6a9bd01 circleci: Allow coverage changes without a failure (#599)
Ref: https://github.com/testground/testground/pull/430

Signed-off-by: Simarpreet Singh <simar@linux.com>
2020-08-13 10:13:49 +03:00
Teppei Fukuda
96af6dc499 feat: add --skip-directories option (#595)
* feat: add --skip-directories option

* chore(README): update

* refactor: rename skip-directories to skip-dirs

* Update internal/app.go

Co-authored-by: Daniel Pacak <pacak.daniel@gmail.com>

* refactor: add some context in the warning message

* chore(README): update

Co-authored-by: Daniel Pacak <pacak.daniel@gmail.com>
2020-08-12 14:03:12 +03:00
rahul2393
675e1b4118 Added test and support of ASFF template (#594)
* Added test and support of ASFF template

* Improve test coverage

* Fixed/Improved tests

* Removed extra space

* Added NVD score/vectors, Added logic to trim description due to file size restriction

* Included quotations around AccountID
2020-08-12 13:25:58 +03:00
Carol Valencia
8ca484f538 fix: remove error using no options (#539)
* fix: remove error using no options

* chore: return error in Init

* chore: return custom error ErrNoTarget

* Update internal/config/artifact.go

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

* Update internal/config/artifact.go

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

* Update internal/artifact/image.go

Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>

* chore - remove error using no options

* fix(config): typo

* test(config): change the log level

* test(config): revert removed tests

Co-authored-by: Carol <krol3@users.noreply.github.com>
Co-authored-by: Teppei Fukuda <knqyf263@gmail.com>
2020-08-09 10:39:27 +03:00
Sebastian Gumprich
9a25f4fbe4 Fix comparison table to use words instead of symbols (#587)
fixes #301
2020-08-05 10:38:45 +03:00
Simarpreet Singh
467ec46cd3 sarif: Remove extra periods from short descriptions (#590)
Signed-off-by: Simarpreet Singh <simar@linux.com>
2020-08-04 22:28:11 -07:00
rahul2393
52feff2213 Added template fucntion to escape string before output (#583)
* Added template fucntion to escape string before output

* Fixed tests
2020-07-31 10:12:49 -07:00
rahul2393
add65f2f0c Revert Dockerfile changes (#581) 2020-07-30 22:04:31 +03:00
490 changed files with 163647 additions and 84337 deletions

View File

@@ -1,8 +0,0 @@
coverage:
status:
project:
default:
informational: true
patch:
default:
informational: true

View File

@@ -1,72 +0,0 @@
version: 2.1
orbs:
codecov: codecov/codecov@1.1.0
defaults: &defaults
docker :
- image: aquasec/trivy-ci:latest
environment:
CGO_ENABLED: "0"
jobs:
unit-test:
<<: *defaults
steps:
- checkout
- run:
name: Check if there's anything to fix with gofmt
command: |
if test -z "$(gofmt -l .)"; then
echo "Congrats! There is nothing to fix."
else
echo "The following lines should be fixed."
gofmt -s -d .
exit 1
fi
- run:
name: Test
command: make test
- codecov/upload:
file: ./coverage.txt
release:
<<: *defaults
steps:
- checkout
- setup_remote_docker:
version: 18.06.0-ce
- run:
name: setup docker
command: echo $DOCKER_PASS | docker login --username $DOCKER_USER --password-stdin
- run:
name: Release
command: goreleaser --rm-dist
- run:
name: Clone trivy repository
command: git clone git@github.com:aquasecurity/trivy-repo.git
- run:
name: Setup git settings
command: |
git config --global user.email "knqyf263@gmail.com"
git config --global user.name "Teppei Fukuda"
- run:
name: Create rpm repository
command: ci/deploy-rpm.sh
- run:
name: Import GPG key
command: echo -e "$GPG_KEY" | gpg --import
- run:
name: Create deb repository
command: ci/deploy-deb.sh
workflows:
version: 2
release:
jobs:
- unit-test
- release:
filters:
branches:
ignore: /.*/
tags:
only: /.*/

View File

@@ -4,28 +4,28 @@ labels: kind/bug
about: If something isn't working as expected.
---
**Description**
## Description
<!--
Briefly describe the problem you are having in a few paragraphs.
-->
**What did you expect to happen?**
## What did you expect to happen?
**What happened instead?**
## What happened instead?
**Output of run with `-debug`:**
## Output of run with `-debug`:
```
(paste your output here)
```
**Output of `trivy -v`:**
## Output of `trivy -v`:
```
(paste your output here)
```
**Additional details (base image name, container registry info...):**
## Additional details (base image name, container registry info...):

10
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: daily
- package-ecosystem: docker
directory: /
schedule:
interval: daily

34
.github/workflows/mkdocs-dev.yaml vendored Normal file
View File

@@ -0,0 +1,34 @@
name: Deploy the dev documentation
on:
push:
paths:
- 'docs/**'
- mkdocs.yml
branches:
- main
jobs:
deploy:
name: Deploy the dev documentation
runs-on: ubuntu-18.04
steps:
- name: Checkout main
uses: actions/checkout@v2
with:
fetch-depth: 0
persist-credentials: true
- uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git
pip install mike
pip install mkdocs-macros-plugin
env:
GH_TOKEN: ${{ secrets.MKDOCS_AQUA_BOT }}
- name: Configure the git user
run: |
git config user.name "knqyf263"
git config user.email "knqyf263@gmail.com"
- name: Deploy the dev documents
run: mike deploy --push dev

42
.github/workflows/mkdocs-latest.yaml vendored Normal file
View File

@@ -0,0 +1,42 @@
name: Deploy the latest documentation
on:
workflow_dispatch:
inputs:
version:
description: Version to be deployed
required: true
push:
tags:
- "v*"
jobs:
deploy:
name: Deploy the latest documentation
runs-on: ubuntu-18.04
steps:
- name: Checkout main
uses: actions/checkout@v2
with:
fetch-depth: 0
persist-credentials: true
- uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git
pip install mike
pip install mkdocs-macros-plugin
env:
GH_TOKEN: ${{ secrets.MKDOCS_AQUA_BOT }}
- name: Configure the git user
run: |
git config user.name "knqyf263"
git config user.email "knqyf263@gmail.com"
- name: Deploy the latest documents from new tag push
if: ${{ github.event.inputs.version == '' }}
run: |
VERSION=$(echo ${{ github.ref }} | sed -e "s#refs/tags/##g")
mike deploy --push --update-aliases $VERSION latest
- name: Deploy the latest documents from manual trigger
if: ${{ github.event.inputs.version != '' }}
run: mike deploy --push --update-aliases ${{ github.event.inputs.version }} latest

51
.github/workflows/publish-chart.yaml vendored Normal file
View File

@@ -0,0 +1,51 @@
name: Publish Chart Helm
on:
push:
branches: [main]
paths:
- 'helm/trivy/**'
workflow_dispatch:
env:
HELM_REP: helm-charts
GH_OWNER: aquasecurity
CHART_DIR: helm/trivy
jobs:
release:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install Helm
uses: azure/setup-helm@v1
with:
version: v3.5.0
- name: Install chart-releaser
run: |
wget https://github.com/helm/chart-releaser/releases/download/v1.1.1/chart-releaser_1.1.1_linux_amd64.tar.gz
tar xzvf chart-releaser_1.1.1_linux_amd64.tar.gz cr
- name: Package helm chart
run: |
./cr package ${{ env.CHART_DIR }}
- name: Upload helm chart
# Failed with upload the same version: https://github.com/helm/chart-releaser/issues/101
continue-on-error: true
## Upload the tar in the Releases repository
run: |
./cr upload -o ${{ env.GH_OWNER }} -r ${{ env.HELM_REP }} --token ${{ secrets.ORG_REPO_TOKEN }} -p .cr-release-packages
- name: Index helm chart
run: |
./cr index -o ${{ env.GH_OWNER }} -r ${{ env.HELM_REP }} -c https://${{ env.GH_OWNER }}.github.io/${{ env.HELM_REP }}/ -i index.yaml
- name: Push index file
uses: dmnemec/copy_file_to_another_repo_action@v1.1.1
env:
API_TOKEN_GITHUB: ${{ secrets.ORG_REPO_TOKEN }}
with:
source_file: 'index.yaml'
destination_repo: '${{ env.GH_OWNER }}/${{ env.HELM_REP }}'
destination_folder: '.'
destination_branch: 'gh-pages'
user_email: aqua-bot@users.noreply.github.com
user_name: 'aqua-bot'

88
.github/workflows/release.yaml vendored Normal file
View File

@@ -0,0 +1,88 @@
name: Release
on:
push:
tags:
- "v*"
env:
GO_VERSION: "1.17"
GH_USER: "aqua-bot"
jobs:
release:
name: Release
runs-on: ubuntu-18.04 # 20.04 doesn't provide createrepo for now
env:
DOCKER_CLI_EXPERIMENTAL: "enabled"
steps:
- name: Install dependencies
run: |
sudo apt-get -y update
sudo apt-get -y install rpm reprepro createrepo distro-info
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Show available Docker Buildx platforms
run: echo ${{ steps.buildx.outputs.platforms }}
- name: Setup Go
uses: actions/setup-go@v2
with:
go-version: ${{ env.GO_VERSION }}
- name: Checkout code
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Cache Go modules
uses: actions/cache@v2
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Login to docker.io registry
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to ghcr.io registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ env.GH_USER }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to ECR
uses: docker/login-action@v1
with:
registry: public.ecr.aws
username: ${{ secrets.ECR_ACCESS_KEY_ID }}
password: ${{ secrets.ECR_SECRET_ACCESS_KEY }}
- name: Generate SBOM
uses: CycloneDX/gh-gomod-generate-sbom@v0.3.0
with:
json: true
output: bom.json
version: ^v0
- name: Release
uses: goreleaser/goreleaser-action@v2
with:
version: v0.182.1
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.ORG_REPO_TOKEN }}
- name: Checkout trivy-repo
uses: actions/checkout@v2
with:
repository: ${{ github.repository_owner }}/trivy-repo
path: trivy-repo
fetch-depth: 0
token: ${{ secrets.ORG_REPO_TOKEN }}
- name: Setup git settings
run: |
git config --global user.email "knqyf263@gmail.com"
git config --global user.name "Teppei Fukuda"
- name: Create rpm repository
run: ci/deploy-rpm.sh
- name: Import GPG key
run: echo -e "${{ secrets.GPG_KEY }}" | gpg --import
- name: Create deb repository
run: ci/deploy-deb.sh

25
.github/workflows/scan.yaml vendored Normal file
View File

@@ -0,0 +1,25 @@
name: Scan
on: [push, pull_request]
jobs:
build:
name: Scan Go vulnerabilities
runs-on: ubuntu-18.04
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Run Trivy vulnerability scanner to scan for Critical Vulnerabilities
uses: aquasecurity/trivy-action@master
with:
scan-type: 'fs'
exit-code: '1'
severity: 'CRITICAL'
skip-dirs: integration
- name: Run Trivy vulnerability scanner to scan for Medium and High Vulnerabilities
uses: aquasecurity/trivy-action@master
with:
scan-type: 'fs'
exit-code: '0'
severity: 'HIGH,MEDIUM'
skip-dirs: integration

20
.github/workflows/stale-issues.yaml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: "Stale issues"
on:
schedule:
- cron: '0 0 * * *'
jobs:
stale:
timeout-minutes: 1
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v4
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue is stale because it has been labeled with inactivity.'
stale-pr-message: 'This PR is stale because it has been labeled with inactivity.'
exempt-issue-labels: 'lifecycle/frozen,lifecycle/active,priority/critical-urgent,priority/important-soon,priority/important-longterm,priority/backlog,priority/awaiting-more-evidence'
exempt-pr-labels: 'lifecycle/active'
stale-pr-label: 'lifecycle/stale'
stale-issue-label: 'lifecycle/stale'
days-before-stale: 60
days-before-close: 20

View File

@@ -1,14 +1,45 @@
name: Test
on: pull_request
on:
push:
branches:
- main
paths-ignore:
- '*.md'
- 'docs/**'
- 'mkdocs.yml'
- 'LICENSE'
pull_request:
env:
GO_VERSION: "1.17"
jobs:
test:
name: Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: ${{ env.GO_VERSION }}
- name: Lint
uses: golangci/golangci-lint-action@v2
with:
version: v1.41
args: --deadline=30m
- name: Run unit tests
run: make test
integration:
name: Integration Test
runs-on: ubuntu-latest
steps:
- name: Set up Go
uses: actions/setup-go@v1
uses: actions/setup-go@v2
with:
go-version: 1.14.x
go-version: ${{ env.GO_VERSION }}
id: go
- name: Check out code into the Go module directory
@@ -20,17 +51,53 @@ jobs:
build-test:
name: Build Test
runs-on: ubuntu-latest
env:
DOCKER_CLI_EXPERIMENTAL: "enabled"
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Show available Docker Buildx platforms
run: echo ${{ steps.buildx.outputs.platforms }}
- name: Checkout
uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v1
uses: actions/setup-go@v2
with:
go-version: 1.14.x
go-version: ${{ env.GO_VERSION }}
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v1
uses: goreleaser/goreleaser-action@v2
with:
version: latest
version: v0.164.0
args: release --snapshot --rm-dist --skip-publish
build-documents:
name: Documentation Test
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
persist-credentials: true
- uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
pip install mkdocs-material
pip install mike
pip install mkdocs-macros-plugin
- name: Configure the git user
run: |
git config user.name "knqyf263"
git config user.email "knqyf263@gmail.com"
- name: Deploy the dev documents
run: mike deploy test

9
.gitignore vendored
View File

@@ -4,6 +4,10 @@
*.dll
*.so
*.dylib
trivy
## chart release
.cr-release-packages
# Test binary, build with `go test -c`
*.test
@@ -19,4 +23,7 @@ thumbs.db
# test fixtures
coverage.txt
integration/testdata/fixtures/
integration/testdata/fixtures/images
# SBOMs generated during CI
/bom.json

71
.golangci.yaml Normal file
View File

@@ -0,0 +1,71 @@
linters-settings:
errcheck:
check-type-assertions: true
check-blank: true
govet:
check-shadowing: false
gofmt:
simplify: false
revive:
ignore-generated-header: true
gocyclo:
min-complexity: 10
dupl:
threshold: 100
goconst:
min-len: 3
min-occurrences: 3
misspell:
locale: US
goimports:
local-prefixes: github.com/aquasecurity
linters:
disable-all: true
enable:
- structcheck
- ineffassign
- typecheck
- govet
- errcheck
- varcheck
- deadcode
- revive
- gosec
- unconvert
- goconst
- gocyclo
- gofmt
- goimports
- misspell
run:
skip-files:
- ".*._mock.go$"
- ".*._test.go$"
- "integration/*"
issues:
exclude-rules:
- linters:
- gosec
text: "G304: Potential file inclusion"
- linters:
- gosec
text: "Deferring unsafe method"
- linters:
- gosec
text: "G204: Subprocess launched with variable"
- linters:
- errcheck
text: "Close` is not checked"
- linters:
- errcheck
text: "os.*` is not checked"
- linters:
- golint
text: "a blank import should be only in a main or test package"
exclude:
- "should have a package comment, unless it's in another file for this package"
exclude-use-default: false
max-same-issues: 0

View File

@@ -1,9 +1,9 @@
Thank you for taking interest in contributing to Trivy !
Thank you for taking interest in contributing to Trivy!
## Issues
- Feel free to open issues for any reason. When you open a new issue, you'll have to select an issue kind: bug/feature/support and fill the required information based on the selected template.
- Please spend a small amount of time giving due diligence to the issue tracker. Your issue might be a duplicate. If it is, please add your comment to the existing issue.
- Remember users might be searching for your issue in the future, so please give it a meaningful title to help others.
- Remember that users might search for your issue in the future, so please give it a meaningful title to help others.
- The issue should clearly explain the reason for opening, the proposal if you have any, and any relevant technical information.
## Pull Requests
@@ -23,6 +23,6 @@ Thank you for taking interest in contributing to Trivy !
Trivy is composed of several different repositories that work together:
- [Trivy](https://github.com/aquasecurity/trivy) is the client-side, user-facing, command line tool.
- [vuln-list](https://github.com/aquasecurity/vuln-list) is a vulnerabilities database, aggregated from different sources, and normalized for easy consumption. This of this as the "server" side of the trivy command line tool. **There should be no pull requests to this repo**
- [vuln-list](https://github.com/aquasecurity/vuln-list) is a vulnerabilities database, aggregated from different sources, and normalized for easy consumption. Think of this as the "server" side of the trivy command line tool. **There should be no pull requests to this repo**
- [vuln-list-update](https://github.com/aquasecurity/vuln-list-update) is the code that maintains the vuln-list database.
- [fanal](https://github.com/aquasecurity/fanal) is a library for extracting system information containers. It is being used by Trivy to find testable subjects in the container image.
- [fanal](https://github.com/aquasecurity/fanal) is a library for extracting system information from containers. It is being used by Trivy to find testable subjects in the container image.

View File

@@ -1,9 +1,5 @@
FROM alpine:3.12
RUN addgroup -g 1000 -S appgroup && adduser -u 1000 -S appuser -G appgroup
RUN apk --no-cache add ca-certificates git rpm
FROM alpine:3.14
RUN apk --no-cache add ca-certificates git
COPY trivy /usr/local/bin/trivy
COPY contrib/gitlab.tpl contrib/gitlab.tpl
COPY contrib/junit.tpl contrib/junit.tpl
COPY contrib/sarif.tpl contrib/sarif.tpl
USER appuser
COPY contrib/*.tpl contrib/
ENTRYPOINT ["trivy"]

View File

@@ -5,6 +5,9 @@ GOPATH=$(shell go env GOPATH)
GOBIN=$(GOPATH)/bin
GOSRC=$(GOPATH)/src
MKDOCS_IMAGE := aquasec/mkdocs-material:dev
MKDOCS_PORT := 8000
u := $(if $(update),-u)
$(GOBIN)/wire:
@@ -12,7 +15,7 @@ $(GOBIN)/wire:
.PHONY: wire
wire: $(GOBIN)/wire
wire gen ./pkg/... ./internal/...
wire gen ./pkg/...
.PHONY: mock
mock: $(GOBIN)/mockery
@@ -24,22 +27,22 @@ deps:
go mod tidy
$(GOBIN)/golangci-lint:
curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(GOBIN) v1.21.0
curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(GOBIN) v1.41.1
.PHONY: test
test:
go test -v -short -coverprofile=coverage.txt -covermode=atomic ./...
integration/testdata/fixtures/*.tar.gz:
git clone https://github.com/aquasecurity/trivy-test-images.git integration/testdata/fixtures
integration/testdata/fixtures/images/*.tar.gz:
git clone https://github.com/aquasecurity/trivy-test-images.git integration/testdata/fixtures/images
.PHONY: test-integration
test-integration: integration/testdata/fixtures/*.tar.gz
test-integration: integration/testdata/fixtures/images/*.tar.gz
go test -v -tags=integration ./integration/...
.PHONY: lint
lint: $(GOBIN)/golangci-lint
$(GOBIN)/golangci-lint run
$(GOBIN)/golangci-lint run --timeout 5m
.PHONY: fmt
fmt:
@@ -51,7 +54,7 @@ build:
.PHONY: protoc
protoc:
find ./rpc/ -name "*.proto" -type f -exec protoc --proto_path=$(GOSRC):. --twirp_out=. --go_out=. {} \;
find ./rpc/ -name "*.proto" -type f -exec protoc --proto_path=$(GOSRC):. --twirp_out=. --twirp_opt=paths=source_relative --go_out=. --go_opt=paths=source_relative {} \;
.PHONY: install
install:
@@ -59,11 +62,17 @@ install:
.PHONY: clean
clean:
rm -rf integration/testdata/fixtures/
rm -rf integration/testdata/fixtures/images
$(GOBIN)/labeler:
GO111MODULE=off go get github.com/knqyf263/labeler
go install github.com/knqyf263/labeler@latest
.PHONY: label
label: $(GOBIN)/labeler
labeler apply misc/triage/labels.yaml -r aquasecurity/trivy -l 5
.PHONY: mkdocs-serve
## Runs MkDocs development server to preview the documentation page
mkdocs-serve:
docker build -t $(MKDOCS_IMAGE) -f docs/build/Dockerfile docs/build
docker run --name mkdocs-serve --rm -v $(PWD):/docs -p $(MKDOCS_PORT):8000 $(MKDOCS_IMAGE)

2042
README.md

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +0,0 @@
FROM circleci/golang:1.13-buster
RUN sudo apt-get -y update \
&& sudo apt-get -y install rpm reprepro createrepo distro-info
ARG GORELEASER_VERSION=0.124.1
ARG GORELEASER_ARTIFACT=goreleaser_Linux_x86_64.tar.gz
RUN wget https://github.com/goreleaser/goreleaser/releases/download/v${GORELEASER_VERSION}/${GORELEASER_ARTIFACT} \
&& sudo tar -xzf ${GORELEASER_ARTIFACT} -C /usr/bin/ goreleaser \
&& rm ${GORELEASER_ARTIFACT}

View File

@@ -1,11 +1,11 @@
#!/bin/bash
DEBIAN_RELEASES=$(debian-distro-info --supported)
UBUNTU_RELEASES=$(ubuntu-distro-info --supported)
UBUNTU_RELEASES=$(ubuntu-distro-info --supported-esm)
cd trivy-repo/deb
for release in $(reprepro ls trivy | awk -F "|" '{print $3}' | sed 's/ //g'); do
for release in ${DEBIAN_RELEASES[@]} ${UBUNTU_RELEASES[@]}; do
echo "Removing deb package of $release"
reprepro -A i386 remove $release trivy
reprepro -A amd64 remove $release trivy
@@ -19,4 +19,4 @@ done
git add .
git commit -m "Update deb packages"
git push origin master
git push origin main

View File

@@ -23,5 +23,5 @@ done
git add .
git commit -m "Update rpm packages"
git push origin master
git push origin main

View File

@@ -1,11 +1,9 @@
package main
import (
l "log"
"os"
"github.com/aquasecurity/trivy/internal"
"github.com/aquasecurity/trivy/pkg/commands"
"github.com/aquasecurity/trivy/pkg/log"
)
@@ -14,12 +12,9 @@ var (
)
func main() {
app := internal.NewApp(version)
app := commands.NewApp(version)
err := app.Run(os.Args)
if err != nil {
if log.Logger != nil {
log.Fatal(err)
}
l.Fatal(err)
log.Fatal(err)
}
}

View File

@@ -10,10 +10,10 @@ Trivy_container_scanning:
IMAGE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
allow_failure: true
before_script:
- export TRIVY_VERSION=${TRIVY_VERSION:-v0.4.3}
- export TRIVY_VERSION=${TRIVY_VERSION:-v0.19.2}
- apk add --no-cache curl docker-cli
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
- curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b /usr/local/bin ${TRIVY_VERSION}
- curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin ${TRIVY_VERSION}
- curl -sSL -o /tmp/trivy-gitlab.tpl https://github.com/aquasecurity/trivy/raw/${TRIVY_VERSION}/contrib/gitlab.tpl
script:
- trivy --exit-code 0 --cache-dir .trivycache/ --no-progress --format template --template "@/tmp/trivy-gitlab.tpl" -o gl-container-scanning-report.json $IMAGE

66
contrib/asff.tpl Normal file
View File

@@ -0,0 +1,66 @@
[
{{- $t_first := true -}}
{{- range . -}}
{{- $target := .Target -}}
{{- range .Vulnerabilities -}}
{{- if $t_first -}}
{{- $t_first = false -}}
{{- else -}}
,
{{- end -}}
{{- $severity := .Severity -}}
{{- if eq $severity "UNKNOWN" -}}
{{- $severity = "INFORMATIONAL" -}}
{{- end -}}
{{- $description := .Description -}}
{{- if gt (len $description ) 1021 -}}
{{- $description = (substr 0 1021 $description) | printf "%v .." -}}
{{- end}}
{
"SchemaVersion": "2018-10-08",
"Id": "{{ $target }}/{{ .VulnerabilityID }}",
"ProductArn": "arn:aws:securityhub:{{ getEnv "AWS_REGION" }}::product/aquasecurity/aquasecurity",
"GeneratorId": "Trivy",
"AwsAccountId": "{{ getEnv "AWS_ACCOUNT_ID" }}",
"Types": [ "Software and Configuration Checks/Vulnerabilities/CVE" ],
"CreatedAt": "{{ getCurrentTime }}",
"UpdatedAt": "{{ getCurrentTime }}",
"Severity": {
"Label": "{{ $severity }}"
},
"Title": "Trivy found a vulnerability to {{ .VulnerabilityID }} in container {{ $target }}",
"Description": {{ escapeString $description | printf "%q" }},
"Remediation": {
"Recommendation": {
"Text": "More information on this vulnerability is provided in the hyperlink",
"Url": "{{ .PrimaryURL }}"
}
},
"ProductFields": { "Product Name": "Trivy" },
"Resources": [
{
"Type": "Container",
"Id": "{{ $target }}",
"Partition": "aws",
"Region": "{{ getEnv "AWS_REGION" }}",
"Details": {
"Container": { "ImageName": "{{ $target }}" },
"Other": {
"CVE ID": "{{ .VulnerabilityID }}",
"CVE Title": {{ .Title | printf "%q" }},
"PkgName": "{{ .PkgName }}",
"Installed Package": "{{ .InstalledVersion }}",
"Patched Package": "{{ .FixedVersion }}",
"NvdCvssScoreV3": "{{ (index .CVSS "nvd").V3Score }}",
"NvdCvssVectorV3": "{{ (index .CVSS "nvd").V3Vector }}",
"NvdCvssScoreV2": "{{ (index .CVSS "nvd").V2Score }}",
"NvdCvssVectorV2": "{{ (index .CVSS "nvd").V2Vector }}"
}
}
}
],
"RecordState": "ACTIVE"
}
{{- end -}}
{{- end }}
]

View File

@@ -0,0 +1,38 @@
{{- /* Template based on https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types */ -}}
[
{{- $t_first := true }}
{{- range . }}
{{- $target := .Target }}
{{- range .Vulnerabilities -}}
{{- if $t_first -}}
{{- $t_first = false -}}
{{ else -}}
,
{{- end }}
{
"type": "issue",
"check_name": "container_scanning",
"categories": [ "Security" ],
"description": "{{ .VulnerabilityID }}: {{ .Title }}",
"content": {{ .Description | printf "%q" }},
"severity": {{ if eq .Severity "LOW" -}}
"info"
{{- else if eq .Severity "MEDIUM" -}}
"minor"
{{- else if eq .Severity "HIGH" -}}
"major"
{{- else if eq .Severity "CRITICAL" -}}
"critical"
{{- else -}}
"info"
{{- end }},
"location": {
"path": "{{ .PkgName }}-{{ .InstalledVersion }}",
"lines": {
"begin": 1
}
}
}
{{- end -}}
{{- end }}
]

View File

@@ -59,7 +59,7 @@
"type": "cve",
"name": "{{ .VulnerabilityID }}",
"value": "{{ .VulnerabilityID }}",
"url": ""
"url": "{{ .PrimaryURL }}"
}
],
"links": [

123
contrib/html.tpl Normal file
View File

@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
{{- if . }}
<style>
* {
font-family: Arial, Helvetica, sans-serif;
}
h1 {
text-align: center;
}
.group-header th {
font-size: 200%;
}
.sub-header th {
font-size: 150%;
}
table, th, td {
border: 1px solid black;
border-collapse: collapse;
white-space: nowrap;
padding: .3em;
}
table {
margin: 0 auto;
}
.severity {
text-align: center;
font-weight: bold;
color: #fafafa;
}
.severity-LOW .severity { background-color: #5fbb31; }
.severity-MEDIUM .severity { background-color: #e9c600; }
.severity-HIGH .severity { background-color: #ff8800; }
.severity-CRITICAL .severity { background-color: #e40000; }
.severity-UNKNOWN .severity { background-color: #747474; }
.severity-LOW { background-color: #5fbb3160; }
.severity-MEDIUM { background-color: #e9c60060; }
.severity-HIGH { background-color: #ff880060; }
.severity-CRITICAL { background-color: #e4000060; }
.severity-UNKNOWN { background-color: #74747460; }
table tr td:first-of-type {
font-weight: bold;
}
.links a,
.links[data-more-links=on] a {
display: block;
}
.links[data-more-links=off] a:nth-of-type(1n+5) {
display: none;
}
a.toggle-more-links { cursor: pointer; }
</style>
<title>{{- escapeXML ( index . 0 ).Target }} - Trivy Report - {{ getCurrentTime }}</title>
<script>
window.onload = function() {
document.querySelectorAll('td.links').forEach(function(linkCell) {
var links = [].concat.apply([], linkCell.querySelectorAll('a'));
[].sort.apply(links, function(a, b) {
return a.href > b.href ? 1 : -1;
});
links.forEach(function(link, idx) {
if (links.length > 3 && 3 === idx) {
var toggleLink = document.createElement('a');
toggleLink.innerText = "Toggle more links";
toggleLink.href = "#toggleMore";
toggleLink.setAttribute("class", "toggle-more-links");
linkCell.appendChild(toggleLink);
}
linkCell.appendChild(link);
});
});
document.querySelectorAll('a.toggle-more-links').forEach(function(toggleLink) {
toggleLink.onclick = function() {
var expanded = toggleLink.parentElement.getAttribute("data-more-links");
toggleLink.parentElement.setAttribute("data-more-links", "on" === expanded ? "off" : "on");
return false;
};
});
};
</script>
</head>
<body>
<h1>{{- escapeXML ( index . 0 ).Target }} - Trivy Report - {{ getCurrentTime }}</h1>
<table>
{{- range . }}
<tr class="group-header"><th colspan="6">{{ escapeXML .Type }}</th></tr>
{{- if (eq (len .Vulnerabilities) 0) }}
<tr><th colspan="6">No Vulnerabilities found</th></tr>
{{- else }}
<tr class="sub-header">
<th>Package</th>
<th>Vulnerability ID</th>
<th>Severity</th>
<th>Installed Version</th>
<th>Fixed Version</th>
<th>Links</th>
</tr>
{{- range .Vulnerabilities }}
<tr class="severity-{{ escapeXML .Vulnerability.Severity }}">
<td class="pkg-name">{{ escapeXML .PkgName }}</td>
<td>{{ escapeXML .VulnerabilityID }}</td>
<td class="severity">{{ escapeXML .Vulnerability.Severity }}</td>
<td class="pkg-version">{{ escapeXML .InstalledVersion }}</td>
<td>{{ escapeXML .FixedVersion }}</td>
<td class="links" data-more-links="off">
{{- range .Vulnerability.References }}
<a href={{ escapeXML . | printf "%q" }}>{{ escapeXML . }}</a>
{{- end }}
</td>
</tr>
{{- end }}
{{- end }}
{{- end }}
</table>
{{- else }}
</head>
<body>
<h1>Trivy Returned Empty Report</h1>
{{- end }}
</body>
</html>

View File

@@ -72,6 +72,7 @@ get_binaries() {
freebsd/armv7) BINARIES="trivy" ;;
linux/386) BINARIES="trivy" ;;
linux/amd64) BINARIES="trivy" ;;
linux/ppc64le) BINARIES="trivy" ;;
linux/arm64) BINARIES="trivy" ;;
linux/armv7) BINARIES="trivy" ;;
openbsd/386) BINARIES="trivy" ;;
@@ -110,6 +111,7 @@ adjust_os() {
amd64) OS=64bit ;;
arm) OS=ARM ;;
arm64) OS=ARM64 ;;
ppc64le) OS=PPC64LE ;;
darwin) OS=macOS ;;
dragonfly) OS=DragonFlyBSD ;;
freebsd) OS=FreeBSD ;;
@@ -126,6 +128,7 @@ adjust_arch() {
amd64) ARCH=64bit ;;
arm) ARCH=ARM ;;
arm64) ARCH=ARM64 ;;
ppc64le) OS=PPC64LE ;;
darwin) ARCH=macOS ;;
dragonfly) ARCH=DragonFlyBSD ;;
freebsd) ARCH=FreeBSD ;;
@@ -209,6 +212,7 @@ uname_arch() {
x86) arch="386" ;;
i686) arch="386" ;;
i386) arch="386" ;;
ppc64le) arch="ppc64le" ;;
aarch64) arch="arm64" ;;
armv5*) arch="armv5" ;;
armv6*) arch="armv6" ;;

View File

@@ -2,7 +2,7 @@
<testsuites>
{{- range . -}}
{{- $failures := len .Vulnerabilities }}
<testsuite tests="1" failures="{{ $failures }}" time="" name="{{ .Target }}">
<testsuite tests="{{ $failures }}" failures="{{ $failures }}" name="{{ .Target }}" errors="0" skipped="0" time="">
{{- if not (eq .Type "") }}
<properties>
<property name="type" value="{{ .Type }}"></property>
@@ -10,7 +10,7 @@
{{- end -}}
{{ range .Vulnerabilities }}
<testcase classname="{{ .PkgName }}-{{ .InstalledVersion }}" name="[{{ .Vulnerability.Severity }}] {{ .VulnerabilityID }}" time="">
<failure message={{escapeXML .Title | printf "%q" }} type="description">{{escapeXML .Description | printf "%q" }}</failure>
<failure message="{{ escapeXML .Title }}" type="description">{{ escapeXML .Description }}</failure>
</testcase>
{{- end }}
</testsuite>

View File

@@ -1,15 +1,18 @@
{
"$schema": "https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0-rtm.4.json",
"$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
"version": "2.1.0",
"runs": [
{
"tool": {
"driver": {
"name": "Trivy",
"informationUri": "https://github.com/aquasecurity/trivy",
"fullName": "Trivy Vulnerability Scanner",
"version": "0.15.0",
"rules": [
{{- $t_first := true }}
{{- range . }}
{{- range $result := . }}
{{- $vulnerabilityType := .Type }}
{{- range .Vulnerabilities -}}
{{- if $t_first -}}
{{- $t_first = false -}}
@@ -17,23 +20,32 @@
,
{{- end }}
{
"id": "[{{ .Vulnerability.Severity }}] {{ .VulnerabilityID }}",
"name": "dockerfile_scan",
"id": {{ printf "%s: %s-%s %s" $result.Target .PkgName .InstalledVersion .VulnerabilityID | toJson }},
"name": "{{ toSarifRuleName $vulnerabilityType }}",
"shortDescription": {
"text": "{{ .VulnerabilityID }} Package: {{ .PkgName }}"
"text": {{ printf "%v Package: %v" .VulnerabilityID .PkgName | printf "%q" }}
},
"fullDescription": {
"text": "{{ endWithPeriod .Title }}"
"text": {{ endWithPeriod (escapeString .Title) | printf "%q" }}
},
"defaultConfiguration": {
"level": "{{ toSarifErrorLevel .Vulnerability.Severity }}"
}
{{- with $help_uri := .PrimaryURL -}}
,
{{ $help_uri | printf "\"helpUri\": %q," -}}
{{- else -}}
,
{{- end }}
"help": {
"text": "Vulnerability {{ .VulnerabilityID }}\nSeverity: {{ .Vulnerability.Severity }}\nPackage: {{ .PkgName }}\nInstalled Version: {{ .InstalledVersion }}\nFixed Version: {{ .FixedVersion }}\nLink: [{{ .VulnerabilityID }}](https://nvd.nist.gov/vuln/detail/{{ .VulnerabilityID | toLower }})",
"markdown": "**Vulnerability {{ .VulnerabilityID }}**\n| Severity | Package | Installed Version | Fixed Version | Link |\n| --- | --- | --- | --- | --- |\n|{{ .Vulnerability.Severity }}|{{ .PkgName }}|{{ .InstalledVersion }}|{{ .FixedVersion }}|[{{ .VulnerabilityID }}](https://nvd.nist.gov/vuln/detail/{{ .VulnerabilityID | toLower }})|\n"
"text": {{ printf "Vulnerability %v\nSeverity: %v\nPackage: %v\nInstalled Version: %v\nFixed Version: %v\nLink: [%v](%v)" .VulnerabilityID .Vulnerability.Severity .PkgName .InstalledVersion .FixedVersion .VulnerabilityID .PrimaryURL | printf "%q"}},
"markdown": {{ printf "**Vulnerability %v**\n| Severity | Package | Installed Version | Fixed Version | Link |\n| --- | --- | --- | --- | --- |\n|%v|%v|%v|%v|[%v](%v)|\n" .VulnerabilityID .Vulnerability.Severity .PkgName .InstalledVersion .FixedVersion .VulnerabilityID .PrimaryURL | printf "%q"}}
},
"properties": {
"tags": [
"vulnerability",
"{{ .Vulnerability.Severity }}",
"{{ .PkgName }}"
{{ .PkgName | printf "%q" }}
],
"precision": "very-high"
}
@@ -45,7 +57,8 @@
},
"results": [
{{- $t_first := true }}
{{- range . }}
{{- range $result := . }}
{{- $filePath := .Target }}
{{- range $index, $vulnerability := .Vulnerabilities -}}
{{- if $t_first -}}
{{- $t_first = false -}}
@@ -53,21 +66,17 @@
,
{{- end }}
{
"ruleId": "[{{ $vulnerability.Vulnerability.Severity }}] {{ $vulnerability.VulnerabilityID }}",
"ruleId": {{ printf "%s: %s-%s %s" $result.Target .PkgName .InstalledVersion .VulnerabilityID | toJson }},
"ruleIndex": {{ $index }},
"level": "error",
"level": "{{ toSarifErrorLevel $vulnerability.Vulnerability.Severity }}",
"message": {
"text": {{ endWithPeriod $vulnerability.Description | printf "%q" }}
"text": {{ endWithPeriod (escapeString $vulnerability.Description) | printf "%q" }}
},
"locations": [{
"physicalLocation": {
"artifactLocation": {
"uri": "Dockerfile"
},
"region": {
"startLine": 1,
"startColumn": 1,
"endColumn": 1
"uri": "{{ toPathUri $filePath }}",
"uriBaseId": "ROOTPATH"
}
}
}]
@@ -75,7 +84,12 @@
{{- end -}}
{{- end -}}
],
"columnKind": "utf16CodeUnits"
"columnKind": "utf16CodeUnits",
"originalUriBaseIds": {
"ROOTPATH": {
"uri": "/"
}
}
}
]
}

View File

@@ -1,16 +1,16 @@
# Air-gapped environment
# Air-Gapped Environment
Trivy can be used in air-gapped environments.
## Download the vulnerability database
At first, you need to download the vulnerability database for use in air-gapped environments.
Go to [trivy-db](https://github.com/aquasecurity/trivy-db/releases) and download `trivy-offline.db.tgz` in the latest release.
Go to [trivy-db][trivy-db] and download `trivy-offline.db.tgz` in the latest release.
If you download `trivy-light-offline.db.tgz`, you have to run Trivy with `--light` option.
```
$ wget https://github.com/aquasecurity/trivy-db/releases/latest/download/trivy-offline.db.tgz
```
## Transfer the DB file into the air-gapped environment
The way of transfer depends on the environment.
@@ -53,3 +53,5 @@ In an air-gapped environment, specify `--skip-update` so that Trivy doesn't atte
```
$ trivy image --skip-update alpine:3.12
```
[trivy-db]: https://github.com/aquasecurity/trivy-db/releases

View File

@@ -0,0 +1,28 @@
# Embed in Dockerfile
Scan your image as part of the build process by embedding Trivy in the
Dockerfile. This approach can be used to update Dockerfiles currently using
Aquas [Microscanner][microscanner].
```bash
$ cat Dockerfile
FROM alpine:3.7
RUN apk add curl \
&& curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin \
&& trivy rootfs --exit-code 1 --no-progress /
$ docker build -t vulnerable-image .
```
Alternatively you can use Trivy in a multistage build. Thus avoiding the
insecure `curl | sh`. Also the image is not changed.
```bash
[...]
# Run vulnerability scan on build image
FROM build AS vulnscan
COPY --from=aquasec/trivy:latest /usr/local/bin/trivy /usr/local/bin/trivy
RUN trivy rootfs --exit-code 1 --no-progress /
[...]
```
[microscanner]: https://github.com/aquasecurity/microscanner

View File

@@ -0,0 +1,17 @@
# OCI Image Layout
An image directory compliant with [Open Container Image Layout Specification](https://github.com/opencontainers/image-spec/blob/master/spec.md).
Buildah:
```
$ buildah push docker.io/library/alpine:3.11 oci:/path/to/alpine
$ trivy image --input /path/to/alpine
```
Skopeo:
```
$ skopeo copy docker-daemon:alpine:3.11 oci:/path/to/alpine
$ trivy image --input /path/to/alpine
```

View File

@@ -0,0 +1,28 @@
# Podman
!!! warning "EXPERIMENTAL"
This feature might change without preserving backwards compatibility.
Scan your image in Podman (>=2.0) running locally. The remote Podman is not supported.
Before performing Trivy commands, you must enable the podman.sock systemd service on your machine.
For more details, see [here][sock].
```bash
$ systemctl --user enable --now podman.socket
```
Then, you can scan your image in Podman.
```bash
$ cat Dockerfile
FROM alpine:3.12
RUN apk add --no-cache bash
$ podman build -t test .
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/test latest efc372d4e0de About a minute ago 7.94 MB
$ trivy image test
```
[sock]: https://github.com/containers/podman/blob/master/docs/tutorials/remote_client.md#enable-the-podman-service-on-the-server-machine

View File

@@ -0,0 +1,116 @@
# Unpacked Filesystem
Scan aan unpacked container image filesystem.
In this case, Trivy works the same way when scanning containers
```bash
$ docker export $(docker create alpine:3.10.2) | tar -C /tmp/rootfs -xvf -
$ trivy rootfs /tmp/rootfs
```
<details>
<summary>Result</summary>
```bash
2021-03-08T05:22:26.378Z INFO Need to update DB
2021-03-08T05:22:26.380Z INFO Downloading DB...
20.37 MiB / 20.37 MiB [-------------------------------------------------------------------------------------------------------------------------------------] 100.00% 8.24 MiB p/s 2s
2021-03-08T05:22:30.134Z INFO Detecting Alpine vulnerabilities...
/tmp/rootfs (alpine 3.10.2)
===========================
Total: 20 (UNKNOWN: 0, LOW: 2, MEDIUM: 10, HIGH: 8, CRITICAL: 0)
+--------------+------------------+----------+-------------------+---------------+---------------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+--------------+------------------+----------+-------------------+---------------+---------------------------------------+
| libcrypto1.1 | CVE-2020-1967 | HIGH | 1.1.1c-r0 | 1.1.1g-r0 | openssl: Segmentation |
| | | | | | fault in SSL_check_chain |
| | | | | | causes denial of service |
| | | | | | -->avd.aquasec.com/nvd/cve-2020-1967 |
+ +------------------+ + +---------------+---------------------------------------+
| | CVE-2021-23839 | | | 1.1.1j-r0 | openssl: incorrect SSLv2 |
| | | | | | rollback protection |
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23839 |
+ +------------------+ + + +---------------------------------------+
| | CVE-2021-23840 | | | | openssl: integer |
| | | | | | overflow in CipherUpdate |
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23840 |
+ +------------------+ + + +---------------------------------------+
| | CVE-2021-23841 | | | | openssl: NULL pointer dereference |
| | | | | | in X509_issuer_and_serial_hash() |
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23841 |
+ +------------------+----------+ +---------------+---------------------------------------+
| | CVE-2019-1547 | MEDIUM | | 1.1.1d-r0 | openssl: side-channel weak |
| | | | | | encryption vulnerability |
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1547 |
+ +------------------+ + + +---------------------------------------+
| | CVE-2019-1549 | | | | openssl: information |
| | | | | | disclosure in fork() |
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1549 |
+ +------------------+ + +---------------+---------------------------------------+
| | CVE-2019-1551 | | | 1.1.1d-r2 | openssl: Integer overflow in RSAZ |
| | | | | | modular exponentiation on x86_64 |
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1551 |
+ +------------------+ + +---------------+---------------------------------------+
| | CVE-2020-1971 | | | 1.1.1i-r0 | openssl: EDIPARTYNAME |
| | | | | | NULL pointer de-reference |
| | | | | | -->avd.aquasec.com/nvd/cve-2020-1971 |
+ +------------------+----------+ +---------------+---------------------------------------+
| | CVE-2019-1563 | LOW | | 1.1.1d-r0 | openssl: information |
| | | | | | disclosure in PKCS7_dataDecode |
| | | | | | and CMS_decrypt_set1_pkey |
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1563 |
+--------------+------------------+----------+ +---------------+---------------------------------------+
| libssl1.1 | CVE-2020-1967 | HIGH | | 1.1.1g-r0 | openssl: Segmentation |
| | | | | | fault in SSL_check_chain |
| | | | | | causes denial of service |
| | | | | | -->avd.aquasec.com/nvd/cve-2020-1967 |
+ +------------------+ + +---------------+---------------------------------------+
| | CVE-2021-23839 | | | 1.1.1j-r0 | openssl: incorrect SSLv2 |
| | | | | | rollback protection |
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23839 |
+ +------------------+ + + +---------------------------------------+
| | CVE-2021-23840 | | | | openssl: integer |
| | | | | | overflow in CipherUpdate |
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23840 |
+ +------------------+ + + +---------------------------------------+
| | CVE-2021-23841 | | | | openssl: NULL pointer dereference |
| | | | | | in X509_issuer_and_serial_hash() |
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23841 |
+ +------------------+----------+ +---------------+---------------------------------------+
| | CVE-2019-1547 | MEDIUM | | 1.1.1d-r0 | openssl: side-channel weak |
| | | | | | encryption vulnerability |
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1547 |
+ +------------------+ + + +---------------------------------------+
| | CVE-2019-1549 | | | | openssl: information |
| | | | | | disclosure in fork() |
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1549 |
+ +------------------+ + +---------------+---------------------------------------+
| | CVE-2019-1551 | | | 1.1.1d-r2 | openssl: Integer overflow in RSAZ |
| | | | | | modular exponentiation on x86_64 |
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1551 |
+ +------------------+ + +---------------+---------------------------------------+
| | CVE-2020-1971 | | | 1.1.1i-r0 | openssl: EDIPARTYNAME |
| | | | | | NULL pointer de-reference |
| | | | | | -->avd.aquasec.com/nvd/cve-2020-1971 |
+ +------------------+----------+ +---------------+---------------------------------------+
| | CVE-2019-1563 | LOW | | 1.1.1d-r0 | openssl: information |
| | | | | | disclosure in PKCS7_dataDecode |
| | | | | | and CMS_decrypt_set1_pkey |
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1563 |
+--------------+------------------+----------+-------------------+---------------+---------------------------------------+
| musl | CVE-2020-28928 | MEDIUM | 1.1.22-r3 | 1.1.22-r4 | In musl libc through 1.2.1, |
| | | | | | wcsnrtombs mishandles particular |
| | | | | | combinations of destination buffer... |
| | | | | | -->avd.aquasec.com/nvd/cve-2020-28928 |
+--------------+ + + + + +
| musl-utils | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+--------------+------------------+----------+-------------------+---------------+---------------------------------------+
```
</details>

View File

@@ -185,11 +185,11 @@ We use two labels [help wanted](https://github.com/aquasecurity/trivy/issues?q=i
and [good first issue](https://github.com/aquasecurity/trivy/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)
to identify issues that have been specially groomed for new contributors.
We have specific [guidelines](/docs/help-wanted.md)
We have specific [guidelines](/docs/advanced/contribd/contrib/help-wanted.md)
for how to use these labels. If you see an issue that satisfies these
guidelines, you can add the `help wanted` label and the `good first issue` label.
Please note that adding the `good first issue` label must also
add the `help wanted` label.
If an issue has these labels but does not satisfy the guidelines, please
ask for more details to be added to the issue or remove the labels.
ask for more details to be added to the issue or remove the labels.

2
docs/advanced/index.md Normal file
View File

@@ -0,0 +1,2 @@
# Advanced
This section describes advanced features, integrations, etc.

View File

@@ -0,0 +1,4 @@
# AWS CodePipeline
See [this blog post][blog] for an example of using Trivy within AWS CodePipeline.
[blog]: https://aws.amazon.com/blogs/containers/scanning-images-with-trivy-in-an-aws-codepipeline/

View File

@@ -0,0 +1,29 @@
# AWS Security Hub
## Upload findings to Security Hub
In the following example using the template `asff.tpl`, [ASFF](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format.html) file can be generated.
```
$ AWS_REGION=us-west-1 AWS_ACCOUNT_ID=123456789012 trivy image --format template --template "@contrib/asff.tpl" -o report.asff golang:1.12-alpine
```
ASFF template needs AWS_REGION and AWS_ACCOUNT_ID from environment variables.
Then, you can upload it with AWS CLI.
```
$ aws securityhub batch-import-findings --findings file://report.asff
```
## Customize
You can customize [asff.tpl](https://github.com/aquasecurity/trivy/blob/main/contrib/asff.tpl)
```
$ export AWS_REGION=us-west-1
$ export AWS_ACCOUNT_ID=123456789012
$ trivy image --format template --template "@your-asff.tpl" -o report.asff golang:1.12-alpine
```
## Reference
https://aws.amazon.com/blogs/security/how-to-build-ci-cd-pipeline-container-vulnerability-scanning-trivy-and-aws-security-hub/

View File

@@ -0,0 +1,34 @@
# CircleCI
```
$ cat .circleci/config.yml
jobs:
build:
docker:
- image: docker:stable-git
steps:
- checkout
- setup_remote_docker
- run:
name: Build image
command: docker build -t trivy-ci-test:${CIRCLE_SHA1} .
- run:
name: Install trivy
command: |
apk add --update-cache --upgrade curl
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
- run:
name: Scan the local image with trivy
command: trivy --exit-code 0 --no-progress trivy-ci-test:${CIRCLE_SHA1}
workflows:
version: 2
release:
jobs:
- build
```
[Example][example]
[Repository][repository]
[example]: https://circleci.com/gh/aquasecurity/trivy-ci-test
[repository]: https://github.com/aquasecurity/trivy-ci-test

View File

@@ -0,0 +1,9 @@
# GitHub Actions
- Here is the [Trivy Github Action][action]
- The Microsoft Azure team have written a [container-scan action][azure] that uses Trivy and Dockle
- For full control over the options specified to Trivy, this [blog post][blog] describes adding Trivy into your own GitHub action workflows
[action]: https://github.com/aquasecurity/trivy-action
[azure]: https://github.com/Azure/container-scan
[blog]: https://blog.aquasec.com/devsecops-with-trivy-github-actions

View File

@@ -0,0 +1,157 @@
# GitLab CI
If you're a GitLab Ultimate customer, GitLab 14.0 and above include out-of-the-box integration with Trivy. To enable it for your project, simply add the container scanning template to your `.gitlab-ci.yml` file. For more details, please refer to [GitLab's documentation](https://docs.gitlab.com/ee/user/application_security/container_scanning/).
If you're using an earlier version of GitLab, you can still use the new integration by copying the [contents of the 14.0 template](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml) to your configuration.
Alternatively, you can always use the example configurations below.
```yaml
stages:
- test
trivy:
stage: test
image: docker:stable
services:
- name: docker:dind
entrypoint: ["env", "-u", "DOCKER_HOST"]
command: ["dockerd-entrypoint.sh"]
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
# See https://github.com/docker-library/docker/pull/166
DOCKER_TLS_CERTDIR: ""
IMAGE: trivy-ci-test:$CI_COMMIT_SHA
before_script:
- export TRIVY_VERSION=$(wget -qO - "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
- echo $TRIVY_VERSION
- wget --no-verbose https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz -O - | tar -zxvf -
allow_failure: true
script:
# Build image
- docker build -t $IMAGE .
# Build report
- ./trivy --exit-code 0 --cache-dir .trivycache/ --no-progress --format template --template "@contrib/gitlab.tpl" -o gl-container-scanning-report.json $IMAGE
# Print report
- ./trivy --exit-code 0 --cache-dir .trivycache/ --no-progress --severity HIGH $IMAGE
# Fail on severe vulnerabilities
- ./trivy --exit-code 1 --cache-dir .trivycache/ --severity CRITICAL --no-progress $IMAGE
cache:
paths:
- .trivycache/
# Enables https://docs.gitlab.com/ee/user/application_security/container_scanning/ (Container Scanning report is available on GitLab EE Ultimate or GitLab.com Gold)
artifacts:
reports:
container_scanning: gl-container-scanning-report.json
```
[Example][example]
[Repository][repository]
### GitLab CI using Trivy container
To scan a previously built image that has already been pushed into the
GitLab container registry the following CI job manifest can be used.
Note that `entrypoint` needs to be unset for the `script` section to work.
In case of a non-public GitLab project Trivy additionally needs to
authenticate to the registry to be able to pull your application image.
Finally, it is not necessary to clone the project repo as we only work
with the container image.
```yaml
container_scanning:
image:
name: docker.io/aquasec/trivy:latest
entrypoint: [""]
variables:
# No need to clone the repo, we exclusively work on artifacts. See
# https://docs.gitlab.com/ee/ci/runners/README.html#git-strategy
GIT_STRATEGY: none
TRIVY_USERNAME: "$CI_REGISTRY_USER"
TRIVY_PASSWORD: "$CI_REGISTRY_PASSWORD"
TRIVY_AUTH_URL: "$CI_REGISTRY"
FULL_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
script:
- trivy --version
# cache cleanup is needed when scanning images with the same tags, it does not remove the database
- time trivy image --clear-cache
# update vulnerabilities db
- time trivy --download-db-only --no-progress --cache-dir .trivycache/
# Builds report and puts it in the default workdir $CI_PROJECT_DIR, so `artifacts:` can take it from there
- time trivy --exit-code 0 --cache-dir .trivycache/ --no-progress --format template --template "@/contrib/gitlab.tpl"
--output "$CI_PROJECT_DIR/gl-container-scanning-report.json" "$FULL_IMAGE_NAME"
# Prints full report
- time trivy --exit-code 0 --cache-dir .trivycache/ --no-progress "$FULL_IMAGE_NAME"
# Fail on critical vulnerabilities
- time trivy --exit-code 1 --cache-dir .trivycache/ --severity CRITICAL --no-progress "$FULL_IMAGE_NAME"
cache:
paths:
- .trivycache/
# Enables https://docs.gitlab.com/ee/user/application_security/container_scanning/ (Container Scanning report is available on GitLab EE Ultimate or GitLab.com Gold)
artifacts:
when: always
reports:
container_scanning: gl-container-scanning-report.json
tags:
- docker-runner
```
[example]: https://gitlab.com/aquasecurity/trivy-ci-test/pipelines
[repository]: https://github.com/aquasecurity/trivy-ci-test
### Gitlab CI alternative template
Depending on the edition of gitlab you have or your desired workflow, the
container scanning template may not meet your needs. As an addition to the
above container scanning template, a template for
[code climate](https://docs.gitlab.com/ee/user/project/merge_requests/code_quality.html)
has been included. The key things to update from the above examples are
the `template` and `report` type. An updated example is below.
```yaml
stages:
- test
trivy:
stage: test
image: docker:stable
services:
- name: docker:dind
entrypoint: ["env", "-u", "DOCKER_HOST"]
command: ["dockerd-entrypoint.sh"]
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
# See https://github.com/docker-library/docker/pull/166
DOCKER_TLS_CERTDIR: ""
IMAGE: trivy-ci-test:$CI_COMMIT_SHA
before_script:
- export TRIVY_VERSION=$(wget -qO - "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
- echo $TRIVY_VERSION
- wget --no-verbose https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz -O - | tar -zxvf -
allow_failure: true
script:
# Build image
- docker build -t $IMAGE .
# Build report
- ./trivy --exit-code 0 --cache-dir .trivycache/ --no-progress --format template --template "@contrib/gitlab-codeclimate.tpl" -o gl-codeclimate.json $IMAGE
cache:
paths:
- .trivycache/
# Enables https://docs.gitlab.com/ee/user/application_security/container_scanning/ (Container Scanning report is available on GitLab EE Ultimate or GitLab.com Gold)
artifacts:
paths:
gl-codeclimate.json
reports:
codequality: gl-codeclimate.json
```
Currently gitlab only supports a single code quality report. There is an
open [feature request](https://gitlab.com/gitlab-org/gitlab/-/issues/9014)
to support multiple reports. Until this has been implemented, if you
already have a code quality report in your pipeline, you can use
`jq` to combine reports. Depending on how you name your artifacts, it may
be necessary to rename the artifact if you want to reuse the name. To then
combine the previous artifact with the output of trivy, the following `jq`
command can be used, `jq -s 'add' prev-codeclimate.json trivy-codeclimate.json > gl-codeclimate.json`.

View File

@@ -0,0 +1,4 @@
# Integrations
Scan your image automatically as part of your CI workflow, failing the workflow if a vulnerability is found. When you don't want to fail the test, specify `--exit-code 0`.
Since in automated scenarios such as CI/CD you are only interested in the end result, and not the full report, use the `--light` flag to optimize for this scenario and get fast results.

View File

@@ -0,0 +1,29 @@
# Travis CI
```
$ cat .travis.yml
services:
- docker
env:
global:
- COMMIT=${TRAVIS_COMMIT::8}
before_install:
- docker build -t trivy-ci-test:${COMMIT} .
- export VERSION=$(curl --silent "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
- wget https://github.com/aquasecurity/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
- tar zxvf trivy_${VERSION}_Linux-64bit.tar.gz
script:
- ./trivy --exit-code 0 --severity HIGH --no-progress trivy-ci-test:${COMMIT}
- ./trivy --exit-code 1 --severity CRITICAL --no-progress trivy-ci-test:${COMMIT}
cache:
directories:
- $HOME/.cache/trivy
```
[Example][example]
[Repository][repository]
[example]: https://travis-ci.org/aquasecurity/trivy-ci-test
[repository]: https://github.com/aquasecurity/trivy-ci-test

View File

@@ -0,0 +1,59 @@
# Client/Server
Trivy has client/server mode. Trivy server has vulnerability database and Trivy client doesn't have to download vulnerability database. It is useful if you want to scan images at multiple locations and do not want to download the database at every location.
## Server
At first, you need to launch Trivy server. It downloads vulnerability database automatically and continue to fetch the latest DB in the background.
```
$ trivy server --listen localhost:8080
2019-12-12T15:17:06.551+0200 INFO Need to update DB
2019-12-12T15:17:56.706+0200 INFO Reopening DB...
2019-12-12T15:17:56.707+0200 INFO Listening localhost:8080...
```
If you want to accept a connection from outside, you have to specify `0.0.0.0` or your ip address, not `localhost`.
```
$ trivy server --listen 0.0.0.0:8080
```
## Client
Then, specify the remote address.
```
$ trivy client --remote http://localhost:8080 alpine:3.10
```
<details>
<summary>Result</summary>
```
alpine:3.10 (alpine 3.10.2)
===========================
Total: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 2, HIGH: 0, CRITICAL: 0)
+---------+------------------+----------+-------------------+---------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION |
+---------+------------------+----------+-------------------+---------------+
| openssl | CVE-2019-1549 | MEDIUM | 1.1.1c-r0 | 1.1.1d-r0 |
+ +------------------+ + + +
| | CVE-2019-1563 | | | |
+ +------------------+----------+ + +
| | CVE-2019-1547 | LOW | | |
+---------+------------------+----------+-------------------+---------------+
```
</details>
## Authentication
```
$ trivy server --listen localhost:8080 --token dummy
```
```
$ trivy client --remote http://localhost:8080 --token dummy alpine:3.10
```
## Architecture
![architecture](../../imgs/client-server.png)

View File

@@ -0,0 +1,16 @@
# Standalone
`trivy image`, `trivy filesystem`, and `trivy repo` works as standalone mode.
## Image
![standalone](../../imgs/image.png)
## Filesystem
![fs](../../imgs/fs.png)
## Git Repository
![repo](../../imgs/repo.png)

173
docs/advanced/plugins.md Normal file
View File

@@ -0,0 +1,173 @@
# Plugins
Trivy provides a plugin feature to allow others to extend the Trivy CLI without the need to change the Trivycode base.
This plugin system was inspired by the plugin system used in [kubectl][kubectl], [Helm][helm], and [Conftest][conftest].
## Overview
Trivy plugins are add-on tools that integrate seamlessly with Trivy.
They provide a way to extend the core feature set of Trivy, but without requiring every new feature to be written in Go and added to the core tool.
- They can be added and removed from a Trivy installation without impacting the core Trivy tool.
- They can be written in any programming language.
- They integrate with Trivy, and will show up in Trivy help and subcommands.
!!! warning
Trivy plugins available in public are not audited for security.
You should install and run third-party plugins at your own risk, since they are arbitrary programs running on your machine.
## Installing a Plugin
A plugin can be installed using the `trivy plugin install` command.
This command takes a url and will download the plugin and install it in the plugin cache.
Trivy adheres to the XDG specification, so the location depends on whether XDG_DATA_HOME is set.
Trivy will now search XDG_DATA_HOME for the location of the Trivy plugins cache.
The preference order is as follows:
- XDG_DATA_HOME if set and .trivy/plugins exists within the XDG_DATA_HOME dir
- ~/.trivy/plugins
Under the hood Trivy leverages [go-getter][go-getter] to download plugins.
This means the following protocols are supported for downloading plugins:
- OCI Registries
- Local Files
- Git
- HTTP/HTTPS
- Mercurial
- Amazon S3
- Google Cloud Storage
For example, to download the Kubernetes Trivy plugin you can execute the following command:
```bash
$ trivy plugin install github.com/aquasecurity/trivy-plugin-kubectl
```
## Using Plugins
Once the plugin is installed, Trivy will load all available plugins in the cache on the start of the next Trivy execution.
A plugin will be made in the Trivy CLI based on the plugin name.
To display all plugins, you can list them by `trivy --help`
```bash
$ trivy --help
NAME:
trivy - A simple and comprehensive vulnerability scanner for containers
USAGE:
trivy [global options] command [command options] target
VERSION:
dev
COMMANDS:
image, i scan an image
filesystem, fs scan local filesystem
repository, repo scan remote repository
client, c client mode
server, s server mode
plugin, p manage plugins
kubectl scan kubectl resources
help, h Shows a list of commands or help for one command
```
As shown above, `kubectl` subcommand exists in the `COMMANDS` section.
To call the kubectl plugin and scan existing Kubernetes deployments, you can execute the following command:
```
$ trivy kubectl deployment <deployment-id> -- --ignore-unfixed --severity CRITICAL
```
Internally the kubectl plugin calls the kubectl binary to fetch information about that deployment and passes the using images to Trivy.
You can see the detail [here][trivy-plugin-kubectl].
If you want to omit even the subcommand, you can use `TRIVY_RUN_AS_PLUGIN` environment variable.
```bash
$ TRIVY_RUN_AS_PLUGIN=kubectl trivy job your-job -- --format json
```
## Installing and Running Plugins on the fly
`trivy plugin run` installs a plugin and runs it on the fly.
If the plugin is already present in the cache, the installation is skipped.
```bash
trivy plugin run github.com/aquasecurity/trivy-plugin-kubectl pod your-pod -- --exit-code 1
```
## Uninstalling Plugins
Specify a plugin name with `trivy plugin uninstall` command.
```bash
$ trivy plugin uninstall kubectl
```
## Building Plugins
Each plugin has a top-level directory, and then a plugin.yaml file.
```bash
your-plugin/
|
|- plugin.yaml
|- your-plugin.sh
```
In the example above, the plugin is contained inside of a directory named `your-plugin`.
It has two files: plugin.yaml (required) and an executable script, your-plugin.sh (optional).
The core of a plugin is a simple YAML file named plugin.yaml.
Here is an example YAML of trivy-plugin-kubectl plugin that adds support for Kubernetes scanning.
```yaml
name: "kubectl"
repository: github.com/aquasecurity/trivy-plugin-kubectl
version: "0.1.0"
usage: scan kubectl resources
description: |-
A Trivy plugin that scans the images of a kubernetes resource.
Usage: trivy kubectl TYPE[.VERSION][.GROUP] NAME
platforms:
- selector: # optional
os: darwin
arch: amd64
uri: ./trivy-kubectl # where the execution file is (local file, http, git, etc.)
bin: ./trivy-kubectl # path to the execution file
- selector: # optional
os: linux
arch: amd64
uri: https://github.com/aquasecurity/trivy-plugin-kubectl/releases/download/v0.1.0/trivy-kubectl.tar.gz
bin: ./trivy-kubectl
```
The `plugin.yaml` field should contain the following information:
- name: The name of the plugin. This also determines how the plugin will be made available in the Trivy CLI. For example, if the plugin is named kubectl, you can call the plugin with `trivy kubectl`. (required)
- version: The version of the plugin. (required)
- usage: A short usage description. (required)
- description: A long description of the plugin. This is where you could provide a helpful documentation of your plugin. (required)
- platforms: (required)
- selector: The OS/Architecture specific variations of a execution file. (optional)
- os: OS information based on GOOS (linux, darwin, etc.) (optional)
- arch: The architecture information based on GOARCH (amd64, arm64, etc.) (optional)
- uri: Where the executable file is. Relative path from the root directory of the plugin or remote URL such as HTTP and S3. (required)
- bin: Which file to call when the plugin is executed. Relative path from the root directory of the plugin. (required)
The following rules will apply in deciding which platform to select:
- If both `os` and `arch` under `selector` match the current platform, search will stop and the platform will be used.
- If `selector` is not present, the platform will be used.
- If `os` matches and there is no more specific `arch` match, the platform will be used.
- If no `platform` match is found, Trivy will exit with an error.
After determining platform, Trivy will download the execution file from `uri` and store it in the plugin cache.
When the plugin is called via Trivy CLI, `bin` command will be executed.
The plugin is responsible for handling flags and arguments. Any arguments are passed to the plugin from the `trivy` command.
## Example
https://github.com/aquasecurity/trivy-plugin-kubectl
[kubectl]: https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/
[helm]: https://helm.sh/docs/topics/plugins/
[conftest]: https://www.conftest.dev/plugins/
[go-getter]: https://github.com/hashicorp/go-getter
[trivy-plugin-kubectl]: https://github.com/aquasecurity/trivy-plugin-kubectl

View File

@@ -0,0 +1,7 @@
Docker Hub needs `TRIVY_USERNAME` and `TRIVY_PASSWORD`.
You don't need to set ENV vars when download from public repository.
```bash
export TRIVY_USERNAME={DOCKERHUB_USERNAME}
export TRIVY_PASSWORD={DOCKERHUB_PASSWORD}
```

View File

@@ -0,0 +1,4 @@
Trivy uses AWS SDK. You don't need to install `aws` CLI tool.
You can use [AWS CLI's ENV Vars][env-var].
[env-var]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

View File

@@ -0,0 +1,7 @@
Trivy uses Google Cloud SDK. You don't need to install `gcloud` command.
If you want to use target project's repository, you can settle via `GOOGLE_APPLICATION_CREDENTIAL`.
```bash
# must set TRIVY_USERNAME empty char
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/credential.json
```

View File

@@ -0,0 +1,4 @@
Trivy can download images from a private registry, without installing `Docker` or any other 3rd party tools.
That's because it's easy to run in a CI process.
All you have to do is install `Trivy` and set ENV vars.

View File

@@ -0,0 +1,9 @@
BasicAuth server needs `TRIVY_USERNAME` and `TRIVY_PASSWORD`.
```bash
export TRIVY_USERNAME={USERNAME}
export TRIVY_PASSWORD={PASSWORD}
# if you want to use 80 port, use NonSSL
export TRIVY_NON_SSL=true
```

9
docs/build/Dockerfile vendored Normal file
View File

@@ -0,0 +1,9 @@
FROM squidfunk/mkdocs-material:7.0.6
## If you want to see exactly the same version as is published to GitHub pages
## use a private image for insiders, which requires authentication.
# docker login -u ${GITHUB_USERNAME} -p ${GITHUB_TOKEN} ghcr.io
# FROM ghcr.io/squidfunk/mkdocs-material-insiders
RUN pip install mike mkdocs-macros-plugin

View File

@@ -0,0 +1,30 @@
# Client
```bash
NAME:
trivy client - client mode
USAGE:
trivy client [command options] image_name
OPTIONS:
--template value, -t value output template [$TRIVY_TEMPLATE]
--format value, -f value format (table, json, template) (default: "table") [$TRIVY_FORMAT]
--input value, -i value input file path instead of image name [$TRIVY_INPUT]
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
--output value, -o value output file name [$TRIVY_OUTPUT]
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
--ignore-unfixed display only fixed vulnerabilities (default: false) [$TRIVY_IGNORE_UNFIXED]
--removed-pkgs detect vulnerabilities of removed packages (only for Alpine) (default: false) [$TRIVY_REMOVED_PKGS]
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
--token value for authentication [$TRIVY_TOKEN]
--token-header value specify a header name for token (default: "Trivy-Token") [$TRIVY_TOKEN_HEADER]
--remote value server address (default: "http://localhost:4954") [$TRIVY_REMOTE]
--custom-headers value custom headers [$TRIVY_CUSTOM_HEADERS]
--help, -h show help (default: false)
```

View File

@@ -0,0 +1,29 @@
# Config
``` bash
NAME:
trivy config - scan config files
USAGE:
trivy config [command options] dir
OPTIONS:
--template value, -t value output template [$TRIVY_TEMPLATE]
--format value, -f value format (table, json, template) (default: "table") [$TRIVY_FORMAT]
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
--output value, -o value output file name [$TRIVY_OUTPUT]
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
--skip-policy-update skip updating built-in policies (default: false) [$TRIVY_SKIP_POLICY_UPDATE]
--reset remove all caches and database (default: false) [$TRIVY_RESET]
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
--skip-files value specify the file paths to skip traversal [$TRIVY_SKIP_FILES]
--skip-dirs value specify the directories where the traversal is skipped [$TRIVY_SKIP_DIRS]
--policy value, --config-policy value specify paths to the Rego policy files directory, applying config files [$TRIVY_POLICY]
--data value, --config-data value specify paths from which data for the Rego policies will be recursively loaded [$TRIVY_DATA]
--policy-namespaces value, --namespaces value Rego namespaces (default: "users") [$TRIVY_POLICY_NAMESPACES]
--file-patterns value specify file patterns [$TRIVY_FILE_PATTERNS]
--include-successes include successes of misconfigurations (default: false) [$TRIVY_INCLUDE_SUCCESSES]
--help, -h show help (default: false)
```

View File

@@ -0,0 +1,34 @@
# Filesystem
```bash
NAME:
trivy filesystem - scan local filesystem
USAGE:
trivy filesystem [command options] dir
OPTIONS:
--template value, -t value output template [$TRIVY_TEMPLATE]
--format value, -f value format (table, json, template) (default: "table") [$TRIVY_FORMAT]
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
--output value, -o value output file name [$TRIVY_OUTPUT]
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
--skip-db-update, --skip-update skip updating vulnerability database (default: false) [$TRIVY_SKIP_UPDATE, $TRIVY_SKIP_DB_UPDATE]
--skip-policy-update skip updating built-in policies (default: false) [$TRIVY_SKIP_POLICY_UPDATE]
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
--ignore-unfixed display only fixed vulnerabilities (default: false) [$TRIVY_IGNORE_UNFIXED]
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
--security-checks value comma-separated list of what security issues to detect (vuln,config) (default: "vuln") [$TRIVY_SECURITY_CHECKS]
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
--cache-backend value cache backend (e.g. redis://localhost:6379) (default: "fs") [$TRIVY_CACHE_BACKEND]
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
--no-progress suppress progress bar (default: false) [$TRIVY_NO_PROGRESS]
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
--skip-files value specify the file paths to skip traversal [$TRIVY_SKIP_FILES]
--skip-dirs value specify the directories where the traversal is skipped [$TRIVY_SKIP_DIRS]
--config-policy value specify paths to the Rego policy files directory, applying config files [$TRIVY_CONFIG_POLICY]
--config-data value specify paths from which data for the Rego policies will be recursively loaded [$TRIVY_CONFIG_DATA]
--policy-namespaces value, --namespaces value Rego namespaces (default: "users") [$TRIVY_POLICY_NAMESPACES]
--help, -h show help (default: false)
```

View File

@@ -0,0 +1,34 @@
# Image
```bash
NAME:
trivy image - scan an image
USAGE:
trivy image [command options] image_name
OPTIONS:
--template value, -t value output template [$TRIVY_TEMPLATE]
--format value, -f value format (table, json, template) (default: "table") [$TRIVY_FORMAT]
--input value, -i value input file path instead of image name [$TRIVY_INPUT]
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
--output value, -o value output file name [$TRIVY_OUTPUT]
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
--skip-update skip db update (default: false) [$TRIVY_SKIP_UPDATE]
--download-db-only download/update vulnerability database but don't run a scan (default: false) [$TRIVY_DOWNLOAD_DB_ONLY]
--reset remove all caches and database (default: false) [$TRIVY_RESET]
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
--no-progress suppress progress bar (default: false) [$TRIVY_NO_PROGRESS]
--ignore-unfixed display only fixed vulnerabilities (default: false) [$TRIVY_IGNORE_UNFIXED]
--removed-pkgs detect vulnerabilities of removed packages (only for Alpine) (default: false) [$TRIVY_REMOVED_PKGS]
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
--light light mode: it's faster, but vulnerability descriptions and references are not displayed (default: false) [$TRIVY_LIGHT]
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
--skip-files value specify the file path to skip traversal [$TRIVY_SKIP_FILES]
--skip-dirs value specify the directory where the traversal is skipped [$TRIVY_SKIP_DIRS]
--cache-backend value cache backend (e.g. redis://localhost:6379) (default: "fs") [$TRIVY_CACHE_BACKEND]
--help, -h show help (default: false)
```

View File

@@ -0,0 +1,30 @@
Trivy has several sub commands, image, fs, repo, client and server.
``` bash
NAME:
trivy - A simple and comprehensive vulnerability scanner for containers
USAGE:
trivy [global options] command [command options] target
VERSION:
dev
COMMANDS:
image, i scan an image
filesystem, fs scan local filesystem
repository, repo scan remote repository
client, c client mode
server, s server mode
config, conf scan config files
plugin, p manage plugins
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--quiet, -q suppress progress bar and log output (default: false) [$TRIVY_QUIET]
--debug, -d debug mode (default: false) [$TRIVY_DEBUG]
--cache-dir value cache directory (default: "/Users/teppei/Library/Caches/trivy") [$TRIVY_CACHE_DIR]
--help, -h show help (default: false)
--version, -v print the version (default: false)
```

View File

@@ -0,0 +1,31 @@
# Repository
```bash
NAME:
trivy repository - scan remote repository
USAGE:
trivy repository [command options] repo_url
OPTIONS:
--template value, -t value output template [$TRIVY_TEMPLATE]
--format value, -f value format (table, json, template) (default: "table") [$TRIVY_FORMAT]
--input value, -i value input file path instead of image name [$TRIVY_INPUT]
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
--output value, -o value output file name [$TRIVY_OUTPUT]
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
--skip-update skip db update (default: false) [$TRIVY_SKIP_UPDATE]
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
--ignore-unfixed display only fixed vulnerabilities (default: false) [$TRIVY_IGNORE_UNFIXED]
--removed-pkgs detect vulnerabilities of removed packages (only for Alpine) (default: false) [$TRIVY_REMOVED_PKGS]
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
--cache-backend value cache backend (e.g. redis://localhost:6379) (default: "fs") [$TRIVY_CACHE_BACKEND]
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
--no-progress suppress progress bar (default: false) [$TRIVY_NO_PROGRESS]
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
--skip-files value specify the file path to skip traversal [$TRIVY_SKIP_FILES]
--skip-dirs value specify the directory where the traversal is skipped [$TRIVY_SKIP_DIRS]
--help, -h show help (default: false)
```

View File

@@ -0,0 +1,34 @@
# Rootfs
```bash
NAME:
trivy rootfs - scan rootfs
USAGE:
trivy rootfs [command options] dir
OPTIONS:
--template value, -t value output template [$TRIVY_TEMPLATE]
--format value, -f value format (table, json, template) (default: "table") [$TRIVY_FORMAT]
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
--output value, -o value output file name [$TRIVY_OUTPUT]
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
--skip-db-update, --skip-update skip updating vulnerability database (default: false) [$TRIVY_SKIP_UPDATE, $TRIVY_SKIP_DB_UPDATE]
--skip-policy-update skip updating built-in policies (default: false) [$TRIVY_SKIP_POLICY_UPDATE]
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
--ignore-unfixed display only fixed vulnerabilities (default: false) [$TRIVY_IGNORE_UNFIXED]
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
--security-checks value comma-separated list of what security issues to detect (vuln,config) (default: "vuln") [$TRIVY_SECURITY_CHECKS]
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
--cache-backend value cache backend (e.g. redis://localhost:6379) (default: "fs") [$TRIVY_CACHE_BACKEND]
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
--no-progress suppress progress bar (default: false) [$TRIVY_NO_PROGRESS]
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
--skip-files value specify the file paths to skip traversal [$TRIVY_SKIP_FILES]
--skip-dirs value specify the directories where the traversal is skipped [$TRIVY_SKIP_DIRS]
--config-policy value specify paths to the Rego policy files directory, applying config files [$TRIVY_CONFIG_POLICY]
--config-data value specify paths from which data for the Rego policies will be recursively loaded [$TRIVY_CONFIG_DATA]
--policy-namespaces value, --namespaces value Rego namespaces (default: "users") [$TRIVY_POLICY_NAMESPACES]
--help, -h show help (default: false)
```

View File

@@ -0,0 +1,19 @@
# Server
```bash
NAME:
trivy server - server mode
USAGE:
trivy server [command options] [arguments...]
OPTIONS:
--skip-update skip db update (default: false) [$TRIVY_SKIP_UPDATE]
--download-db-only download/update vulnerability database but don't run a scan (default: false) [$TRIVY_DOWNLOAD_DB_ONLY]
--reset remove all caches and database (default: false) [$TRIVY_RESET]
--cache-backend value cache backend (e.g. redis://localhost:6379) (default: "fs") [$TRIVY_CACHE_BACKEND]
--token value for authentication [$TRIVY_TOKEN]
--token-header value specify a header name for token (default: "Trivy-Token") [$TRIVY_TOKEN_HEADER]
--listen value listen address (default: "localhost:4954") [$TRIVY_LISTEN]
--help, -h show help (default: false)
```

View File

@@ -0,0 +1,10 @@
# Author
[Teppei Fukuda][knqyf263] (knqyf263)
# Contributors
Thanks to all [contributors][contributors]
[knqyf263]: https://github.com/knqyf263
[contributors]: https://github.com/aquasecurity/trivy/graphs/contributors

View File

@@ -0,0 +1,45 @@
# Further Reading
## Presentations
- Aqua Security YouTube Channel
- [Trivy - container image scanning][intro]
- [Using Trivy in client server mode][server]
- [Tweaking Trivy output to fit your workflow][tweaking]
- [How does a vulnerability scanner identify packages?][identify]
- CNCF Webinar 2020
- [Trivy Open Source Scanner for Container Images Just Download and Run!][cncf]
- KubeCon + CloudNativeCon Europe 2020 Virtual
- [Handling Container Vulnerabilities with Open Policy Agent - Teppei Fukuda, Aqua Security][kubecon]
## Blogs
- [Trivy Vulnerability Scanner Joins the Aqua Open-source Family][join]
- [Trivy Image Vulnerability Scanner Now Under Apache 2.0 License][license]
- [DevSecOps with Trivy and GitHub Actions][actions]
- [Find Image Vulnerabilities Using GitHub and Aqua Security Trivy Action][actions2]
- [Using Trivy to Discover Vulnerabilities in VS Code Projects][vscode]
## External Blogs/Links
- [the vulnerability remediation lifecycle of Alpine containers][alpine]
- [Open Source CVE Scanner Round-Up: Clair vs Anchore vs Trivy][round-up]
- [Docker Image Security: Static Analysis Tool Comparison Anchore Engine vs Clair vs Trivy][tool-comparison]
- [Research Spike: evaluate Trivy for scanning running containers][gitlab]
- [Istio evaluates scanners][istio]
[intro]: https://www.youtube.com/watch?v=AzOBGm7XxOA
[cncf]: https://www.youtube.com/watch?v=XnYxX9uueoQ
[server]: https://www.youtube.com/watch?v=tNQ-VlahtYM
[kubecon]: https://www.youtube.com/watch?v=WKE2XNZ2zr4
[identify]: https://www.youtube.com/watch?v=PaMnzeHBa8M
[tweaking]: https://www.youtube.com/watch?v=wFIGUjcRLnU
[join]: https://blog.aquasec.com/trivy-vulnerability-scanner-joins-aqua-family
[license]: https://blog.aquasec.com/trivy-open-source-vulnerability-scanner-apache2.0-license
[actions]: https://blog.aquasec.com/devsecops-with-trivy-github-actions
[actions2]: https://blog.aquasec.com/github-vulnerability-scanner-trivy
[vscode]: https://blog.aquasec.com/trivy-open-source-vulnerability-scanner-vs-code
[alpine]: https://ariadne.space/2021/06/08/the-vulnerability-remediation-lifecycle-of-alpine-containers/
[round-up]: https://boxboat.com/2020/04/24/image-scanning-tech-compared/
[tool-comparison]: https://www.a10o.net/devsecops/docker-image-security-static-analysis-tool-comparison-anchore-engine-vs-clair-vs-trivy/
[gitlab]: https://gitlab.com/gitlab-org/gitlab/-/issues/270888
[istio]: https://github.com/istio/release-builder/pull/687#issuecomment-874938417

View File

@@ -0,0 +1,202 @@
# Installation
## RHEL/CentOS
=== "Repository"
Add repository setting to `/etc/yum.repos.d`.
``` bash
$ sudo vim /etc/yum.repos.d/trivy.repo
[trivy]
name=Trivy repository
baseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/$releasever/$basearch/
gpgcheck=0
enabled=1
$ sudo yum -y update
$ sudo yum -y install trivy
```
=== "RPM"
``` bash
rpm -ivh https://github.com/aquasecurity/trivy/releases/download/{{ git.tag }}/trivy_{{ git.tag[1:] }}_Linux-64bit.rpm
```
## Debian/Ubuntu
=== "Repository"
Add repository setting to `/etc/apt/sources.list.d`.
``` bash
sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy
```
=== "DEB"
``` bash
wget https://github.com/aquasecurity/trivy/releases/download/{{ git.tag }}/trivy_{{ git.tag[1:] }}_Linux-64bit.deb
sudo dpkg -i trivy_{{ git.tag[1:] }}_Linux-64bit.deb
```
## Arch Linux
Package trivy-bin can be installed from the Arch User Repository.
=== "pikaur"
``` bash
pikaur -Sy trivy-bin
```
=== "yay"
``` bash
yay -Sy trivy-bin
```
## Homebrew
You can use homebrew on macOS and Linux.
```bash
brew install aquasecurity/trivy/trivy
```
## Nix/NixOS
You can use nix on Linux or macOS and on others unofficially.
Note that trivy is currently only in the unstable channels.
```bash
nix-env --install trivy
```
Or through your configuration on NixOS or with home-manager as usual
## Install Script
This script downloads Trivy binary based on your OS and architecture.
```bash
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin {{ git.tag }}
```
## Binary
Download the archive file for your operating system/architecture from [here](https://github.com/aquasecurity/trivy/releases/tag/{{ git.tag }}).
Unpack the archive, and put the binary somewhere in your `$PATH` (on UNIX-y systems, /usr/local/bin or the like).
Make sure it has execution bits turned on.
## From source
```bash
mkdir -p $GOPATH/src/github.com/aquasecurity
cd $GOPATH/src/github.com/aquasecurity
git clone --depth 1 --branch {{ git.tag }} https://github.com/aquasecurity/trivy
cd trivy/cmd/trivy/
export GO111MODULE=on
go install
```
## Docker
### Docker Hub
Replace [YOUR_CACHE_DIR] with the cache directory on your machine.
```bash
docker pull aquasec/trivy:{{ git.tag[1:] }}
```
Example:
=== "Linux"
``` bash
docker run --rm -v [YOUR_CACHE_DIR]:/root/.cache/ aquasec/trivy:{{ git.tag[1:] }} [YOUR_IMAGE_NAME]
```
=== "macOS"
``` bash
yay -Sy trivy-bin
docker run --rm -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:{{ git.tag[1:] }} python:3.4-alpine
```
If you would like to scan the image on your host machine, you need to mount `docker.sock`.
```bash
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
-v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:{{ git.tag[1:] }} python:3.4-alpine
```
Please re-pull latest `aquasec/trivy` if an error occurred.
<details>
<summary>Result</summary>
```bash
2019-05-16T01:20:43.180+0900 INFO Updating vulnerability database...
2019-05-16T01:20:53.029+0900 INFO Detecting Alpine vulnerabilities...
python:3.4-alpine3.9 (alpine 3.9.2)
===================================
Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0)
+---------+------------------+----------+-------------------+---------------+--------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+---------+------------------+----------+-------------------+---------------+--------------------------------+
| openssl | CVE-2019-1543 | MEDIUM | 1.1.1a-r1 | 1.1.1b-r1 | openssl: ChaCha20-Poly1305 |
| | | | | | with long nonces |
+---------+------------------+----------+-------------------+---------------+--------------------------------+
```
</details>
### GitHub Container Registry
The same image is hosted on [GitHub Container Registry][registry] as well.
```bash
docker pull ghcr.io/aquasecurity/trivy:{{ git.tag[1:] }}
```
### Amazon ECR Public
The same image is hosted on [Amazon ECR Public][ecr] as well.
```bash
docker pull public.ecr.aws/aquasecurity/trivy:{{ git.tag[1:] }}
```
## Helm
### Installing from the the Aqua Chart Repository
```
helm repo add aquasecurity https://aquasecurity.github.io/helm-charts/
helm repo update
helm search repo trivy
helm install my-trivy aquasecurity/trivy
```
### Installing the Chart
To install the chart with the release name `my-release`:
```
helm install my-release .
```
The command deploys Trivy on the Kubernetes cluster in the default configuration. The [Parameters][helm]
section lists the parameters that can be configured during installation.
> **Tip**: List all releases using `helm list`.
[ecr]: https://gallery.ecr.aws/aquasecurity/trivy
[registry]: https://github.com/orgs/aquasecurity/packages/container/package/trivy
[helm]: https://github.com/aquasecurity/trivy/tree/{{ git.tag }}/helm/trivy

View File

@@ -0,0 +1,83 @@
# Overview
Trivy detects two types of security issues:
- [Vulnerabilities][vuln]
- [Misconfigurations][misconf]
Trivy can scan three different artifacts:
- [Container Images][container]
- [Filesystem][filesystem] and [Rootfs][rootfs]
- [Git Repositories][repo]
Trivy can be run in two different modes:
- [Standalone][standalone]
- [Client/Server][client-server]
It is designed to be used in CI. Before pushing to a container registry or deploying your application, you can scan your local container image and other artifacts easily.
See [Integrations][integrations] for details.
## Features
- Comprehensive vulnerability detection
- [OS packages][os] (Alpine, Red Hat Universal Base Image, Red Hat Enterprise Linux, CentOS, Oracle Linux, Debian, Ubuntu, Amazon Linux, openSUSE Leap, SUSE Enterprise Linux, Photon OS and Distroless)
- [**Language-specific packages**][lang] (Bundler, Composer, Pipenv, Poetry, npm, yarn, Cargo, NuGet, Maven, and Go)
- Detect IaC misconfigurations
- A wide variety of [built-in policies][builtin] are provided **out of the box**:
- Kubernetes
- Docker
- Terraform
- more coming soon
- Support custom policies
- Simple
- Specify only an image name, a directory containing IaC configs, or an artifact name
- See [Quick Start][quickstart]
- Fast
- The first scan will finish within 10 seconds (depending on your network). Consequent scans will finish in single seconds.
- Unlike other scanners that take long to fetch vulnerability information (~10 minutes) on the first run, and encourage you to maintain a durable vulnerability database, Trivy is stateless and requires no maintenance or preparation.
- Easy installation
- `apt-get install`, `yum install` and `brew install` is possible (See [Installation](installation.md))
- **No pre-requisites** such as installation of DB, libraries, etc.
- High accuracy
- **Especially Alpine Linux and RHEL/CentOS**
- Other OSes are also high
- DevSecOps
- **Suitable for CI** such as Travis CI, CircleCI, Jenkins, GitLab CI, etc.
- See [CI Example][integrations]
- Support multiple formats
- container image
- A local image in Docker Engine which is running as a daemon
- A local image in [Podman][podman] (>=2.0) which is exposing a socket
- A remote image in Docker Registry such as Docker Hub, ECR, GCR and ACR
- A tar archive stored in the `docker save` / `podman save` formatted file
- An image directory compliant with [OCI Image Format][oci]
- local filesystem and rootfs
- remote git repository
Please see [LICENSE][license] for Trivy licensing information.
!!! note
Trivy uses vulnerability information from a variety of sources, some of which are licensed for non-commercial use only.
[vuln]: ../vulnerability/scanning/index.md
[misconf]: ../misconfiguration/index.md
[container]: ../vulnerability/scanning/image.md
[rootfs]: ../vulnerability/scanning/rootfs.md
[filesystem]: ../vulnerability/scanning/filesystem.md
[repo]: ../vulnerability/scanning/git-repository.md
[standalone]: ../advanced/modes/standalone.md
[client-server]: ../advanced/modes/client-server.md
[integrations]: ../advanced/integrations/index.md
[os]: ../vulnerability/detection/os.md
[lang]: ../vulnerability/detection/language.md
[builtin]: ../misconfiguration/policy/builtin.md
[quickstart]: quickstart.md
[podman]: ../advanced/container/podman.md
[oci]: https://github.com/opencontainers/image-spec
[license]: https://github.com/aquasecurity/trivy/blob/main/LICENSE

View File

@@ -0,0 +1,83 @@
# Quick Start
## Scan image for vulnerabilities
Simply specify an image name (and a tag).
```
$ trivy image [YOUR_IMAGE_NAME]
```
For example:
```
$ trivy image python:3.4-alpine
```
<details>
<summary>Result</summary>
```
2019-05-16T01:20:43.180+0900 INFO Updating vulnerability database...
2019-05-16T01:20:53.029+0900 INFO Detecting Alpine vulnerabilities...
python:3.4-alpine3.9 (alpine 3.9.2)
===================================
Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0)
+---------+------------------+----------+-------------------+---------------+--------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+---------+------------------+----------+-------------------+---------------+--------------------------------+
| openssl | CVE-2019-1543 | MEDIUM | 1.1.1a-r1 | 1.1.1b-r1 | openssl: ChaCha20-Poly1305 |
| | | | | | with long nonces |
+---------+------------------+----------+-------------------+---------------+--------------------------------+
```
</details>
For more details, see [here][vulnerability].
## Scan directory for misconfigurations
Simply specify a directory containing IaC files such as Terraform and Dockerfile.
```
$ trivy config [YOUR_IAC_DIR]
```
For example:
```
$ ls build/
Dockerfile
$ trivy config ./build
```
<details>
<summary>Result</summary>
```
2021-07-09T10:06:29.188+0300 INFO Need to update the built-in policies
2021-07-09T10:06:29.188+0300 INFO Downloading the built-in policies...
2021-07-09T10:06:30.520+0300 INFO Detected config files: 1
Dockerfile (dockerfile)
=======================
Tests: 23 (SUCCESSES: 22, FAILURES: 1, EXCEPTIONS: 0)
Failures: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0)
+---------------------------+------------+----------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+----------------------+----------+------------------------------------------+
| Dockerfile Security Check | DS002 | Image user is 'root' | HIGH | Last USER command in |
| | | | | Dockerfile should not be 'root' |
| | | | | -->avd.aquasec.com/appshield/ds002 |
+---------------------------+------------+----------------------+----------+------------------------------------------+
```
</details>
For more details, see [here][misconf].
[vulnerability]: ../vulnerability/scanning/index.md
[misconf]: ../misconfiguration/index.md

View File

@@ -0,0 +1,109 @@
# Troubleshooting
## Scan
### Timeout
!!! error
``` bash
$ trivy image ...
...
analyze error: timeout: context deadline exceeded
```
Your scan may time out. Java takes a particularly long time to scan. Try increasing the value of the ---timeout option such as `--timeout 15m`.
### Certification
!!! error
Error: x509: certificate signed by unknown authority
`TRIVY_INSECURE` can be used to allow insecure connections to a container registry when using SSL.
```
$ TRIVY_INSECURE=true trivy image [YOUR_IMAGE]
```
### GitHub Rate limiting
!!! error
``` bash
$ trivy image ...
...
API rate limit exceeded for xxx.xxx.xxx.xxx.
```
Specify GITHUB_TOKEN for authentication
https://developer.github.com/v3/#rate-limiting
```
$ GITHUB_TOKEN=XXXXXXXXXX trivy alpine:3.10
```
### Running in parallel takes same time as series run
When running trivy on multiple images simultaneously, it will take same time as running trivy in series.
This is because of a limitation of boltdb.
> Bolt obtains a file lock on the data file so multiple processes cannot open the same database at the same time. Opening an already open Bolt database will cause it to hang until the other process closes it.
Reference : [boltdb: Opening a database][boltdb].
[boltdb]: https://github.com/boltdb/bolt#opening-a-database
### Error downloading vulnerability DB
!!! error
FATAL failed to download vulnerability DB
If trivy is running behind corporate firewall try to whitelist urls below:
- api.github.com
- github.com
- github-releases.githubusercontent.com
## Homebrew
### Scope error
!!! error
Error: Your macOS keychain GitHub credentials do not have sufficient scope!
```
$ brew tap aquasecurity/trivy
Error: Your macOS keychain GitHub credentials do not have sufficient scope!
Scopes they need: none
Scopes they have:
Create a personal access token:
https://github.com/settings/tokens/new?scopes=gist,public_repo&description=Homebrew
echo 'export HOMEBREW_GITHUB_API_TOKEN=your_token_here' >> ~/.zshrc
```
Try:
```
$ printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase
```
### Already installed
!!! error
Error: aquasecurity/trivy/trivy 64 already installed
```
$ brew upgrade
...
Error: aquasecurity/trivy/trivy 64 already installed
```
Try:
```
$ brew unlink trivy && brew uninstall trivy
($ rm -rf /usr/local/Cellar/trivy/64)
$ brew install aquasecurity/trivy/trivy
```
## Others
### Unknown error
Try again with `--reset` option:
```
$ trivy image --reset
```

BIN
docs/imgs/client-server.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,397 @@
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "ribsikcWWSf8Aw4M6BOYJ",
"type": "rectangle",
"x": 528.53466796875,
"y": 377.9640197753906,
"width": 169.21945190429688,
"height": 104.2457275390625,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 698826281,
"version": 274,
"versionNonce": 942385065,
"isDeleted": false,
"boundElementIds": [
"eJn9MVaNlcyj8-YPfrBSY",
"JinTKutXOSTzURP969rwo"
]
},
{
"id": "GkrbG--OvBT9zJ-w8E5oQ",
"type": "ellipse",
"x": 496.9409637451172,
"y": 63.6944580078125,
"width": 215.20677185058594,
"height": 152.14088439941406,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 995070601,
"version": 595,
"versionNonce": 1870840679,
"isDeleted": false,
"boundElementIds": [
"eJn9MVaNlcyj8-YPfrBSY"
]
},
{
"id": "KPLvdnBVoU3U5XGhCch-x",
"type": "text",
"x": 585.4711608886719,
"y": 418.1110534667969,
"width": 48,
"height": 25,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 938497417,
"version": 119,
"versionNonce": 1368050313,
"isDeleted": false,
"boundElementIds": null,
"text": "Trivy",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 18
},
{
"id": "Ry65W-Cczzy8M9JsouEgZ",
"type": "text",
"x": 558.5760498046875,
"y": 114.79718017578125,
"width": 89,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1676815783,
"version": 368,
"versionNonce": 2034482823,
"isDeleted": false,
"boundElementIds": null,
"text": "GitHub\n(trivy-db)",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "center",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "eJn9MVaNlcyj8-YPfrBSY",
"type": "arrow",
"x": 608.6504180950899,
"y": 218.69285081443215,
"width": 0.45618097890837817,
"height": 154.16252445127046,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 1741763111,
"version": 1069,
"versionNonce": 2093125993,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
0.45618097890837817,
154.16252445127046
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "GkrbG--OvBT9zJ-w8E5oQ",
"focus": -0.035986229233252585,
"gap": 2.9120411440381986
},
"endBinding": {
"elementId": "ribsikcWWSf8Aw4M6BOYJ",
"focus": -0.04563780983822369,
"gap": 5.10864450968802
},
"startArrowhead": null,
"endArrowhead": "arrow"
},
{
"id": "2P02jU3j2eEc92lH0YSwm",
"type": "text",
"x": 637.9371185302734,
"y": 248.28482055664062,
"width": 327,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 501371753,
"version": 360,
"versionNonce": 326653351,
"isDeleted": false,
"boundElementIds": null,
"text": "1. Download Trivy DB\n(including vulnerability information)",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "zdNQvzJczyD9GSExNdKS1",
"type": "draw",
"x": 513.9153137207031,
"y": 461.14288330078125,
"width": 72.64572143554688,
"height": 72.18890380859375,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 1270145927,
"version": 459,
"versionNonce": 1094761993,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
-39.526153564453125,
16.35540771484375
],
[
-32.219512939453125,
72.170166015625
],
[
30.40386962890625,
72.18890380859375
],
[
33.11956787109375,
32.5743408203125
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "YK7xYiSKb1RwCCobsRAXm",
"type": "text",
"x": 391.5774230957031,
"y": 541.0142517089844,
"width": 280,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 2027931817,
"version": 510,
"versionNonce": 1538345895,
"isDeleted": false,
"boundElementIds": null,
"text": "3. Traverse directories\nand look for necessary files",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "Z_DiM_TKY2bBa4Q5VEWgI",
"type": "text",
"x": 684.9671020507812,
"y": 621.1561279296875,
"width": 160,
"height": 25,
"angle": 0,
"strokeColor": "#1864ab",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1365660617,
"version": 564,
"versionNonce": 2113117703,
"isDeleted": false,
"boundElementIds": null,
"text": "Local Filesystem",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 18
},
{
"id": "kqEATPhet5tYxzkEOFZng",
"type": "text",
"x": 571.0751342773438,
"y": 494.0994567871094,
"width": 254,
"height": 25,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 130557095,
"version": 654,
"versionNonce": 2037434313,
"isDeleted": false,
"boundElementIds": null,
"text": "4. Detect security issues",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 18
},
{
"id": "K0XdIaMYVmUP2kGc8Oe1O",
"type": "rectangle",
"x": 360.9377136230469,
"y": 357.07373046875,
"width": 495.45401000976557,
"height": 297.8450317382812,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1367853545,
"version": 339,
"versionNonce": 314224297,
"isDeleted": false,
"boundElementIds": null
},
{
"id": "_vOsyHICDRWn01MF3g7rB",
"type": "draw",
"x": 539.7380981445312,
"y": 501.50762939453125,
"width": 16.976165771484375,
"height": 16.45367431640625,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 1322966281,
"version": 82,
"versionNonce": 244034663,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
6.905059814453125,
-16.45367431640625
],
[
16.976165771484375,
-5.1099853515625
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
}
],
"appState": {
"gridSize": null,
"viewBackgroundColor": "#ffffff"
}
}

View File

@@ -0,0 +1,504 @@
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "ribsikcWWSf8Aw4M6BOYJ",
"type": "rectangle",
"x": 528.53466796875,
"y": 359.7196350097656,
"width": 169.21945190429688,
"height": 104.2457275390625,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 698826281,
"version": 235,
"versionNonce": 865905065,
"isDeleted": false,
"boundElementIds": [
"eJn9MVaNlcyj8-YPfrBSY",
"JinTKutXOSTzURP969rwo"
]
},
{
"id": "GkrbG--OvBT9zJ-w8E5oQ",
"type": "ellipse",
"x": 382.4654998779297,
"y": 70.28388977050781,
"width": 215.20677185058594,
"height": 152.14088439941406,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 995070601,
"version": 442,
"versionNonce": 1305668297,
"isDeleted": false,
"boundElementIds": [
"eJn9MVaNlcyj8-YPfrBSY"
]
},
{
"id": "KPLvdnBVoU3U5XGhCch-x",
"type": "text",
"x": 585.4711608886719,
"y": 399.8666687011719,
"width": 48,
"height": 25,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 938497417,
"version": 82,
"versionNonce": 463601353,
"isDeleted": false,
"boundElementIds": null,
"text": "Trivy",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 18
},
{
"id": "Ry65W-Cczzy8M9JsouEgZ",
"type": "text",
"x": 445.5017395019531,
"y": 121.72871398925781,
"width": 89,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1676815783,
"version": 306,
"versionNonce": 1721298503,
"isDeleted": false,
"boundElementIds": null,
"text": "GitHub\n(trivy-db)",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "center",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "eJn9MVaNlcyj8-YPfrBSY",
"type": "arrow",
"x": 497.981827043938,
"y": 226.98470679602065,
"width": 90.39040277767413,
"height": 127.08286800676547,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 1741763111,
"version": 591,
"versionNonce": 1564262983,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
90.39040277767413,
127.08286800676547
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "GkrbG--OvBT9zJ-w8E5oQ",
"focus": 0.41046776258752976,
"gap": 4.7596344319156
},
"endBinding": {
"elementId": "ribsikcWWSf8Aw4M6BOYJ",
"focus": 0.1341309277800711,
"gap": 5.652060206979513
},
"startArrowhead": null,
"endArrowhead": "arrow"
},
{
"id": "2P02jU3j2eEc92lH0YSwm",
"type": "text",
"x": 181.22366333007812,
"y": 252.094970703125,
"width": 327,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 501371753,
"version": 281,
"versionNonce": 1175555431,
"isDeleted": false,
"boundElementIds": null,
"text": "1. Download Trivy DB\n(including vulnerability information)",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "P3WUTj2Q9se-JE7t3AUeq",
"type": "ellipse",
"x": 635.5376052856445,
"y": 68.77783966064453,
"width": 286.11024475097656,
"height": 152.14088439941406,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "#228be6",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1633931305,
"version": 684,
"versionNonce": 1011691465,
"isDeleted": false,
"boundElementIds": [
"eJn9MVaNlcyj8-YPfrBSY",
"JinTKutXOSTzURP969rwo"
]
},
{
"id": "2q_e-oMWU2gv7ZEClixAx",
"type": "text",
"x": 680.7248458862305,
"y": 102.90502166748047,
"width": 186,
"height": 74,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 866083559,
"version": 676,
"versionNonce": 1669555559,
"isDeleted": false,
"boundElementIds": null,
"text": "Container Registry\nor\nContainer Engine",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "center",
"verticalAlign": "top",
"baseline": 67
},
{
"id": "JinTKutXOSTzURP969rwo",
"type": "arrow",
"x": 725.3393330640303,
"y": 216.94283962355922,
"width": 69.9915382406898,
"height": 134.02688987715163,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 1348821927,
"version": 938,
"versionNonce": 1580551495,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
-69.9915382406898,
134.02688987715163
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "P3WUTj2Q9se-JE7t3AUeq",
"focus": 0.10510087993199528,
"gap": 1.4587528984692284
},
"endBinding": {
"elementId": "ribsikcWWSf8Aw4M6BOYJ",
"focus": 0.0931277668871816,
"gap": 8.74990550905477
},
"startArrowhead": null,
"endArrowhead": "arrow"
},
{
"id": "kHnEt-AjbEzMxB61VSDc2",
"type": "text",
"x": 723.4168395996094,
"y": 258.063232421875,
"width": 295,
"height": 25,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1080814281,
"version": 613,
"versionNonce": 1064224615,
"isDeleted": false,
"boundElementIds": null,
"text": "2. Pull missing layers in cache",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 18
},
{
"id": "zdNQvzJczyD9GSExNdKS1",
"type": "draw",
"x": 524.4000854492188,
"y": 435.25982666015625,
"width": 72.64572143554688,
"height": 72.18890380859375,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 1270145927,
"version": 331,
"versionNonce": 1090245193,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
-39.526153564453125,
16.35540771484375
],
[
-32.219512939453125,
72.170166015625
],
[
30.40386962890625,
72.18890380859375
],
[
33.11956787109375,
32.5743408203125
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "13A9Y6sL_9DQ1KskiX5Oj",
"type": "draw",
"x": 545.8597412109375,
"y": 483.20318603515625,
"width": 25.76263427734375,
"height": 16.2581787109375,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 788909033,
"version": 85,
"versionNonce": 991433415,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
13.24993896484375,
-16.2581787109375
],
[
25.76263427734375,
-5.01812744140625
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "YK7xYiSKb1RwCCobsRAXm",
"type": "text",
"x": 261.88555908203125,
"y": 379.65887451171875,
"width": 249,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 2027931817,
"version": 255,
"versionNonce": 809279785,
"isDeleted": false,
"boundElementIds": null,
"text": "3. Analyze layers &\nStore informatin in cache",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "Z_DiM_TKY2bBa4Q5VEWgI",
"type": "text",
"x": 404.58673095703125,
"y": 522.828125,
"width": 144,
"height": 25,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1365660617,
"version": 327,
"versionNonce": 2016944615,
"isDeleted": false,
"boundElementIds": null,
"text": "4. Apply layers",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 18
},
{
"id": "kqEATPhet5tYxzkEOFZng",
"type": "text",
"x": 598.8711547851562,
"y": 480.22222900390625,
"width": 257,
"height": 25,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 130557095,
"version": 539,
"versionNonce": 562048487,
"isDeleted": false,
"boundElementIds": null,
"text": "5. Detect security issues",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 18
}
],
"appState": {
"gridSize": null,
"viewBackgroundColor": "#ffffff"
}
}

View File

@@ -0,0 +1,352 @@
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"type": "rectangle",
"version": 573,
"versionNonce": 2034670720,
"isDeleted": false,
"id": "BkXuq_6BxgqZGZWc8oCtu",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 599.211669921875,
"y": 376.32061767578125,
"strokeColor": "#000000",
"backgroundColor": "#fd7e14",
"width": 867.8921508789062,
"height": 151.39703369140625,
"seed": 1632394695,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 572,
"versionNonce": 425683840,
"isDeleted": false,
"id": "YQURTHNPSe05RPSlYRcok",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 983.89404296875,
"y": 399.98724365234375,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 88,
"height": 45,
"seed": 891391049,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 36,
"fontFamily": 1,
"text": "Trivy",
"baseline": 32,
"textAlign": "left",
"verticalAlign": "top"
},
{
"type": "text",
"version": 822,
"versionNonce": 1061096576,
"isDeleted": false,
"id": "6dpF2EyZBtYgO6MrvGj0-",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 771.2554931640625,
"y": 469.7777099609375,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 507,
"height": 35,
"seed": 687997545,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Vulnerability/Misconfiguration Scanner",
"baseline": 25,
"textAlign": "left",
"verticalAlign": "top"
},
{
"type": "rectangle",
"version": 763,
"versionNonce": 560331648,
"isDeleted": false,
"id": "cpnTMy7L2AUg9IDJppF4H",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 602.28369140625,
"y": 258.8445587158203,
"strokeColor": "#000000",
"backgroundColor": "#fab005",
"width": 397.493408203125,
"height": 103.28388977050778,
"seed": 77164935,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 1072,
"versionNonce": 212434048,
"isDeleted": false,
"id": "9-blmNVtLesthMSY_f60t",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 630.9301147460938,
"y": 292.4002990722656,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 331,
"height": 35,
"seed": 860091815,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Infrastructure as Code",
"baseline": 25,
"textAlign": "center",
"verticalAlign": "top"
},
{
"type": "rectangle",
"version": 1194,
"versionNonce": 131337088,
"isDeleted": false,
"id": "gugZxhi7ThlcjWY_MFO7q",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1021.5928955078125,
"y": 261.56090545654297,
"strokeColor": "#000000",
"backgroundColor": "#be4bdb",
"width": 441.0702514648438,
"height": 99.05134582519533,
"seed": 1232790121,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 1270,
"versionNonce": 591785088,
"isDeleted": false,
"id": "K48gtpesBxIGJxLTnI2CB",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1173.3179931640625,
"y": 294.12510681152344,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 137,
"height": 35,
"seed": 449264361,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Filesystem",
"baseline": 25,
"textAlign": "center",
"verticalAlign": "top"
},
{
"type": "rectangle",
"version": 1319,
"versionNonce": 1264839808,
"isDeleted": false,
"id": "BYJwfkhd1BilbLQGc973f",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1233.3157348632812,
"y": 168.29967880249023,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 229.03393554687523,
"height": 77.80606079101562,
"seed": 1923498546,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 659,
"versionNonce": 2122259328,
"isDeleted": false,
"id": "eedUyCpr8i1aY_3PHsHAB",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1241.1352844238281,
"y": 191.2939567565918,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 216,
"height": 35,
"seed": 595309038,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Misconfiguration",
"baseline": 25,
"textAlign": "center",
"verticalAlign": "middle"
},
{
"type": "rectangle",
"version": 1397,
"versionNonce": 20077696,
"isDeleted": false,
"id": "SPkrBrH6DGvkgQXtZQjIJ",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1023.8157043457031,
"y": 168.7816276550293,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"width": 200.7496337890626,
"height": 77.80606079101562,
"seed": 1896460914,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 840,
"versionNonce": 655338368,
"isDeleted": false,
"id": "n06MNIqirDmVZBkDg_UPV",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1040.526611328125,
"y": 194.3111228942871,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 160,
"height": 35,
"seed": 1131832750,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Vulnerability",
"baseline": 25,
"textAlign": "center",
"verticalAlign": "middle"
},
{
"type": "rectangle",
"version": 1441,
"versionNonce": 1393118080,
"isDeleted": false,
"id": "8SHSNGf7PNddFLi2ZA3Vi",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 673.6463928222656,
"y": 167.8159294128418,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 278.48516845703136,
"height": 77.80606079101562,
"seed": 1986948530,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 851,
"versionNonce": 2114620544,
"isDeleted": false,
"id": "3Z5w3RXdgpvP43dlHqq26",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 701.5146789550781,
"y": 189.60757064819336,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 216,
"height": 35,
"seed": 1077804654,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Misconfiguration",
"baseline": 25,
"textAlign": "center",
"verticalAlign": "middle"
}
],
"appState": {
"gridSize": null,
"viewBackgroundColor": "#ffffff"
}
}

View File

@@ -0,0 +1,508 @@
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"type": "rectangle",
"version": 476,
"versionNonce": 916788210,
"isDeleted": false,
"id": "BkXuq_6BxgqZGZWc8oCtu",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 599.211669921875,
"y": 376.32061767578125,
"strokeColor": "#000000",
"backgroundColor": "#fd7e14",
"width": 1076.4584350585938,
"height": 151.39703369140625,
"seed": 1632394695,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 423,
"versionNonce": 931200686,
"isDeleted": false,
"id": "YQURTHNPSe05RPSlYRcok",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1119.1937866210938,
"y": 403.56756591796875,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 88,
"height": 45,
"seed": 891391049,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 36,
"fontFamily": 1,
"text": "Trivy",
"baseline": 32,
"textAlign": "left",
"verticalAlign": "top"
},
{
"type": "text",
"version": 758,
"versionNonce": 813811122,
"isDeleted": false,
"id": "6dpF2EyZBtYgO6MrvGj0-",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 922.1328735351562,
"y": 470.18975830078125,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 507,
"height": 35,
"seed": 687997545,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Vulnerability/Misconfiguration Scanner",
"baseline": 25,
"textAlign": "left",
"verticalAlign": "top"
},
{
"type": "rectangle",
"version": 595,
"versionNonce": 1705780846,
"isDeleted": false,
"id": "cpnTMy7L2AUg9IDJppF4H",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 597.4796142578125,
"y": 258.9286651611328,
"strokeColor": "#000000",
"backgroundColor": "#fab005",
"width": 349.1224975585937,
"height": 103.28388977050778,
"seed": 77164935,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 921,
"versionNonce": 929185650,
"isDeleted": false,
"id": "9-blmNVtLesthMSY_f60t",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 655.6057739257812,
"y": 292.4844055175781,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 238,
"height": 35,
"seed": 860091815,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Container Images",
"baseline": 25,
"textAlign": "center",
"verticalAlign": "top"
},
{
"type": "rectangle",
"version": 853,
"versionNonce": 377039022,
"isDeleted": false,
"id": "gugZxhi7ThlcjWY_MFO7q",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 955.929443359375,
"y": 262.11351776123047,
"strokeColor": "#000000",
"backgroundColor": "#be4bdb",
"width": 359.85211181640625,
"height": 99.05134582519533,
"seed": 1232790121,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 1065,
"versionNonce": 126714162,
"isDeleted": false,
"id": "K48gtpesBxIGJxLTnI2CB",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1064.449462890625,
"y": 296.9230194091797,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 137,
"height": 35,
"seed": 449264361,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Filesystem",
"baseline": 25,
"textAlign": "center",
"verticalAlign": "top"
},
{
"type": "rectangle",
"version": 896,
"versionNonce": 585884398,
"isDeleted": false,
"id": "La6f87LDZ0uEIZB947bXo",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1329.0839233398438,
"y": 264.9097213745117,
"strokeColor": "#000000",
"backgroundColor": "#12b886",
"width": 346.5517578125,
"height": 96.3990020751953,
"seed": 2005637801,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 1186,
"versionNonce": 1013615346,
"isDeleted": false,
"id": "aOgRPVQ81jhOfkvzjWTMF",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1392.300048828125,
"y": 294.1288604736328,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 223,
"height": 35,
"seed": 1284472935,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Git Repositories",
"baseline": 25,
"textAlign": "center",
"verticalAlign": "top"
},
{
"type": "rectangle",
"version": 974,
"versionNonce": 1011959534,
"isDeleted": false,
"id": "BYJwfkhd1BilbLQGc973f",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1141.5093994140625,
"y": 171.09759140014648,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 169.93957519531259,
"height": 77.80606079101562,
"seed": 1923498546,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 403,
"versionNonce": 1635608306,
"isDeleted": false,
"id": "eedUyCpr8i1aY_3PHsHAB",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1149.8379821777344,
"y": 197.31159591674805,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 155,
"height": 25,
"seed": 595309038,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 20,
"fontFamily": 1,
"text": "Misconfiguration",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle"
},
{
"type": "rectangle",
"version": 1035,
"versionNonce": 1646453614,
"isDeleted": false,
"id": "SPkrBrH6DGvkgQXtZQjIJ",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 959.9851989746094,
"y": 170.4835319519043,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"width": 169.93957519531259,
"height": 77.80606079101562,
"seed": 1896460914,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 532,
"versionNonce": 1887556210,
"isDeleted": false,
"id": "n06MNIqirDmVZBkDg_UPV",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 988.8137817382812,
"y": 196.69753646850586,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 114,
"height": 25,
"seed": 1131832750,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 20,
"fontFamily": 1,
"text": "Vulnerability",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle"
},
{
"type": "rectangle",
"version": 1072,
"versionNonce": 789595566,
"isDeleted": false,
"id": "0JP6OL7EFfoH4E4vFARFl",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1508.9087371826172,
"y": 170.7038917541504,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 169.93957519531259,
"height": 77.80606079101562,
"seed": 101784622,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 496,
"versionNonce": 1027781682,
"isDeleted": false,
"id": "jRmlh5MZuRKm3FtbC6qdZ",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1517.237319946289,
"y": 196.91789627075195,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 155,
"height": 25,
"seed": 1950385586,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 20,
"fontFamily": 1,
"text": "Misconfiguration",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle"
},
{
"type": "rectangle",
"version": 1133,
"versionNonce": 882335726,
"isDeleted": false,
"id": "EQRF92xU4o9CfeHHvbd-a",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1327.384536743164,
"y": 170.0898323059082,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"width": 169.93957519531259,
"height": 77.80606079101562,
"seed": 1379493486,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 569,
"versionNonce": 184638962,
"isDeleted": false,
"id": "_04YR8geM-ar9vZhNZtSj",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 1356.213119506836,
"y": 196.30383682250977,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 114,
"height": 25,
"seed": 357105522,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 20,
"fontFamily": 1,
"text": "Vulnerability",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle"
},
{
"type": "rectangle",
"version": 1215,
"versionNonce": 650195502,
"isDeleted": false,
"id": "8SHSNGf7PNddFLi2ZA3Vi",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 599.9767150878906,
"y": 169.0025749206543,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"width": 344.1738281250001,
"height": 77.80606079101562,
"seed": 1986948530,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": []
},
{
"type": "text",
"version": 680,
"versionNonce": 113561522,
"isDeleted": false,
"id": "3Z5w3RXdgpvP43dlHqq26",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 700.3721618652344,
"y": 190.79421615600586,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 160,
"height": 35,
"seed": 1077804654,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElementIds": [],
"fontSize": 28,
"fontFamily": 1,
"text": "Vulnerability",
"baseline": 25,
"textAlign": "center",
"verticalAlign": "middle"
}
],
"appState": {
"gridSize": null,
"viewBackgroundColor": "#ffffff"
}
}

View File

@@ -0,0 +1,631 @@
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "ribsikcWWSf8Aw4M6BOYJ",
"type": "rectangle",
"x": 458.6370544433594,
"y": 379.5105285644531,
"width": 169.21945190429688,
"height": 104.2457275390625,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 698826281,
"version": 360,
"versionNonce": 899087049,
"isDeleted": false,
"boundElementIds": [
"eJn9MVaNlcyj8-YPfrBSY",
"JinTKutXOSTzURP969rwo",
"nXkZQsrtjmNqPM6SmPxrc"
]
},
{
"id": "GkrbG--OvBT9zJ-w8E5oQ",
"type": "ellipse",
"x": 427.04335021972656,
"y": 65.240966796875,
"width": 215.20677185058594,
"height": 152.14088439941406,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 995070601,
"version": 679,
"versionNonce": 1333899847,
"isDeleted": false,
"boundElementIds": [
"eJn9MVaNlcyj8-YPfrBSY"
]
},
{
"id": "KPLvdnBVoU3U5XGhCch-x",
"type": "text",
"x": 515.5735473632812,
"y": 419.6575622558594,
"width": 48,
"height": 25,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 938497417,
"version": 202,
"versionNonce": 677296553,
"isDeleted": false,
"boundElementIds": null,
"text": "Trivy",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 18
},
{
"id": "Ry65W-Cczzy8M9JsouEgZ",
"type": "text",
"x": 488.6784362792969,
"y": 116.34368896484375,
"width": 89,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1676815783,
"version": 451,
"versionNonce": 490852711,
"isDeleted": false,
"boundElementIds": null,
"text": "GitHub\n(trivy-db)",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "center",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "eJn9MVaNlcyj8-YPfrBSY",
"type": "arrow",
"x": 538.7528045696993,
"y": 220.23935960349465,
"width": 0.45618097890837817,
"height": 154.16252445127046,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 1741763111,
"version": 1292,
"versionNonce": 764124297,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
0.45618097890837817,
154.16252445127046
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "GkrbG--OvBT9zJ-w8E5oQ",
"focus": -0.03598869040285281,
"gap": 2.911871895302724
},
"endBinding": {
"elementId": "ribsikcWWSf8Aw4M6BOYJ",
"focus": -0.04563780983822428,
"gap": 5.10864450968802
},
"startArrowhead": null,
"endArrowhead": "arrow"
},
{
"id": "2P02jU3j2eEc92lH0YSwm",
"type": "text",
"x": 190.61294555664062,
"y": 255.17030334472656,
"width": 327,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 501371753,
"version": 569,
"versionNonce": 2012286087,
"isDeleted": false,
"boundElementIds": null,
"text": "1. Download Trivy DB\n(including vulnerability information)",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "YK7xYiSKb1RwCCobsRAXm",
"type": "text",
"x": 588.7474975585938,
"y": 488.1255798339844,
"width": 280,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 2027931817,
"version": 628,
"versionNonce": 30461609,
"isDeleted": false,
"boundElementIds": null,
"text": "3. Traverse directories\nand look for necessary files",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "Z_DiM_TKY2bBa4Q5VEWgI",
"type": "text",
"x": 877.162353515625,
"y": 618.5094604492188,
"width": 160,
"height": 25,
"angle": 0,
"strokeColor": "#1864ab",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1365660617,
"version": 647,
"versionNonce": 760156423,
"isDeleted": false,
"boundElementIds": null,
"text": "Local Filesystem",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 18
},
{
"id": "K0XdIaMYVmUP2kGc8Oe1O",
"type": "rectangle",
"x": 360.9377136230469,
"y": 357.07373046875,
"width": 695.5669860839844,
"height": 297.8450317382812,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1367853545,
"version": 417,
"versionNonce": 1598611913,
"isDeleted": false,
"boundElementIds": null
},
{
"id": "9cBakj4Z-FKXwYYdweyW1",
"type": "ellipse",
"x": 774.155647277832,
"y": 56.2083175778389,
"width": 215.20677185058594,
"height": 152.14088439941406,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "#4c6ef5",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1010956009,
"version": 673,
"versionNonce": 825999529,
"isDeleted": false,
"boundElementIds": [
"eJn9MVaNlcyj8-YPfrBSY",
"vGa683rpZ9AztfvrVvEyD"
]
},
{
"id": "5y2AKGYkXhCldwQOecwl6",
"type": "text",
"x": 806.7732543945312,
"y": 106.18511658906937,
"width": 147,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1289267591,
"version": 83,
"versionNonce": 1127203721,
"isDeleted": false,
"boundElementIds": null,
"text": "Remote\nGit Repository",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "center",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "vGa683rpZ9AztfvrVvEyD",
"type": "arrow",
"x": 884.4609964246083,
"y": 220.86864013003574,
"width": 0.45618097890837817,
"height": 154.16252445127046,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 1762737031,
"version": 1200,
"versionNonce": 457627015,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
0.45618097890837817,
154.16252445127046
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "9cBakj4Z-FKXwYYdweyW1",
"focus": -0.022674122391029432,
"gap": 12.541597764893623
},
"endBinding": {
"elementId": "4_okkFmweGK_2DBTmRp4i",
"focus": 0.047202684587572305,
"gap": 3.295263653270979
},
"startArrowhead": null,
"endArrowhead": "arrow"
},
{
"id": "4_okkFmweGK_2DBTmRp4i",
"type": "rectangle",
"x": 796.4703521728516,
"y": 378.3264282345772,
"width": 169.21945190429688,
"height": 104.2457275390625,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "#4c6ef5",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 853231143,
"version": 387,
"versionNonce": 1096837737,
"isDeleted": false,
"boundElementIds": [
"eJn9MVaNlcyj8-YPfrBSY",
"JinTKutXOSTzURP969rwo",
"vGa683rpZ9AztfvrVvEyD",
"nXkZQsrtjmNqPM6SmPxrc"
]
},
{
"id": "zvgwnUmSms_XcbMDespIP",
"type": "text",
"x": 847.181640625,
"y": 404.5675476193428,
"width": 72,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1769283399,
"version": 307,
"versionNonce": 1392544935,
"isDeleted": false,
"boundElementIds": null,
"text": "Git\nProject",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "center",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "f0kayc0oXZazxPJKizaM1",
"type": "text",
"x": 916.8968811035156,
"y": 253.85886842012405,
"width": 258,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 49135625,
"version": 649,
"versionNonce": 1150891337,
"isDeleted": false,
"boundElementIds": null,
"text": "2. Clone Git Repository\n to local temp directory",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 43
},
{
"id": "nXkZQsrtjmNqPM6SmPxrc",
"type": "arrow",
"x": 640.9059448242188,
"y": 429.34260255098343,
"width": 146.4581298828125,
"height": 0.93572998046875,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 2075020231,
"version": 93,
"versionNonce": 1421238215,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
146.4581298828125,
-0.93572998046875
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "ribsikcWWSf8Aw4M6BOYJ",
"focus": -0.031650787945314215,
"gap": 13.0494384765625
},
"endBinding": {
"elementId": "4_okkFmweGK_2DBTmRp4i",
"focus": 0.050151997400131744,
"gap": 9.106277465820312
},
"startArrowhead": null,
"endArrowhead": "arrow"
},
{
"id": "OPRFQTrsfmF5a7us-mxkI",
"type": "draw",
"x": 446.98912048339844,
"y": 467.28928834199905,
"width": 72.64572143554688,
"height": 72.18890380859375,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 1541066697,
"version": 504,
"versionNonce": 1115999975,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
-39.526153564453125,
16.35540771484375
],
[
-32.219512939453125,
72.170166015625
],
[
30.40386962890625,
72.18890380859375
],
[
33.11956787109375,
32.5743408203125
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "QzKnYI7o5Yxg_7szebL6Z",
"type": "draw",
"x": 472.81190490722656,
"y": 507.65403443574905,
"width": 16.976165771484375,
"height": 16.45367431640625,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 2144447815,
"version": 127,
"versionNonce": 807483145,
"isDeleted": false,
"boundElementIds": null,
"points": [
[
0,
0
],
[
6.905059814453125,
-16.45367431640625
],
[
16.976165771484375,
-5.1099853515625
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "qqbEan2u1uU3loTdTvQ4B",
"type": "text",
"x": 376.983642578125,
"y": 561.5254028439522,
"width": 254,
"height": 25,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1619652615,
"version": 718,
"versionNonce": 1190681095,
"isDeleted": false,
"boundElementIds": null,
"text": "4. Detect security issues",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 18
}
],
"appState": {
"gridSize": null,
"viewBackgroundColor": "#ffffff"
}
}

BIN
docs/imgs/fs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
docs/imgs/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

42
docs/imgs/logo-white.svg Normal file
View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 25.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="_x30_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="273.277px" height="312.341px" viewBox="0 0 273.277 312.341" enable-background="new 0 0 273.277 312.341"
xml:space="preserve">
<g display="none">
<g display="inline">
<path id="XMLID_238_" fill="#F6921E" d="M754.885-766.991c-21.65-2.012-36.066-7.554-55.471-17.526
c-34.765-17.865-71.511-25.264-109.482-29.708c-7.552-0.884-15.107-1.971-22.551-3.503c-30.631-6.306-41.022-20.345-31.022-50.036
c8.852-26.284,8.129-51.529,4.062-77.9c-3.886-25.202,5.516-42.009,30.232-49.091c26.958-7.724,46.055-23.279,62.176-45.683
c22.552-31.342,50.43-32.387,75.678-2.592c13.29,15.683,24.5,33.868,33.206,52.53c15.16,32.498,33.741,62.384,56.465,90.012
c8.997,10.939,16.637,23.055,24.312,35.009c14.177,22.079,18.196,45.43,4.449,69.026
C812.894-772.342,790.61-767.179,754.885-766.991z"/>
</g>
</g>
<g>
<path fill="#FFFFFF" d="M134.241,178.01c-14.966-6.734-23.812-21.134-23.341-36.425l-31.99-18.474
c-2.386,17.699,1.426,36.211,11.026,52.252c10.219,17.074,24.977,29.791,44.305,37.154V178.01L134.241,178.01z"/>
<path fill="#FFFFFF" d="M134.241,256.256v-39.66c-20.701-7.561-36.56-21.171-47.443-39.355
c-10.295-17.201-14.212-37.138-11.295-56.097l-29.733-17.17C28.736,166.142,66.954,232.356,134.241,256.256z"/>
<path fill="#FFFFFF" d="M138.623,216.235v40.021c66.042-24.455,105.685-90.553,88.941-152.077l-29.572,17.228
c3.69,20.45,0.473,40.386-9.42,57.065C178.408,195.609,160.66,208.469,138.623,216.235z"/>
<path fill="#FFFFFF" d="M162.732,141.756c0.133,14.847-8.593,27.909-24.109,36.253v34.508c20.619-7.517,37.273-19.844,46.802-35.91
c9.226-15.555,12.364-34.116,9.199-53.238L162.732,141.756z"/>
<path fill="#FFFFFF" d="M167.338,88.702c12.474,6.083,22.634,15.828,29.381,28.179c0.089,0.163,0.172,0.332,0.26,0.496
l29.007-16.751c-0.461-0.581-0.905-1.169-1.269-1.758c-10.641-17.213-24.699-30.163-41.784-38.496
c-48.231-23.521-107.332-5.786-135.568,40.317l28.937,16.703C95.95,85.802,135.501,73.176,167.338,88.702z"/>
<path fill="#FFFFFF" d="M114.557,143.696c0.395,12.594,7.426,24.256,19.684,30.297v-18.6L114.557,143.696z"/>
<path fill="#FFFFFF" d="M158.428,139.64c-0.105-0.216-0.208-0.433-0.321-0.645c-2.395-4.49-6.021-8.015-10.487-10.193
c-11.485-5.598-25.573-0.979-32.947,10.739l21.968,12.68L158.428,139.64z"/>
<path fill="#FFFFFF" d="M149.224,125.515c5.164,2.519,9.351,6.585,12.11,11.758c0.094,0.175,0.175,0.358,0.263,0.537l32.213-18.602
c-0.101-0.19-0.198-0.384-0.301-0.572c-6.381-11.683-15.985-20.898-27.774-26.646c-30.119-14.69-67.578-2.707-86.265,27.232
l32.037,18.492C119.857,124.323,136.011,119.072,149.224,125.515z"/>
<path fill="#FFFFFF" d="M264.965,82.39l-34.137,19.888c18.006,64.017-23.286,133.016-92.204,157.866v43.341l126.341-73.633V82.39z"
/>
<path fill="#FFFFFF" d="M8.319,82.347v147.466l125.922,73.672v-43.341c-70.174-24.263-110.029-93.387-91.739-158.058L9.921,83.271
L8.319,82.347z"/>
<path fill="#FFFFFF" d="M138.623,155.413v18.581c12.219-7.071,19.799-18.339,20.386-30.068L138.623,155.413z"/>
<path fill="#FFFFFF" d="M10.129,79.195l3.72,2.148L44.196,98.86c29.195-47.754,90.394-66.13,140.341-41.775
c17.716,8.64,32.282,22.051,43.292,39.859c0.349,0.563,0.835,1.182,1.362,1.832l33.939-19.599L136.643,6.134L10.129,79.195z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
docs/imgs/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
docs/imgs/misconf-demo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

BIN
docs/imgs/misconf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
docs/imgs/overview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 KiB

BIN
docs/imgs/repo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

BIN
docs/imgs/vuln-demo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
docs/imgs/vulnerability.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 846 KiB

49
docs/index.md Normal file
View File

@@ -0,0 +1,49 @@
---
hide:
- navigation
- toc
---
![logo](imgs/logo.png){ align=left }
`Trivy` (`tri` pronounced like **tri**gger, `vy` pronounced like en**vy**) is a simple and comprehensive [vulnerability][vulnerability]/[misconfiguration][misconf] scanner for containers and other artifacts.
A software vulnerability is a glitch, flaw, or weakness present in the software or in an Operating System.
`Trivy` detects vulnerabilities of [OS packages][os] (Alpine, RHEL, CentOS, etc.) and [language-specific packages][lang] (Bundler, Composer, npm, yarn, etc.).
In addition, `Trivy` scans [Infrastructure as Code (IaC) files][iac] such as Terraform and Kubernetes, to detect potential configuration issues that expose your deployments to the risk of attack.
`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.
<div style="text-align: center">
<img src="imgs/overview.png" width="800">
</div>
<div style="text-align: center; margin-top: 150px">
<h1 id="demo">Demo</h1>
</div>
<figure style="text-aligh: center">
<img src="imgs/vuln-demo.gif" width="1000">
<figcaption>Demo: Vulnerability Detection</figcaption>
</figure>
<figure style="text-aligh: center">
<img src="imgs/misconf-demo.gif" width="1000">
<figcaption>Demo: Misconfiguration Detection</figcaption>
</figure>
---
Trivy is an [Aqua Security][aquasec] open source project.
Learn about our open source work and portfolio [here][oss].
Contact us about any matter by opening a GitHub Discussion [here][discussions]
[vulnerability]: vulnerability/scanning/index.md
[misconf]: misconfiguration/index.md
[os]: vulnerability/detection/os.md
[lang]: vulnerability/detection/language.md
[iac]: misconfiguration/iac.md
[aquasec]: https://aquasec.com
[oss]: https://www.aquasec.com/products/open-source-projects/
[discussions]: https://github.com/aquasecurity/trivy/discussions

View File

@@ -0,0 +1,43 @@
# vs Conftest
[Conftest][conftest] is a really nice tool to help you write tests against structured configuration data.
Misconfiguration detection in Trivy is heavily inspired by Conftest and provides similar features Conftest has.
This section describes the differences between Trivy and Conftest.
| Feature | Trivy | Conftest |
| --------------------------- | -------------------- | -------------------- |
| Support Rego Language | :material-check: | :material-check: |
| Built-in Policies | :material-check: | :material-close: |
| Custom Policies | :material-check: | :material-check: |
| Custom Data | :material-check: | :material-check: |
| Combine | :material-check: | :material-check: |
| Combine per Policy | :material-check: | :material-close: |
| Policy Input Selector[^1] | :material-check: | :material-close: |
| Policy Metadata[^2] | :material-check: | :material-close:[^3] |
| Filtering by Severity | :material-check: | :material-close: |
| Rule-based Exceptions | :material-check: | :material-check: |
| Namespace-based Exceptions | :material-check: | :material-close: |
| Sharing Policies | :material-close: | :material-check: |
| Show Successes | :material-check: | :material-close: |
| Flexible Exit Code | :material-check: | :material-close: |
| Rego Unit Tests | :material-close:[^4] | :material-check: |
| Go Testing | :material-check: | :material-close: |
| Verbose Trace | :material-check: | :material-check: |
| Supported Formats | 6 formats[^5] | 14 formats[^6] |
Trivy offers built-in policies and a variety of options, while Conftest only supports custom policies.
In other words, Conftest is simpler and lighter.
Conftest is a general testing tool for configuration files, and Trivy is more security-focused.
People who need an out-of-the-box misconfiguration scanner should use Trivy.
People who don't need built-in policies and write your policies should use Conftest.
[^1]: Pass only the types of configuration file as input, specified in selector
[^2]: To enrich the results such as ID, Title, Description, etc.
[^3]: Conftest supports [structured errors in rules][conftest-structured], but they are free format and not natively supported by Conftest.
[^4]: Trivy is not able to run `*_test.rego` like `conftest verify`.
[^5]: Dockerfile, HCL, HCL2, JSON, TOML, and YAML
[^6]: CUE, Dockerfile, EDN, HCL, HCL2, HOCON, Ignore files, INI, JSON, Jsonnet, TOML, VCL, XML, and YAML
[conftest-structured]: https://github.com/open-policy-agent/conftest/pull/243
[conftest]: https://github.com/open-policy-agent/conftest

View File

@@ -0,0 +1,26 @@
# vs tfsec
[tfsec][tfsec] uses static analysis of your Terraform templates to spot potential security issues.
Trivy uses tfsec internally to scan Terraform HCL files, but Trivy doesn't support some features provided by tfsec.
This section describes the differences between Trivy and tfsec.
| Feature | Trivy | tfsec |
| --------------------------- | --------------------------------------- | -------------------- |
| Built-in Policies | :material-check: | :material-check: |
| Custom Policies | Rego[^1] | JSON and YAML |
| Policy Metadata[^2] | :material-check: | :material-check: |
| Show Successes | :material-check: | :material-check: |
| Disable Policies | :material-check: | :material-check: |
| Show Issue Lines | :material-close: | :material-check: |
| Support .tfvars | :material-close: | :material-check: |
| View Statistics | :material-close: | :material-check: |
| Filtering by Severity | :material-check: | :material-close: |
| Supported Formats | Dockerfile, JSON, YAML, Terraform, etc. | Terraform |
[^1]: Terraform HCL files are not supported.
[^2]: To enrich the results such as ID, Title, Description, Severity, etc.
tfsec is designed for Terraform.
People who use only Terraform should use tfsec.
People who want to scan a wide range of configuration files should use Trivy.
[tfsec]: https://github.com/tfsec/tfsec

View File

@@ -0,0 +1,44 @@
# Combined input
## Overview
Trivy usually scans each configuration file individually.
Sometimes it might be useful to compare values from different configuration files simultaneously.
When `combine` is set to true, all config files under the specified directory are combined into one input data structure.
!!! example
```
__rego_input__ := {
"combine": false,
}
```
In "combine" mode, the `input` document becomes an array, where each element is an object with two fields:
- `"path": "path/to/file"`: the relative file path of the respective file
- `"contents": ...`: the parsed content of the respective file
Now you can ensure that duplicate values match across the entirety of your configuration files.
## Return value
In "combine" mode, the `deny` entrypoint must return an object with two keys
`filepath` (required)
: the relative file path of the file being evaluated
`msg` (required)
: the message describing an issue
!!! example
```
deny[res] {
resource := input[i].contents
... some logic ...
res := {
"filepath": input[i].path,
"msg": "something bad",
}
}
```

View File

@@ -0,0 +1,35 @@
# Custom Data
Custom policies may require additional data in order to determine an answer.
For example, an allowed list of resources that can be created.
Instead of hardcoding this information inside of your policy, Trivy allows passing paths to data files with the `--data` flag.
Given the following yaml file:
```bash
$ cd examples/misconf/custom-data
$ cat data/ports.yaml [~/src/github.com/aquasecurity/trivy/examples/misconf/custom-data]
services:
ports:
- "20"
- "20/tcp"
- "20/udp"
- "23"
- "23/tcp"
```
This can be imported into your policy:
```rego
import data.services
ports := services.ports
```
Then, you need to pass data paths through `--data` option.
Trivy recursively searches the specified paths for JSON (`*.json`) and YAML (`*.yaml`) files.
```bash
$ trivy conf --policy ./policy --data data --namespaces user ./configs
```

View File

@@ -0,0 +1,225 @@
# Debugging policies
When working on more complex queries (or when learning Rego), it's useful to see exactly how the policy is applied.
For this purpose you can use the `--trace` flag.
This will output a large trace from Open Policy Agent like the following:
!!! tip
Only failed policies show traces. If you want to debug a passed policy, you need to make it fail on purpose.
```bash
$ trivy conf --trace configs/
2021-07-11T16:45:58.493+0300 INFO Detected config files: 1
Dockerfile (dockerfile)
=======================
Tests: 23 (SUCCESSES: 22, FAILURES: 1, EXCEPTIONS: 0)
Failures: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0)
+---------------------------+------------+----------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+----------------------+----------+------------------------------------------+
| Dockerfile Security Check | DS002 | Image user is 'root' | HIGH | Last USER command in |
| | | | | Dockerfile should not be 'root' |
| | | | | -->avd.aquasec.com/appshield/ds002 |
+---------------------------+------------+----------------------+----------+------------------------------------------+
ID: DS002
File: Dockerfile
Namespace: appshield.dockerfile.DS002
Query: data.appshield.dockerfile.DS002.deny
Message: Last USER command in Dockerfile should not be 'root'
TRACE Enter data.appshield.dockerfile.DS002.deny = _
TRACE | Eval data.appshield.dockerfile.DS002.deny = _
TRACE | Index data.appshield.dockerfile.DS002.deny matched 2 rules)
TRACE | Enter data.appshield.dockerfile.DS002.deny
TRACE | | Eval data.appshield.dockerfile.DS002.fail_user_count
TRACE | | Index data.appshield.dockerfile.DS002.fail_user_count (matched 1 rule)
TRACE | | Enter data.appshield.dockerfile.DS002.fail_user_count
TRACE | | | Eval __local559__ = data.appshield.dockerfile.DS002.get_user
TRACE | | | Index data.appshield.dockerfile.DS002.get_user (matched 1 rule)
TRACE | | | Enter data.appshield.dockerfile.DS002.get_user
TRACE | | | | Eval user = data.lib.docker.user[_]
TRACE | | | | Index data.lib.docker.user (matched 1 rule)
TRACE | | | | Enter data.lib.docker.user
TRACE | | | | | Eval instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Exit data.lib.docker.user
TRACE | | | | Eval username = user.Value[_]
TRACE | | | | Exit data.appshield.dockerfile.DS002.get_user
TRACE | | | Redo data.appshield.dockerfile.DS002.get_user
TRACE | | | | Redo username = user.Value[_]
TRACE | | | | Redo user = data.lib.docker.user[_]
TRACE | | | | Redo data.lib.docker.user
TRACE | | | | | Redo instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Exit data.lib.docker.user
TRACE | | | | Eval username = user.Value[_]
TRACE | | | | Exit data.appshield.dockerfile.DS002.get_user
TRACE | | | Redo data.appshield.dockerfile.DS002.get_user
TRACE | | | | Redo username = user.Value[_]
TRACE | | | | Redo user = data.lib.docker.user[_]
TRACE | | | | Redo data.lib.docker.user
TRACE | | | | | Redo instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | Eval count(__local559__, __local391__)
TRACE | | | Eval lt(__local391__, 1)
TRACE | | | Fail lt(__local391__, 1)
TRACE | | | Redo count(__local559__, __local391__)
TRACE | | | Redo __local559__ = data.appshield.dockerfile.DS002.get_user
TRACE | | Fail data.appshield.dockerfile.DS002.fail_user_count
TRACE | Enter data.appshield.dockerfile.DS002.deny
TRACE | | Eval data.appshield.dockerfile.DS002.fail_last_user_root
TRACE | | Index data.appshield.dockerfile.DS002.fail_last_user_root (matched 1 rule)
TRACE | | Enter data.appshield.dockerfile.DS002.fail_last_user_root
TRACE | | | Eval __local560__ = data.appshield.dockerfile.DS002.get_user
TRACE | | | Index data.appshield.dockerfile.DS002.get_user (matched 1 rule)
TRACE | | | Enter data.appshield.dockerfile.DS002.get_user
TRACE | | | | Eval user = data.lib.docker.user[_]
TRACE | | | | Index data.lib.docker.user (matched 1 rule)
TRACE | | | | Enter data.lib.docker.user
TRACE | | | | | Eval instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Exit data.lib.docker.user
TRACE | | | | Eval username = user.Value[_]
TRACE | | | | Exit data.appshield.dockerfile.DS002.get_user
TRACE | | | Redo data.appshield.dockerfile.DS002.get_user
TRACE | | | | Redo username = user.Value[_]
TRACE | | | | Redo user = data.lib.docker.user[_]
TRACE | | | | Redo data.lib.docker.user
TRACE | | | | | Redo instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Exit data.lib.docker.user
TRACE | | | | Eval username = user.Value[_]
TRACE | | | | Exit data.appshield.dockerfile.DS002.get_user
TRACE | | | Redo data.appshield.dockerfile.DS002.get_user
TRACE | | | | Redo username = user.Value[_]
TRACE | | | | Redo user = data.lib.docker.user[_]
TRACE | | | | Redo data.lib.docker.user
TRACE | | | | | Redo instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | Eval cast_array(__local560__, __local392__)
TRACE | | | Eval user = __local392__
TRACE | | | Eval __local561__ = data.appshield.dockerfile.DS002.get_user
TRACE | | | Index data.appshield.dockerfile.DS002.get_user (matched 1 rule)
TRACE | | | Enter data.appshield.dockerfile.DS002.get_user
TRACE | | | | Eval user = data.lib.docker.user[_]
TRACE | | | | Index data.lib.docker.user (matched 1 rule)
TRACE | | | | Enter data.lib.docker.user
TRACE | | | | | Eval instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Exit data.lib.docker.user
TRACE | | | | Eval username = user.Value[_]
TRACE | | | | Exit data.appshield.dockerfile.DS002.get_user
TRACE | | | Redo data.appshield.dockerfile.DS002.get_user
TRACE | | | | Redo username = user.Value[_]
TRACE | | | | Redo user = data.lib.docker.user[_]
TRACE | | | | Redo data.lib.docker.user
TRACE | | | | | Redo instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Exit data.lib.docker.user
TRACE | | | | Eval username = user.Value[_]
TRACE | | | | Exit data.appshield.dockerfile.DS002.get_user
TRACE | | | Redo data.appshield.dockerfile.DS002.get_user
TRACE | | | | Redo username = user.Value[_]
TRACE | | | | Redo user = data.lib.docker.user[_]
TRACE | | | | Redo data.lib.docker.user
TRACE | | | | | Redo instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | | | Eval instruction.Cmd = "user"
TRACE | | | | | Fail instruction.Cmd = "user"
TRACE | | | | | Redo instruction = input.stages[_][_]
TRACE | | | Eval count(__local561__, __local393__)
TRACE | | | Eval len = __local393__
TRACE | | | Eval minus(len, 1, __local394__)
TRACE | | | Eval user[__local394__] = "root"
TRACE | | | Exit data.appshield.dockerfile.DS002.fail_last_user_root
TRACE | | Eval res = "Last USER command in Dockerfile should not be 'root'"
TRACE | | Exit data.appshield.dockerfile.DS002.deny
TRACE | Redo data.appshield.dockerfile.DS002.deny
TRACE | | Redo res = "Last USER command in Dockerfile should not be 'root'"
TRACE | | Redo data.appshield.dockerfile.DS002.fail_last_user_root
TRACE | | Redo data.appshield.dockerfile.DS002.fail_last_user_root
TRACE | | | Redo user[__local394__] = "root"
TRACE | | | Redo minus(len, 1, __local394__)
TRACE | | | Redo len = __local393__
TRACE | | | Redo count(__local561__, __local393__)
TRACE | | | Redo __local561__ = data.appshield.dockerfile.DS002.get_user
TRACE | | | Redo user = __local392__
TRACE | | | Redo cast_array(__local560__, __local392__)
TRACE | | | Redo __local560__ = data.appshield.dockerfile.DS002.get_user
TRACE | Exit data.appshield.dockerfile.DS002.deny = _
TRACE Redo data.appshield.dockerfile.DS002.deny = _
TRACE | Redo data.appshield.dockerfile.DS002.deny = _
```

View File

@@ -0,0 +1,296 @@
# Examples
## Custom Policy
### Kubernetes
See [here][k8s].
The custom policy is defined in `user.kubernetes.ID001` package.
You need to pass the package prefix you want to evaluate through `--namespaces` option.
In this case, the package prefix should be `user`, `user.kuberntes`, or `user.kubernetes.ID001`.
### Dockerfile
See [here][dockerfile].
The input will be a dictionary of stages.
#### Single Stage
??? example
Dockerfile
```dockerfile
FROM foo
COPY . /
RUN echo hello
```
Rego Input
```json
{
"stages": {
"foo": [
{
"Cmd": "from",
"EndLine": 1,
"Flags": [],
"JSON": false,
"Original": "FROM foo",
"Stage": 0,
"StartLine": 1,
"SubCmd": "",
"Value": [
"foo"
]
},
{
"Cmd": "copy",
"EndLine": 2,
"Flags": [],
"JSON": false,
"Original": "COPY . /",
"Stage": 0,
"StartLine": 2,
"SubCmd": "",
"Value": [
".",
"/"
]
},
{
"Cmd": "run",
"EndLine": 3,
"Flags": [],
"JSON": false,
"Original": "RUN echo hello",
"Stage": 0,
"StartLine": 3,
"SubCmd": "",
"Value": [
"echo hello"
]
}
]
}
}
```
#### Multi Stage
??? example
Dockerfile
```dockerfile
FROM golang:1.16 AS builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates \
&& apk add --no-cache bash
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
```
Rego Input
```json
{
"stages": {
"alpine:latest": [
{
"Cmd": "from",
"EndLine": 7,
"Flags": [],
"JSON": false,
"Original": "FROM alpine:latest",
"Stage": 1,
"StartLine": 7,
"SubCmd": "",
"Value": [
"alpine:latest"
]
},
{
"Cmd": "run",
"EndLine": 9,
"Flags": [],
"JSON": false,
"Original": "RUN apk --no-cache add ca-certificates \u0026\u0026 apk add --no-cache bash",
"Stage": 1,
"StartLine": 8,
"SubCmd": "",
"Value": [
"apk --no-cache add ca-certificates \u0026\u0026 apk add --no-cache bash"
]
},
{
"Cmd": "workdir",
"EndLine": 10,
"Flags": [],
"JSON": false,
"Original": "WORKDIR /root/",
"Stage": 1,
"StartLine": 10,
"SubCmd": "",
"Value": [
"/root/"
]
},
{
"Cmd": "copy",
"EndLine": 11,
"Flags": [
"--from=builder"
],
"JSON": false,
"Original": "COPY --from=builder /go/src/github.com/alexellis/href-counter/app .",
"Stage": 1,
"StartLine": 11,
"SubCmd": "",
"Value": [
"/go/src/github.com/alexellis/href-counter/app",
"."
]
},
{
"Cmd": "cmd",
"EndLine": 12,
"Flags": [],
"JSON": true,
"Original": "CMD [\"./app\"]",
"Stage": 1,
"StartLine": 12,
"SubCmd": "",
"Value": [
"./app"
]
}
],
"golang:1.16 AS builder": [
{
"Cmd": "from",
"EndLine": 1,
"Flags": [],
"JSON": false,
"Original": "FROM golang:1.16 AS builder",
"Stage": 0,
"StartLine": 1,
"SubCmd": "",
"Value": [
"golang:1.16",
"AS",
"builder"
]
},
{
"Cmd": "workdir",
"EndLine": 2,
"Flags": [],
"JSON": false,
"Original": "WORKDIR /go/src/github.com/alexellis/href-counter/",
"Stage": 0,
"StartLine": 2,
"SubCmd": "",
"Value": [
"/go/src/github.com/alexellis/href-counter/"
]
},
{
"Cmd": "run",
"EndLine": 3,
"Flags": [],
"JSON": false,
"Original": "RUN go get -d -v golang.org/x/net/html",
"Stage": 0,
"StartLine": 3,
"SubCmd": "",
"Value": [
"go get -d -v golang.org/x/net/html"
]
},
{
"Cmd": "copy",
"EndLine": 4,
"Flags": [],
"JSON": false,
"Original": "COPY app.go .",
"Stage": 0,
"StartLine": 4,
"SubCmd": "",
"Value": [
"app.go",
"."
]
},
{
"Cmd": "run",
"EndLine": 5,
"Flags": [],
"JSON": false,
"Original": "RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .",
"Stage": 0,
"StartLine": 5,
"SubCmd": "",
"Value": [
"CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app ."
]
}
]
}
}
```
### Docker Compose
See [here][compose].
Docker Compose uses YAML format for configurations. You can apply your Rego policies to `docker-compose.yml`.
### HCL
See [here][hcl].
Trivy parses HCL files and converts into structured data.
!!! warning
Terraform HCL files are not supported yet.
### Terraform Plan
See [here][tfplan].
Use the command [terraform show][terraform-show] to convert the Terraform plan into JSON so that OPA can read the plan.
```bash
$ terraform init
$ terraform plan --out tfplan.binary
$ terraform show -json tfplan.binary > tfplan.json
```
For more details, see also [OPA document][opa-terraform].
### Serverless Framework
See [here][serverless].
Server Framework uses YAML format for configurations. You can apply your Rego policies to `serverless.yaml`.
## Custom Data
See [here][data].
## Combined Input
See [here][combine].
## Go Testing
See [here][go-testing].
[k8s]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/kubernetes/
[dockerfile]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/dockerfile/
[compose]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/docker-compose/
[hcl]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/hcl/
[serverless]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/serverless/
[tfplan]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/terraform-plan/
[terraform-show]: https://www.terraform.io/docs/cli/commands/show.html
[opa-terraform]: https://www.openpolicyagent.org/docs/latest/terraform/
[custom]: https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy
[data]: https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-data
[combine]: https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/combine
[go-testing]: https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/go-testing

View File

@@ -0,0 +1,183 @@
# Custom Policies
## Overview
You can write custom policies in [Rego][rego].
Once you finish writing custom policies, you can pass the directory where those policies are stored with `--policy` option.
``` bash
trivy conf --policy /path/to/custom_policies --namespaces user /path/to/config_dir
```
As for `--namespaces` option, the detail is described as below.
### File formats
If a file name matches the following file patterns, Trivy will parse the file and pass it as input to your Rego policy.
| File format | File pattern |
| -------------- | ------------------------------------------------ |
| JSON | `*.json` |
| YAML | `*.yaml` |
| TOML | `*.toml` |
| HCL | `*.hcl`, `*.hcl1`, and `*.hcl2` |
| Dockerfile | `Dockerfile`, `Dockerfile.*`, and `*.Dockerfile` |
### Configuration languages
In the above general file formats, Trivy automatically identifies the following types of configuration files:
- Ansible (YAML)
- CloudFormation (JSON/YAML)
- Kubernetes (JSON/YAML)
This is useful for filtering inputs, as described below.
!!! warning
Custom policies do not support Terraform at the moment.
## Rego format
A single package must contain only one policy.
!!!example
``` rego
package user.kubernetes.ID001
__rego_metadata__ := {
"id": "ID001",
"title": "Deployment not allowed",
"severity": "LOW",
"type": "Custom Kubernetes Check",
"description": "Deployments are not allowed because of some reasons.",
}
__rego_input__ := {
"selector": [
{"type": "kubernetes"},
],
}
deny[msg] {
input.kind == "Deployment"
msg = sprintf("Found deployment '%s' but deployments are not allowed", [input.metadata.name])
}
```
In this example, ID001 "Deployment not allowed" is defined under `user.kubernetes.ID001`.
If you add a new custom policy, it must be defined under a new package like `user.kubernetes.ID002`.
### Policy structure
`package` (required)
: - MUST follow the Rego's [specification][package]
- MUST be unique per policy
- SHOULD include policy id for uniqueness
- MAY include the group name such as `kubernetes` for clarity
- Group name has no effect on policy evaluation
`__rego_metadata__` (optional)
: - SHOULD be defined for clarity since these values will be displayed in the scan results
`__rego_input__` (optional)
: - MAY be defined when you want to specify input format
`deny` (required)
: - SHOULD be `deny` or start with `deny_`
- Although `warn`, `warn_*`, `violation`, `violation_` also work for compatibility, `deny` is recommended as severity can be defined in `__rego_metadata__`.
- SHOULD return `string`
- Although `object` with `msg` field is accepted, other fields are dropped and `string` is recommended.
- e.g. `{"msg": "deny message", "details": "something"}`
### Package
A package name must be unique per policy.
!!!example
``` rego
package user.kubernetes.ID001
```
By default, only `appshield.*` packages will be evaluated.
If you define custom packages, you have to specify the package prefix via `--namespaces` option.
``` bash
trivy conf --policy /path/to/custom_policies --namespaces user /path/to/config_dir
```
In this case, `user.*` will be evaluated.
Any package prefixes such as `main` and `user` are allowed.
### Metadata
Metadata helps enrich Trivy's scan results with useful information.
!!!example
``` rego
__rego_metadata__ := {
"id": "ID001",
"title": "Deployment not allowed",
"severity": "LOW",
"type": "Custom Kubernetes Check",
"description": "Deployments are not allowed because of some reasons.",
"recommended_actions": "Remove Deployment",
"url": "https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-resource-requests-and-limits",
}
```
All fields under `__rego_metadata__` are optional.
| Field name | Allowed values | Default value | In table | In JSON |
| ------------------ | ------------------------------------| :-----------: | :----------------: |:---------------: |
| id | Any characters | N/A | :material-check: | :material-check: |
| title | Any characters | N/A | :material-check: | :material-check: |
| severity | `LOW`, `MEDIUM`, `HIGH`, `CRITICAL` | UNKNOWN | :material-check: | :material-check: |
| type | Any characters | N/A | :material-check: | :material-check: |
| description | Any characters | | :material-close: | :material-check: |
| recommended_actions| Any characters | | :material-close: | :material-check: |
| url | Any characters | | :material-close: | :material-check: |
Some fields are displayed in scan results.
``` bash
deployment.yaml (kubernetes)
============================
Tests: 28 (SUCCESSES: 14, FAILURES: 14, EXCEPTIONS: 0)
Failures: 14 (HIGH: 1)
+---------------------------+------------+-------------------------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+-------------------------------------+----------+------------------------------------------+
| Custom Kubernetes Check | ID001 | Deployment not allowed | LOW | Found deployment 'test' but deployments |
| | | | | are not allowed |
+---------------------------+------------+-------------------------------------+----------+------------------------------------------+
```
### Input
You can specify input format via `__rego_input__`.
All fields under `__rego_input` are optional.
!!!example
``` rego
__rego_input__ := {
"combine": false,
"selector": [
{"type": "kubernetes"},
],
}
```
`combine` (boolean)
: The details is [here](combine.md).
`selector` (array)
: This option filters the input by file formats or configuration languages.
In the above example, Trivy passes only Kubernetes files to this policy.
Even if Dockerfile exists in the specified directory, it will not be passed to the policy as input.
When configuration language such as Kubernetes is not identified, file format such as JSON will be used as `type`.
When configuration language is identified, it will overwrite `type`.
!!! example
`pod.yaml` including Kubernetes Pod will be handled as `kubernetes`, not `yaml`.
`type` is overwritten by `kubernetes` from `yaml`.
`type` accepts `kubernetes`, `dockerfile`, `ansible`, `cloudformation`, `json`, `yaml`, `toml`, or `hcl`.
[rego]: https://www.openpolicyagent.org/docs/latest/policy-language/
[package]: https://www.openpolicyagent.org/docs/latest/policy-language/#packages

View File

@@ -0,0 +1,90 @@
# Testing
It is highly recommended to write tests for your custom policies.
## Rego testing
To help you verify the correctness of your custom policies, OPA gives you a framework that you can use to write tests for your policies.
By writing tests for your custom policies you can speed up the development process of new rules and reduce the amount of time it takes to modify rules as requirements evolve.
For more details, see [Policy Testing][opa-testing].
!!! example
```
package user.dockerfile.ID002
test_add_denied {
r := deny with input as {"stages": {"alpine:3.13": [
{"Cmd": "add", "Value": ["/target/resources.tar.gz", "resources.jar"]},
{"Cmd": "add", "Value": ["/target/app.jar", "app.jar"]},
]}}
count(r) == 1
r[_] == "Consider using 'COPY /target/app.jar app.jar' command instead of 'ADD /target/app.jar app.jar'"
}
```
To write tests for custom policies, you can refer to existing tests under [AppShield][appshield].
## Go testing
[Fanal][fanal] which is a core library of Trivy can be imported as a Go library.
You can scan config files in Go and test your custom policies using Go's testing methods, such as [table-driven tests][table].
This allows you to use the actual configuration file as input, making it easy to prepare test data and ensure that your custom policies work in practice.
In particular, Dockerfile and HCL need to be converted to structural data as input, which may be different from the expected input format.
!!! tip
We recommend writing OPA and Go tests both since they have different roles, like unit tests and integration tests.
The following example stores allowed and denied configuration files in a directory.
`Successes` contains the result of successes, and `Failures` contains the result of failures.
``` go
{
name: "disallowed ports",
input: "configs/",
fields: fields{
policyPaths: []string{"policy"},
dataPaths: []string{"data"},
namespaces: []string{"user"},
},
want: []types.Misconfiguration{
{
FileType: types.Dockerfile,
FilePath: "Dockerfile.allowed",
Successes: types.MisconfResults{
{
Namespace: "user.dockerfile.ID002",
PolicyMetadata: types.PolicyMetadata{
ID: "ID002",
Type: "Docker Custom Check",
Title: "Disallowed ports exposed",
Severity: "HIGH",
},
},
},
},
{
FileType: types.Dockerfile,
FilePath: "Dockerfile.denied",
Failures: types.MisconfResults{
{
Namespace: "user.dockerfile.ID002",
Message: "Port 23 should not be exposed",
PolicyMetadata: types.PolicyMetadata{
ID: "ID002",
Type: "Docker Custom Check",
Title: "Disallowed ports exposed",
Severity: "HIGH",
},
},
},
},
},
},
```
`Dockerfile.allowed` has one successful result in `Successes`, while `Dockerfile.denied` has one failure result in `Failures`.
[opa-testing]: https://www.openpolicyagent.org/docs/latest/policy-testing/
[appshield]: https://github.com/aquasecurity/appshield
[table]: https://github.com/golang/go/wiki/TableDrivenTests
[fanal]: https://github.com/aquasecurity/fanal

View File

@@ -0,0 +1,56 @@
# Filesystem
## Quick start
Trivy scans a filesystem such as a virtual machine to detect misconfigurations.
You have to specify `--security-checks config` to enable misconfiguration detection.
```bash
$ trivy fs --security-checks config /path/to/dir
```
Internally, it is the same as [config subcommand](iac.md).
## Vulnerability and Misconfiguration scanning
The difference between `fs` and `config` subcommand is that `fs` can detect both vulnerabilities and misconfiguration at the same time.
You have to specify `--security-checks vuln,config` to enable vulnerability and misconfiguration detection.
``` bash
$ ls myapp/
Dockerfile Pipfile.lock
$ trivy fs --security-checks vuln,config --severity HIGH,CRITICAL myapp/
2021-07-09T12:03:27.564+0300 INFO Detected OS: unknown
2021-07-09T12:03:27.564+0300 INFO Number of language-specific files: 1
2021-07-09T12:03:27.564+0300 INFO Detecting pipenv vulnerabilities...
2021-07-09T12:03:27.566+0300 INFO Detected config files: 1
Pipfile.lock (pipenv)
=====================
Total: 1 (HIGH: 1, CRITICAL: 0)
+----------+------------------+----------+-------------------+---------------+---------------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+----------+------------------+----------+-------------------+---------------+---------------------------------------+
| httplib2 | CVE-2021-21240 | HIGH | 0.12.1 | 0.19.0 | python-httplib2: Regular |
| | | | | | expression denial of |
| | | | | | service via malicious header |
| | | | | | -->avd.aquasec.com/nvd/cve-2021-21240 |
+----------+------------------+----------+-------------------+---------------+---------------------------------------+
Dockerfile (dockerfile)
=======================
Tests: 23 (SUCCESSES: 22, FAILURES: 1, EXCEPTIONS: 0)
Failures: 1 (HIGH: 1, CRITICAL: 0)
+---------------------------+------------+----------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+----------------------+----------+------------------------------------------+
| Dockerfile Security Check | DS002 | Image user is 'root' | HIGH | Last USER command in |
| | | | | Dockerfile should not be 'root' |
| | | | | -->avd.aquasec.com/appshield/ds002 |
+---------------------------+------------+----------------------+----------+------------------------------------------+
```
In the above example, Trivy detected vulnerabilities of Python dependencies and misconfigurations in Dockerfile.

View File

@@ -0,0 +1,157 @@
# Infrastructure as Code (IaC)
## Quick start
Simply specify a directory containing IaC files such as Terraform and Dockerfile.
``` bash
$ trivy config [YOUR_IaC_DIRECTORY]
```
Trivy will automatically fetch the managed policies and will keep them up-to-date in future scans.
!!! example
```
$ ls build/
Dockerfile
$ trivy config ./build
2021-07-09T10:06:29.188+0300 INFO Need to update the built-in policies
2021-07-09T10:06:29.188+0300 INFO Downloading the built-in policies...
2021-07-09T10:06:30.520+0300 INFO Detected config files: 1
Dockerfile (dockerfile)
=======================
Tests: 23 (SUCCESSES: 22, FAILURES: 1, EXCEPTIONS: 0)
Failures: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0)
+---------------------------+------------+----------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+----------------------+----------+------------------------------------------+
| Dockerfile Security Check | DS002 | Image user is 'root' | HIGH | Last USER command in |
| | | | | Dockerfile should not be 'root' |
| | | | | -->avd.aquasec.com/appshield/ds002 |
+---------------------------+------------+----------------------+----------+------------------------------------------+
```
## Type detection
The specified directory can contain mixed types of IaC files.
Trivy automatically detects config types and applies relevant policies.
For example, the following example holds IaC files for Terraform, Kubernetes, and Dockerfile in the same directory.
``` bash
$ ls iac/
Dockerfile deployment.yaml main.tf
$ trivy conf --severith HIGH,CRITICAL ./iac
```
<details>
<summary>Result</summary>
```
2021-07-09T11:51:08.212+0300 INFO Need to update the built-in policies
2021-07-09T11:51:08.212+0300 INFO Downloading the built-in policies...
2021-07-09T11:51:09.527+0300 INFO Detected config files: 3
Dockerfile (dockerfile)
=======================
Tests: 23 (SUCCESSES: 22, FAILURES: 1, EXCEPTIONS: 0)
Failures: 1 (HIGH: 1, CRITICAL: 0)
+---------------------------+------------+----------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+----------------------+----------+------------------------------------------+
| Dockerfile Security Check | DS002 | Image user is 'root' | HIGH | Last USER command in |
| | | | | Dockerfile should not be 'root' |
| | | | | -->avd.aquasec.com/appshield/ds002 |
+---------------------------+------------+----------------------+----------+------------------------------------------+
deployment.yaml (kubernetes)
============================
Tests: 28 (SUCCESSES: 15, FAILURES: 13, EXCEPTIONS: 0)
Failures: 13 (HIGH: 1, CRITICAL: 0)
+---------------------------+------------+----------------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+----------------------------+----------+------------------------------------------+
| Kubernetes Security Check | KSV005 | SYS_ADMIN capability added | HIGH | Container 'hello-kubernetes' of |
| | | | | Deployment 'hello-kubernetes' |
| | | | | should not include 'SYS_ADMIN' in |
| | | | | 'securityContext.capabilities.add' |
| | | | | -->avd.aquasec.com/appshield/ksv005 |
+---------------------------+------------+----------------------------+----------+------------------------------------------+
main.tf (terraform)
===================
Tests: 23 (SUCCESSES: 14, FAILURES: 9, EXCEPTIONS: 0)
Failures: 9 (HIGH: 6, CRITICAL: 1)
+------------------------------------------+------------+------------------------------------------+----------+--------------------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+------------------------------------------+------------+------------------------------------------+----------+--------------------------------------------------------+
| Terraform Security Check powered by | AWS003 | AWS Classic resource usage. | HIGH | Resource |
| tfsec | | | | 'aws_db_security_group.my-group' |
| | | | | uses EC2 Classic. Use a VPC instead. |
| | | | | -->tfsec.dev/docs/aws/AWS003/ |
+ +------------+------------------------------------------+----------+--------------------------------------------------------+
| | AWS004 | Use of plain HTTP. | CRITICAL | Resource |
| | | | | 'aws_alb_listener.my-alb-listener' |
| | | | | uses plain HTTP instead of HTTPS. |
| | | | | -->tfsec.dev/docs/aws/AWS004/ |
+ +------------+------------------------------------------+----------+--------------------------------------------------------+
| | AWS018 | Missing description for security | HIGH | Resource |
| | | group/security group rule. | | 'aws_security_group_rule.my-rule' should |
| | | | | include a description for auditing |
| | | | | purposes. -->tfsec.dev/docs/aws/AWS018/ |
+ +------------+------------------------------------------+ +--------------------------------------------------------+
| | AWS025 | API Gateway domain name uses outdated | | Resource |
| | | SSL/TLS protocols. | | 'aws_api_gateway_domain_name.empty_security_policy' |
| | | | | defines outdated SSL/TLS policies (not using |
| | | | | TLS_1_2). -->tfsec.dev/docs/aws/AWS025/ |
+ + + + +--------------------------------------------------------+
| | | | | Resource |
| | | | | 'aws_api_gateway_domain_name.missing_security_policy' |
| | | | | should include security_policy (defauls to outdated |
| | | | | SSL/TLS policy). -->tfsec.dev/docs/aws/AWS025/ |
+ + + + +--------------------------------------------------------+
| | | | | Resource |
| | | | | 'aws_api_gateway_domain_name.outdated_security_policy' |
| | | | | defines outdated SSL/TLS policies (not using TLS_1_2). |
| | | | | -->tfsec.dev/docs/aws/AWS025/ |
+ +------------+------------------------------------------+ +--------------------------------------------------------+
| | AZU003 | Unencrypted managed disk. | | Resource 'azurerm_managed_disk.source' |
| | | | | defines an unencrypted managed disk. |
| | | | | -->tfsec.dev/docs/azure/AZU003/ |
+------------------------------------------+------------+------------------------------------------+----------+--------------------------------------------------------+
```
</details>
You can see the config type next to each file name.
!!! example
``` bash
Dockerfile (dockerfile)
=======================
Tests: 23 (SUCCESSES: 22, FAILURES: 1, EXCEPTIONS: 0)
Failures: 1 (HIGH: 1, CRITICAL: 0)
...
deployment.yaml (kubernetes)
============================
Tests: 28 (SUCCESSES: 15, FAILURES: 13, EXCEPTIONS: 0)
Failures: 13 (HIGH: 1, CRITICAL: 0)
...
main.tf (terraform)
===================
Tests: 23 (SUCCESSES: 14, FAILURES: 9, EXCEPTIONS: 0)
Failures: 9 (HIGH: 6, CRITICAL: 1)
...
```
## Example
See [here](https://github.com/aquasecurity/trivy/tree/125c457517f05b6498bc68eaeec6e683dd36c49a/examples/misconf/mixed)

View File

@@ -0,0 +1,8 @@
# Misconfiguration Scanning
Trivy provides built-in policies to detect configuration issues in Docker, Kubernetes and Terraform.
Also, you can write your own policies in [Rego][rego] to scan JSON, YAML, HCL, etc, like [Conftest][conftest].
![misconf](../imgs/misconf.png)
[rego]: https://www.openpolicyagent.org/docs/latest/policy-language/
[conftest]: https://github.com/open-policy-agent/conftest/

View File

@@ -0,0 +1,212 @@
# Filter Misconfigurations
## By Severity
Use `--severity` option.
```bash
trivy conf --severity HIGH,CRITICAL examples/misconf/mixed
```
<details>
<summary>Result</summary>
```bash
2021-07-10T17:37:13.267+0300 INFO Detected config files: 4
configs/Dockerfile (dockerfile)
===============================
Tests: 23 (SUCCESSES: 21, FAILURES: 2, EXCEPTIONS: 0)
Failures: 2 (HIGH: 1, CRITICAL: 0)
+---------------------------+------------+----------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+----------------------+----------+------------------------------------------+
| Dockerfile Security Check | DS002 | Image user is 'root' | HIGH | Specify at least 1 USER |
| | | | | command in Dockerfile with |
| | | | | non-root user as argument |
| | | | | -->avd.aquasec.com/appshield/ds002 |
+---------------------------+------------+----------------------+----------+------------------------------------------+
configs/deployment.yaml (kubernetes)
====================================
Tests: 28 (SUCCESSES: 14, FAILURES: 14, EXCEPTIONS: 0)
Failures: 14 (HIGH: 1, CRITICAL: 0)
+---------------------------+------------+-------------------------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+-------------------------------------+----------+------------------------------------------+
| Kubernetes Security Check | KSV006 | docker.sock is mounted to container | HIGH | Deployment 'hello-kubernetes' should |
| | | | | not specify '/var/run/docker.socker' in |
| | | | | 'spec.template.volumes.hostPath.path' |
| | | | | -->avd.aquasec.com/appshield/ksv006 |
+---------------------------+------------+-------------------------------------+----------+------------------------------------------+
configs/main.tf (terraform)
===========================
Tests: 19 (SUCCESSES: 11, FAILURES: 8, EXCEPTIONS: 0)
Failures: 8 (HIGH: 6, CRITICAL: 1)
+------------------------------------------+------------+------------------------------------------+----------+--------------------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+------------------------------------------+------------+------------------------------------------+----------+--------------------------------------------------------+
| Terraform Security Check powered by | AWS003 | AWS Classic resource usage. | HIGH | Resource |
| tfsec | | | | 'aws_db_security_group.my-group' |
| | | | | uses EC2 Classic. Use a VPC instead. |
| | | | | -->tfsec.dev/docs/aws/AWS003/ |
+ +------------+------------------------------------------+----------+--------------------------------------------------------+
| | AWS004 | Use of plain HTTP. | CRITICAL | Resource |
| | | | | 'aws_alb_listener.my-alb-listener' |
| | | | | uses plain HTTP instead of HTTPS. |
| | | | | -->tfsec.dev/docs/aws/AWS004/ |
+ +------------+------------------------------------------+----------+--------------------------------------------------------+
| | AWS018 | Missing description for security | HIGH | Resource |
| | | group/security group rule. | | 'aws_security_group_rule.my-rule' should |
| | | | | include a description for auditing |
| | | | | purposes. -->tfsec.dev/docs/aws/AWS018/ |
+ +------------+------------------------------------------+ +--------------------------------------------------------+
| | AWS025 | API Gateway domain name uses outdated | | Resource |
| | | SSL/TLS protocols. | | 'aws_api_gateway_domain_name.empty_security_policy' |
| | | | | defines outdated SSL/TLS policies (not using |
| | | | | TLS_1_2). -->tfsec.dev/docs/aws/AWS025/ |
+ + + + +--------------------------------------------------------+
| | | | | Resource |
| | | | | 'aws_api_gateway_domain_name.missing_security_policy' |
| | | | | should include security_policy (defauls to outdated |
| | | | | SSL/TLS policy). -->tfsec.dev/docs/aws/AWS025/ |
+ + + + +--------------------------------------------------------+
| | | | | Resource |
| | | | | 'aws_api_gateway_domain_name.outdated_security_policy' |
| | | | | defines outdated SSL/TLS policies (not using TLS_1_2). |
| | | | | -->tfsec.dev/docs/aws/AWS025/ |
+ +------------+------------------------------------------+ +--------------------------------------------------------+
| | AZU003 | Unencrypted managed disk. | | Resource 'azurerm_managed_disk.source' |
| | | | | defines an unencrypted managed disk. |
| | | | | -->tfsec.dev/docs/azure/AZU003/ |
+------------------------------------------+------------+------------------------------------------+----------+--------------------------------------------------------+
configs/variables.tf (terraform)
================================
Tests: 1 (SUCCESSES: 1, FAILURES: 0, EXCEPTIONS: 0)
Failures: 0 (HIGH: 0, CRITICAL: 0)
```
</details>
## By Misconfiguration IDs
Use `.trivyignore`.
```bash
$ cat .trivyignore
# Accept the risk
AWS003
AWS018
AWS025
$ trivy conf --severity HIGH,CRITICAL examples/misconf/mixed
```
<details>
<summary>Result</summary>
```bash
2021-07-10T17:38:51.306+0300 INFO Detected config files: 4
configs/Dockerfile (dockerfile)
===============================
Tests: 23 (SUCCESSES: 21, FAILURES: 2, EXCEPTIONS: 0)
Failures: 2 (HIGH: 1, CRITICAL: 0)
+---------------------------+------------+----------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+----------------------+----------+------------------------------------------+
| Dockerfile Security Check | DS002 | Image user is 'root' | HIGH | Specify at least 1 USER |
| | | | | command in Dockerfile with |
| | | | | non-root user as argument |
| | | | | -->avd.aquasec.com/appshield/ds002 |
+---------------------------+------------+----------------------+----------+------------------------------------------+
configs/deployment.yaml (kubernetes)
====================================
Tests: 28 (SUCCESSES: 14, FAILURES: 14, EXCEPTIONS: 0)
Failures: 14 (HIGH: 1, CRITICAL: 0)
+---------------------------+------------+-------------------------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+---------------------------+------------+-------------------------------------+----------+------------------------------------------+
| Kubernetes Security Check | KSV006 | docker.sock is mounted to container | HIGH | Deployment 'hello-kubernetes' should |
| | | | | not specify '/var/run/docker.socker' in |
| | | | | 'spec.template.volumes.hostPath.path' |
| | | | | -->avd.aquasec.com/appshield/ksv006 |
+---------------------------+------------+-------------------------------------+----------+------------------------------------------+
configs/main.tf (terraform)
===========================
Tests: 19 (SUCCESSES: 11, FAILURES: 8, EXCEPTIONS: 0)
Failures: 8 (HIGH: 1, CRITICAL: 1)
+------------------------------------------+------------+---------------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+------------------------------------------+------------+---------------------------+----------+------------------------------------------+
| Terraform Security Check powered by | AWS004 | Use of plain HTTP. | CRITICAL | Resource |
| tfsec | | | | 'aws_alb_listener.my-alb-listener' |
| | | | | uses plain HTTP instead of HTTPS. |
| | | | | -->tfsec.dev/docs/aws/AWS004/ |
+ +------------+---------------------------+----------+------------------------------------------+
| | AZU003 | Unencrypted managed disk. | HIGH | Resource 'azurerm_managed_disk.source' |
| | | | | defines an unencrypted managed disk. |
| | | | | -->tfsec.dev/docs/azure/AZU003/ |
+------------------------------------------+------------+---------------------------+----------+------------------------------------------+
configs/variables.tf (terraform)
================================
Tests: 1 (SUCCESSES: 1, FAILURES: 0, EXCEPTIONS: 0)
Failures: 0 (HIGH: 0, CRITICAL: 0)
```
</details>
## By Exceptions
See [Exceptions](../policy/exceptions.md)
## Show Successes and Exceptions
Use `--include-non-failures` option to show successes and exceptions as well as failures.
```bash
trivy conf --severity CRITICAL --include-non-failures examples/misconf/mixed
```
<details>
<summary>Result</summary>
```
2021-07-10T17:44:02.049+0300 INFO Detected config files: 4
configs/Dockerfile (dockerfile)
===============================
Tests: 23 (SUCCESSES: 21, FAILURES: 2, EXCEPTIONS: 0)
Failures: 2 (CRITICAL: 0)
+---------------------------+------------+------------------------------------------+----------+--------+-----------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | STATUS | MESSAGE |
+---------------------------+------------+------------------------------------------+----------+--------+-----------------+
| Dockerfile Security Check | DS006 | COPY '--from' refers to the current | CRITICAL | PASS | No issues found |
| | | image | | | |
+ +------------+------------------------------------------+ + + +
| | DS007 | Multiple ENTRYPOINT instructions are | | | |
| | | listed | | | |
+ +------------+------------------------------------------+ + + +
| | DS008 | Exposed port is out of range | | | |
+ +------------+------------------------------------------+ + + +
| | DS010 | 'sudo' is used | | | |
+ +------------+------------------------------------------+ + + +
| | DS011 | COPY with more than two arguments is not | | | |
| | | ending with slash | | | |
+ +------------+------------------------------------------+ + + +
| | DS012 | Duplicate aliases are defined in | | | |
| | | different FROMs | | | |
+---------------------------+------------+------------------------------------------+----------+--------+-----------------+
...
```
</details>

View File

@@ -0,0 +1,22 @@
# Others
!!! hint
See also [Others](../../vulnerability/examples/others.md) in Vulnerability section.
## File patterns
When a directory is given as an input, Trivy will recursively look for and test all files based on file patterns.
The default file patterns are [here](../custom/index.md).
In addition to the default file patterns, the `--file-patterns` option takes regexp patterns to look for your files.
For example, it may be useful when your file name of Dockerfile doesn't match the default patterns.
This can be repeated for specifying multiple file patterns.
Allowed values are here:
- dockerfile
- yaml
- json
- toml
- hcl
For more details, see [an example](https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/file-patterns)

View File

@@ -0,0 +1,88 @@
# Policy
## Pass custom policies
You can pass directories including your custom policies through `--policy` option.
This can be repeated for specifying multiple directories.
```bash
cd examplex/misconf/
trivy conf --policy custom-policy/policy --policy combine/policy --namespaces user misconf/mixed
```
For more details, see [Custom Policies](../custom/index.md).
!!! tip
You also need to specify `--namespaces` option.
## Pass custom data
You can pass directories including your custom data through `--data` option.
This can be repeated for specifying multiple directories.
```bash
cd examples/misconf/custom-data
trivy conf --policy ./policy --data ./data --namespaces user ./configs
```
For more details, see [Custom Data](../custom/data.md).
## Pass namespaces
By default, Trivy evaluate policies defined in `appshield.*`.
If you want to evaluate custom policies in other packages, you have to specify package prefixes through `--namespaces` option.
This can be repeated for specifying multiple packages.
``` bash
trivy conf --policy ./policy --namespaces main --namespaces user ./configs
```
## Skip update of built-in policies
`Trivy` downloads built-in policies when it starts operating.
Then, it checks for updates every 24 hours.
You can use the `--skip-policy-update` option to skip it.
If you skip it the first time, the built-in policies will not be loaded.
!!! note
Even if you specify the option the first time, it will be loaded as Terraform policies are written in Go.
```
trivy conf --skip-policy-update examples/misconf/mixed [~/src/github.com/aquasecurity/trivy]
```
<details>
<summary>Result</summary>
```
2021-07-10T18:04:19.083+0300 INFO No builtin policies were loaded
2021-07-10T18:04:19.174+0300 INFO Detected config files: 2
configs/main.tf (terraform)
===========================
Tests: 19 (SUCCESSES: 11, FAILURES: 8, EXCEPTIONS: 0)
Failures: 8 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 1, CRITICAL: 1)
+------------------------------------------+------------+------------------------------------------+----------+------------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+------------------------------------------+------------+------------------------------------------+----------+------------------------------------------+
| Terraform Security Check powered by | AWS004 | Use of plain HTTP. | CRITICAL | Resource |
| tfsec | | | | 'aws_alb_listener.my-alb-listener' |
| | | | | uses plain HTTP instead of HTTPS. |
| | | | | -->tfsec.dev/docs/aws/AWS004/ |
+ +------------+------------------------------------------+----------+------------------------------------------+
| | AWS006 | An ingress security group rule allows | MEDIUM | Resource |
| | | traffic from /0. | | 'aws_security_group_rule.my-rule' |
| | | | | defines a fully open |
| | | | | ingress security group rule. |
| | | | | -->tfsec.dev/docs/aws/AWS006/ |
+ +------------+------------------------------------------+----------+------------------------------------------+
| | AZU003 | Unencrypted managed disk. | HIGH | Resource 'azurerm_managed_disk.source' |
| | | | | defines an unencrypted managed disk. |
| | | | | -->tfsec.dev/docs/azure/AZU003/ |
+------------------------------------------+------------+------------------------------------------+----------+------------------------------------------+
configs/variables.tf (terraform)
================================
Tests: 1 (SUCCESSES: 1, FAILURES: 0, EXCEPTIONS: 0)
Failures: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
```
</details>

View File

@@ -0,0 +1,6 @@
# Report Formats
See [Reports Formats](../../vulnerability/examples/report.md) in Vulnerability section.
!!! caution
Misconfiguration scanning doesn't support default templates such as XML and SARIF for now.

Some files were not shown because too many files have changed in this diff Show More