Compare commits
943 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb76acbd9f | ||
|
|
3d2fc78852 | ||
|
|
3e3c119555 | ||
|
|
685a92e09a | ||
|
|
1e0b03d47f | ||
|
|
c9f9a9c917 | ||
|
|
bcc231d3ba | ||
|
|
7cecade3a1 | ||
|
|
a02c06bafd | ||
|
|
e85881231f | ||
|
|
276daae672 | ||
|
|
546e7bd6b1 | ||
|
|
b69c4de757 | ||
|
|
33b8521aee | ||
|
|
313ade3386 | ||
|
|
b331e771aa | ||
|
|
bfe5c6f14f | ||
|
|
363a3e40ea | ||
|
|
b213956cea | ||
|
|
efbc968ca8 | ||
|
|
9a601d49ef | ||
|
|
a589353bb3 | ||
|
|
f38f8d66fb | ||
|
|
2b1de93249 | ||
|
|
5423196f4c | ||
|
|
6fb477097c | ||
|
|
4d382a0302 | ||
|
|
f1c6af3121 | ||
|
|
0977dfcde8 | ||
|
|
6b2cd7e8da | ||
|
|
3912768470 | ||
|
|
a17c3eec2a | ||
|
|
d8b59efea9 | ||
|
|
60a81fcb95 | ||
|
|
c73650d967 | ||
|
|
6cfdffda18 | ||
|
|
510ce1a782 | ||
|
|
92c0452b74 | ||
|
|
1eb73f3fea | ||
|
|
270dc7346f | ||
|
|
a6ff0d12bb | ||
|
|
67d94774ba | ||
|
|
3e6dc37728 | ||
|
|
2dc5c9152e | ||
|
|
6daf62ebeb | ||
|
|
f9ee4943b1 | ||
|
|
c3e227b625 | ||
|
|
ca390411f3 | ||
|
|
c676361681 | ||
|
|
126fe0abba | ||
|
|
f7d02538f6 | ||
|
|
f982167c0a | ||
|
|
d3a73e4db7 | ||
|
|
5d5b93ed69 | ||
|
|
36498501bf | ||
|
|
3c0e354743 | ||
|
|
af5882bc3e | ||
|
|
3d2921343b | ||
|
|
e18f38af3c | ||
|
|
0e937b5367 | ||
|
|
911c5e971a | ||
|
|
6fd1887e64 | ||
|
|
4059e94aba | ||
|
|
84af32a7fe | ||
|
|
4ab696eaa2 | ||
|
|
b7ec642572 | ||
|
|
1e1ccbec52 | ||
|
|
4ceae2a052 | ||
|
|
4e7e842682 | ||
|
|
089d34e866 | ||
|
|
bfb0f2a193 | ||
|
|
f19243127a | ||
|
|
4c6a866cce | ||
|
|
3ecc65d626 | ||
|
|
6b95d3857f | ||
|
|
f6cfcaf193 | ||
|
|
4b4a0c95ba | ||
|
|
6d79fcacfc | ||
|
|
f8951f3847 | ||
|
|
afe3292843 | ||
|
|
3d23ad846c | ||
|
|
9822b40862 | ||
|
|
bb6ff8511b | ||
|
|
3bed96f0cf | ||
|
|
4a7544caea | ||
|
|
b7fc3dfc98 | ||
|
|
89893a7303 | ||
|
|
dbba0bf152 | ||
|
|
3ef450d9a4 | ||
|
|
f4ec4e7483 | ||
|
|
96a5cb106a | ||
|
|
023e09e3f3 | ||
|
|
b3759f54fa | ||
|
|
dbf4b2dec5 | ||
|
|
2ae8faa7a8 | ||
|
|
5f004f03d9 | ||
|
|
3679bc358c | ||
|
|
029dd76c30 | ||
|
|
a39133a13c | ||
|
|
995024f148 | ||
|
|
c9f9a346cc | ||
|
|
5a58e41476 | ||
|
|
fbb83c42d9 | ||
|
|
8a4b49ca70 | ||
|
|
7ba773f2bb | ||
|
|
bd94618b34 | ||
|
|
fa5dcaf8f2 | ||
|
|
2c57716359 | ||
|
|
6601d2957a | ||
|
|
6e2453c2d6 | ||
|
|
7c94df539c | ||
|
|
8c33bae5a8 | ||
|
|
2cdacc1517 | ||
|
|
9acb240fdc | ||
|
|
4b193b4712 | ||
|
|
79d1a0163f | ||
|
|
c1b4b5be16 | ||
|
|
bbe490b162 | ||
|
|
78286aaff1 | ||
|
|
55f29b8fb2 | ||
|
|
b6baa65ff2 | ||
|
|
4b8e0ec2ea | ||
|
|
cf78a436d2 | ||
|
|
f8c2ced302 | ||
|
|
84c199428f | ||
|
|
bdf55e16db | ||
|
|
9fd86da367 | ||
|
|
fbc9030db6 | ||
|
|
e2a31abd19 | ||
|
|
708a7a7175 | ||
|
|
e000329ec4 | ||
|
|
e127334664 | ||
|
|
3870515a81 | ||
|
|
4e6389af27 | ||
|
|
5f047f97db | ||
|
|
0700586483 | ||
|
|
1f393c12d5 | ||
|
|
110c534015 | ||
|
|
525e2685ce | ||
|
|
9898ac9251 | ||
|
|
453a1edfd2 | ||
|
|
407f3b668b | ||
|
|
a0047a7983 | ||
|
|
d786655a18 | ||
|
|
a02cf65196 | ||
|
|
613e38ccf6 | ||
|
|
3b6d65beb8 | ||
|
|
22f5b938f9 | ||
|
|
485637c28a | ||
|
|
6fdb554a0d | ||
|
|
d9bddb90fe | ||
|
|
1cf1873f21 | ||
|
|
d77dbe8a55 | ||
|
|
32bd1e484a | ||
|
|
94a5a1808f | ||
|
|
72d94b21cf | ||
|
|
b4a7d6a861 | ||
|
|
0127c1d39e | ||
|
|
a92da72263 | ||
|
|
b0f3864e46 | ||
|
|
0b1d32c182 | ||
|
|
d4e3df81e8 | ||
|
|
7e48cc1f4d | ||
|
|
c9efa8c479 | ||
|
|
52b715421e | ||
|
|
21f7a41b27 | ||
|
|
ff2b3d176d | ||
|
|
9c19298f5f | ||
|
|
aa3d696625 | ||
|
|
31e76699da | ||
|
|
4ca35b26a7 | ||
|
|
8da4548073 | ||
|
|
76e9d7eb27 | ||
|
|
2b217a3b2a | ||
|
|
902aa8ceb9 | ||
|
|
60b19e5e60 | ||
|
|
58aab67928 | ||
|
|
209b9cc25a | ||
|
|
bfb931d454 | ||
|
|
ae86a5b171 | ||
|
|
1a23039e31 | ||
|
|
56498ca1df | ||
|
|
02105678ed | ||
|
|
4470a181e2 | ||
|
|
cb171ead72 | ||
|
|
36e24b1858 | ||
|
|
88311745ba | ||
|
|
9154b819ac | ||
|
|
f36d9b6f90 | ||
|
|
7a148089ec | ||
|
|
df80fd31a0 | ||
|
|
88ebc07504 | ||
|
|
d6418cf0de | ||
|
|
12d0317a67 | ||
|
|
c3aca1524c | ||
|
|
b2b68951f2 | ||
|
|
06659f1509 | ||
|
|
a91cc50df7 | ||
|
|
4b8bf874d8 | ||
|
|
5040caefc8 | ||
|
|
28cd5a5537 | ||
|
|
b2f554eb2a | ||
|
|
7a44a7a344 | ||
|
|
18842fbe04 | ||
|
|
12ca3ca6da | ||
|
|
728a3db6c6 | ||
|
|
4e7b5ca365 | ||
|
|
0fca2cda91 | ||
|
|
e50839bb40 | ||
|
|
f95a0f0d52 | ||
|
|
e5bf3d1e30 | ||
|
|
2193fb3c44 | ||
|
|
bbccb5a69d | ||
|
|
a625455f1c | ||
|
|
7e69f4820e | ||
|
|
f6c986b6c0 | ||
|
|
aab6f0bf20 | ||
|
|
eebf9c8f58 | ||
|
|
971092b847 | ||
|
|
2f2d8222e4 | ||
|
|
a2afd6e683 | ||
|
|
a423b99312 | ||
|
|
a069ad7818 | ||
|
|
015055e1f5 | ||
|
|
cbaa363990 | ||
|
|
bec02f098d | ||
|
|
d7f8b92a27 | ||
|
|
59ea0d5781 | ||
|
|
c788676f87 | ||
|
|
58ade462b4 | ||
|
|
77cab6e0b9 | ||
|
|
2ede15d358 | ||
|
|
d266c74941 | ||
|
|
4423396bcc | ||
|
|
356ae30c7e | ||
|
|
477dc7d5f9 | ||
|
|
89b8d7ff30 | ||
|
|
219b71b4fd | ||
|
|
aa6e1eb6f9 | ||
|
|
de6c3cbb6c | ||
|
|
b7d4d1ead4 | ||
|
|
e6c029d08a | ||
|
|
ec6cb1a642 | ||
|
|
7dfc16cf21 | ||
|
|
42d8fd6638 | ||
|
|
c3ef2035b5 | ||
|
|
274103e883 | ||
|
|
e618d83dae | ||
|
|
3b0b2ed4ce | ||
|
|
5c8d098324 | ||
|
|
11f4f81123 | ||
|
|
6db2092c72 | ||
|
|
8898bb0937 | ||
|
|
33d0833717 | ||
|
|
13874d866c | ||
|
|
f26a06b980 | ||
|
|
e2821a4fba | ||
|
|
ef8a1afcdb | ||
|
|
449add24af | ||
|
|
cb9afc8441 | ||
|
|
78b2b899a0 | ||
|
|
52fd3c2e0a | ||
|
|
8d5882be03 | ||
|
|
84dd33f7e9 | ||
|
|
9e903a1d88 | ||
|
|
f4c746a2d2 | ||
|
|
420f8ab13e | ||
|
|
d2827cba06 | ||
|
|
ce703ce4a5 | ||
|
|
50bb938a21 | ||
|
|
a31ddbe971 | ||
|
|
3a4e18ac82 | ||
|
|
8ba68361bd | ||
|
|
f5c5573936 | ||
|
|
eab2b425db | ||
|
|
cabd18daae | ||
|
|
02c3c3659d | ||
|
|
4f7b768369 | ||
|
|
d754cb8c6f | ||
|
|
a936e675c9 | ||
|
|
af116d3c9e | ||
|
|
b507360075 | ||
|
|
7fcbf44bb8 | ||
|
|
478d279919 | ||
|
|
33bd41b40f | ||
|
|
39a10089fc | ||
|
|
37abd612aa | ||
|
|
78de33e8ea | ||
|
|
22054626f3 | ||
|
|
28ddcf1ae8 | ||
|
|
df134c73f8 | ||
|
|
8da20c8c92 | ||
|
|
714b5ca246 | ||
|
|
51e152b01c | ||
|
|
884daff429 | ||
|
|
2a8336b9aa | ||
|
|
1e171af165 | ||
|
|
e65274e0ef | ||
|
|
db35450bbb | ||
|
|
24254d19f6 | ||
|
|
2ee074568c | ||
|
|
0aef82c58e | ||
|
|
8b2a799721 | ||
|
|
42f795fa34 | ||
|
|
8f737cc6eb | ||
|
|
76249bdcf0 | ||
|
|
59957d4c6b | ||
|
|
da8b72d2e7 | ||
|
|
b713ad0fd3 | ||
|
|
56115e9d4f | ||
|
|
7f859afacb | ||
|
|
628a7964d5 | ||
|
|
82fba77141 | ||
|
|
d5269da5ee | ||
|
|
8e57dee86b | ||
|
|
8bfbc84a41 | ||
|
|
1e811de263 | ||
|
|
8b5796f770 | ||
|
|
a2199bb417 | ||
|
|
279e76f704 | ||
|
|
5262590831 | ||
|
|
c275a841fd | ||
|
|
7beed30170 | ||
|
|
f50e1f42a1 | ||
|
|
3ae4de5869 | ||
|
|
6e35b8f53c | ||
|
|
beb60b05f3 | ||
|
|
582e7fd1ba | ||
|
|
11bc290111 | ||
|
|
392f68926c | ||
|
|
101d576025 | ||
|
|
bd3ba68cce | ||
|
|
3860d6e4e9 | ||
|
|
4f82673a61 | ||
|
|
b9a51de862 | ||
|
|
7f248341cc | ||
|
|
af3eaefdb2 | ||
|
|
07c9200eb7 | ||
|
|
8bc8a4ad60 | ||
|
|
9076a49b0f | ||
|
|
bb316d93ca | ||
|
|
efdb29d0d4 | ||
|
|
9bcf9e72f5 | ||
|
|
3147097daf | ||
|
|
33f74b3acb | ||
|
|
5915ffb42b | ||
|
|
ae4c42b975 | ||
|
|
19747d0535 | ||
|
|
da45061f4d | ||
|
|
cb1a4ed3a1 | ||
|
|
69dae54aa1 | ||
|
|
5dc8cfe55d | ||
|
|
798b564ee3 | ||
|
|
21bf5e58f7 | ||
|
|
e0f4ebd7cb | ||
|
|
23a9a5e319 | ||
|
|
1f5d17fe13 | ||
|
|
bcfa0287b9 | ||
|
|
681ab1b889 | ||
|
|
46051d5ec8 | ||
|
|
d8d692b8ba | ||
|
|
cc344dfbe3 | ||
|
|
0dec17fc3f | ||
|
|
f12446d3ba | ||
|
|
1c9ccb5e03 | ||
|
|
a463e794ce | ||
|
|
e0ca5eff38 | ||
|
|
1ebb3296ee | ||
|
|
b37f682ee2 | ||
|
|
da905108b4 | ||
|
|
bd57b4f9b5 | ||
|
|
9027dc3252 | ||
|
|
5750cc2e1a | ||
|
|
bbcce9f7b7 | ||
|
|
6bcb4af10f | ||
|
|
8d13234554 | ||
|
|
982f35b424 | ||
|
|
2e170cd15a | ||
|
|
cc6c67d81c | ||
|
|
669fd1fd1d | ||
|
|
8cd7de276e | ||
|
|
3bf3a46cd4 | ||
|
|
8edcc62a8d | ||
|
|
31c45ffc52 | ||
|
|
d8cc8b550b | ||
|
|
dbc7a83e8c | ||
|
|
19c0b70d26 | ||
|
|
9d617777d5 | ||
|
|
5d57deaa4f | ||
|
|
b5955597a4 | ||
|
|
b1410b27b8 | ||
|
|
0e777d386e | ||
|
|
b6d9c30eea | ||
|
|
5160a2eb53 | ||
|
|
40ed227c23 | ||
|
|
2a4400c147 | ||
|
|
82eb630be7 | ||
|
|
4a8db20a9a | ||
|
|
8db9b6a2a6 | ||
|
|
c159501d0d | ||
|
|
76e63d1124 | ||
|
|
79b6684840 | ||
|
|
214fe82c7e | ||
|
|
c489e31f5d | ||
|
|
efd812cb1a | ||
|
|
3a920dc401 | ||
|
|
7cb1598991 | ||
|
|
6a8800286e | ||
|
|
f3f3029014 | ||
|
|
0e52fde047 | ||
|
|
9b3fba04f9 | ||
|
|
1101634f6a | ||
|
|
499b7a6ecf | ||
|
|
cea9b0bc78 | ||
|
|
dea3428804 | ||
|
|
47d600a9b4 | ||
|
|
eae4bafff3 | ||
|
|
9e08bd44fb | ||
|
|
d9883e4442 | ||
|
|
e6f7e556e8 | ||
|
|
4b84e79cc3 | ||
|
|
05ae22a85c | ||
|
|
a0e5c3a2e2 | ||
|
|
712f9eba35 | ||
|
|
803b2f9a93 | ||
|
|
92f980f4b7 | ||
|
|
52e98f1bd9 | ||
|
|
6cd9a328a4 | ||
|
|
03a73667db | ||
|
|
a29d6d8c5b | ||
|
|
2a08969ddc | ||
|
|
3a94b7399b | ||
|
|
41d000c97e | ||
|
|
78da283c1b | ||
|
|
e362843705 | ||
|
|
097b8d4881 | ||
|
|
3b6122f86d | ||
|
|
f75a36945c | ||
|
|
e4c32cdb77 | ||
|
|
fb19abd09a | ||
|
|
d2afc206b2 | ||
|
|
43ff5f93e8 | ||
|
|
5e6a50b2f9 | ||
|
|
23b9533791 | ||
|
|
d1f8cfcfdc | ||
|
|
aa2336be92 | ||
|
|
e64617212e | ||
|
|
85e45cad95 | ||
|
|
9fa512a652 | ||
|
|
349371bbc9 | ||
|
|
4446961167 | ||
|
|
04473ada48 | ||
|
|
1b66b77f69 | ||
|
|
8fc6ea6489 | ||
|
|
eaf2da20a6 | ||
|
|
083c157b05 | ||
|
|
e26e39a7f8 | ||
|
|
04e7ccabea | ||
|
|
415e1d8ea3 | ||
|
|
3bb8852ef7 | ||
|
|
c0fddd9467 | ||
|
|
41c066d4c8 | ||
|
|
2316931e3b | ||
|
|
77f3d55149 | ||
|
|
b319579b78 | ||
|
|
0c0febe28a | ||
|
|
d41736b828 | ||
|
|
c88bbbd6cc | ||
|
|
d88b7cfb08 | ||
|
|
1385fa4190 | ||
|
|
0346a106f8 | ||
|
|
60a4e7e5d4 | ||
|
|
39ab6bd630 | ||
|
|
0518d2785f | ||
|
|
a6b8ec3134 | ||
|
|
6d22387727 | ||
|
|
7221579340 | ||
|
|
ee29ffaf4f | ||
|
|
8935aa6523 | ||
|
|
288481ffe1 | ||
|
|
f961e9912e | ||
|
|
0edf73bf3d | ||
|
|
f5b060a9f1 | ||
|
|
c26a3e481f | ||
|
|
8b3b5d0290 | ||
|
|
37edc66418 | ||
|
|
becd5088df | ||
|
|
e517bef17f | ||
|
|
da2b28a3bb | ||
|
|
965bb6d08a | ||
|
|
049728665f | ||
|
|
fcb9a93d05 | ||
|
|
425eaf8a2a | ||
|
|
47ce996d36 | ||
|
|
e890ae02c2 | ||
|
|
9bc3565af1 | ||
|
|
a0cd5d70ae | ||
|
|
3170dc3e63 | ||
|
|
10ad2edd3c | ||
|
|
c9f22f4e55 | ||
|
|
3047c524d9 | ||
|
|
89e5295421 | ||
|
|
cdabe7fc9e | ||
|
|
b0fe439309 | ||
|
|
6685cd4e21 | ||
|
|
7a683bd02e | ||
|
|
6ed03a83a5 | ||
|
|
182cb800a8 | ||
|
|
2acd1cafd0 | ||
|
|
dd35bfd1a1 | ||
|
|
1f17e71dce | ||
|
|
0954f6b1bb | ||
|
|
6b29bf1c71 | ||
|
|
f6afdf0145 | ||
|
|
412847d6a2 | ||
|
|
5b2786213a | ||
|
|
6ed25c19e6 | ||
|
|
e2c483f856 | ||
|
|
5c5e0cb86d | ||
|
|
b9b84cd963 | ||
|
|
e517bcc2b2 | ||
|
|
7f5a6d479e | ||
|
|
8de09ddf37 | ||
|
|
e08ae8d01d | ||
|
|
a00d719ed2 | ||
|
|
08ca1b00b7 | ||
|
|
7b86f81e29 | ||
|
|
8cd4afeaf1 | ||
|
|
b606b621e5 | ||
|
|
5c2b14b910 | ||
|
|
a19a023f1f | ||
|
|
e6cef75162 | ||
|
|
1371f72cfb | ||
|
|
8ecaa2f057 | ||
|
|
8132174754 | ||
|
|
bcc285095d | ||
|
|
cb369727cd | ||
|
|
9bdbeaba66 | ||
|
|
d85cb77123 | ||
|
|
1bee83ccc4 | ||
|
|
4d1894327e | ||
|
|
1391b3bf47 | ||
|
|
b6d5b82c48 | ||
|
|
9dfb0fe3a9 | ||
|
|
455546975c | ||
|
|
c189aa6a0a | ||
|
|
8442528fa7 | ||
|
|
d09787e150 | ||
|
|
0285a89c7c | ||
|
|
7d7784fecb | ||
|
|
ca6f196001 | ||
|
|
e621cf2bc1 | ||
|
|
906ab5483e | ||
|
|
1549c25709 | ||
|
|
fe1d07e58c | ||
|
|
793a1aa3c8 | ||
|
|
4a94477532 | ||
|
|
9bc2b1949c | ||
|
|
49691ba85e | ||
|
|
87ff0c1bbc | ||
|
|
de30c3f8d6 | ||
|
|
4c3bfb89a4 | ||
|
|
8b21cfe7eb | ||
|
|
46700f7b74 | ||
|
|
014be7e143 | ||
|
|
b3ff2c35ea | ||
|
|
9c786de8f9 | ||
|
|
188e108d7c | ||
|
|
7d7842f2f3 | ||
|
|
901a3715cb | ||
|
|
095b5ce97c | ||
|
|
1d3f70e07f | ||
|
|
5e308da81a | ||
|
|
2231e4068d | ||
|
|
b3680f0016 | ||
|
|
89527796f6 | ||
|
|
165d593fdb | ||
|
|
d8b09628f0 | ||
|
|
d35e8ec351 | ||
|
|
f50b0ce8af | ||
|
|
ed8607b710 | ||
|
|
ea28d3b6f3 | ||
|
|
827cea3245 | ||
|
|
b2a0d83518 | ||
|
|
85e0139f32 | ||
|
|
80d5df0ceb | ||
|
|
3a54e5b644 | ||
|
|
acc6a9bd01 | ||
|
|
96af6dc499 | ||
|
|
675e1b4118 | ||
|
|
8ca484f538 | ||
|
|
9a25f4fbe4 | ||
|
|
467ec46cd3 | ||
|
|
52feff2213 | ||
|
|
add65f2f0c | ||
|
|
20f2bae49b | ||
|
|
8eb9df8447 | ||
|
|
88aaffa957 | ||
|
|
469c0b41df | ||
|
|
4a34f72f22 | ||
|
|
4d721e1410 | ||
|
|
9c91da8a2b | ||
|
|
5b9d942313 | ||
|
|
d6b37cb87e | ||
|
|
9c6f077818 | ||
|
|
0b5d936dbe | ||
|
|
6eebed33b2 | ||
|
|
43085a80bc | ||
|
|
4f90b114ea | ||
|
|
d9fa353a06 | ||
|
|
9a1d7460f6 | ||
|
|
d18d17b861 | ||
|
|
4b57c0d4e6 | ||
|
|
ccd9b2d2c5 | ||
|
|
ec770cd819 | ||
|
|
b7ec633fb2 | ||
|
|
7aabff1236 | ||
|
|
9dc1bdffb1 | ||
|
|
2ac672a663 | ||
|
|
11ae6b29d5 | ||
|
|
f201f59e27 | ||
|
|
25d45e1ac5 | ||
|
|
298ba99b8f | ||
|
|
65cbe3cac3 | ||
|
|
f94e8dcf04 | ||
|
|
9629303a0f | ||
|
|
020c4a3b14 | ||
|
|
2f2d1a908b | ||
|
|
03ad8a3cd0 | ||
|
|
1218e111ef | ||
|
|
78b7529172 | ||
|
|
e2bcb44687 | ||
|
|
a57c27eeec | ||
|
|
926f323a72 | ||
|
|
aa20adb22b | ||
|
|
3e0779a78d | ||
|
|
09442d65f2 | ||
|
|
415b99dab3 | ||
|
|
35b038edd3 | ||
|
|
34a95c1556 | ||
|
|
b2821420fd | ||
|
|
216a33b4cd | ||
|
|
ad0bb7ce23 | ||
|
|
17b84f6c09 | ||
|
|
7629f7f0d6 | ||
|
|
ac5f313129 | ||
|
|
329f245283 | ||
|
|
d6595ad7c9 | ||
|
|
114df7a345 | ||
|
|
e5ff5ec895 | ||
|
|
1bc02f9f6a | ||
|
|
05fa7791dc | ||
|
|
6fbdec6e83 | ||
|
|
94eb7cc592 | ||
|
|
b847e57991 | ||
|
|
07a731c4bb | ||
|
|
4ee7a1e173 | ||
|
|
ede778fb7d | ||
|
|
64a07dad38 | ||
|
|
623eb79080 | ||
|
|
51b8fd8393 | ||
|
|
6f7776e5ec | ||
|
|
a70cee9651 | ||
|
|
5e36cb91de | ||
|
|
74bf99b828 | ||
|
|
3ed0cfbd5f | ||
|
|
aca31dffb3 | ||
|
|
18b80e3781 | ||
|
|
b83174f32d | ||
|
|
80bbe47774 | ||
|
|
7726963e86 | ||
|
|
db2136b17c | ||
|
|
42043a0888 | ||
|
|
246793e873 | ||
|
|
692b0f1410 | ||
|
|
0629e1d731 | ||
|
|
9707c7bcb1 | ||
|
|
194fbef73c | ||
|
|
f7db00c1eb | ||
|
|
2f4b31ecc6 | ||
|
|
9289624688 | ||
|
|
5a8749cd5b | ||
|
|
4a7fb525d7 | ||
|
|
8888fcafa7 | ||
|
|
63a8c6d26b | ||
|
|
fc222bed7c | ||
|
|
6132ff93a2 | ||
|
|
87556aa741 | ||
|
|
43362b2832 | ||
|
|
db2d0c2e9b | ||
|
|
922d493159 | ||
|
|
c4811c3104 | ||
|
|
0ec840b3b4 | ||
|
|
0b96d08877 | ||
|
|
7abd41609f | ||
|
|
fcc193b7d1 | ||
|
|
44d74a7d8a | ||
|
|
4189855fc1 | ||
|
|
77f1abc17d | ||
|
|
96d58ccd1b | ||
|
|
823374b578 | ||
|
|
b127c1c8a7 | ||
|
|
b1ea09d901 | ||
|
|
8c1c3df232 | ||
|
|
cee08c38f4 | ||
|
|
bc8f613ba6 | ||
|
|
af584a8517 | ||
|
|
1805a956a3 | ||
|
|
74717b888e | ||
|
|
24fc88ced2 | ||
|
|
1e9dcdb7d1 | ||
|
|
7233b5f419 | ||
|
|
b9eddafe71 | ||
|
|
3a53a88139 | ||
|
|
6cbbb22ab4 | ||
|
|
b6a8af5b20 | ||
|
|
30c1a00225 | ||
|
|
b345342369 | ||
|
|
438680f3e4 | ||
|
|
740c2c4069 | ||
|
|
35429e3c46 | ||
|
|
fb265417d0 | ||
|
|
15af65b9c5 | ||
|
|
c2fdfab3ed | ||
|
|
bdd1266087 | ||
|
|
3cb713c5d7 | ||
|
|
0106939d30 | ||
|
|
e371747bae | ||
|
|
514137ecd5 | ||
|
|
4f4019b920 | ||
|
|
30fe97339b | ||
|
|
c91eb92d7f | ||
|
|
fdeaaee53d | ||
|
|
0cf1b70947 | ||
|
|
6a9f4fdce0 | ||
|
|
852c47f677 | ||
|
|
8be4af33ee | ||
|
|
daf0d59461 | ||
|
|
348f2bdde3 | ||
|
|
12b18ea7f4 | ||
|
|
381b80125a | ||
|
|
739b1f33e4 | ||
|
|
d312c0d6b3 | ||
|
|
61ec338ea8 | ||
|
|
b6cfbad35b | ||
|
|
41589d5110 | ||
|
|
4fcd61c6b1 | ||
|
|
c96ecaae4a | ||
|
|
d1f35ffb59 | ||
|
|
b348dc2b55 | ||
|
|
119e3098db | ||
|
|
4bf0615579 | ||
|
|
93c7b5e248 | ||
|
|
51eb0dd362 | ||
|
|
6a283102f9 | ||
|
|
8a5887a4d5 | ||
|
|
b605bb4c53 | ||
|
|
23b26e0b48 | ||
|
|
9efc4214b2 | ||
|
|
84b759d767 | ||
|
|
abac635737 | ||
|
|
f0ea4be2e0 | ||
|
|
010a6867f3 | ||
|
|
ee0d6b1841 | ||
|
|
0604e363f4 | ||
|
|
77d7177627 | ||
|
|
c44af99c6b | ||
|
|
4f92d2942a | ||
|
|
6013ed9fd7 | ||
|
|
8ea2e8c632 | ||
|
|
d1615bcdb6 | ||
|
|
76d920eda7 | ||
|
|
35a7d9bb15 | ||
|
|
8257e0d455 | ||
|
|
d47958b7c5 | ||
|
|
380de9fd10 | ||
|
|
ff4405589d | ||
|
|
1f072205a9 | ||
|
|
c970018fc7 | ||
|
|
5a3ebc1ba9 | ||
|
|
a97bbb0f8d | ||
|
|
46c7ff7a83 | ||
|
|
f326beb1f2 | ||
|
|
55d5c29f38 | ||
|
|
47273ef6da | ||
|
|
e5fc57af0e | ||
|
|
2921c25c62 | ||
|
|
e04e90fcbc | ||
|
|
d27eeb2b84 | ||
|
|
62ea073bad | ||
|
|
187864a4e4 | ||
|
|
a666c4a787 | ||
|
|
bda4ee0ad5 | ||
|
|
4925873a67 | ||
|
|
63ed4eb77f | ||
|
|
d03a64ced0 | ||
|
|
615a56353d | ||
|
|
45db6df1eb | ||
|
|
ac628f39ec | ||
|
|
20babc46a1 | ||
|
|
a6141ed2f0 | ||
|
|
a12bb8d0e2 | ||
|
|
5ae10e0463 | ||
|
|
ff873a274b | ||
|
|
7ad94c34e7 | ||
|
|
f8509846cf | ||
|
|
9334e607a0 | ||
|
|
f198b6eb63 | ||
|
|
cb1870e7bf | ||
|
|
384205a8c5 | ||
|
|
d9e64d2cfe | ||
|
|
5ccb0af867 | ||
|
|
da621c3524 | ||
|
|
3a28576e02 | ||
|
|
dbb7a555ce | ||
|
|
7a6991c8d9 | ||
|
|
6efac16c80 | ||
|
|
a7360a4b34 | ||
|
|
4fb9f0cb74 | ||
|
|
89f2d48f0f | ||
|
|
11dcbff707 | ||
|
|
7a6074721f | ||
|
|
959e43d8f9 | ||
|
|
f933ab4602 | ||
|
|
af78d2fd69 | ||
|
|
6f9c4aa2e0 | ||
|
|
5efa4a4751 | ||
|
|
cde336ec99 | ||
|
|
b8c51c56c2 | ||
|
|
22c28adc78 | ||
|
|
7b04f31566 | ||
|
|
0fff415c2a | ||
|
|
987538fc49 | ||
|
|
2642020398 | ||
|
|
c4a2b762e7 | ||
|
|
339d0db240 | ||
|
|
43568ccd69 | ||
|
|
fbd73f2f17 | ||
|
|
4a21ad9540 | ||
|
|
18de7e45e9 | ||
|
|
48f66aa3fe | ||
|
|
18274462ff | ||
|
|
90e4c159b1 | ||
|
|
4f57216935 | ||
|
|
e6b68305ec | ||
|
|
4ce651c0e4 | ||
|
|
db2d4e45eb | ||
|
|
ab8b73e8f8 | ||
|
|
876b8bd795 | ||
|
|
64ef6b63b7 | ||
|
|
a77984a381 | ||
|
|
31a1f5968b | ||
|
|
4ca73f0406 | ||
|
|
0909f94c20 | ||
|
|
d1c01c1ecc | ||
|
|
f8cdd608e2 | ||
|
|
2e4b83b710 | ||
|
|
6fbcbb3286 | ||
|
|
a843682f7c | ||
|
|
0611bf915b | ||
|
|
9a9cb016fa | ||
|
|
74a66fb68a | ||
|
|
aedfd3bfb8 | ||
|
|
a2e13bdeed | ||
|
|
a7d991f3cc | ||
|
|
11bc00d629 | ||
|
|
5005d7966d | ||
|
|
c2a05c71c7 | ||
|
|
51bbc1dc95 | ||
|
|
7b5e3407d1 | ||
|
|
52ab4e9376 | ||
|
|
9bfbff953b | ||
|
|
6af2d32e10 | ||
|
|
75b944ff50 | ||
|
|
bbb67198bb | ||
|
|
6be2ebde9d | ||
|
|
a4f1f25cc4 | ||
|
|
c29f6f51da | ||
|
|
edb899b9ce | ||
|
|
a8f7ecefae | ||
|
|
ec1afc2665 | ||
|
|
f12284ab2e | ||
|
|
a9ff0b5243 | ||
|
|
0a271a04cc | ||
|
|
6fa78df282 | ||
|
|
b62536fcdc | ||
|
|
9741d4ae94 | ||
|
|
68f326d9e1 | ||
|
|
76ee7291d6 | ||
|
|
d31f09035e | ||
|
|
8d7c2e6d2a | ||
|
|
9269a305fb | ||
|
|
073b315737 | ||
|
|
47c46fbe17 | ||
|
|
39572968bb | ||
|
|
4383764cae | ||
|
|
e0ef0563ce | ||
|
|
d9cf2c487d | ||
|
|
58bf4b21e7 | ||
|
|
e95c619eaa | ||
|
|
cd04c0bdb2 | ||
|
|
fd74926e76 | ||
|
|
f82ff5a4fd | ||
|
|
fa72bef8d4 | ||
|
|
2f7f1f8e83 | ||
|
|
90d083489b | ||
|
|
295cd29aeb | ||
|
|
1c844aad64 | ||
|
|
e0cd18e264 | ||
|
|
9f9faf2215 | ||
|
|
3907a60b33 | ||
|
|
e85e961af6 | ||
|
|
61cbae2697 | ||
|
|
2d512c5e47 | ||
|
|
936297a6b2 | ||
|
|
ad0f9e8cba | ||
|
|
4d20d3f543 | ||
|
|
c3e5227992 | ||
|
|
ff39445db2 | ||
|
|
77e9b0a6d1 | ||
|
|
cfd85db900 | ||
|
|
948519d460 | ||
|
|
9a67f0d1a7 | ||
|
|
17b5a60247 | ||
|
|
f42895465d | ||
|
|
9006dd5d16 | ||
|
|
27d776cdf2 | ||
|
|
1827d3d5c9 | ||
|
|
2b5782c920 | ||
|
|
6284def316 | ||
|
|
0c11078302 | ||
|
|
507fac9284 | ||
|
|
22abb9dab1 | ||
|
|
6463176bc0 | ||
|
|
b208bc4c12 | ||
|
|
53ad8c2f35 | ||
|
|
34ba0ca8d7 | ||
|
|
6d82700032 | ||
|
|
a0a991ca16 | ||
|
|
989b893bf2 | ||
|
|
d270edea75 | ||
|
|
7aa407099c | ||
|
|
abeeb37e75 |
@@ -1,50 +0,0 @@
|
|||||||
defaults: &defaults
|
|
||||||
docker :
|
|
||||||
- image: knqyf263/ci-trivy:latest
|
|
||||||
environment:
|
|
||||||
CGO_ENABLED: "0"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
<<: *defaults
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: Test
|
|
||||||
command: go test ./...
|
|
||||||
release:
|
|
||||||
<<: *defaults
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: Release
|
|
||||||
command: goreleaser --rm-dist
|
|
||||||
- run:
|
|
||||||
name: Clone trivy repository
|
|
||||||
command: git clone git@github.com:knqyf263/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:
|
|
||||||
- test
|
|
||||||
- release:
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
ignore: /.*/
|
|
||||||
tags:
|
|
||||||
only: /.*/
|
|
||||||
5
.clang-format
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
Language: Proto
|
||||||
|
BasedOnStyle: Google
|
||||||
|
AlignConsecutiveAssignments: true
|
||||||
|
AlignConsecutiveDeclarations: true
|
||||||
6
.dockerignore
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
.git
|
||||||
|
.github
|
||||||
|
.cache
|
||||||
|
.circleci
|
||||||
|
integration
|
||||||
|
imgs
|
||||||
9
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Global
|
||||||
|
* @knqyf263
|
||||||
|
|
||||||
|
# Helm chart
|
||||||
|
helm/trivy/ @krol3
|
||||||
|
|
||||||
|
# Kubernetes scanning
|
||||||
|
pkg/k8s/ @josedonizetti @chen-keinan
|
||||||
|
docs/docs/kubernetes/ @josedonizetti @chen-keinan
|
||||||
31
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
name: Bug Report
|
||||||
|
labels: kind/bug
|
||||||
|
about: If something isn't working as expected.
|
||||||
|
---
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Briefly describe the problem you are having in a few paragraphs.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## What did you expect to happen?
|
||||||
|
|
||||||
|
|
||||||
|
## What happened instead?
|
||||||
|
|
||||||
|
|
||||||
|
## Output of run with `-debug`:
|
||||||
|
|
||||||
|
```
|
||||||
|
(paste your output here)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output of `trivy -v`:
|
||||||
|
|
||||||
|
```
|
||||||
|
(paste your output here)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Additional details (base image name, container registry info...):
|
||||||
9
.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
name: Feature Request
|
||||||
|
labels: kind/feature
|
||||||
|
about: I have a suggestion (and might want to implement myself)!
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
If this is a FEATURE REQUEST, request format does not matter!
|
||||||
|
-->
|
||||||
10
.github/ISSUE_TEMPLATE/SUPPORT_QUESTION.md
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
name: Support Question
|
||||||
|
labels: triage/support
|
||||||
|
about: If you have a question about Trivy.
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
If you have a trouble, feel free to ask.
|
||||||
|
Make sure you're not asking duplicate question by searching on the issues lists.
|
||||||
|
-->
|
||||||
33
.github/ISSUE_TEMPLATE/WRONG_DETECTION.md
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
name: Wrong Detection
|
||||||
|
labels: ["kind/bug"]
|
||||||
|
about: If Trivy doesn't detect something, or shows false positive detection
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
- [ ] I've read [the documentation regarding wrong detection](https://aquasecurity.github.io/trivy/latest/community/contribute/issue/#wrong-detection).
|
||||||
|
- [ ] I've confirmed that a security advisory in data sources was correct.
|
||||||
|
- Run Trivy with `-f json` that shows data sources and make sure that the security advisory is correct.
|
||||||
|
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Briefly describe the CVE that aren't detected and information about artifacts with this CVE.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## JSON Output of run with `-debug`:
|
||||||
|
|
||||||
|
```
|
||||||
|
(paste your output here)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output of `trivy -v`:
|
||||||
|
|
||||||
|
```
|
||||||
|
(paste your output here)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Additional details (base image name, container registry info...):
|
||||||
|
|
||||||
|
|
||||||
15
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: monthly
|
||||||
|
- package-ecosystem: docker
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: monthly
|
||||||
|
- package-ecosystem: gomod
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: monthly
|
||||||
18
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
## Description
|
||||||
|
|
||||||
|
## Related issues
|
||||||
|
- Close #XXX
|
||||||
|
|
||||||
|
## Related PRs
|
||||||
|
- [ ] #XXX
|
||||||
|
- [ ] #YYY
|
||||||
|
|
||||||
|
Remove this section if you don't have related PRs.
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
- [ ] I've read the [guidelines for contributing](https://aquasecurity.github.io/trivy/latest/community/contribute/pr/) to this repository.
|
||||||
|
- [ ] I've followed the [conventions](https://aquasecurity.github.io/trivy/latest/community/contribute/pr/#title) in the PR title.
|
||||||
|
- [ ] I've added tests that prove my fix is effective or that my feature works.
|
||||||
|
- [ ] I've updated the [documentation](https://github.com/aquasecurity/trivy/blob/main/docs) with the relevant information (if needed).
|
||||||
|
- [ ] I've added usage information (if the PR introduces new options)
|
||||||
|
- [ ] I've included a "before" and "after" example to the description (if the PR is a user interface change).
|
||||||
33
.github/workflows/mkdocs-dev.yaml
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
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@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
persist-credentials: true
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git
|
||||||
|
pip install -r docs/build/requirements.txt
|
||||||
|
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
|
||||||
41
.github/workflows/mkdocs-latest.yaml
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
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@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
persist-credentials: true
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git
|
||||||
|
pip install -r docs/build/requirements.txt
|
||||||
|
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
|
||||||
87
.github/workflows/publish-chart.yaml
vendored
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
|
||||||
|
name: Publish Helm chart
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'helm/trivy/**'
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
env:
|
||||||
|
HELM_REP: helm-charts
|
||||||
|
GH_OWNER: aquasecurity
|
||||||
|
CHART_DIR: helm/trivy
|
||||||
|
KIND_VERSION: "v0.11.1"
|
||||||
|
KIND_IMAGE: "kindest/node:v1.21.1@sha256:69860bda5563ac81e3c0057d654b5253219618a22ec3a346306239bba8cfa1a6"
|
||||||
|
jobs:
|
||||||
|
test-chart:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Install Helm
|
||||||
|
uses: azure/setup-helm@18bc76811624f360dbd7f18c2d4ecb32c7b87bab
|
||||||
|
with:
|
||||||
|
version: v3.5.0
|
||||||
|
- name: Set up python
|
||||||
|
uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: 3.7
|
||||||
|
- name: Setup Chart Linting
|
||||||
|
id: lint
|
||||||
|
uses: helm/chart-testing-action@dae259e86a35ff09145c0805e2d7dd3f7207064a
|
||||||
|
- name: Setup Kubernetes cluster (KIND)
|
||||||
|
uses: helm/kind-action@94729529f85113b88f4f819c17ce61382e6d8478
|
||||||
|
with:
|
||||||
|
version: ${{ env.KIND_VERSION }}
|
||||||
|
image: ${{ env.KIND_IMAGE }}
|
||||||
|
- name: Run chart-testing
|
||||||
|
run: ct lint-and-install --validate-maintainers=false --charts helm/trivy
|
||||||
|
- name: Run chart-testing (Ingress enabled)
|
||||||
|
run: |
|
||||||
|
sed -i -e '117s,false,'true',g' ./helm/trivy/values.yaml
|
||||||
|
ct lint-and-install --validate-maintainers=false --charts helm/trivy
|
||||||
|
|
||||||
|
publish-chart:
|
||||||
|
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
||||||
|
needs:
|
||||||
|
- test-chart
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Install chart-releaser
|
||||||
|
run: |
|
||||||
|
wget https://github.com/helm/chart-releaser/releases/download/v1.3.0/chart-releaser_1.3.0_linux_amd64.tar.gz
|
||||||
|
echo "baed2315a9bb799efb71d512c5198a2a3b8dcd139d7f22f878777cffcd649a37 chart-releaser_1.3.0_linux_amd64.tar.gz" | sha256sum -c -
|
||||||
|
tar xzvf chart-releaser_1.3.0_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
|
||||||
|
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@c93037aa10fa8893de271f19978c980d0c1a9b37 #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'
|
||||||
92
.github/workflows/release.yaml
vendored
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
name: Release
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
env:
|
||||||
|
GO_VERSION: "1.18"
|
||||||
|
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"
|
||||||
|
permissions:
|
||||||
|
id-token: write # For cosign
|
||||||
|
packages: write # For GHCR
|
||||||
|
contents: read # Not required for public repositories, but for clarity
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install rpm reprepro createrepo distro-info
|
||||||
|
- uses: sigstore/cosign-installer@536b37ec5d5b543420bdfd9b744c5965bd4d8730
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
- name: Show available Docker Buildx platforms
|
||||||
|
run: echo ${{ steps.buildx.outputs.platforms }}
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Cache Go modules
|
||||||
|
uses: actions/cache@v3.0.2
|
||||||
|
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@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USER }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Login to ghcr.io registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ env.GH_USER }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Login to ECR
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
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@v1
|
||||||
|
with:
|
||||||
|
args: mod -licenses -json -output bom.json
|
||||||
|
version: ^v1
|
||||||
|
- name: Release
|
||||||
|
uses: goreleaser/goreleaser-action@v3
|
||||||
|
with:
|
||||||
|
version: v1.4.1
|
||||||
|
args: release --rm-dist --timeout 60m
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.ORG_REPO_TOKEN }}
|
||||||
|
- name: Checkout trivy-repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
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
|
||||||
23
.github/workflows/scan.yaml
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
name: Scan vulnerabilities
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Scan Go vulnerabilities
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Run Trivy vulnerability scanner and create GitHub issues
|
||||||
|
uses: knqyf263/trivy-issue-action@v0.0.4
|
||||||
|
with:
|
||||||
|
assignee: knqyf263
|
||||||
|
severity: CRITICAL
|
||||||
|
skip-dirs: integration,examples
|
||||||
|
label: vulnerability
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
86
.github/workflows/semantic-pr.yaml
vendored
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
name: "Lint PR title"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- edited
|
||||||
|
- synchronize
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
main:
|
||||||
|
name: Validate PR title
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: amannn/action-semantic-pull-request@v4
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
types:
|
||||||
|
feat
|
||||||
|
fix
|
||||||
|
docs
|
||||||
|
style
|
||||||
|
refactor
|
||||||
|
perf
|
||||||
|
test
|
||||||
|
build
|
||||||
|
ci
|
||||||
|
chore
|
||||||
|
revert
|
||||||
|
BREAKING
|
||||||
|
|
||||||
|
scopes:
|
||||||
|
vuln
|
||||||
|
misconf
|
||||||
|
secret
|
||||||
|
|
||||||
|
image
|
||||||
|
fs
|
||||||
|
repo
|
||||||
|
sbom
|
||||||
|
server
|
||||||
|
k8s
|
||||||
|
|
||||||
|
alpine
|
||||||
|
redhat
|
||||||
|
alma
|
||||||
|
rocky
|
||||||
|
mariner
|
||||||
|
oracle
|
||||||
|
debian
|
||||||
|
ubuntu
|
||||||
|
amazon
|
||||||
|
suse
|
||||||
|
photon
|
||||||
|
distroless
|
||||||
|
|
||||||
|
ruby
|
||||||
|
php
|
||||||
|
python
|
||||||
|
nodejs
|
||||||
|
rust
|
||||||
|
dotnet
|
||||||
|
java
|
||||||
|
go
|
||||||
|
|
||||||
|
os
|
||||||
|
lang
|
||||||
|
|
||||||
|
kubernetes
|
||||||
|
dockerfile
|
||||||
|
terraform
|
||||||
|
cloudformation
|
||||||
|
|
||||||
|
docker
|
||||||
|
podman
|
||||||
|
containerd
|
||||||
|
oci
|
||||||
|
|
||||||
|
cli
|
||||||
|
flag
|
||||||
|
|
||||||
|
helm
|
||||||
|
report
|
||||||
|
db
|
||||||
|
deps
|
||||||
20
.github/workflows/stale-issues.yaml
vendored
Normal 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@v5
|
||||||
|
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
|
||||||
137
.github/workflows/test.yaml
vendored
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
name: Test
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths-ignore:
|
||||||
|
- '*.md'
|
||||||
|
- 'docs/**'
|
||||||
|
- 'mkdocs.yml'
|
||||||
|
- 'LICENSE'
|
||||||
|
pull_request:
|
||||||
|
env:
|
||||||
|
GO_VERSION: "1.18"
|
||||||
|
TINYGO_VERSION: "0.23.0"
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
|
||||||
|
- name: go mod tidy
|
||||||
|
run: |
|
||||||
|
go mod tidy
|
||||||
|
if [ -n "$(git status --porcelain)" ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Lint
|
||||||
|
uses: golangci/golangci-lint-action@v3.2.0
|
||||||
|
with:
|
||||||
|
version: v1.45
|
||||||
|
args: --deadline=30m
|
||||||
|
skip-cache: true # https://github.com/golangci/golangci-lint-action/issues/244#issuecomment-1052197778
|
||||||
|
|
||||||
|
- name: Install TinyGo
|
||||||
|
run: |
|
||||||
|
wget https://github.com/tinygo-org/tinygo/releases/download/v${TINYGO_VERSION}/tinygo_${TINYGO_VERSION}_amd64.deb
|
||||||
|
sudo dpkg -i tinygo_${TINYGO_VERSION}_amd64.deb
|
||||||
|
|
||||||
|
- name: Run unit tests
|
||||||
|
run: make test
|
||||||
|
|
||||||
|
integration:
|
||||||
|
name: Integration Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
id: go
|
||||||
|
|
||||||
|
- name: Check out code into the Go module directory
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Run integration tests
|
||||||
|
run: make test-integration
|
||||||
|
|
||||||
|
module-test:
|
||||||
|
name: Module Integration Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
id: go
|
||||||
|
|
||||||
|
- name: Install TinyGo
|
||||||
|
run: |
|
||||||
|
wget https://github.com/tinygo-org/tinygo/releases/download/v${TINYGO_VERSION}/tinygo_${TINYGO_VERSION}_amd64.deb
|
||||||
|
sudo dpkg -i tinygo_${TINYGO_VERSION}_amd64.deb
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Run module integration tests
|
||||||
|
run: |
|
||||||
|
make test-module-integration
|
||||||
|
|
||||||
|
build-test:
|
||||||
|
name: Build Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
DOCKER_CLI_EXPERIMENTAL: "enabled"
|
||||||
|
steps:
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
|
- name: Show available Docker Buildx platforms
|
||||||
|
run: echo ${{ steps.buildx.outputs.platforms }}
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
|
||||||
|
- name: Run GoReleaser
|
||||||
|
uses: goreleaser/goreleaser-action@v3
|
||||||
|
with:
|
||||||
|
version: v1.4.1
|
||||||
|
args: release --snapshot --rm-dist --skip-publish --timeout 60m
|
||||||
|
|
||||||
|
build-documents:
|
||||||
|
name: Documentation Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
persist-credentials: true
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip install -r docs/build/requirements.txt
|
||||||
|
- 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
|
||||||
21
.gitignore
vendored
@@ -4,6 +4,10 @@
|
|||||||
*.dll
|
*.dll
|
||||||
*.so
|
*.so
|
||||||
*.dylib
|
*.dylib
|
||||||
|
/trivy
|
||||||
|
|
||||||
|
## chart release
|
||||||
|
.cr-release-packages
|
||||||
|
|
||||||
# Test binary, build with `go test -c`
|
# Test binary, build with `go test -c`
|
||||||
*.test
|
*.test
|
||||||
@@ -12,3 +16,20 @@
|
|||||||
*.out
|
*.out
|
||||||
|
|
||||||
.idea
|
.idea
|
||||||
|
|
||||||
|
# Directory Cache Files
|
||||||
|
.DS_Store
|
||||||
|
thumbs.db
|
||||||
|
|
||||||
|
# test fixtures
|
||||||
|
coverage.txt
|
||||||
|
integration/testdata/fixtures/images
|
||||||
|
|
||||||
|
# SBOMs generated during CI
|
||||||
|
/bom.json
|
||||||
|
|
||||||
|
# goreleaser output
|
||||||
|
dist
|
||||||
|
|
||||||
|
# WebAssembly
|
||||||
|
*.wasm
|
||||||
|
|||||||
74
.golangci.yaml
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
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: 20
|
||||||
|
dupl:
|
||||||
|
threshold: 100
|
||||||
|
goconst:
|
||||||
|
min-len: 3
|
||||||
|
min-occurrences: 3
|
||||||
|
misspell:
|
||||||
|
locale: US
|
||||||
|
goimports:
|
||||||
|
local-prefixes: github.com/aquasecurity
|
||||||
|
gosec:
|
||||||
|
excludes:
|
||||||
|
- G204
|
||||||
|
- G402
|
||||||
|
|
||||||
|
linters:
|
||||||
|
disable-all: true
|
||||||
|
enable:
|
||||||
|
- structcheck
|
||||||
|
- ineffassign
|
||||||
|
- typecheck
|
||||||
|
- govet
|
||||||
|
- errcheck
|
||||||
|
- varcheck
|
||||||
|
- deadcode
|
||||||
|
- revive
|
||||||
|
- gosec
|
||||||
|
- unconvert
|
||||||
|
- goconst
|
||||||
|
- gocyclo
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
- misspell
|
||||||
|
|
||||||
|
run:
|
||||||
|
go: 1.18
|
||||||
|
skip-files:
|
||||||
|
- ".*._mock.go$"
|
||||||
|
- ".*._test.go$"
|
||||||
|
- "integration/*"
|
||||||
|
- "examples/*"
|
||||||
|
|
||||||
|
issues:
|
||||||
|
exclude-rules:
|
||||||
|
- linters:
|
||||||
|
- gosec
|
||||||
|
text: "G304: Potential file inclusion"
|
||||||
|
- linters:
|
||||||
|
- gosec
|
||||||
|
text: "Deferring unsafe method"
|
||||||
|
- 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
|
||||||
1
CONTRIBUTING.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
See [Issues](https://aquasecurity.github.io/trivy/latest/community/contribute/issue/) and [Pull Requests](https://aquasecurity.github.io/trivy/latest/community/contribute/pr/)
|
||||||
5
Dockerfile
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
FROM alpine:3.16.0
|
||||||
|
RUN apk --no-cache add ca-certificates git
|
||||||
|
COPY trivy /usr/local/bin/trivy
|
||||||
|
COPY contrib/*.tpl contrib/
|
||||||
|
ENTRYPOINT ["trivy"]
|
||||||
12
Dockerfile.protoc
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
FROM golang:1.18.2
|
||||||
|
|
||||||
|
# Install protoc (cf. http://google.github.io/proto-lens/installing-protoc.html)
|
||||||
|
ENV PROTOC_ZIP=protoc-3.19.4-linux-x86_64.zip
|
||||||
|
RUN apt-get update && apt-get install -y unzip
|
||||||
|
RUN curl --retry 5 -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/$PROTOC_ZIP \
|
||||||
|
&& unzip -o $PROTOC_ZIP -d /usr/local bin/protoc \
|
||||||
|
&& unzip -o $PROTOC_ZIP -d /usr/local 'include/*' \
|
||||||
|
&& rm -f $PROTOC_ZIP
|
||||||
|
|
||||||
|
RUN go install github.com/twitchtv/twirp/protoc-gen-twirp@v8.1.0
|
||||||
|
RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.27.1
|
||||||
214
LICENSE
@@ -1,21 +1,201 @@
|
|||||||
MIT License
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
Copyright (c) 2019 Teppei Fukuda
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
1. Definitions.
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
copies or substantial portions of the Software.
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
the copyright owner that is granting the License.
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
other entities that control, are controlled by, or are under common
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
control with that entity. For the purposes of this definition,
|
||||||
SOFTWARE.
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|||||||
124
Makefile
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
VERSION := $(shell git describe --tags)
|
||||||
|
LDFLAGS := -ldflags "-s -w -X=main.version=$(VERSION)"
|
||||||
|
|
||||||
|
GOPATH := $(shell go env GOPATH)
|
||||||
|
GOBIN := $(GOPATH)/bin
|
||||||
|
GOSRC := $(GOPATH)/src
|
||||||
|
|
||||||
|
TEST_MODULE_DIR := pkg/module/testdata
|
||||||
|
TEST_MODULE_SRCS := $(wildcard $(TEST_MODULE_DIR)/*/*.go)
|
||||||
|
TEST_MODULES := $(patsubst %.go,%.wasm,$(TEST_MODULE_SRCS))
|
||||||
|
|
||||||
|
EXAMPLE_MODULE_DIR := examples/module
|
||||||
|
EXAMPLE_MODULE_SRCS := $(wildcard $(EXAMPLE_MODULE_DIR)/*/*.go)
|
||||||
|
EXAMPLE_MODULES := $(patsubst %.go,%.wasm,$(EXAMPLE_MODULE_SRCS))
|
||||||
|
|
||||||
|
MKDOCS_IMAGE := aquasec/mkdocs-material:dev
|
||||||
|
MKDOCS_PORT := 8000
|
||||||
|
|
||||||
|
u := $(if $(update),-u)
|
||||||
|
|
||||||
|
# Tools
|
||||||
|
$(GOBIN)/wire:
|
||||||
|
go install github.com/google/wire/cmd/wire@v0.5.0
|
||||||
|
|
||||||
|
$(GOBIN)/crane:
|
||||||
|
go install github.com/google/go-containerregistry/cmd/crane@v0.9.0
|
||||||
|
|
||||||
|
$(GOBIN)/golangci-lint:
|
||||||
|
curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(GOBIN) v1.45.2
|
||||||
|
|
||||||
|
$(GOBIN)/labeler:
|
||||||
|
go install github.com/knqyf263/labeler@latest
|
||||||
|
|
||||||
|
$(GOBIN)/easyjson:
|
||||||
|
go install github.com/mailru/easyjson/...@v0.7.7
|
||||||
|
|
||||||
|
.PHONY: wire
|
||||||
|
wire: $(GOBIN)/wire
|
||||||
|
wire gen ./pkg/commands/... ./pkg/rpc/...
|
||||||
|
|
||||||
|
.PHONY: mock
|
||||||
|
mock: $(GOBIN)/mockery
|
||||||
|
mockery -all -inpkg -case=snake -dir $(DIR)
|
||||||
|
|
||||||
|
.PHONY: deps
|
||||||
|
deps:
|
||||||
|
go get ${u} -d
|
||||||
|
go mod tidy
|
||||||
|
|
||||||
|
.PHONY: generate-test-modules
|
||||||
|
generate-test-modules: $(TEST_MODULES)
|
||||||
|
|
||||||
|
# Compile WASM modules for unit and integration tests
|
||||||
|
%.wasm:%.go
|
||||||
|
@if !(type "tinygo" > /dev/null 2>&1); then \
|
||||||
|
echo "Need to install TinyGo. Follow https://tinygo.org/getting-started/install/"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
go generate $<
|
||||||
|
|
||||||
|
# Run unit tests
|
||||||
|
.PHONY: test
|
||||||
|
test: $(TEST_MODULES)
|
||||||
|
go test -v -short -coverprofile=coverage.txt -covermode=atomic ./...
|
||||||
|
|
||||||
|
integration/testdata/fixtures/images/*.tar.gz: $(GOBIN)/crane
|
||||||
|
mkdir -p integration/testdata/fixtures/images/
|
||||||
|
integration/scripts/download-images.sh
|
||||||
|
|
||||||
|
# Run integration tests
|
||||||
|
.PHONY: test-integration
|
||||||
|
test-integration: integration/testdata/fixtures/images/*.tar.gz
|
||||||
|
go test -v -tags=integration ./integration/...
|
||||||
|
|
||||||
|
# Run WASM integration tests
|
||||||
|
.PHONY: test-module-integration
|
||||||
|
test-module-integration: integration/testdata/fixtures/images/*.tar.gz $(EXAMPLE_MODULES)
|
||||||
|
go test -v -tags=module_integration ./integration/...
|
||||||
|
|
||||||
|
.PHONY: lint
|
||||||
|
lint: $(GOBIN)/golangci-lint
|
||||||
|
$(GOBIN)/golangci-lint run --timeout 5m
|
||||||
|
|
||||||
|
.PHONY: fmt
|
||||||
|
fmt:
|
||||||
|
find ./ -name "*.proto" | xargs clang-format -i
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
go build $(LDFLAGS) ./cmd/trivy
|
||||||
|
|
||||||
|
.PHONY: protoc
|
||||||
|
protoc:
|
||||||
|
docker build -t trivy-protoc - < Dockerfile.protoc
|
||||||
|
docker run --rm -it -v ${PWD}:/app -w /app trivy-protoc make _$@
|
||||||
|
|
||||||
|
_protoc:
|
||||||
|
for path in `find ./rpc/ -name "*.proto" -type f`; do \
|
||||||
|
protoc --twirp_out=. --twirp_opt=paths=source_relative --go_out=. --go_opt=paths=source_relative $${path} || exit; \
|
||||||
|
done
|
||||||
|
|
||||||
|
.PHONY: install
|
||||||
|
install:
|
||||||
|
go install $(LDFLAGS) ./cmd/trivy
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf integration/testdata/fixtures/images
|
||||||
|
|
||||||
|
# Create labels on GitHub
|
||||||
|
.PHONY: label
|
||||||
|
label: $(GOBIN)/labeler
|
||||||
|
labeler apply misc/triage/labels.yaml -r aquasecurity/trivy -l 5
|
||||||
|
|
||||||
|
# Run MkDocs development server to preview the documentation page
|
||||||
|
.PHONY: mkdocs-serve
|
||||||
|
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)
|
||||||
|
|
||||||
|
# Generate JSON marshaler/unmarshaler for TinyGo/WebAssembly as TinyGo doesn't support encoding/json.
|
||||||
|
.PHONY: easyjson
|
||||||
|
easyjson: $(GOBIN)/easyjson
|
||||||
|
easyjson pkg/module/serialize/types.go
|
||||||
4
NOTICE
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
Trivy
|
||||||
|
Copyright 2019-2020 Aqua Security Software Ltd.
|
||||||
|
|
||||||
|
This product includes software developed by Aqua Security (https://aquasec.com).
|
||||||
233
README.md
@@ -1,149 +1,144 @@
|
|||||||
<img src="imgs/logo.png" width="300">
|
<div align="center">
|
||||||
|
<img src="docs/imgs/logo.png" width="200">
|
||||||
|
|
||||||
[](https://github.com/knqyf263/trivy/releases/latest)
|
[![GitHub Release][release-img]][release]
|
||||||
[](https://circleci.com/gh/knqyf263/trivy)
|
[![Test][test-img]][test]
|
||||||
[](https://goreportcard.com/report/github.com/knqyf263/trivy)
|
[![Go Report Card][go-report-img]][go-report]
|
||||||
[](https://github.com/knqyf263/trivy/blob/master/LICENSE)
|
[![License: Apache-2.0][license-img]][license]
|
||||||
|
[![GitHub All Releases][github-all-releases-img]][release]
|
||||||
|
![Docker Pulls][docker-pulls]
|
||||||
|
|
||||||
A Simple and Comprehensive Vulnerability Scanner for Containers
|
[📖 Documentation][docs]
|
||||||
|
</div>
|
||||||
|
|
||||||
# Abstract
|
Trivy (`tri` pronounced like **tri**gger, `vy` pronounced like en**vy**) is a comprehensive security scanner. It is reliable, fast, extremely easy to use, and it works wherever you need it.
|
||||||
Scan containers
|
|
||||||
|
|
||||||
# Features
|
Trivy has different *scanners* that look for different security issues, and different *targets* where it can find those issues.
|
||||||
|
|
||||||
# Installation
|
Targets:
|
||||||
|
- Container Image
|
||||||
|
- Filesystem
|
||||||
|
- Git repository (remote)
|
||||||
|
- Kubernetes cluster or resource
|
||||||
|
|
||||||
## RHEL/CentOS
|
Scanners:
|
||||||
|
- OS packages and software dependencies in use (SBOM)
|
||||||
|
- Known vulnerabilities (CVEs)
|
||||||
|
- IaC misconfigurations
|
||||||
|
- Sensitive information and secrets
|
||||||
|
|
||||||
Add repository setting to `/etc/yum.repos.d`.
|
Much more scanners and targets are coming up. Missing something? Let us know!
|
||||||
|
|
||||||
```
|
Read more in the [Trivy Documentation][docs]
|
||||||
$ sudo vim /etc/yum.repos.d/trivy.repo
|
|
||||||
[trivy]
|
## Quick Start
|
||||||
name=Trivy repository
|
|
||||||
baseurl=https://knqyf263.github.io/trivy-repo/rpm/releases/$releasever/$basearch/
|
### Get Trivy
|
||||||
gpgcheck=0
|
|
||||||
enabled=1
|
Get Trivy by your favorite installation method. See [installation] section in the documentation for details. For example:
|
||||||
$ sudo yum -y update
|
|
||||||
$ sudo yum -y install trivy
|
- `apt-get install trivy`
|
||||||
|
- `yum install trivy`
|
||||||
|
- `brew install aquasecurity/trivy/trivy`
|
||||||
|
- `docker run aquasec/trivy`
|
||||||
|
- Download binary from https://github.com/aquasecurity/trivy/releases/latest/
|
||||||
|
|
||||||
|
### General usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
trivy <target> [--security-checks <scanner1,scanner2>] TARGET_NAME
|
||||||
```
|
```
|
||||||
|
|
||||||
## Debian/Ubuntu
|
Examples:
|
||||||
|
|
||||||
Replace `[CODE_NAME]` with your code name
|
```bash
|
||||||
|
$ trivy image python:3.4-alpine
|
||||||
CODE_NAME: wheezy, jessie, stretch, buster, trusty, xenial, bionic
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo apt-get install apt-transport-https gnupg
|
|
||||||
$ wget -qO - https://knqyf263.github.io/trivy-repo/deb/public.key | sudo apt-key add -
|
|
||||||
$ echo deb https://knqyf263.github.io/trivy-repo/deb [CODE_NAME] main | sudo tee -a /etc/apt/sources.list
|
|
||||||
$ sudo apt-get update
|
|
||||||
$ sudo apt-get install trivy
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Mac OS X / Homebrew
|
<details>
|
||||||
You can use homebrew on OS X.
|
<summary>Result</summary>
|
||||||
```
|
|
||||||
$ brew tap knqyf263/trivy
|
https://user-images.githubusercontent.com/1161307/171013513-95f18734-233d-45d3-aaf5-d6aec687db0e.mov
|
||||||
$ brew install knqyf263/trivy/trivy
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy fs --security-checks vuln,secret,config myproject/
|
||||||
```
|
```
|
||||||
|
|
||||||
## Binary (Including Windows)
|
<details>
|
||||||
Go to [the releases page](https://github.com/knqyf263/trivy/releases), find the version you want, and download the zip file. Unpack the zip file, and put the binary to somewhere you want (on UNIX-y systems, /usr/local/bin or the like). Make sure it has execution bits turned on.
|
<summary>Result</summary>
|
||||||
|
|
||||||
## From source
|
https://user-images.githubusercontent.com/1161307/171013917-b1f37810-f434-465c-b01a-22de036bd9b3.mov
|
||||||
|
|
||||||
```sh
|
</details>
|
||||||
$ go get -u github.com/knqyf263/trivy
|
|
||||||
|
```bash
|
||||||
|
$ trivy k8s mycluster
|
||||||
```
|
```
|
||||||
|
|
||||||
# Examples
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
# Usage
|

|
||||||
|
|
||||||
```
|
</details>
|
||||||
$ trivy -h
|
|
||||||
NAME:
|
|
||||||
trivy - A simple and comprehensive vulnerability scanner for containers
|
|
||||||
USAGE:
|
|
||||||
main [options] image_name
|
|
||||||
VERSION:
|
|
||||||
0.0.1
|
|
||||||
OPTIONS:
|
|
||||||
--format value, -f value format (table, json) (default: "table")
|
|
||||||
--input value, -i value input file path instead of image name
|
|
||||||
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "CRITICAL,HIGH,MEDIUM,LOW,UNKNOWN")
|
|
||||||
--output value, -o value output file name
|
|
||||||
--skip-update skip db update
|
|
||||||
--clean, -c clean all cache
|
|
||||||
--debug, -d debug mode
|
|
||||||
--help, -h show help
|
|
||||||
--version, -v print the version
|
|
||||||
```
|
|
||||||
|
|
||||||
# Q&A
|
Find out more in the [Trivy Documentation][docs] - [Getting Started][getting-started]
|
||||||
## Homebrew
|
|
||||||
### Error: Your macOS keychain GitHub credentials do not have sufficient scope!
|
|
||||||
|
|
||||||
```
|
|
||||||
$ brew tap knqyf263/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:
|
## Highlights
|
||||||
```
|
|
||||||
$ printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase
|
|
||||||
```
|
|
||||||
|
|
||||||
### Error: knqyf263/trivy/trivy 64 already installed
|
- Comprehensive vulnerability detection
|
||||||
|
- OS packages (Alpine Linux, Red Hat Universal Base Image, Red Hat Enterprise Linux, CentOS, AlmaLinux, Rocky Linux, CBL-Mariner, Oracle Linux, Debian, Ubuntu, Amazon Linux, openSUSE Leap, SUSE Enterprise Linux, Photon OS and Distroless)
|
||||||
|
- **Language-specific packages** (Bundler, Composer, Pipenv, Poetry, npm, yarn, Cargo, NuGet, Maven, and Go)
|
||||||
|
- High accuracy, especially [Alpine Linux][alpine] and RHEL/CentOS
|
||||||
|
- Supply chain security (SBOM support)
|
||||||
|
- Support CycloneDX
|
||||||
|
- Support SPDX
|
||||||
|
- Misconfiguration detection (IaC scanning)
|
||||||
|
- Wide variety of security checks are provided **out of the box**
|
||||||
|
- Kubernetes, Docker, Terraform, and more
|
||||||
|
- User-defined policies using [OPA Rego][rego]
|
||||||
|
- Secret detection
|
||||||
|
- A wide variety of built-in rules are provided **out of the box**
|
||||||
|
- User-defined patterns
|
||||||
|
- Efficient scanning of container images
|
||||||
|
- Simple
|
||||||
|
- Available in apt, yum, brew, dockerhub
|
||||||
|
- **No pre-requisites** such as a database, system libraries, or eny environmental requirements. The binary runs anywhere.
|
||||||
|
- The first scan will finish within 10 seconds (depending on your network). Consequent scans will finish instantaneously.
|
||||||
|
- Fits your workflow
|
||||||
|
- **Great for CI** such as GitHub Actions, Jenkins, GitLab CI, etc.
|
||||||
|
- Available as extension for IDEs such as vscode, jetbrains, vim
|
||||||
|
- Available as extension for Docker Desktop, Rancher Desktop
|
||||||
|
- See [integrations] section in the documentation.
|
||||||
|
|
||||||
```
|
---
|
||||||
$ brew upgrade
|
|
||||||
...
|
|
||||||
Error: knqyf263/trivy/trivy 64 already installed
|
|
||||||
```
|
|
||||||
|
|
||||||
Try:
|
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]
|
||||||
|
|
||||||
```
|
[test]: https://github.com/aquasecurity/trivy/actions/workflows/test.yaml
|
||||||
$ brew unlink trivy && brew uninstall trivy
|
[test-img]: https://github.com/aquasecurity/trivy/actions/workflows/test.yaml/badge.svg
|
||||||
($ rm -rf /usr/local/Cellar/trivy/64)
|
[go-report]: https://goreportcard.com/report/github.com/aquasecurity/trivy
|
||||||
$ brew install knqyf263/trivy/trivy
|
[go-report-img]: https://goreportcard.com/badge/github.com/aquasecurity/trivy
|
||||||
```
|
[release]: https://github.com/aquasecurity/trivy/releases
|
||||||
|
[release-img]: https://img.shields.io/github/release/aquasecurity/trivy.svg?logo=github
|
||||||
|
[github-all-releases-img]: https://img.shields.io/github/downloads/aquasecurity/trivy/total?logo=github
|
||||||
|
[docker-pulls]: https://img.shields.io/docker/pulls/aquasec/trivy?logo=docker&label=docker%20pulls%20%2F%20trivy
|
||||||
|
[license]: https://github.com/aquasecurity/trivy/blob/main/LICENSE
|
||||||
|
[license-img]: https://img.shields.io/badge/License-Apache%202.0-blue.svg
|
||||||
|
|
||||||
## Others
|
|
||||||
### Unknown error
|
|
||||||
Try again with `--clean` option
|
|
||||||
|
|
||||||
```
|
[getting-started]: https://aquasecurity.github.io/trivy/latest/getting-started/installation/
|
||||||
$ trivy --clean alpine:3.8
|
[docs]: https://aquasecurity.github.io/trivy
|
||||||
```
|
[integrations]:https://aquasecurity.github.io/trivy/latest/docs/integrations/
|
||||||
|
[installation]:https://aquasecurity.github.io/trivy/latest/docs/getting-started/installation/
|
||||||
# Contribute
|
[releases]: https://github.com/aquasecurity/trivy/releases
|
||||||
|
[alpine]: https://ariadne.space/2021/06/08/the-vulnerability-remediation-lifecycle-of-alpine-containers/
|
||||||
1. fork a repository: github.com/knqyf263/trivy to github.com/you/repo
|
[rego]: https://www.openpolicyagent.org/docs/latest/#rego
|
||||||
2. get original code: `go get github.com/knqyf263/trivy`
|
[aquasec]: https://aquasec.com
|
||||||
3. work on original code
|
[oss]: https://www.aquasec.com/products/open-source-projects/
|
||||||
4. add remote to your repo: git remote add myfork https://github.com/you/repo.git
|
[discussions]: https://github.com/aquasecurity/trivy/discussions
|
||||||
5. push your changes: git push myfork
|
|
||||||
6. create a new Pull Request
|
|
||||||
|
|
||||||
- see [GitHub and Go: forking, pull requests, and go-getting](http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html)
|
|
||||||
|
|
||||||
----
|
|
||||||
|
|
||||||
# Credits
|
|
||||||
Special thanks to [Tomoya Amachi](https://github.com/tomoyamachi)
|
|
||||||
|
|
||||||
# License
|
|
||||||
MIT
|
|
||||||
|
|
||||||
# Author
|
|
||||||
Teppei Fukuda (knqyf263)
|
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
FROM bepsays/ci-goreleaser:1.12-2
|
|
||||||
|
|
||||||
RUN apt-get -y update \
|
|
||||||
&& apt-get -y install vim rpm reprepro createrepo \
|
|
||||||
&& wget https://dl.bintray.com/homebrew/mirror/berkeley-db-18.1.32.tar.gz \
|
|
||||||
|
|
||||||
# Berkeley DB
|
|
||||||
&& tar zxvf berkeley-db-18.1.32.tar.gz \
|
|
||||||
&& cd db-18.1.32/build_unix \
|
|
||||||
|
|
||||||
# Linux
|
|
||||||
&& ../dist/configure --prefix=/usr/local --host=x86_64-linux \
|
|
||||||
&& make \
|
|
||||||
&& make install \
|
|
||||||
|
|
||||||
# Darwin
|
|
||||||
&& make clean \
|
|
||||||
&& ../dist/configure --prefix=/usr/local --host=x86_64-apple-darwin15 \
|
|
||||||
&& make \
|
|
||||||
&& make install
|
|
||||||
@@ -1,17 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
RELEASES=(wheezy jessie stretch buster trusty xenial bionic)
|
DEBIAN_RELEASES=$(debian-distro-info --supported)
|
||||||
|
UBUNTU_RELEASES=$(sort -u <(ubuntu-distro-info --supported-esm) <(ubuntu-distro-info --supported))
|
||||||
|
|
||||||
cd trivy-repo/deb
|
cd trivy-repo/deb
|
||||||
|
|
||||||
for release in ${RELEASES[@]}; do
|
for release in ${DEBIAN_RELEASES[@]} ${UBUNTU_RELEASES[@]}; do
|
||||||
echo "Adding deb package to $release"
|
echo "Removing deb package of $release"
|
||||||
reprepro -A i386 remove $release trivy
|
reprepro -A i386 remove $release trivy
|
||||||
reprepro -A amd64 remove $release trivy
|
reprepro -A amd64 remove $release trivy
|
||||||
|
reprepro -A arm64 remove $release trivy
|
||||||
|
done
|
||||||
|
|
||||||
|
for release in ${DEBIAN_RELEASES[@]} ${UBUNTU_RELEASES[@]}; do
|
||||||
|
echo "Adding deb package to $release"
|
||||||
reprepro includedeb $release ../../dist/*Linux-64bit.deb
|
reprepro includedeb $release ../../dist/*Linux-64bit.deb
|
||||||
reprepro includedeb $release ../../dist/*Linux-32bit.deb
|
reprepro includedeb $release ../../dist/*Linux-32bit.deb
|
||||||
|
reprepro includedeb $release ../../dist/*Linux-ARM64.deb
|
||||||
done
|
done
|
||||||
|
|
||||||
git add .
|
git add .
|
||||||
git commit -m "Update deb packages"
|
git commit -m "Update deb packages"
|
||||||
git push origin master
|
git push origin main
|
||||||
|
|||||||
@@ -1,20 +1,27 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
RPM_EL6=$(find dist/ -type f -name "*64bit.rpm" -printf "%f\n" | head -n1 | sed -e 's/_/-/g' -e 's/-Linux/.el6/' -e 's/-64bit/.x86_64/')
|
function create_rpm_repo () {
|
||||||
RPM_EL7=$(find dist/ -type f -name "*64bit.rpm" -printf "%f\n" | head -n1 | sed -e 's/_/-/g' -e 's/-Linux/.el7/' -e 's/-64bit/.x86_64/')
|
version=$1
|
||||||
|
rpm_path=rpm/releases/${version}/x86_64
|
||||||
|
|
||||||
|
RPM_EL=$(find ../dist/ -type f -name "*64bit.rpm" -printf "%f\n" | head -n1 | sed -e "s/_/-/g" -e "s/-Linux/.el$version/" -e "s/-64bit/.x86_64/")
|
||||||
|
echo $RPM_EL
|
||||||
|
|
||||||
|
mkdir -p $rpm_path
|
||||||
|
cp ../dist/*64bit.rpm ${rpm_path}/${RPM_EL}
|
||||||
|
|
||||||
|
createrepo --update $rpm_path
|
||||||
|
}
|
||||||
|
|
||||||
cd trivy-repo
|
cd trivy-repo
|
||||||
mkdir -p rpm/releases/6/x86_64
|
|
||||||
mkdir -p rpm/releases/7/x86_64
|
|
||||||
|
|
||||||
cd rpm
|
VERSIONS=(5 6 7 8)
|
||||||
cp ../../dist/*64bit.rpm releases/6/x86_64/${RPM_EL6}
|
for version in ${VERSIONS[@]}; do
|
||||||
cp ../../dist/*64bit.rpm releases/7/x86_64/${RPM_EL7}
|
echo "Processing RHEL/CentOS $version..."
|
||||||
|
create_rpm_repo $version
|
||||||
createrepo --update releases/6/x86_64/
|
done
|
||||||
createrepo --update releases/7/x86_64/
|
|
||||||
|
|
||||||
git add .
|
git add .
|
||||||
git commit -m "Update rpm packages"
|
git commit -m "Update rpm packages"
|
||||||
git push origin master
|
git push origin main
|
||||||
|
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
|
||||||
|
|
||||||
"github.com/knqyf263/trivy/pkg/remic"
|
|
||||||
"github.com/urfave/cli"
|
|
||||||
|
|
||||||
"github.com/knqyf263/trivy/pkg/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
cli.AppHelpTemplate = `NAME:
|
|
||||||
{{.Name}}{{if .Usage}} - {{.Usage}}{{end}}
|
|
||||||
USAGE:
|
|
||||||
{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}}
|
|
||||||
VERSION:
|
|
||||||
{{.Version}}{{end}}{{end}}{{if .Description}}
|
|
||||||
DESCRIPTION:
|
|
||||||
{{.Description}}{{end}}{{if len .Authors}}
|
|
||||||
AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
|
|
||||||
{{range $index, $author := .Authors}}{{if $index}}
|
|
||||||
{{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}
|
|
||||||
OPTIONS:
|
|
||||||
{{range $index, $option := .VisibleFlags}}{{if $index}}
|
|
||||||
{{end}}{{$option}}{{end}}{{end}}
|
|
||||||
`
|
|
||||||
app := cli.NewApp()
|
|
||||||
app.Name = "remic"
|
|
||||||
app.Version = "0.0.1"
|
|
||||||
app.ArgsUsage = "file"
|
|
||||||
|
|
||||||
app.Usage = "A simple and fast tool for detecting vulnerabilities in application dependencies"
|
|
||||||
|
|
||||||
app.Flags = []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "format, f",
|
|
||||||
Value: "table",
|
|
||||||
Usage: "format (table, json)",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "severity, s",
|
|
||||||
Value: strings.Join(vulnerability.SeverityNames, ","),
|
|
||||||
Usage: "severity of vulnerabilities to be displayed",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "output, o",
|
|
||||||
Usage: "output file name",
|
|
||||||
},
|
|
||||||
cli.BoolFlag{
|
|
||||||
Name: "debug, d",
|
|
||||||
Usage: "debug mode",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
app.Action = func(c *cli.Context) error {
|
|
||||||
return remic.Run(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
err := app.Run(os.Args)
|
|
||||||
if err != nil {
|
|
||||||
log.Logger.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,14 +2,9 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
"github.com/aquasecurity/trivy/pkg/commands"
|
||||||
|
"github.com/aquasecurity/trivy/pkg/log"
|
||||||
"github.com/urfave/cli"
|
|
||||||
|
|
||||||
"github.com/knqyf263/trivy/pkg"
|
|
||||||
"github.com/knqyf263/trivy/pkg/log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -17,68 +12,9 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
cli.AppHelpTemplate = `NAME:
|
app := commands.NewApp(version)
|
||||||
{{.Name}}{{if .Usage}} - {{.Usage}}{{end}}
|
|
||||||
USAGE:
|
|
||||||
{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}}
|
|
||||||
VERSION:
|
|
||||||
{{.Version}}{{end}}{{end}}{{if .Description}}
|
|
||||||
DESCRIPTION:
|
|
||||||
{{.Description}}{{end}}{{if len .Authors}}
|
|
||||||
AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
|
|
||||||
{{range $index, $author := .Authors}}{{if $index}}
|
|
||||||
{{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}
|
|
||||||
OPTIONS:
|
|
||||||
{{range $index, $option := .VisibleFlags}}{{if $index}}
|
|
||||||
{{end}}{{$option}}{{end}}{{end}}
|
|
||||||
`
|
|
||||||
app := cli.NewApp()
|
|
||||||
app.Name = "trivy"
|
|
||||||
app.Version = version
|
|
||||||
app.ArgsUsage = "image_name"
|
|
||||||
|
|
||||||
app.Usage = "A simple and comprehensive vulnerability scanner for containers"
|
|
||||||
|
|
||||||
app.Flags = []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "format, f",
|
|
||||||
Value: "table",
|
|
||||||
Usage: "format (table, json)",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "input, i",
|
|
||||||
Value: "",
|
|
||||||
Usage: "input file path instead of image name",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "severity, s",
|
|
||||||
Value: strings.Join(vulnerability.SeverityNames, ","),
|
|
||||||
Usage: "severities of vulnerabilities to be displayed (comma separated)",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "output, o",
|
|
||||||
Usage: "output file name",
|
|
||||||
},
|
|
||||||
cli.BoolFlag{
|
|
||||||
Name: "skip-update",
|
|
||||||
Usage: "skip db update",
|
|
||||||
},
|
|
||||||
cli.BoolFlag{
|
|
||||||
Name: "clean, c",
|
|
||||||
Usage: "clean all cache",
|
|
||||||
},
|
|
||||||
cli.BoolFlag{
|
|
||||||
Name: "debug, d",
|
|
||||||
Usage: "debug mode",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
app.Action = func(c *cli.Context) error {
|
|
||||||
return pkg.Run(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
err := app.Run(os.Args)
|
err := app.Run(os.Args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Logger.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
29
contrib/Trivy.gitlab-ci.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
Trivy_container_scanning:
|
||||||
|
stage: test
|
||||||
|
image:
|
||||||
|
name: alpine:3.11
|
||||||
|
variables:
|
||||||
|
# Override the GIT_STRATEGY variable in your `.gitlab-ci.yml` file and set it to `fetch` if you want to provide a `clair-whitelist.yml`
|
||||||
|
# file. See https://docs.gitlab.com/ee/user/application_security/container_scanning/index.html#overriding-the-container-scanning-template
|
||||||
|
# for details
|
||||||
|
GIT_STRATEGY: none
|
||||||
|
IMAGE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
|
||||||
|
allow_failure: true
|
||||||
|
before_script:
|
||||||
|
- 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/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
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- .trivycache/
|
||||||
|
artifacts:
|
||||||
|
reports:
|
||||||
|
container_scanning: gl-container-scanning-report.json
|
||||||
|
dependencies: []
|
||||||
|
only:
|
||||||
|
refs:
|
||||||
|
- branches
|
||||||
122
contrib/asff.tpl
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
{
|
||||||
|
"Findings": [
|
||||||
|
{{- $t_first := true -}}
|
||||||
|
{{- range . -}}
|
||||||
|
{{- $target := .Target -}}
|
||||||
|
{{- $image := .Target -}}
|
||||||
|
{{- if gt (len $image) 127 -}}
|
||||||
|
{{- $image = $image | regexFind ".{124}$" | printf "...%v" -}}
|
||||||
|
{{- end}}
|
||||||
|
{{- 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 ) 512 -}}
|
||||||
|
{{- $description = (substr 0 512 $description) | printf "%v .." -}}
|
||||||
|
{{- end}}
|
||||||
|
{
|
||||||
|
"SchemaVersion": "2018-10-08",
|
||||||
|
"Id": "{{ $target }}/{{ .VulnerabilityID }}",
|
||||||
|
"ProductArn": "arn:aws:securityhub:{{ env "AWS_REGION" }}::product/aquasecurity/aquasecurity",
|
||||||
|
"GeneratorId": "Trivy/{{ .VulnerabilityID }}",
|
||||||
|
"AwsAccountId": "{{ env "AWS_ACCOUNT_ID" }}",
|
||||||
|
"Types": [ "Software and Configuration Checks/Vulnerabilities/CVE" ],
|
||||||
|
"CreatedAt": "{{ now | date "2006-01-02T15:04:05.999999999Z07:00" }}",
|
||||||
|
"UpdatedAt": "{{ now | date "2006-01-02T15:04:05.999999999Z07:00" }}",
|
||||||
|
"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": "{{ env "AWS_REGION" }}",
|
||||||
|
"Details": {
|
||||||
|
"Container": { "ImageName": "{{ $image }}" },
|
||||||
|
"Other": {
|
||||||
|
"CVE ID": "{{ .VulnerabilityID }}",
|
||||||
|
"CVE Title": {{ .Title | printf "%q" }},
|
||||||
|
"PkgName": "{{ .PkgName }}",
|
||||||
|
"Installed Package": "{{ .InstalledVersion }}",
|
||||||
|
"Patched Package": "{{ .FixedVersion }}",
|
||||||
|
"NvdCvssScoreV3": "{{ (index .CVSS (sourceID "nvd")).V3Score }}",
|
||||||
|
"NvdCvssVectorV3": "{{ (index .CVSS (sourceID "nvd")).V3Vector }}",
|
||||||
|
"NvdCvssScoreV2": "{{ (index .CVSS (sourceID "nvd")).V2Score }}",
|
||||||
|
"NvdCvssVectorV2": "{{ (index .CVSS (sourceID "nvd")).V2Vector }}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"RecordState": "ACTIVE"
|
||||||
|
}
|
||||||
|
{{- end -}}
|
||||||
|
{{- range .Misconfigurations -}}
|
||||||
|
{{- if $t_first -}}{{- $t_first = false -}}{{- else -}},{{- end -}}
|
||||||
|
{{- $severity := .Severity -}}
|
||||||
|
{{- if eq $severity "UNKNOWN" -}}
|
||||||
|
{{- $severity = "INFORMATIONAL" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- $description := .Description -}}
|
||||||
|
{{- if gt (len $description ) 512 -}}
|
||||||
|
{{- $description = (substr 0 512 $description) | printf "%v .." -}}
|
||||||
|
{{- end}}
|
||||||
|
{
|
||||||
|
"SchemaVersion": "2018-10-08",
|
||||||
|
"Id": "{{ $target }}/{{ .ID }}",
|
||||||
|
"ProductArn": "arn:aws:securityhub:{{ env "AWS_REGION" }}::product/aquasecurity/aquasecurity",
|
||||||
|
"GeneratorId": "Trivy/{{ .ID }}",
|
||||||
|
"AwsAccountId": "{{ env "AWS_ACCOUNT_ID" }}",
|
||||||
|
"Types": [ "Software and Configuration Checks" ],
|
||||||
|
"CreatedAt": "{{ now | date "2006-01-02T15:04:05.999999999Z07:00" }}",
|
||||||
|
"UpdatedAt": "{{ now | date "2006-01-02T15:04:05.999999999Z07:00" }}",
|
||||||
|
"Severity": {
|
||||||
|
"Label": "{{ $severity }}"
|
||||||
|
},
|
||||||
|
"Title": "Trivy found a misconfiguration in {{ $target }}: {{ .Title }}",
|
||||||
|
"Description": {{ escapeString $description | printf "%q" }},
|
||||||
|
"Remediation": {
|
||||||
|
"Recommendation": {
|
||||||
|
"Text": "{{ .Resolution }}",
|
||||||
|
"Url": "{{ .PrimaryURL }}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ProductFields": { "Product Name": "Trivy" },
|
||||||
|
"Resources": [
|
||||||
|
{
|
||||||
|
"Type": "Other",
|
||||||
|
"Id": "{{ $target }}",
|
||||||
|
"Partition": "aws",
|
||||||
|
"Region": "{{ env "AWS_REGION" }}",
|
||||||
|
"Details": {
|
||||||
|
"Other": {
|
||||||
|
"Message": "{{ .Message }}",
|
||||||
|
"Filename": "{{ $target }}",
|
||||||
|
"StartLine": "{{ .CauseMetadata.StartLine }}",
|
||||||
|
"EndLine": "{{ .CauseMetadata.EndLine }}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"RecordState": "ACTIVE"
|
||||||
|
}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
]
|
||||||
|
}
|
||||||
106
contrib/example_policy/advanced.rego
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
package trivy
|
||||||
|
|
||||||
|
import data.lib.trivy
|
||||||
|
|
||||||
|
default ignore = false
|
||||||
|
|
||||||
|
nvd_v3_vector = v {
|
||||||
|
v := input.CVSS.nvd.V3Vector
|
||||||
|
}
|
||||||
|
|
||||||
|
redhat_v3_vector = v {
|
||||||
|
v := input.CVSS.redhat.V3Vector
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ignore a vulnerability which requires high privilege
|
||||||
|
ignore {
|
||||||
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
nvd_cvss_vector.PrivilegesRequired == "High"
|
||||||
|
|
||||||
|
# Check against RedHat scores as well as NVD
|
||||||
|
redhat_cvss_vector := trivy.parse_cvss_vector_v3(redhat_v3_vector)
|
||||||
|
redhat_cvss_vector.PrivilegesRequired == "High"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ignore a vulnerability which requires user interaction
|
||||||
|
ignore {
|
||||||
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
nvd_cvss_vector.UserInteraction == "Required"
|
||||||
|
|
||||||
|
# Check against RedHat scores as well as NVD
|
||||||
|
redhat_cvss_vector := trivy.parse_cvss_vector_v3(redhat_v3_vector)
|
||||||
|
redhat_cvss_vector.UserInteraction == "Required"
|
||||||
|
}
|
||||||
|
|
||||||
|
ignore {
|
||||||
|
input.PkgName == "openssl"
|
||||||
|
|
||||||
|
# Split CVSSv3 vector
|
||||||
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
|
||||||
|
# Evaluate Attack Vector
|
||||||
|
ignore_attack_vectors := {"Physical", "Local"}
|
||||||
|
nvd_cvss_vector.AttackVector == ignore_attack_vectors[_]
|
||||||
|
}
|
||||||
|
|
||||||
|
ignore {
|
||||||
|
input.PkgName == "openssl"
|
||||||
|
|
||||||
|
# Evaluate severity
|
||||||
|
input.Severity == {"LOW", "MEDIUM", "HIGH"}[_]
|
||||||
|
|
||||||
|
# Evaluate CWE-ID
|
||||||
|
deny_cwe_ids := {
|
||||||
|
"CWE-119", # Improper Restriction of Operations within the Bounds of a Memory Buffer
|
||||||
|
"CWE-200", # Exposure of Sensitive Information to an Unauthorized Actor
|
||||||
|
}
|
||||||
|
|
||||||
|
count({x | x := input.CweIDs[_]; x == deny_cwe_ids[_]}) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
ignore {
|
||||||
|
input.PkgName == "bash"
|
||||||
|
|
||||||
|
# Split CVSSv3 vector
|
||||||
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
|
||||||
|
# Evaluate Attack Vector
|
||||||
|
ignore_attack_vectors := {"Physical", "Local", "Adjacent"}
|
||||||
|
nvd_cvss_vector.AttackVector == ignore_attack_vectors[_]
|
||||||
|
|
||||||
|
# Evaluate severity
|
||||||
|
input.Severity == {"LOW", "MEDIUM", "HIGH"}[_]
|
||||||
|
}
|
||||||
|
|
||||||
|
ignore {
|
||||||
|
input.PkgName == "django"
|
||||||
|
|
||||||
|
# Split CVSSv3 vector
|
||||||
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
|
||||||
|
# Evaluate Attack Vector
|
||||||
|
ignore_attack_vectors := {"Physical", "Local"}
|
||||||
|
nvd_cvss_vector.AttackVector == ignore_attack_vectors[_]
|
||||||
|
|
||||||
|
# Evaluate severity
|
||||||
|
input.Severity == {"LOW", "MEDIUM"}[_]
|
||||||
|
|
||||||
|
# Evaluate CWE-ID
|
||||||
|
deny_cwe_ids := {
|
||||||
|
"CWE-89", # SQL Injection
|
||||||
|
"CWE-78", # OS Command Injection
|
||||||
|
}
|
||||||
|
|
||||||
|
count({x | x := input.CweIDs[_]; x == deny_cwe_ids[_]}) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
ignore {
|
||||||
|
input.PkgName == "jquery"
|
||||||
|
|
||||||
|
# Split CVSSv3 vector
|
||||||
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
|
||||||
|
# Evaluate CWE-ID
|
||||||
|
deny_cwe_ids := {"CWE-79"} # XSS
|
||||||
|
count({x | x := input.CweIDs[_]; x == deny_cwe_ids[_]}) == 0
|
||||||
|
}
|
||||||
58
contrib/example_policy/basic.rego
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
package trivy
|
||||||
|
|
||||||
|
import data.lib.trivy
|
||||||
|
|
||||||
|
default ignore = false
|
||||||
|
|
||||||
|
ignore_pkgs := {"bash", "bind-license", "rpm", "vim", "vim-minimal"}
|
||||||
|
|
||||||
|
ignore_severities := {"LOW", "MEDIUM"}
|
||||||
|
|
||||||
|
nvd_v3_vector = v {
|
||||||
|
v := input.CVSS.nvd.V3Vector
|
||||||
|
}
|
||||||
|
|
||||||
|
redhat_v3_vector = v {
|
||||||
|
v := input.CVSS.redhat.V3Vector
|
||||||
|
}
|
||||||
|
|
||||||
|
ignore {
|
||||||
|
input.PkgName == ignore_pkgs[_]
|
||||||
|
}
|
||||||
|
|
||||||
|
ignore {
|
||||||
|
input.Severity == ignore_severities[_]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ignore a vulnerability which is not remotely exploitable
|
||||||
|
ignore {
|
||||||
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
nvd_cvss_vector.AttackVector != "Network"
|
||||||
|
|
||||||
|
redhat_cvss_vector := trivy.parse_cvss_vector_v3(redhat_v3_vector)
|
||||||
|
redhat_cvss_vector.AttackVector != "Network"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ignore a vulnerability which requires high privilege
|
||||||
|
ignore {
|
||||||
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
nvd_cvss_vector.PrivilegesRequired == "High"
|
||||||
|
|
||||||
|
redhat_cvss_vector := trivy.parse_cvss_vector_v3(redhat_v3_vector)
|
||||||
|
redhat_cvss_vector.PrivilegesRequired == "High"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ignore a vulnerability which requires user interaction
|
||||||
|
ignore {
|
||||||
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
nvd_cvss_vector.UserInteraction == "Required"
|
||||||
|
|
||||||
|
redhat_cvss_vector := trivy.parse_cvss_vector_v3(redhat_v3_vector)
|
||||||
|
redhat_cvss_vector.UserInteraction == "Required"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ignore CSRF
|
||||||
|
ignore {
|
||||||
|
# https://cwe.mitre.org/data/definitions/352.html
|
||||||
|
input.CweIDs[_] == "CWE-352"
|
||||||
|
}
|
||||||
71
contrib/gitlab-codequality.tpl
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
{{- /* 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": {{ list .VulnerabilityID .PkgName .InstalledVersion .Title | join " - " | printf "%q" }},
|
||||||
|
"fingerprint": "{{ list .VulnerabilityID .PkgName .InstalledVersion $target | join "" | sha1sum }}",
|
||||||
|
"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": "{{ $target }}",
|
||||||
|
"lines": {
|
||||||
|
"begin": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{{- end -}}
|
||||||
|
{{- range .Misconfigurations -}}
|
||||||
|
{{- if $t_first -}}
|
||||||
|
{{- $t_first = false -}}
|
||||||
|
{{ else -}}
|
||||||
|
,
|
||||||
|
{{- end }}
|
||||||
|
{
|
||||||
|
"type": "issue",
|
||||||
|
"check_name": "container_scanning",
|
||||||
|
"categories": [ "Security" ],
|
||||||
|
"description": {{ list .ID .Title | join ": " | printf "%q" }},
|
||||||
|
"fingerprint": "{{ list .ID .Title $target | join "" | sha1sum }}",
|
||||||
|
"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": "{{ $target }}",
|
||||||
|
"lines": {
|
||||||
|
"begin": {{ .CauseMetadata.StartLine }}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
]
|
||||||
83
contrib/gitlab.tpl
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{{- /* Template based on https://docs.gitlab.com/ee/user/application_security/container_scanning/#reports-json-format */ -}}
|
||||||
|
{
|
||||||
|
"version": "2.3",
|
||||||
|
"vulnerabilities": [
|
||||||
|
{{- $t_first := true }}
|
||||||
|
{{- range . }}
|
||||||
|
{{- $target := .Target }}
|
||||||
|
{{- range .Vulnerabilities -}}
|
||||||
|
{{- if $t_first -}}
|
||||||
|
{{- $t_first = false -}}
|
||||||
|
{{ else -}}
|
||||||
|
,
|
||||||
|
{{- end }}
|
||||||
|
{
|
||||||
|
"id": "{{ .VulnerabilityID }}",
|
||||||
|
"category": "container_scanning",
|
||||||
|
"message": {{ .Title | printf "%q" }},
|
||||||
|
"description": {{ .Description | printf "%q" }},
|
||||||
|
{{- /* cve is a deprecated key, use id instead */}}
|
||||||
|
"cve": "{{ .VulnerabilityID }}",
|
||||||
|
"severity": {{ if eq .Severity "UNKNOWN" -}}
|
||||||
|
"Unknown"
|
||||||
|
{{- else if eq .Severity "LOW" -}}
|
||||||
|
"Low"
|
||||||
|
{{- else if eq .Severity "MEDIUM" -}}
|
||||||
|
"Medium"
|
||||||
|
{{- else if eq .Severity "HIGH" -}}
|
||||||
|
"High"
|
||||||
|
{{- else if eq .Severity "CRITICAL" -}}
|
||||||
|
"Critical"
|
||||||
|
{{- else -}}
|
||||||
|
"{{ .Severity }}"
|
||||||
|
{{- end }},
|
||||||
|
{{- /* TODO: Define confidence */}}
|
||||||
|
"confidence": "Unknown",
|
||||||
|
"solution": {{ if .FixedVersion -}}
|
||||||
|
"Upgrade {{ .PkgName }} to {{ .FixedVersion }}"
|
||||||
|
{{- else -}}
|
||||||
|
"No solution provided"
|
||||||
|
{{- end }},
|
||||||
|
"scanner": {
|
||||||
|
"id": "trivy",
|
||||||
|
"name": "trivy"
|
||||||
|
},
|
||||||
|
"location": {
|
||||||
|
"dependency": {
|
||||||
|
"package": {
|
||||||
|
"name": "{{ .PkgName }}"
|
||||||
|
},
|
||||||
|
"version": "{{ .InstalledVersion }}"
|
||||||
|
},
|
||||||
|
{{- /* TODO: No mapping available - https://github.com/aquasecurity/trivy/issues/332 */}}
|
||||||
|
"operating_system": "Unknown",
|
||||||
|
"image": "{{ $target }}"
|
||||||
|
},
|
||||||
|
"identifiers": [
|
||||||
|
{
|
||||||
|
{{- /* TODO: Type not extractable - https://github.com/aquasecurity/trivy-db/pull/24 */}}
|
||||||
|
"type": "cve",
|
||||||
|
"name": "{{ .VulnerabilityID }}",
|
||||||
|
"value": "{{ .VulnerabilityID }}",
|
||||||
|
"url": "{{ .PrimaryURL }}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
{{- $l_first := true -}}
|
||||||
|
{{- range .References -}}
|
||||||
|
{{- if $l_first -}}
|
||||||
|
{{- $l_first = false }}
|
||||||
|
{{- else -}}
|
||||||
|
,
|
||||||
|
{{- end -}}
|
||||||
|
{
|
||||||
|
"url": "{{ . }}"
|
||||||
|
}
|
||||||
|
{{- end }}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
],
|
||||||
|
"remediations": []
|
||||||
|
}
|
||||||
148
contrib/html.tpl
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
<!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 - {{ now }} </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 - {{ now }}</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 }}
|
||||||
|
{{- if (eq (len .Misconfigurations ) 0) }}
|
||||||
|
<tr><th colspan="6">No Misconfigurations found</th></tr>
|
||||||
|
{{- else }}
|
||||||
|
<tr class="sub-header">
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Misconf ID</th>
|
||||||
|
<th>Check</th>
|
||||||
|
<th>Severity</th>
|
||||||
|
<th>Message</th>
|
||||||
|
</tr>
|
||||||
|
{{- range .Misconfigurations }}
|
||||||
|
<tr class="severity-{{ escapeXML .Severity }}">
|
||||||
|
<td class="misconf-type">{{ escapeXML .Type }}</td>
|
||||||
|
<td>{{ escapeXML .ID }}</td>
|
||||||
|
<td class="misconf-check">{{ escapeXML .Title }}</td>
|
||||||
|
<td class="severity">{{ escapeXML .Severity }}</td>
|
||||||
|
<td class="link" data-more-links="off" style="white-space:normal;"">
|
||||||
|
{{ escapeXML .Message }}
|
||||||
|
<br>
|
||||||
|
<a href={{ escapeXML .PrimaryURL | printf "%q" }}>{{ escapeXML .PrimaryURL }}</a>
|
||||||
|
</br>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</table>
|
||||||
|
{{- else }}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Trivy Returned Empty Report</h1>
|
||||||
|
{{- end }}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
413
contrib/install.sh
Executable file
@@ -0,0 +1,413 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
# Code generated by godownloader on 2020-01-14T10:03:29Z. DO NOT EDIT.
|
||||||
|
#
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
this=$1
|
||||||
|
cat <<EOF
|
||||||
|
$this: download go binaries for aquasecurity/trivy
|
||||||
|
|
||||||
|
Usage: $this [-b] bindir [-d] [tag]
|
||||||
|
-b sets bindir or installation directory, Defaults to ./bin
|
||||||
|
-d turns on debug logging
|
||||||
|
[tag] is a tag from
|
||||||
|
https://github.com/aquasecurity/trivy/releases
|
||||||
|
If tag is missing, then the latest will be used.
|
||||||
|
|
||||||
|
Generated by godownloader
|
||||||
|
https://github.com/goreleaser/godownloader
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_args() {
|
||||||
|
#BINDIR is ./bin unless set be ENV
|
||||||
|
# over-ridden by flag below
|
||||||
|
|
||||||
|
BINDIR=${BINDIR:-./bin}
|
||||||
|
while getopts "b:dh?x" arg; do
|
||||||
|
case "$arg" in
|
||||||
|
b) BINDIR="$OPTARG" ;;
|
||||||
|
d) log_set_priority 10 ;;
|
||||||
|
h | \?) usage "$0" ;;
|
||||||
|
x) set -x ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $((OPTIND - 1))
|
||||||
|
TAG=$1
|
||||||
|
}
|
||||||
|
# this function wraps all the destructive operations
|
||||||
|
# if a curl|bash cuts off the end of the script due to
|
||||||
|
# network, either nothing will happen or will syntax error
|
||||||
|
# out preventing half-done work
|
||||||
|
execute() {
|
||||||
|
tmpdir=$(mktemp -d)
|
||||||
|
log_debug "downloading files into ${tmpdir}"
|
||||||
|
http_download "${tmpdir}/${TARBALL}" "${TARBALL_URL}"
|
||||||
|
http_download "${tmpdir}/${CHECKSUM}" "${CHECKSUM_URL}"
|
||||||
|
hash_sha256_verify "${tmpdir}/${TARBALL}" "${tmpdir}/${CHECKSUM}"
|
||||||
|
srcdir="${tmpdir}"
|
||||||
|
(cd "${tmpdir}" && untar "${TARBALL}")
|
||||||
|
test ! -d "${BINDIR}" && install -d "${BINDIR}"
|
||||||
|
for binexe in $BINARIES; do
|
||||||
|
if [ "$OS" = "windows" ]; then
|
||||||
|
binexe="${binexe}.exe"
|
||||||
|
fi
|
||||||
|
install "${srcdir}/${binexe}" "${BINDIR}/"
|
||||||
|
log_info "installed ${BINDIR}/${binexe}"
|
||||||
|
done
|
||||||
|
rm -rf "${tmpdir}"
|
||||||
|
}
|
||||||
|
get_binaries() {
|
||||||
|
case "$PLATFORM" in
|
||||||
|
darwin/386) BINARIES="trivy" ;;
|
||||||
|
darwin/amd64) BINARIES="trivy" ;;
|
||||||
|
darwin/arm64) BINARIES="trivy" ;;
|
||||||
|
darwin/armv7) BINARIES="trivy" ;;
|
||||||
|
freebsd/386) BINARIES="trivy" ;;
|
||||||
|
freebsd/amd64) BINARIES="trivy" ;;
|
||||||
|
freebsd/arm64) BINARIES="trivy" ;;
|
||||||
|
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" ;;
|
||||||
|
openbsd/amd64) BINARIES="trivy" ;;
|
||||||
|
openbsd/arm64) BINARIES="trivy" ;;
|
||||||
|
openbsd/armv7) BINARIES="trivy" ;;
|
||||||
|
*)
|
||||||
|
log_crit "platform $PLATFORM is not supported. Make sure this script is up-to-date and file request at https://github.com/${PREFIX}/issues/new"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
tag_to_version() {
|
||||||
|
if [ -z "${TAG}" ]; then
|
||||||
|
log_info "checking GitHub for latest tag"
|
||||||
|
else
|
||||||
|
log_info "checking GitHub for tag '${TAG}'"
|
||||||
|
fi
|
||||||
|
REALTAG=$(github_release "$OWNER/$REPO" "${TAG}") && true
|
||||||
|
if test -z "$REALTAG"; then
|
||||||
|
log_crit "unable to find '${TAG}' - use 'latest' or see https://github.com/${PREFIX}/releases for details"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# if version starts with 'v', remove it
|
||||||
|
TAG="$REALTAG"
|
||||||
|
VERSION=${TAG#v}
|
||||||
|
}
|
||||||
|
adjust_format() {
|
||||||
|
# change format (tar.gz or zip) based on OS
|
||||||
|
true
|
||||||
|
}
|
||||||
|
adjust_os() {
|
||||||
|
# adjust archive name based on OS
|
||||||
|
case ${OS} in
|
||||||
|
386) OS=32bit ;;
|
||||||
|
amd64) OS=64bit ;;
|
||||||
|
arm) OS=ARM ;;
|
||||||
|
arm64) OS=ARM64 ;;
|
||||||
|
ppc64le) OS=PPC64LE ;;
|
||||||
|
darwin) OS=macOS ;;
|
||||||
|
dragonfly) OS=DragonFlyBSD ;;
|
||||||
|
freebsd) OS=FreeBSD ;;
|
||||||
|
linux) OS=Linux ;;
|
||||||
|
netbsd) OS=NetBSD ;;
|
||||||
|
openbsd) OS=OpenBSD ;;
|
||||||
|
esac
|
||||||
|
true
|
||||||
|
}
|
||||||
|
adjust_arch() {
|
||||||
|
# adjust archive name based on ARCH
|
||||||
|
case ${ARCH} in
|
||||||
|
386) ARCH=32bit ;;
|
||||||
|
amd64) ARCH=64bit ;;
|
||||||
|
arm) ARCH=ARM ;;
|
||||||
|
arm64) ARCH=ARM64 ;;
|
||||||
|
ppc64le) OS=PPC64LE ;;
|
||||||
|
darwin) ARCH=macOS ;;
|
||||||
|
dragonfly) ARCH=DragonFlyBSD ;;
|
||||||
|
freebsd) ARCH=FreeBSD ;;
|
||||||
|
linux) ARCH=Linux ;;
|
||||||
|
netbsd) ARCH=NetBSD ;;
|
||||||
|
openbsd) ARCH=OpenBSD ;;
|
||||||
|
esac
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
cat /dev/null <<EOF
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
https://github.com/client9/shlib - portable posix shell functions
|
||||||
|
Public domain - http://unlicense.org
|
||||||
|
https://github.com/client9/shlib/blob/master/LICENSE.md
|
||||||
|
but credit (and pull requests) appreciated.
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
EOF
|
||||||
|
is_command() {
|
||||||
|
command -v "$1" >/dev/null
|
||||||
|
}
|
||||||
|
echoerr() {
|
||||||
|
echo "$@" 1>&2
|
||||||
|
}
|
||||||
|
log_prefix() {
|
||||||
|
echo "$0"
|
||||||
|
}
|
||||||
|
_logp=6
|
||||||
|
log_set_priority() {
|
||||||
|
_logp="$1"
|
||||||
|
}
|
||||||
|
log_priority() {
|
||||||
|
if test -z "$1"; then
|
||||||
|
echo "$_logp"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
[ "$1" -le "$_logp" ]
|
||||||
|
}
|
||||||
|
log_tag() {
|
||||||
|
case $1 in
|
||||||
|
0) echo "emerg" ;;
|
||||||
|
1) echo "alert" ;;
|
||||||
|
2) echo "crit" ;;
|
||||||
|
3) echo "err" ;;
|
||||||
|
4) echo "warning" ;;
|
||||||
|
5) echo "notice" ;;
|
||||||
|
6) echo "info" ;;
|
||||||
|
7) echo "debug" ;;
|
||||||
|
*) echo "$1" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
log_debug() {
|
||||||
|
log_priority 7 || return 0
|
||||||
|
echo "$(log_prefix)" "$(log_tag 7)" "$@"
|
||||||
|
}
|
||||||
|
log_info() {
|
||||||
|
log_priority 6 || return 0
|
||||||
|
echo "$(log_prefix)" "$(log_tag 6)" "$@"
|
||||||
|
}
|
||||||
|
log_err() {
|
||||||
|
log_priority 3 || return 0
|
||||||
|
echoerr "$(log_prefix)" "$(log_tag 3)" "$@"
|
||||||
|
}
|
||||||
|
log_crit() {
|
||||||
|
log_priority 2 || return 0
|
||||||
|
echoerr "$(log_prefix)" "$(log_tag 2)" "$@"
|
||||||
|
}
|
||||||
|
uname_os() {
|
||||||
|
os=$(uname -s | tr '[:upper:]' '[:lower:]')
|
||||||
|
case "$os" in
|
||||||
|
cygwin_nt*) os="windows" ;;
|
||||||
|
mingw*) os="windows" ;;
|
||||||
|
msys_nt*) os="windows" ;;
|
||||||
|
esac
|
||||||
|
echo "$os"
|
||||||
|
}
|
||||||
|
uname_arch() {
|
||||||
|
arch=$(uname -m)
|
||||||
|
case $arch in
|
||||||
|
x86_64) arch="amd64" ;;
|
||||||
|
x86) arch="386" ;;
|
||||||
|
i686) arch="386" ;;
|
||||||
|
i386) arch="386" ;;
|
||||||
|
ppc64le) arch="ppc64le" ;;
|
||||||
|
aarch64) arch="arm64" ;;
|
||||||
|
armv5*) arch="armv5" ;;
|
||||||
|
armv6*) arch="armv6" ;;
|
||||||
|
armv7*) arch="armv7" ;;
|
||||||
|
esac
|
||||||
|
echo ${arch}
|
||||||
|
}
|
||||||
|
uname_os_check() {
|
||||||
|
os=$(uname_os)
|
||||||
|
case "$os" in
|
||||||
|
darwin) return 0 ;;
|
||||||
|
dragonfly) return 0 ;;
|
||||||
|
freebsd) return 0 ;;
|
||||||
|
linux) return 0 ;;
|
||||||
|
android) return 0 ;;
|
||||||
|
nacl) return 0 ;;
|
||||||
|
netbsd) return 0 ;;
|
||||||
|
openbsd) return 0 ;;
|
||||||
|
plan9) return 0 ;;
|
||||||
|
solaris) return 0 ;;
|
||||||
|
windows) return 0 ;;
|
||||||
|
esac
|
||||||
|
log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
uname_arch_check() {
|
||||||
|
arch=$(uname_arch)
|
||||||
|
case "$arch" in
|
||||||
|
386) return 0 ;;
|
||||||
|
amd64) return 0 ;;
|
||||||
|
arm64) return 0 ;;
|
||||||
|
armv5) return 0 ;;
|
||||||
|
armv6) return 0 ;;
|
||||||
|
armv7) return 0 ;;
|
||||||
|
ppc64) return 0 ;;
|
||||||
|
ppc64le) return 0 ;;
|
||||||
|
mips) return 0 ;;
|
||||||
|
mipsle) return 0 ;;
|
||||||
|
mips64) return 0 ;;
|
||||||
|
mips64le) return 0 ;;
|
||||||
|
s390x) return 0 ;;
|
||||||
|
amd64p32) return 0 ;;
|
||||||
|
esac
|
||||||
|
log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
untar() {
|
||||||
|
tarball=$1
|
||||||
|
case "${tarball}" in
|
||||||
|
*.tar.gz | *.tgz) tar --no-same-owner -xzf "${tarball}" ;;
|
||||||
|
*.tar) tar --no-same-owner -xf "${tarball}" ;;
|
||||||
|
*.zip) unzip "${tarball}" ;;
|
||||||
|
*)
|
||||||
|
log_err "untar unknown archive format for ${tarball}"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
http_download_curl() {
|
||||||
|
local_file=$1
|
||||||
|
source_url=$2
|
||||||
|
header=$3
|
||||||
|
if [ -z "$header" ]; then
|
||||||
|
code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url")
|
||||||
|
else
|
||||||
|
code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url")
|
||||||
|
fi
|
||||||
|
if [ "$code" != "200" ]; then
|
||||||
|
log_debug "http_download_curl received HTTP status $code"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
http_download_wget() {
|
||||||
|
local_file=$1
|
||||||
|
source_url=$2
|
||||||
|
header=$3
|
||||||
|
if [ -z "$header" ]; then
|
||||||
|
wget -q -O "$local_file" "$source_url"
|
||||||
|
else
|
||||||
|
wget -q --header "$header" -O "$local_file" "$source_url"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
http_download() {
|
||||||
|
log_debug "http_download $2"
|
||||||
|
if is_command curl; then
|
||||||
|
http_download_curl "$@"
|
||||||
|
return
|
||||||
|
elif is_command wget; then
|
||||||
|
http_download_wget "$@"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
log_crit "http_download unable to find wget or curl"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
http_copy() {
|
||||||
|
tmp=$(mktemp)
|
||||||
|
http_download "${tmp}" "$1" "$2" || return 1
|
||||||
|
body=$(cat "$tmp")
|
||||||
|
rm -f "${tmp}"
|
||||||
|
echo "$body"
|
||||||
|
}
|
||||||
|
github_release() {
|
||||||
|
owner_repo=$1
|
||||||
|
version=$2
|
||||||
|
test -z "$version" && version="latest"
|
||||||
|
giturl="https://github.com/${owner_repo}/releases/${version}"
|
||||||
|
json=$(http_copy "$giturl" "Accept:application/json")
|
||||||
|
test -z "$json" && return 1
|
||||||
|
version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//')
|
||||||
|
test -z "$version" && return 1
|
||||||
|
echo "$version"
|
||||||
|
}
|
||||||
|
hash_sha256() {
|
||||||
|
TARGET=${1:-/dev/stdin}
|
||||||
|
if is_command gsha256sum; then
|
||||||
|
hash=$(gsha256sum "$TARGET") || return 1
|
||||||
|
echo "$hash" | cut -d ' ' -f 1
|
||||||
|
elif is_command sha256sum; then
|
||||||
|
hash=$(sha256sum "$TARGET") || return 1
|
||||||
|
echo "$hash" | cut -d ' ' -f 1
|
||||||
|
elif is_command shasum; then
|
||||||
|
hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1
|
||||||
|
echo "$hash" | cut -d ' ' -f 1
|
||||||
|
elif is_command openssl; then
|
||||||
|
hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1
|
||||||
|
echo "$hash" | cut -d ' ' -f a
|
||||||
|
else
|
||||||
|
log_crit "hash_sha256 unable to find command to compute sha-256 hash"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
hash_sha256_verify() {
|
||||||
|
TARGET=$1
|
||||||
|
checksums=$2
|
||||||
|
if [ -z "$checksums" ]; then
|
||||||
|
log_err "hash_sha256_verify checksum file not specified in arg2"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
BASENAME=${TARGET##*/}
|
||||||
|
want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1)
|
||||||
|
if [ -z "$want" ]; then
|
||||||
|
log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
got=$(hash_sha256 "$TARGET")
|
||||||
|
if [ "$want" != "$got" ]; then
|
||||||
|
log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
cat /dev/null <<EOF
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
End of functions from https://github.com/client9/shlib
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
EOF
|
||||||
|
|
||||||
|
PROJECT_NAME="trivy"
|
||||||
|
OWNER=aquasecurity
|
||||||
|
REPO="trivy"
|
||||||
|
BINARY=trivy
|
||||||
|
FORMAT=tar.gz
|
||||||
|
OS=$(uname_os)
|
||||||
|
ARCH=$(uname_arch)
|
||||||
|
PREFIX="$OWNER/$REPO"
|
||||||
|
|
||||||
|
# use in logging routines
|
||||||
|
log_prefix() {
|
||||||
|
echo "$PREFIX"
|
||||||
|
}
|
||||||
|
PLATFORM="${OS}/${ARCH}"
|
||||||
|
GITHUB_DOWNLOAD=https://github.com/${OWNER}/${REPO}/releases/download
|
||||||
|
|
||||||
|
uname_os_check "$OS"
|
||||||
|
uname_arch_check "$ARCH"
|
||||||
|
|
||||||
|
parse_args "$@"
|
||||||
|
|
||||||
|
get_binaries
|
||||||
|
|
||||||
|
tag_to_version
|
||||||
|
|
||||||
|
adjust_format
|
||||||
|
|
||||||
|
adjust_os
|
||||||
|
|
||||||
|
adjust_arch
|
||||||
|
|
||||||
|
log_info "found version: ${VERSION} for ${TAG}/${OS}/${ARCH}"
|
||||||
|
|
||||||
|
NAME=${PROJECT_NAME}_${VERSION}_${OS}-${ARCH}
|
||||||
|
TARBALL=${NAME}.${FORMAT}
|
||||||
|
TARBALL_URL=${GITHUB_DOWNLOAD}/${TAG}/${TARBALL}
|
||||||
|
CHECKSUM=${PROJECT_NAME}_${VERSION}_checksums.txt
|
||||||
|
CHECKSUM_URL=${GITHUB_DOWNLOAD}/${TAG}/${CHECKSUM}
|
||||||
|
|
||||||
|
|
||||||
|
execute
|
||||||
31
contrib/junit.tpl
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<testsuites>
|
||||||
|
{{- range . -}}
|
||||||
|
{{- $failures := len .Vulnerabilities }}
|
||||||
|
<testsuite tests="{{ $failures }}" failures="{{ $failures }}" name="{{ .Target }}" errors="0" skipped="0" time="">
|
||||||
|
{{- if not (eq .Type "") }}
|
||||||
|
<properties>
|
||||||
|
<property name="type" value="{{ .Type }}"></property>
|
||||||
|
</properties>
|
||||||
|
{{- end -}}
|
||||||
|
{{ range .Vulnerabilities }}
|
||||||
|
<testcase classname="{{ .PkgName }}-{{ .InstalledVersion }}" name="[{{ .Vulnerability.Severity }}] {{ .VulnerabilityID }}" time="">
|
||||||
|
<failure message="{{ escapeXML .Title }}" type="description">{{ escapeXML .Description }}</failure>
|
||||||
|
</testcase>
|
||||||
|
{{- end }}
|
||||||
|
</testsuite>
|
||||||
|
{{- $failures := len .Misconfigurations }}
|
||||||
|
<testsuite tests="{{ $failures }}" failures="{{ $failures }}" name="{{ .Target }}" errors="0" skipped="0" time="">
|
||||||
|
{{- if not (eq .Type "") }}
|
||||||
|
<properties>
|
||||||
|
<property name="type" value="{{ .Type }}"></property>
|
||||||
|
</properties>
|
||||||
|
{{- end -}}
|
||||||
|
{{ range .Misconfigurations }}
|
||||||
|
<testcase classname="{{ .Type }}" name="[{{ .Severity }}] {{ .ID }}" time="">
|
||||||
|
<failure message="{{ escapeXML .Title }}" type="description">{{ escapeXML .Description }}</failure>
|
||||||
|
</testcase>
|
||||||
|
{{- end }}
|
||||||
|
</testsuite>
|
||||||
|
{{- end }}
|
||||||
|
</testsuites>
|
||||||
10
docs/build/Dockerfile
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
FROM squidfunk/mkdocs-material:8.2.10
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
30
docs/build/requirements.txt
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
click==8.1.2
|
||||||
|
csscompressor==0.9.5
|
||||||
|
ghp-import==2.0.2
|
||||||
|
htmlmin==0.1.12
|
||||||
|
importlib-metadata==4.11.3
|
||||||
|
Jinja2==3.1.1
|
||||||
|
jsmin==3.0.1
|
||||||
|
Markdown==3.3.6
|
||||||
|
MarkupSafe==2.1.1
|
||||||
|
mergedeep==1.3.4
|
||||||
|
mike==1.1.2
|
||||||
|
mkdocs==1.3.0
|
||||||
|
mkdocs-macros-plugin==0.7.0
|
||||||
|
mkdocs-material==8.2.10
|
||||||
|
mkdocs-material-extensions==1.0.3
|
||||||
|
mkdocs-minify-plugin==0.5.0
|
||||||
|
mkdocs-redirects==1.0.4
|
||||||
|
packaging==21.3
|
||||||
|
Pygments==2.11.2
|
||||||
|
pymdown-extensions==9.3
|
||||||
|
pyparsing==3.0.8
|
||||||
|
python-dateutil==2.8.2
|
||||||
|
PyYAML==6.0
|
||||||
|
pyyaml-env-tag==0.1
|
||||||
|
six==1.16.0
|
||||||
|
termcolor==1.1.0
|
||||||
|
verspec==0.1.0
|
||||||
|
watchdog==2.1.7
|
||||||
|
zipp==3.8.0
|
||||||
|
|
||||||
21
docs/community/cks.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# CKS preparation resources
|
||||||
|
|
||||||
|
Community Resources
|
||||||
|
|
||||||
|
- [Trivy Video overview (short)][overview]
|
||||||
|
- [Example questions from the exam][exam]
|
||||||
|
- [More example questions][questions]
|
||||||
|
|
||||||
|
Aqua Security Blog posts
|
||||||
|
|
||||||
|
- Supply chain security best [practices][supply-chain-best-practices]
|
||||||
|
- Supply chain [attacks][supply-chain-attacks]
|
||||||
|
-
|
||||||
|
If you know of interesting resources, please start a PR to add those to the list.
|
||||||
|
|
||||||
|
[overview]: https://youtu.be/2cjH6Zkieys
|
||||||
|
[exam]: https://jonathan18186.medium.com/certified-kubernetes-security-specialist-cks-preparation-part-7-supply-chain-security-9cf62c34cf6a
|
||||||
|
[questions]: https://github.com/kodekloudhub/certified-kubernetes-security-specialist-cks-course/blob/main/docs/06-Supply-Chain-Security/09-Scan-images-for-known-vulnerabilities-(Trivy).md
|
||||||
|
|
||||||
|
[supply-chain-best-practices]: https://blog.aquasec.com/supply-chain-security-best-practices
|
||||||
|
[supply-chain-attacks]: https://blog.aquasec.com/supply-chain-threats-using-container-images
|
||||||
31
docs/community/contribute/issue.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
Thank you for taking interest in contributing to Trivy!
|
||||||
|
|
||||||
|
- 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 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.
|
||||||
|
|
||||||
|
## Wrong detection
|
||||||
|
Trivy depends on [multiple data sources](https://aquasecurity.github.io/trivy/latest/docs/vulnerability/detection/data-source/).
|
||||||
|
Sometime these databases contain mistakes.
|
||||||
|
|
||||||
|
If Trivy can't detect any CVE-IDs or shows false positive result, at first please follow the next steps:
|
||||||
|
|
||||||
|
1. Run Trivy with `-f json` that shows data sources.
|
||||||
|
2. According to the shown data source, make sure that the security advisory in the data source is correct.
|
||||||
|
|
||||||
|
If the data source is correct and Trivy shows wrong results, please raise an issue on Trivy.
|
||||||
|
|
||||||
|
### GitHub Advisory Database
|
||||||
|
Visit [here](https://github.com/advisories) and search CVE-ID.
|
||||||
|
|
||||||
|
If you find a problem, it'll be nice to fix it: [How to contribute to a GitHub security advisory](https://github.blog/2022-02-22-github-advisory-database-now-open-to-community-contributions/)
|
||||||
|
|
||||||
|
### GitLab Advisory Database
|
||||||
|
Visit [here](https://advisories.gitlab.com/) and search CVE-ID.
|
||||||
|
|
||||||
|
If you find a problem, it'll be nice to fix it: [Create an issue to GitLab Advisory Database](https://gitlab.com/gitlab-org/security-products/gemnasium-db/-/issues/new)
|
||||||
|
|
||||||
|
### Red Hat CVE Database
|
||||||
|
Visit [here](https://access.redhat.com/security/security-updates/?cwe=476#/cve) and search CVE-ID.
|
||||||
|
|
||||||
164
docs/community/contribute/pr.md
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
Thank you for taking interest in contributing to Trivy!
|
||||||
|
|
||||||
|
1. Every Pull Request should have an associated bug or feature issue unless you are fixing a trivial documentation issue.
|
||||||
|
1. Please add the associated Issue link in the PR description.
|
||||||
|
1. Your PR is more likely to be accepted if it focuses on just one change.
|
||||||
|
1. There's no need to add or tag reviewers.
|
||||||
|
1. If a reviewer commented on your code or asked for changes, please remember to respond with comment. Do not mark discussion as resolved. It's up to reviewer to mark it resolved (in case if suggested fix addresses problem properly). PRs with unresolved issues should not be merged (even if the comment is unclear or requires no action from your side).
|
||||||
|
1. Please include a comment with the results before and after your change.
|
||||||
|
1. Your PR is more likely to be accepted if it includes tests (We have not historically been very strict about tests, but we would like to improve this!).
|
||||||
|
1. If your PR affects the user experience in some way, please update the README.md and the CLI help accordingly.
|
||||||
|
|
||||||
|
### Title
|
||||||
|
It is not that strict, but we use the title conventions in this repository.
|
||||||
|
Each commit message doesn't have to follow the conventions as long as it is clear and descriptive since it will be squashed and merged.
|
||||||
|
|
||||||
|
#### Format of the title
|
||||||
|
|
||||||
|
```
|
||||||
|
<type>(<scope>): <subject>
|
||||||
|
```
|
||||||
|
|
||||||
|
The `type` and `scope` should always be lowercase as shown below.
|
||||||
|
|
||||||
|
**Allowed `<type>` values:**
|
||||||
|
|
||||||
|
- **feat** for a new feature for the user, not a new feature for build script. Such commit will trigger a release bumping a MINOR version.
|
||||||
|
- **fix** for a bug fix for the user, not a fix to a build script. Such commit will trigger a release bumping a PATCH version.
|
||||||
|
- **perf** for performance improvements. Such commit will trigger a release bumping a PATCH version.
|
||||||
|
- **docs** for changes to the documentation.
|
||||||
|
- **style** for formatting changes, missing semicolons, etc.
|
||||||
|
- **refactor** for refactoring production code, e.g. renaming a variable.
|
||||||
|
- **test** for adding missing tests, refactoring tests; no production code change.
|
||||||
|
- **build** for updating build configuration, development tools or other changes irrelevant to the user.
|
||||||
|
- **chore** for updates that do not apply to the above, such as dependency updates.
|
||||||
|
- **ci** for changes to CI configuration files and scripts
|
||||||
|
- **revert** for revert to a previous commit
|
||||||
|
|
||||||
|
**Allowed `<scope>` values:**
|
||||||
|
|
||||||
|
checks:
|
||||||
|
|
||||||
|
- vuln
|
||||||
|
- misconf
|
||||||
|
- secret
|
||||||
|
|
||||||
|
mode:
|
||||||
|
|
||||||
|
- image
|
||||||
|
- fs
|
||||||
|
- repo
|
||||||
|
- sbom
|
||||||
|
- server
|
||||||
|
|
||||||
|
os:
|
||||||
|
|
||||||
|
- alpine
|
||||||
|
- redhat
|
||||||
|
- alma
|
||||||
|
- rocky
|
||||||
|
- mariner
|
||||||
|
- oracle
|
||||||
|
- debian
|
||||||
|
- ubuntu
|
||||||
|
- amazon
|
||||||
|
- suse
|
||||||
|
- photon
|
||||||
|
- distroless
|
||||||
|
|
||||||
|
language:
|
||||||
|
|
||||||
|
- ruby
|
||||||
|
- php
|
||||||
|
- python
|
||||||
|
- nodejs
|
||||||
|
- rust
|
||||||
|
- dotnet
|
||||||
|
- java
|
||||||
|
- go
|
||||||
|
|
||||||
|
vuln:
|
||||||
|
|
||||||
|
- os
|
||||||
|
- lang
|
||||||
|
|
||||||
|
config:
|
||||||
|
|
||||||
|
- kubernetes
|
||||||
|
- dockerfile
|
||||||
|
- terraform
|
||||||
|
- cloudformation
|
||||||
|
|
||||||
|
container
|
||||||
|
|
||||||
|
- docker
|
||||||
|
- podman
|
||||||
|
- containerd
|
||||||
|
- oci
|
||||||
|
|
||||||
|
cli:
|
||||||
|
|
||||||
|
- cli
|
||||||
|
- flag
|
||||||
|
|
||||||
|
others:
|
||||||
|
|
||||||
|
- helm
|
||||||
|
- report
|
||||||
|
- db
|
||||||
|
- deps
|
||||||
|
|
||||||
|
The `<scope>` can be empty (e.g. if the change is a global or difficult to assign to a single component), in which case the parentheses are omitted.
|
||||||
|
|
||||||
|
#### Example titles
|
||||||
|
|
||||||
|
```
|
||||||
|
feat(alma): add support for AlmaLinux
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
fix(oracle): handle advisories with ksplice versions
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
docs(misconf): add comparison with Conftest and TFsec
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
chore(deps): bump go.uber.org/zap from 1.19.1 to 1.20.0
|
||||||
|
```
|
||||||
|
|
||||||
|
**NOTE**: please do not use `chore(deps): update fanal` and something like that if you add new features or fix bugs in Trivy-related projects.
|
||||||
|
The PR title should describe what the PR adds or fixes even though it just updates the dependency in Trivy.
|
||||||
|
|
||||||
|
### Unit tests
|
||||||
|
Your PR must pass all the unit tests. You can test it as below.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ make test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration tests
|
||||||
|
Your PR must pass all the integration tests. You can test it as below.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ make test-integration
|
||||||
|
```
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
You can build the documents as below and view it at http://localhost:8000.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ make mkdocs-serve
|
||||||
|
```
|
||||||
|
|
||||||
|
## Understand where your pull request belongs
|
||||||
|
|
||||||
|
Trivy is composed of several 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. 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.
|
||||||
|
- [trivy-db](https://github.com/aquasecurity/trivy-db) maintains the vulnerability database pulled by Trivy CLI.
|
||||||
|
- [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.
|
||||||
|
- [go-dep-parser](https://github.com/aquasecurity/go-dep-parser) is a library for parsing lock files such as package-lock.json and Gemfile.lock.
|
||||||
10
docs/community/credit.md
Normal 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
|
||||||
78
docs/community/maintainer/help-wanted.md
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# Overview
|
||||||
|
|
||||||
|
We use two labels [help wanted](#help-wanted) and [good first
|
||||||
|
issue](#good-first-issue) to identify issues that have been specially groomed
|
||||||
|
for new contributors. The `good first issue` label is a subset of `help wanted`
|
||||||
|
label, indicating that members have committed to providing extra assistance for
|
||||||
|
new contributors. All `good first issue` items also have the `help wanted`
|
||||||
|
label.
|
||||||
|
|
||||||
|
## Help Wanted
|
||||||
|
|
||||||
|
Items marked with the `help wanted` label need to ensure that they are:
|
||||||
|
|
||||||
|
- **Low Barrier to Entry**
|
||||||
|
|
||||||
|
It should be tractable for new contributors. Documentation on how that type of
|
||||||
|
change should be made should already exist.
|
||||||
|
|
||||||
|
- **Clear Task**
|
||||||
|
|
||||||
|
The task is agreed upon and does not require further discussions in the
|
||||||
|
community. Call out if that area of code is untested and requires new
|
||||||
|
fixtures.
|
||||||
|
|
||||||
|
API / CLI behavior is decided and included in the OP issue, for example: "The
|
||||||
|
new command syntax is `trivy --format yaml IMAGE_NAME`"_ with
|
||||||
|
expected validations called out.
|
||||||
|
|
||||||
|
- **Goldilocks priority**
|
||||||
|
|
||||||
|
Not too high that a core contributor should do it, but not too low that it
|
||||||
|
isn't useful enough for a core contributor to spend time to review it, answer
|
||||||
|
questions, help get it into a release, etc.
|
||||||
|
|
||||||
|
- **Up-To-Date**
|
||||||
|
|
||||||
|
Often these issues become obsolete and have already been done, are no longer
|
||||||
|
desired, no longer make sense, have changed priority or difficulty , etc.
|
||||||
|
|
||||||
|
|
||||||
|
## Good First Issue
|
||||||
|
|
||||||
|
Items marked with the `good first issue` label are intended for _first-time
|
||||||
|
contributors_. It indicates that members will keep an eye out for these pull
|
||||||
|
requests and shepherd it through our processes.
|
||||||
|
|
||||||
|
These items need to ensure that they follow the guidelines for `help wanted`
|
||||||
|
labels (above) in addition to meeting the following criteria:
|
||||||
|
|
||||||
|
- **No Barrier to Entry**
|
||||||
|
|
||||||
|
The task is something that a new contributor can tackle without advanced
|
||||||
|
setup, or domain knowledge.
|
||||||
|
|
||||||
|
- **Solution Explained**
|
||||||
|
|
||||||
|
The recommended solution is clearly described in the issue.
|
||||||
|
|
||||||
|
- **Provides Context**
|
||||||
|
|
||||||
|
If background knowledge is required, this should be explicitly mentioned and a
|
||||||
|
list of suggested readings included.
|
||||||
|
|
||||||
|
- **Gives Examples**
|
||||||
|
|
||||||
|
Link to examples of similar implementations so new contributors have a
|
||||||
|
reference guide for their changes.
|
||||||
|
|
||||||
|
- **Identifies Relevant Code**
|
||||||
|
|
||||||
|
The relevant code and tests to be changed should be linked in the issue.
|
||||||
|
|
||||||
|
- **Ready to Test**
|
||||||
|
|
||||||
|
There should be existing tests that can be modified, or existing test cases
|
||||||
|
fit to be copied. If the area of code doesn't have tests, before labeling the
|
||||||
|
issue, add a test fixture. This prep often makes a great `help wanted` task!
|
||||||
|
|
||||||
198
docs/community/maintainer/triage.md
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
# Triage
|
||||||
|
|
||||||
|
Triage is an important part of maintaining the health of the trivy repo.
|
||||||
|
A well organized repo allows maintainers to prioritize feature requests, fix bugs, and respond to users facing difficulty with the tool as quickly as possible.
|
||||||
|
|
||||||
|
Triage includes:
|
||||||
|
|
||||||
|
- Labeling issues
|
||||||
|
- Responding to issues
|
||||||
|
- Closing issues
|
||||||
|
|
||||||
|
# Daily Triage
|
||||||
|
Daily triage has two goals:
|
||||||
|
|
||||||
|
1. Responsiveness for new issues
|
||||||
|
1. Responsiveness when explicitly requested information was provided
|
||||||
|
|
||||||
|
It covers:
|
||||||
|
|
||||||
|
1. Issues without a `kind/` or `triage/` label
|
||||||
|
1. Issues without a `priority/` label
|
||||||
|
1. `triage/needs-information` issues which the user has followed up on, and now require a response.
|
||||||
|
|
||||||
|
## Categorization
|
||||||
|
|
||||||
|
The most important level of categorizing the issue is defining what type it is.
|
||||||
|
We typically want at least one of the following labels on every issue, and some issues may fall into multiple categories:
|
||||||
|
|
||||||
|
- `triage/support` - The default for most incoming issues
|
||||||
|
- `kind/bug` - When it’s a bug or we aren’t delivering the best user experience
|
||||||
|
|
||||||
|
Other possibilities:
|
||||||
|
- `kind/feature`- Identify new feature requests
|
||||||
|
- `kind/testing` - Update or fix unit/integration tests
|
||||||
|
- `kind/cleanup` - Cleaning up/refactoring the codebase
|
||||||
|
- `kind/documentation` - Updates or additions to trivy documentation
|
||||||
|
|
||||||
|
If the issue is specific to a driver for OS packages or libraries:
|
||||||
|
|
||||||
|
**co/[driver for OS packages]**
|
||||||
|
|
||||||
|
- `co/alpine`
|
||||||
|
- `co/amazon`
|
||||||
|
- `co/debian`
|
||||||
|
- `co/oracle`
|
||||||
|
- `co/photon`
|
||||||
|
- `co/redhat`
|
||||||
|
- `co/suse`
|
||||||
|
- `co/ubuntu`
|
||||||
|
|
||||||
|
**co/[driver for libraries of programming languages]**
|
||||||
|
|
||||||
|
- `co/bundler`
|
||||||
|
- `co/cargo`
|
||||||
|
- `co/composer`
|
||||||
|
- `co/npm`
|
||||||
|
- `co/yarn`
|
||||||
|
- `co/pipenv`
|
||||||
|
- `co/poetry`
|
||||||
|
|
||||||
|
|
||||||
|
**Help wanted?**
|
||||||
|
|
||||||
|
`Good First Issue` - bug has a proposed solution, can be implemented w/o further discussion.
|
||||||
|
|
||||||
|
`Help wanted` - if the bug could use help from a contributor
|
||||||
|
|
||||||
|
|
||||||
|
## Prioritization
|
||||||
|
If the issue is not `triage/support`, it needs a priority label.
|
||||||
|
|
||||||
|
`priority/critical-urgent` - someones top priority ASAP, such as security issue, user-visible bug, or build breakage. Rarely used.
|
||||||
|
|
||||||
|
`priority/important-soon`: in time for the next two releases. It should be attached to a milestone.
|
||||||
|
|
||||||
|
`priority/important-longterm`: 2-4 releases from now
|
||||||
|
|
||||||
|
`priority/backlog`: agreed that this would be good to have, but no one is available at the moment. Consider tagging as `help wanted`
|
||||||
|
|
||||||
|
`priority/awaiting-more-evidence`: may be useful, but there is not yet enough support.
|
||||||
|
|
||||||
|
|
||||||
|
# Weekly Triage
|
||||||
|
|
||||||
|
Weekly triage has three goals:
|
||||||
|
|
||||||
|
1. Catching up on unresponded issues
|
||||||
|
1. Reviewing and closing PR’s
|
||||||
|
1. Closing stale issues
|
||||||
|
|
||||||
|
|
||||||
|
## Post-Release Triage
|
||||||
|
|
||||||
|
Post-release triage occurs after a major release (around every 4-6 weeks).
|
||||||
|
It focuses on:
|
||||||
|
|
||||||
|
1. Closing bugs that have been resolved by the release
|
||||||
|
1. Reprioritizing bugs that have not been resolved by the release
|
||||||
|
1. Letting users know if we believe that there is still an issue
|
||||||
|
|
||||||
|
This includes reviewing:
|
||||||
|
|
||||||
|
1. Every issue that hasn’t been touched in the last 2 days
|
||||||
|
1. Re-evaluation of long-term issues
|
||||||
|
1. Re-evaluation of short-term issues
|
||||||
|
|
||||||
|
|
||||||
|
## Responding to Issues
|
||||||
|
|
||||||
|
### Needs More Information
|
||||||
|
A sample response to ask for more info:
|
||||||
|
|
||||||
|
> I don’t yet have a clear way to replicate this issue. Do you mind adding some additional details. Here is additional information that would be helpful:
|
||||||
|
>
|
||||||
|
> \* The exact `trivy` command line used
|
||||||
|
>
|
||||||
|
> \* The exact image you want to scan
|
||||||
|
>
|
||||||
|
> \* The full output of the `trivy` command, preferably with `--debug` for extra logging.
|
||||||
|
>
|
||||||
|
>
|
||||||
|
> Thank you for sharing your experience!
|
||||||
|
|
||||||
|
|
||||||
|
Then: Label with `triage/needs-information`.
|
||||||
|
|
||||||
|
### Issue might be resolved
|
||||||
|
If you think a release may have resolved an issue, ask the author to see if their issue has been resolved:
|
||||||
|
|
||||||
|
> Could you please check to see if trivy <x> addresses this issue? We've made some changes with how this is handled, and improved the trivy logs output to help us debug tricky cases like this.
|
||||||
|
|
||||||
|
Then: Label with `triage/needs-information`.
|
||||||
|
|
||||||
|
|
||||||
|
## Closing with Care
|
||||||
|
|
||||||
|
Issues typically need to be closed for the following reasons:
|
||||||
|
|
||||||
|
- The issue has been addressed
|
||||||
|
- The issue is a duplicate of an existing issue
|
||||||
|
- There has been a lack of information over a long period of time
|
||||||
|
|
||||||
|
In any of these situations, we aim to be kind when closing the issue, and offer the author action items should they need to reopen their issue or still require a solution.
|
||||||
|
|
||||||
|
Samples responses for these situations include:
|
||||||
|
|
||||||
|
### Issue has been addressed
|
||||||
|
|
||||||
|
>@author: I believe this issue is now addressed by trivy v1.0.0, as it <reason>. If you still see this issue with trivy v1.0 or higher, please reopen this issue.
|
||||||
|
>
|
||||||
|
>Thank you for reporting this issue!
|
||||||
|
|
||||||
|
Then: Close the issue
|
||||||
|
|
||||||
|
### Duplicate Issue
|
||||||
|
|
||||||
|
>This issue appears to be a duplicate of #X, do you mind if we move the conversation there?
|
||||||
|
>
|
||||||
|
>This way we can centralize the content relating to the issue. If you feel that this issue is not in fact a duplicate, please re-open it. If you have additional information to share, please add it to the new issue.
|
||||||
|
>
|
||||||
|
>Thank you for reporting this!
|
||||||
|
|
||||||
|
Then: Label with `triage/duplicate` and close the issue.
|
||||||
|
|
||||||
|
### Lack of Information
|
||||||
|
If an issue hasn't been active for more than four weeks, and the author has been pinged at least once, then the issue can be closed.
|
||||||
|
|
||||||
|
>Hey @author -- hopefully it's OK if I close this - there wasn't enough information to make it actionable, and some time has already passed. If you are able to provide additional details, you may reopen it at any point.
|
||||||
|
>
|
||||||
|
>Here is additional information that may be helpful to us:
|
||||||
|
>
|
||||||
|
>\* Whether the issue occurs with the latest trivy release
|
||||||
|
>
|
||||||
|
>\* The exact `trivy` command line used
|
||||||
|
>
|
||||||
|
>\* The exact image you want to scan
|
||||||
|
>
|
||||||
|
>\* The full output of the `trivy` command, preferably with `--debug` for extra logging.
|
||||||
|
>
|
||||||
|
>
|
||||||
|
>Thank you for sharing your experience!
|
||||||
|
|
||||||
|
Then: Close the issue.
|
||||||
|
|
||||||
|
## Help Wanted issues
|
||||||
|
|
||||||
|
We use two labels [help wanted](https://github.com/aquasecurity/trivy/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22)
|
||||||
|
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/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.
|
||||||
48
docs/community/references.md
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# Additional References
|
||||||
|
There are external blogs and evaluations.
|
||||||
|
|
||||||
|
## 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]
|
||||||
|
- [the vulnerability remediation lifecycle of Alpine containers][alpine]
|
||||||
|
- [Continuous Container Vulnerability Testing with Trivy][semaphore]
|
||||||
|
- [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]
|
||||||
|
|
||||||
|
## Links
|
||||||
|
- [Research Spike: evaluate Trivy for scanning running containers][gitlab]
|
||||||
|
- [Istio evaluates scanners][istio]
|
||||||
|
|
||||||
|
## 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]
|
||||||
|
|
||||||
|
[alpine]: https://ariadne.space/2021/06/08/the-vulnerability-remediation-lifecycle-of-alpine-containers/
|
||||||
|
[semaphore]: https://semaphoreci.com/blog/continuous-container-vulnerability-testing-with-trivy
|
||||||
|
[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
|
||||||
|
|
||||||
|
[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
|
||||||
37
docs/community/tools.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Community Tools
|
||||||
|
The open source community has been hard at work developing new tools for Trivy. You can check out some of them here.
|
||||||
|
|
||||||
|
Have you created a tool that’s not listed? Add the name and description of your integration and open a pull request in the GitHub repository to get your change merged.
|
||||||
|
|
||||||
|
## GitHub Actions
|
||||||
|
|
||||||
|
| Actions | Description |
|
||||||
|
| ------------------------------------------ | -------------------------------------------------------------------------------- |
|
||||||
|
| [gitrivy][gitrivy] | GitHub Issue + Trivy |
|
||||||
|
| [trivy-github-issues][trivy-github-issues] | GitHub Actions for creating GitHub Issues according to the Trivy scanning result |
|
||||||
|
|
||||||
|
## Semaphore
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| -------------------------------------------------------| ----------------------------------------- |
|
||||||
|
| [Continuous Vulnerability Testing with Trivy][semaphore-tutorial] | Tutorial on scanning code, containers, infrastructure, and Kubernetes with Semaphore CI/CD. |
|
||||||
|
|
||||||
|
|
||||||
|
## CircleCI
|
||||||
|
|
||||||
|
| Orb | Description |
|
||||||
|
| -----------------------------------------| ----------------------------------------- |
|
||||||
|
| [fifteen5/trivy-orb][fifteen5/trivy-orb] | Orb for running Trivy, a security scanner |
|
||||||
|
|
||||||
|
## Others
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| -----------------------------------------| ----------------------------------------- |
|
||||||
|
| [Trivy Vulnerability Explorer][explorer] | Explore trivy vulnerability reports in your browser and create .trivyignore files interactively. Can be integrated in your CI/CD tooling with deep links. |
|
||||||
|
|
||||||
|
|
||||||
|
[trivy-github-issues]: https://github.com/marketplace/actions/trivy-github-issues
|
||||||
|
[fifteen5/trivy-orb]: https://circleci.com/developer/orbs/orb/fifteen5/trivy-orb
|
||||||
|
[gitrivy]: https://github.com/marketplace/actions/trivy-action
|
||||||
|
[explorer]: https://dbsystel.github.io/trivy-vulnerability-explorer/
|
||||||
|
[semaphore-tutorial]: https://semaphoreci.com/blog/continuous-container-vulnerability-testing-with-trivy
|
||||||
66
docs/docs/advanced/air-gap.md
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# Air-Gapped Environment
|
||||||
|
|
||||||
|
Trivy can be used in air-gapped environments. Note that an allowlist is [here][allowlist].
|
||||||
|
|
||||||
|
## Air-Gapped Environment for vulnerabilities
|
||||||
|
|
||||||
|
### Download the vulnerability database
|
||||||
|
At first, you need to download the vulnerability database for use in air-gapped environments.
|
||||||
|
Please follow [oras installation instruction][oras].
|
||||||
|
|
||||||
|
Download `db.tar.gz`:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ oras pull ghcr.io/aquasecurity/trivy-db:2 -a
|
||||||
|
```
|
||||||
|
|
||||||
|
### Transfer the DB file into the air-gapped environment
|
||||||
|
The way of transfer depends on the environment.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ rsync -av -e ssh /path/to/db.tar.gz [user]@[host]:dst
|
||||||
|
```
|
||||||
|
|
||||||
|
### Put the DB file in Trivy's cache directory
|
||||||
|
You have to know where to put the DB file. The following command shows the default cache directory.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh user@host
|
||||||
|
$ trivy -h | grep cache
|
||||||
|
--cache-dir value cache directory (default: "/home/myuser/.cache/trivy") [$TRIVY_CACHE_DIR]
|
||||||
|
```
|
||||||
|
|
||||||
|
Put the DB file in the cache directory + `/db`.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ mkdir -p /home/myuser/.cache/trivy/db
|
||||||
|
$ cd /home/myuser/.cache/trivy/db
|
||||||
|
$ tar xvf /path/to/db.tar.gz -C /home/myuser/.cache/trivy/db
|
||||||
|
x trivy.db
|
||||||
|
x metadata.json
|
||||||
|
$ rm /path/to/db.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
In an air-gapped environment it is your responsibility to update the Trivy database on a regular basis, so that the scanner can detect recently-identified vulnerabilities.
|
||||||
|
|
||||||
|
### Run Trivy with --skip-update and --offline-scan option
|
||||||
|
In an air-gapped environment, specify `--skip-update` so that Trivy doesn't attempt to download the latest database file.
|
||||||
|
In addition, if you want to scan Java dependencies such as JAR and pom.xml, you need to specify `--offline-scan` since Trivy tries to issue API requests for scanning Java applications by default.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy image --skip-update --offline-scan alpine:3.12
|
||||||
|
```
|
||||||
|
|
||||||
|
## Air-Gapped Environment for misconfigurations
|
||||||
|
|
||||||
|
No special measures are required to detect misconfigurations in an air-gapped environment.
|
||||||
|
|
||||||
|
### Run Trivy with --skip-policy-update option
|
||||||
|
In an air-gapped environment, specify `--skip-policy-update` so that Trivy doesn't attempt to download the latest misconfiguration policies.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy conf --skip-policy-update /path/to/conf
|
||||||
|
```
|
||||||
|
|
||||||
|
[allowlist]: ../references/troubleshooting.md
|
||||||
|
[oras]: https://oras.land/cli/
|
||||||
22
docs/docs/advanced/container/containerd.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# containerd
|
||||||
|
|
||||||
|
!!! warning "EXPERIMENTAL"
|
||||||
|
This feature might change without preserving backwards compatibility.
|
||||||
|
|
||||||
|
Scan your image in [containerd][containerd] running locally.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ nerdctl images
|
||||||
|
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
|
||||||
|
aquasec/nginx latest 2bcabc23b454 3 hours ago linux/amd64 149.1 MiB 54.1 MiB
|
||||||
|
$ trivy image aquasec/nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
If your containerd socket is not the default path (`//run/containerd/containerd.sock`), you can override it via `CONTAINERD_ADDRESS`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ export CONTAINERD_ADDRESS=/run/k3s/containerd/containerd.sock
|
||||||
|
$ trivy image aquasec/nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
[containerd]: https://containerd.io/
|
||||||
28
docs/docs/advanced/container/embed-in-dockerfile.md
Normal 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
|
||||||
|
Aqua’s [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
|
||||||
17
docs/docs/advanced/container/oci.md
Normal 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
|
||||||
|
```
|
||||||
28
docs/docs/advanced/container/podman.md
Normal 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
|
||||||
116
docs/docs/advanced/container/unpacked-filesystem.md
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
# Unpacked Filesystem
|
||||||
|
|
||||||
|
Scan an 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>
|
||||||
358
docs/docs/advanced/modules.md
Normal file
@@ -0,0 +1,358 @@
|
|||||||
|
# Modules
|
||||||
|
|
||||||
|
!!! warning "EXPERIMENTAL"
|
||||||
|
This feature might change without preserving backwards compatibility.
|
||||||
|
|
||||||
|
Trivy provides a module feature to allow others to extend the Trivy CLI without the need to change the Trivy code base.
|
||||||
|
It changes the behavior during scanning by WebAssembly.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Trivy modules are add-on tools that integrate seamlessly with Trivy.
|
||||||
|
They provide a way to extend the core feature set of Trivy, but without updating the Trivy binary.
|
||||||
|
|
||||||
|
- They can be added and removed from a Trivy installation without impacting the core Trivy tool.
|
||||||
|
- They can be written in any programming language supporting WebAssembly.
|
||||||
|
- It supports only [TinyGo][tinygo] at the moment.
|
||||||
|
|
||||||
|
You can write your own detection logic.
|
||||||
|
|
||||||
|
- Evaluate complex vulnerability conditions like [Spring4Shell][spring4shell]
|
||||||
|
- Detect a shell script communicating with malicious domains
|
||||||
|
- Detect malicious python install script (setup.py)
|
||||||
|
- Even detect misconfigurations in WordPress setting
|
||||||
|
- etc.
|
||||||
|
|
||||||
|
Then, you can update the scan result however you want.
|
||||||
|
|
||||||
|
- Change a severity
|
||||||
|
- Remove a vulnerability
|
||||||
|
- Add a new vulnerability
|
||||||
|
- etc.
|
||||||
|
|
||||||
|
Modules should be distributed in OCI registries like GitHub Container Registry.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
WebAssembly doesn't allow file access and network access by default.
|
||||||
|
Modules can read required files only, but cannot overwrite them.
|
||||||
|
WebAssembly is sandboxed and secure by design, but Trivy modules available in public are not audited for security.
|
||||||
|
You should install and run third-party modules at your own risk even though
|
||||||
|
|
||||||
|
Under the hood Trivy leverages [wazero][wazero] to run WebAssembly modules without CGO.
|
||||||
|
|
||||||
|
## Installing a Module
|
||||||
|
A module can be installed using the `trivy module install` command.
|
||||||
|
This command takes an url. It will download the module and install it in the module 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 modules cache.
|
||||||
|
The preference order is as follows:
|
||||||
|
|
||||||
|
- XDG_DATA_HOME if set and .trivy/plugins exists within the XDG_DATA_HOME dir
|
||||||
|
- $HOME/.trivy/plugins
|
||||||
|
|
||||||
|
For example, to download the WebAssembly module, you can execute the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy module install ghcr.io/aquasecurity/trivy-module-spring4shell
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using Modules
|
||||||
|
Once the module is installed, Trivy will load all available modules in the cache on the start of the next Trivy execution.
|
||||||
|
The modules may inject custom logic into scanning and change the result.
|
||||||
|
You can run Trivy as usual and modules are loaded automatically.
|
||||||
|
|
||||||
|
You will see the log messages about WASM modules.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ trivy image ghcr.io/aquasecurity/trivy-test-images:spring4shell-jre8
|
||||||
|
2022-06-12T12:57:13.210+0300 INFO Loading ghcr.io/aquasecurity/trivy-module-spring4shell/spring4shell.wasm...
|
||||||
|
2022-06-12T12:57:13.596+0300 INFO Registering WASM module: spring4shell@v1
|
||||||
|
...
|
||||||
|
2022-06-12T12:57:14.865+0300 INFO Module spring4shell: Java Version: 8, Tomcat Version: 8.5.77
|
||||||
|
2022-06-12T12:57:14.865+0300 INFO Module spring4shell: change CVE-2022-22965 severity from CRITICAL to LOW
|
||||||
|
|
||||||
|
Java (jar)
|
||||||
|
|
||||||
|
Total: 9 (UNKNOWN: 1, LOW: 3, MEDIUM: 2, HIGH: 3, CRITICAL: 0)
|
||||||
|
|
||||||
|
┌──────────────────────────────────────────────────────────────┬─────────────────────┬──────────┬───────────────────┬────────────────────────┬────────────────────────────────────────────────────────────┐
|
||||||
|
│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │
|
||||||
|
├──────────────────────────────────────────────────────────────┼─────────────────────┼──────────┼───────────────────┼────────────────────────┼────────────────────────────────────────────────────────────┤
|
||||||
|
│ org.springframework.boot:spring-boot (helloworld.war) │ CVE-2022-22965 │ LOW │ 2.6.3 │ 2.5.12, 2.6.6 │ spring-framework: RCE via Data Binding on JDK 9+ │
|
||||||
|
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-22965 │
|
||||||
|
├──────────────────────────────────────────────────────────────┼─────────────────────┼──────────┼───────────────────┼────────────────────────┼────────────────────────────────────────────────────────────┤
|
||||||
|
...(snip)...
|
||||||
|
```
|
||||||
|
|
||||||
|
In the above example, the Spring4Shell module changed the severity from CRITICAL to LOW because the application doesn't satisfy one of conditions.
|
||||||
|
|
||||||
|
## Uninstalling Modules
|
||||||
|
Specify a module repository with `trivy module uninstall` command.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy module uninstall ghcr.io/aquasecurity/trivy-module-spring4shell
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building Modules
|
||||||
|
It supports TinyGo only at the moment.
|
||||||
|
|
||||||
|
### TinyGo
|
||||||
|
Trivy provides Go SDK including three interfaces.
|
||||||
|
Your own module needs to implement either or both `Analyzer` and `PostScanner` in addition to `Module`.
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Module interface {
|
||||||
|
Version() int
|
||||||
|
Name() string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Analyzer interface {
|
||||||
|
RequiredFiles() []string
|
||||||
|
Analyze(filePath string) (*serialize.AnalysisResult, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type PostScanner interface {
|
||||||
|
PostScanSpec() serialize.PostScanSpec
|
||||||
|
PostScan(serialize.Results) (serialize.Results, error)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In the following tutorial, it creates a WordPress module that detects a WordPress version and a critical vulnerability accordingly.
|
||||||
|
|
||||||
|
!!! tips
|
||||||
|
You can use logging functions such as `Debug` and `Info` for debugging.
|
||||||
|
See [examples](#examples) for the detail.
|
||||||
|
|
||||||
|
#### Initialize your module
|
||||||
|
Replace the repository name with yours.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ go mod init github.com/aquasecurity/trivy-module-wordpress
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Module interface
|
||||||
|
`Version()` returns your module version and should be incremented after updates.
|
||||||
|
`Name()` returns your module name.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
const (
|
||||||
|
version = 1
|
||||||
|
name = "wordpress-module"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WordpressModule struct{
|
||||||
|
// Cannot define fields as modules can't keep state.
|
||||||
|
}
|
||||||
|
|
||||||
|
func (WordpressModule) Version() int {
|
||||||
|
return version
|
||||||
|
}
|
||||||
|
|
||||||
|
func (WordpressModule) Name() string {
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! info
|
||||||
|
A struct cannot have any fields. Each method invocation is performed in different states.
|
||||||
|
|
||||||
|
#### Analyzer interface
|
||||||
|
If you implement the `Analyzer` interface, `Analyze` method is called when the file path is matched to file patterns returned by `RequiredFiles()`.
|
||||||
|
A file pattern must be a regular expression. The syntax detail is [here][regexp].
|
||||||
|
|
||||||
|
`Analyze` takes the matched file path, then the file can be opened by `os.Open()`.
|
||||||
|
|
||||||
|
```go
|
||||||
|
const typeWPVersion = "wordpress-version"
|
||||||
|
|
||||||
|
func (WordpressModule) RequiredFiles() []string {
|
||||||
|
return []string{
|
||||||
|
`wp-includes\/version.php`,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (WordpressModule) Analyze(filePath string) (*serialize.AnalysisResult, error) {
|
||||||
|
f, err := os.Open(filePath) // e.g. filePath: /usr/src/wordpress/wp-includes/version.php
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
var wpVersion string
|
||||||
|
scanner := bufio.NewScanner(f)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
if !strings.HasPrefix(line, "$wp_version=") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ss := strings.Split(line, "=")
|
||||||
|
if len(ss) != 2 {
|
||||||
|
return nil, fmt.Errorf("invalid wordpress version: %s", line)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: it is an example; you actually need to handle comments, etc
|
||||||
|
ss[1] = strings.TrimSpace(ss[1])
|
||||||
|
wpVersion = strings.Trim(ss[1], `";`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = scanner.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &serialize.AnalysisResult{
|
||||||
|
CustomResources: []serialize.CustomResource{
|
||||||
|
{
|
||||||
|
Type: typeWPVersion,
|
||||||
|
FilePath: filePath,
|
||||||
|
Data: wpVersion,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! tips
|
||||||
|
Trivy caches analysis results according to the module version.
|
||||||
|
We'd recommend cleaning the cache or changing the module version every time you update `Analyzer`.
|
||||||
|
|
||||||
|
|
||||||
|
#### PostScanner interface
|
||||||
|
`PostScan` is called after scanning and takes the scan result as an argument from Trivy.
|
||||||
|
In post scanning, your module can perform one of three actions:
|
||||||
|
|
||||||
|
- Insert
|
||||||
|
- Add a new security finding
|
||||||
|
- e.g. Add a new vulnerability and misconfiguration
|
||||||
|
- Update
|
||||||
|
- Update the detected vulnerability and misconfiguration
|
||||||
|
- e.g. Change a severity
|
||||||
|
- Delete
|
||||||
|
- Delete the detected vulnerability and misconfiguration
|
||||||
|
- e.g. Remove Spring4Shell because it is not actually affected.
|
||||||
|
|
||||||
|
`PostScanSpec()` returns which action the module does.
|
||||||
|
If it is `Update` or `Delete`, it also needs to return IDs such as CVE-ID and misconfiguration ID, which your module wants to update or delete.
|
||||||
|
|
||||||
|
`serialize.Results` contains the filtered results matching IDs you specified.
|
||||||
|
Also, it includes `CustomResources` with the values your `Analyze` returns, so you can modify the scan result according to the custom resources.
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (WordpressModule) PostScanSpec() serialize.PostScanSpec {
|
||||||
|
return serialize.PostScanSpec{
|
||||||
|
Action: api.ActionInsert, // Add new vulnerabilities
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (WordpressModule) PostScan(results serialize.Results) (serialize.Results, error) {
|
||||||
|
// e.g. results
|
||||||
|
// [
|
||||||
|
// {
|
||||||
|
// "Target": "",
|
||||||
|
// "Class": "custom",
|
||||||
|
// "CustomResources": [
|
||||||
|
// {
|
||||||
|
// "Type": "wordpress-version",
|
||||||
|
// "FilePath": "/usr/src/wordpress/wp-includes/version.php",
|
||||||
|
// "Layer": {
|
||||||
|
// "DiffID": "sha256:057649e61046e02c975b84557c03c6cca095b8c9accd3bd20eb4e432f7aec887"
|
||||||
|
// },
|
||||||
|
// "Data": "5.7.1"
|
||||||
|
// }
|
||||||
|
// ]
|
||||||
|
// }
|
||||||
|
// ]
|
||||||
|
var wpVersion int
|
||||||
|
for _, result := range results {
|
||||||
|
if result.Class != types.ClassCustom {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range result.CustomResources {
|
||||||
|
if c.Type != typeWPVersion {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
wpVersion = c.Data.(string)
|
||||||
|
wasm.Info(fmt.Sprintf("WordPress Version: %s", wpVersion))
|
||||||
|
|
||||||
|
...snip...
|
||||||
|
|
||||||
|
if affectedVersion.Check(ver) {
|
||||||
|
vulnerable = true
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if vulnerable {
|
||||||
|
// Add CVE-2020-36326
|
||||||
|
results = append(results, serialize.Result{
|
||||||
|
Target: wpPath,
|
||||||
|
Class: types.ClassLangPkg,
|
||||||
|
Type: "wordpress",
|
||||||
|
Vulnerabilities: []types.DetectedVulnerability {
|
||||||
|
{
|
||||||
|
VulnerabilityID: "CVE-2020-36326",
|
||||||
|
PkgName: "wordpress",
|
||||||
|
InstalledVersion: wpVersion,
|
||||||
|
FixedVersion: "5.7.2",
|
||||||
|
Vulnerability: dbTypes.Vulnerability{
|
||||||
|
Title: "PHPMailer 6.1.8 through 6.4.0 allows object injection through Phar Deserialization via addAttachment with a UNC pathname.",
|
||||||
|
Severity: "CRITICAL",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return results, nil
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The new vulnerability will be added to the scan results.
|
||||||
|
This example shows how the module inserts a new finding.
|
||||||
|
If you are interested in `Update`, you can see an example of [Spring4Shell][trivy-module-spring4shell].
|
||||||
|
|
||||||
|
In the `Delete` action, `PostScan` needs to return results you want to delete.
|
||||||
|
If `PostScan` returns an empty, Trivy will not delete anything.
|
||||||
|
|
||||||
|
#### Build
|
||||||
|
Follow [the install guide][tinygo-installation] and install TinyGo.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tinygo build -o wordpress.wasm -scheduler=none -target=wasi --no-debug wordpress.go
|
||||||
|
```
|
||||||
|
|
||||||
|
Put the built binary to the module directory that is under the home directory by default.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mkdir -p ~/.trivy/modules
|
||||||
|
$ cp spring4shell.wasm ~/.trivy/modules
|
||||||
|
```
|
||||||
|
|
||||||
|
## Distribute Your Module
|
||||||
|
You can distribute your own module in OCI registries. Please follow [the oras installation instruction][oras].
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oras push ghcr.io/aquasecurity/trivy-module-wordpress:latest wordpress.wasm:application/vnd.module.wasm.content.layer.v1+wasm
|
||||||
|
Uploading 3daa3dac086b wordpress.wasm
|
||||||
|
Pushed ghcr.io/aquasecurity/trivy-module-wordpress:latest
|
||||||
|
Digest: sha256:6416d0199d66ce52ced19f01d75454b22692ff3aa7737e45f7a189880840424f
|
||||||
|
```
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
- [Spring4Shell][trivy-module-spring4shell]
|
||||||
|
- [WordPress][trivy-module-wordpress]
|
||||||
|
|
||||||
|
[regexp]: https://github.com/google/re2/wiki/Syntax
|
||||||
|
|
||||||
|
[tinygo]: https://tinygo.org/
|
||||||
|
[spring4shell]: https://blog.aquasec.com/zero-day-rce-vulnerability-spring4shell
|
||||||
|
[wazero]: https://github.com/tetratelabs/wazero
|
||||||
|
|
||||||
|
[trivy-module-spring4shell]: https://github.com/aquasecurity/trivy/tree/main/examples/module/spring4shell
|
||||||
|
[trivy-module-wordpress]: https://github.com/aquasecurity/trivy-module-wordpress
|
||||||
|
|
||||||
|
[tinygo-installation]: https://tinygo.org/getting-started/install/
|
||||||
|
[oras]: https://oras.land/cli/
|
||||||
173
docs/docs/advanced/plugins.md
Normal 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
|
||||||
|
|
||||||
27
docs/docs/advanced/private-registries/acr.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Requirements
|
||||||
|
None, Trivy uses Azure SDK for Go. You don't need to install `az` command.
|
||||||
|
|
||||||
|
# Privileges
|
||||||
|
Service principal must have the `AcrPull` permissions.
|
||||||
|
|
||||||
|
## Creation of a service principal
|
||||||
|
```bash
|
||||||
|
export SP_DATA=$(az ad sp create-for-rbac --name TrivyTest --role AcrPull --scope "/subscriptions/<subscription_id>/resourceGroups/<resource_group>/providers/Microsoft.ContainerRegistry/registries/<registry_name>")
|
||||||
|
```
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
```bash
|
||||||
|
# must set TRIVY_USERNAME empty char
|
||||||
|
export AZURE_CLIENT_ID$(echo $SP_DATA | jq -r .appId)
|
||||||
|
export AZURE_CLIENT_SECRET$(echo $SP_DATA | jq -r .password)
|
||||||
|
export AZURE_TENANT_ID$(echo $SP_DATA | jq -r .tenant)
|
||||||
|
```
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
You can test credentials in the following manner.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -it --rm -v /tmp:/tmp\
|
||||||
|
-e AZURE_CLIENT_ID=${AZURE_CLIENT_ID} -e AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET} \
|
||||||
|
-e AZURE_TENANT_ID=${AZURE_TENANT_ID} aquasec/trivy image your_special_project.azurecr.io/your_special_image:your_special_tag
|
||||||
|
```
|
||||||
7
docs/docs/advanced/private-registries/docker-hub.md
Normal 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}
|
||||||
|
```
|
||||||
4
docs/docs/advanced/private-registries/ecr.md
Normal 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
|
||||||
40
docs/docs/advanced/private-registries/gcr.md
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# Requirements
|
||||||
|
None, Trivy uses Google Cloud SDK. You don't need to install `gcloud` command.
|
||||||
|
|
||||||
|
# Privileges
|
||||||
|
Credential file must have the `roles/storage.objectViewer` permissions.
|
||||||
|
More information can be found in [Google's documentation](https://cloud.google.com/container-registry/docs/access-control)
|
||||||
|
|
||||||
|
## JSON File Format
|
||||||
|
The JSON file specified should have the following format provided by google's service account mechanisms:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "service_account",
|
||||||
|
"project_id": "your_special_project",
|
||||||
|
"private_key_id": "XXXXXXXXXXXXXXXXXXXXxx",
|
||||||
|
"private_key": "-----BEGIN PRIVATE KEY-----\nNONONONO\n-----END PRIVATE KEY-----\n",
|
||||||
|
"client_email": "somedude@your_special_project.iam.gserviceaccount.com",
|
||||||
|
"client_id": "1234567890",
|
||||||
|
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
||||||
|
"token_uri": "https://oauth2.googleapis.com/token",
|
||||||
|
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
||||||
|
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/somedude%40your_special_project.iam.gserviceaccount.com"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
If you want to use target project's repository, you can set them via `GOOGLE_APPLICATION_CREDENTIALS`.
|
||||||
|
```bash
|
||||||
|
# must set TRIVY_USERNAME empty char
|
||||||
|
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/credential.json
|
||||||
|
```
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
You can test credentials in the following manner (assuming they are in `/tmp` on host machine).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -it --rm -v /tmp:/tmp\
|
||||||
|
-e GOOGLE_APPLICATION_CREDENTIALS=/tmp/service_account.json\
|
||||||
|
aquasec/trivy image gcr.io/your_special_project/your_special_image:your_special_tag
|
||||||
|
```
|
||||||
4
docs/docs/advanced/private-registries/index.md
Normal 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.
|
||||||
9
docs/docs/advanced/private-registries/self.md
Normal 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
|
||||||
|
```
|
||||||
93
docs/docs/index.md
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# Docs
|
||||||
|
|
||||||
|
Trivy detects two types of security issues:
|
||||||
|
|
||||||
|
- [Vulnerabilities][vuln]
|
||||||
|
- [Misconfigurations][misconf]
|
||||||
|
|
||||||
|
Trivy can scan four different artifacts:
|
||||||
|
|
||||||
|
- [Container Images][container]
|
||||||
|
- [Filesystem][filesystem] and [Rootfs][rootfs]
|
||||||
|
- [Git Repositories][repo]
|
||||||
|
- [Kubernetes][kubernetes]
|
||||||
|
|
||||||
|
Trivy can be run in two different modes:
|
||||||
|
|
||||||
|
- [Standalone][standalone]
|
||||||
|
- [Client/Server][client-server]
|
||||||
|
|
||||||
|
Trivy can be run as a Kubernetes Operator:
|
||||||
|
|
||||||
|
- [Kubernetes Operator][kubernetesoperator]
|
||||||
|
|
||||||
|
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, AlmaLinux, Rocky Linux, CBL-Mariner, 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])
|
||||||
|
- **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
|
||||||
|
- [SBOM][sbom] (Software Bill of Materials) support
|
||||||
|
- CycloneDX
|
||||||
|
- SPDX
|
||||||
|
|
||||||
|
Please see [LICENSE][license] for Trivy licensing information.
|
||||||
|
|
||||||
|
[installation]: ../getting-started/installation.md
|
||||||
|
[vuln]: ../docs/vulnerability/scanning/index.md
|
||||||
|
[misconf]: ../docs/misconfiguration/scanning.md
|
||||||
|
[kubernetesoperator]: ../docs/kubernetes/operator/index.md
|
||||||
|
[container]: ../docs/vulnerability/scanning/image.md
|
||||||
|
[rootfs]: ../docs/vulnerability/scanning/rootfs.md
|
||||||
|
[filesystem]: ../docs/vulnerability/scanning/filesystem.md
|
||||||
|
[repo]: ../docs/vulnerability/scanning/git-repository.md
|
||||||
|
[kubernetes]: ../docs/kubernetes/cli/scanning.md
|
||||||
|
|
||||||
|
[standalone]: ../docs/references/modes/standalone.md
|
||||||
|
[client-server]: ../docs/references/modes/client-server.md
|
||||||
|
[integrations]: ../docs/integrations/index.md
|
||||||
|
|
||||||
|
[os]: ../docs/vulnerability/detection/os.md
|
||||||
|
[lang]: ../docs/vulnerability/detection/language.md
|
||||||
|
|
||||||
|
[builtin]: ../docs/misconfiguration/policy/builtin.md
|
||||||
|
[quickstart]: ../getting-started/quickstart.md
|
||||||
|
[podman]: ../docs/advanced/container/podman.md
|
||||||
|
|
||||||
|
[sbom]: ../docs/sbom/index.md
|
||||||
|
|
||||||
|
[oci]: https://github.com/opencontainers/image-spec
|
||||||
|
[license]: https://github.com/aquasecurity/trivy/blob/main/LICENSE
|
||||||
4
docs/docs/integrations/aws-codepipeline.md
Normal 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/
|
||||||
29
docs/docs/integrations/aws-security-hub.md
Normal 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/
|
||||||
5
docs/docs/integrations/bitbucket.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Bitbucket Pipelines
|
||||||
|
|
||||||
|
See [trivy-pipe][trivy-pipe] for the details.
|
||||||
|
|
||||||
|
[trivy-pipe]: https://github.com/aquasecurity/trivy-pipe
|
||||||
34
docs/docs/integrations/circleci.md
Normal 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 image --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
|
||||||
9
docs/docs/integrations/github-actions.md
Normal 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
|
||||||
181
docs/docs/integrations/gitlab-ci.md
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
# GitLab CI
|
||||||
|
|
||||||
|
GitLab 15.0 includes [free](https://gitlab.com/groups/gitlab-org/-/epics/2233) integration with Trivy.
|
||||||
|
|
||||||
|
To [configure container scanning with Trivy in GitLab](https://docs.gitlab.com/ee/user/application_security/container_scanning/#configuration), simply include the CI template in your `.gitlab-ci.yml` file:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
include:
|
||||||
|
- template: Security/Container-Scanning.gitlab-ci.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're a GitLab 14.x Ultimate customer, you can use the same configuration above.
|
||||||
|
|
||||||
|
Alternatively, you can always use the example configurations below. Note that the examples use [`contrib/gitlab.tpl`](https://github.com/aquasecurity/trivy/blob/main/contrib/gitlab.tpl), which does not work with GitLab 15.0 and above (for details, see [issue 1598](https://github.com/aquasecurity/trivy/issues/1598)).
|
||||||
|
|
||||||
|
```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
|
||||||
|
TRIVY_NO_PROGRESS: "true"
|
||||||
|
TRIVY_CACHE_DIR: ".trivycache/"
|
||||||
|
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 image --exit-code 0 --format template --template "@contrib/gitlab.tpl" -o gl-container-scanning-report.json $IMAGE
|
||||||
|
# Print report
|
||||||
|
- ./trivy image --exit-code 0 --severity HIGH $IMAGE
|
||||||
|
# Fail on severe vulnerabilities
|
||||||
|
- ./trivy image --exit-code 1 --severity CRITICAL $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"
|
||||||
|
TRIVY_NO_PROGRESS: "true"
|
||||||
|
TRIVY_CACHE_DIR: ".trivycache/"
|
||||||
|
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 image --download-db-only
|
||||||
|
# Builds report and puts it in the default workdir $CI_PROJECT_DIR, so `artifacts:` can take it from there
|
||||||
|
- time trivy image --exit-code 0 --format template --template "@/contrib/gitlab.tpl"
|
||||||
|
--output "$CI_PROJECT_DIR/gl-container-scanning-report.json" "$FULL_IMAGE_NAME"
|
||||||
|
# Prints full report
|
||||||
|
- time trivy image --exit-code 0 "$FULL_IMAGE_NAME"
|
||||||
|
# Fail on critical vulnerabilities
|
||||||
|
- time trivy image --exit-code 1 --severity CRITICAL "$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
|
||||||
|
TRIVY_NO_PROGRESS: "true"
|
||||||
|
TRIVY_CACHE_DIR: ".trivycache/"
|
||||||
|
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 .
|
||||||
|
# Image report
|
||||||
|
- ./trivy image --exit-code 0 --format template --template "@contrib/gitlab-codequality.tpl" -o gl-codeclimate-image.json $IMAGE
|
||||||
|
# Filesystem report
|
||||||
|
- ./trivy filesystem --security-checks config,vuln --exit-code 0 --format template --template "@contrib/gitlab-codequality.tpl" -o gl-codeclimate-fs.json .
|
||||||
|
# Combine report
|
||||||
|
- apk update && apk add jq
|
||||||
|
- jq -s 'add' gl-codeclimate-image.json gl-codeclimate-fs.json > gl-codeclimate.json
|
||||||
|
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`.
|
||||||
|
|
||||||
|
### Gitlab CI alternative template example report
|
||||||
|
|
||||||
|
You'll be able to see a full report in the Gitlab pipeline code quality UI, where filesystem vulnerabilities and misconfigurations include links to the flagged files and image vulnerabilities report the image/os or runtime/library that the vulnerability originates from instead.
|
||||||
|
|
||||||
|

|
||||||
2
docs/docs/integrations/index.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# 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`.
|
||||||
29
docs/docs/integrations/travis-ci.md
Normal 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 image --exit-code 0 --severity HIGH --no-progress trivy-ci-test:${COMMIT}
|
||||||
|
- ./trivy image --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
|
||||||
220
docs/docs/kubernetes/cli/scanning.md
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
# Kubernetes
|
||||||
|
|
||||||
|
!!! warning "EXPERIMENTAL"
|
||||||
|
This feature might change without preserving backwards compatibility.
|
||||||
|
|
||||||
|
The Trivy K8s CLI allows you to scan your Kubernetes cluster for Vulnerabilities, Secrets and Misconfigurations. You can either run the CLI locally or integrate it into your CI/CD pipeline. The difference to the Trivy CLI is that the Trivy K8s CLI allows you to scan running workloads directly within your cluster.
|
||||||
|
|
||||||
|
If you are looking for continuous cluster audit scanning, have a look at the [Trivy K8s operator.](../operator/getting-started.md)
|
||||||
|
|
||||||
|
Trivy uses your local kubectl configuration to access the API server to list artifacts.
|
||||||
|
|
||||||
|
## CLI Commands
|
||||||
|
|
||||||
|
Scan a full cluster and generate a simple summary report:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s --report=summary cluster
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The summary report is the default. To get all of the detail the output contains, use `--report all`.
|
||||||
|
|
||||||
|
Filter by severity:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s --severity=CRITICAL --report=all cluster
|
||||||
|
```
|
||||||
|
|
||||||
|
Filter by security check (Vulnerabilties, Secrets or Misconfigurations):
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s --security-checks=secret --report=summary cluster
|
||||||
|
# or
|
||||||
|
$ trivy k8s --security-checks=config --report=summary cluster
|
||||||
|
```
|
||||||
|
|
||||||
|
Scan a specific namespace:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s -n kube-system --report=summary all
|
||||||
|
```
|
||||||
|
|
||||||
|
Scan a specific resource and get all the output:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s deployment appname
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to pass in flags before scanning specific workloads, you will have to do it before the resource name.
|
||||||
|
For example, scanning a deployment in the app namespace of your Kubernetes cluster for critical vulnerabilities would be done through the following command:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s -n app --severity=CRITICAL deployment/appname
|
||||||
|
```
|
||||||
|
This is specific to all Trivy CLI commands.
|
||||||
|
|
||||||
|
The supported formats are `table`, which is the default, and `json`.
|
||||||
|
To get a JSON output on a full cluster scan:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s --format json -o results.json cluster
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"ClusterName": "minikube",
|
||||||
|
"Vulnerabilities": [
|
||||||
|
{
|
||||||
|
"Namespace": "default",
|
||||||
|
"Kind": "Deployment",
|
||||||
|
"Name": "app",
|
||||||
|
"Results": [
|
||||||
|
{
|
||||||
|
"Target": "ubuntu:latest (ubuntu 22.04)",
|
||||||
|
"Class": "os-pkgs",
|
||||||
|
"Type": "ubuntu",
|
||||||
|
"Vulnerabilities": [
|
||||||
|
{
|
||||||
|
"VulnerabilityID": "CVE-2016-2781",
|
||||||
|
"PkgName": "coreutils",
|
||||||
|
"InstalledVersion": "8.32-4.1ubuntu1",
|
||||||
|
"Layer": {
|
||||||
|
"Digest": "sha256:125a6e411906fe6b0aaa50fc9d600bf6ff9bb11a8651727ce1ed482dc271c24c",
|
||||||
|
"DiffID": "sha256:e59fc94956120a6c7629f085027578e6357b48061d45714107e79f04a81a6f0c"
|
||||||
|
},
|
||||||
|
"SeveritySource": "ubuntu",
|
||||||
|
"PrimaryURL": "https://avd.aquasec.com/nvd/cve-2016-2781",
|
||||||
|
"DataSource": {
|
||||||
|
"ID": "ubuntu",
|
||||||
|
"Name": "Ubuntu CVE Tracker",
|
||||||
|
"URL": "https://git.launchpad.net/ubuntu-cve-tracker"
|
||||||
|
},
|
||||||
|
"Title": "coreutils: Non-privileged session can escape to the parent session in chroot",
|
||||||
|
"Description": "chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.",
|
||||||
|
"Severity": "LOW",
|
||||||
|
"CweIDs": [
|
||||||
|
"CWE-20"
|
||||||
|
],
|
||||||
|
"VendorSeverity": {
|
||||||
|
"cbl-mariner": 2,
|
||||||
|
"nvd": 2,
|
||||||
|
"redhat": 2,
|
||||||
|
"ubuntu": 1
|
||||||
|
},
|
||||||
|
"CVSS": {
|
||||||
|
"nvd": {
|
||||||
|
"V2Vector": "AV:L/AC:L/Au:N/C:N/I:P/A:N",
|
||||||
|
"V3Vector": "CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:N",
|
||||||
|
"V2Score": 2.1,
|
||||||
|
"V3Score": 6.5
|
||||||
|
},
|
||||||
|
"redhat": {
|
||||||
|
"V2Vector": "AV:L/AC:H/Au:N/C:C/I:C/A:C",
|
||||||
|
"V3Vector": "CVSS:3.0/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H",
|
||||||
|
"V2Score": 6.2,
|
||||||
|
"V3Score": 8.6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"References": [
|
||||||
|
"http://seclists.org/oss-sec/2016/q1/452",
|
||||||
|
"http://www.openwall.com/lists/oss-security/2016/02/28/2",
|
||||||
|
"http://www.openwall.com/lists/oss-security/2016/02/28/3",
|
||||||
|
"https://access.redhat.com/security/cve/CVE-2016-2781",
|
||||||
|
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-2781",
|
||||||
|
"https://lists.apache.org/thread.html/rf9fa47ab66495c78bb4120b0754dd9531ca2ff0430f6685ac9b07772@%3Cdev.mina.apache.org%3E",
|
||||||
|
"https://lore.kernel.org/patchwork/patch/793178/",
|
||||||
|
"https://nvd.nist.gov/vuln/detail/CVE-2016-2781"
|
||||||
|
],
|
||||||
|
"PublishedDate": "2017-02-07T15:59:00Z",
|
||||||
|
"LastModifiedDate": "2021-02-25T17:15:00Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Misconfigurations": [
|
||||||
|
{
|
||||||
|
"Namespace": "default",
|
||||||
|
"Kind": "Deployment",
|
||||||
|
"Name": "app",
|
||||||
|
"Results": [
|
||||||
|
{
|
||||||
|
"Target": "Deployment/app",
|
||||||
|
"Class": "config",
|
||||||
|
"Type": "kubernetes",
|
||||||
|
"MisconfSummary": {
|
||||||
|
"Successes": 20,
|
||||||
|
"Failures": 19,
|
||||||
|
"Exceptions": 0
|
||||||
|
},
|
||||||
|
"Misconfigurations": [
|
||||||
|
{
|
||||||
|
"Type": "Kubernetes Security Check",
|
||||||
|
"ID": "KSV001",
|
||||||
|
"Title": "Process can elevate its own privileges",
|
||||||
|
"Description": "A program inside the container can elevate its own privileges and run as root, which might give the program control over the container and node.",
|
||||||
|
"Message": "Container 'app' of Deployment 'app' should set 'securityContext.allowPrivilegeEscalation' to false",
|
||||||
|
"Namespace": "builtin.kubernetes.KSV001",
|
||||||
|
"Query": "data.builtin.kubernetes.KSV001.deny",
|
||||||
|
"Resolution": "Set 'set containers[].securityContext.allowPrivilegeEscalation' to 'false'.",
|
||||||
|
"Severity": "MEDIUM",
|
||||||
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/ksv001",
|
||||||
|
"References": [
|
||||||
|
"https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted",
|
||||||
|
"https://avd.aquasec.com/misconfig/ksv001"
|
||||||
|
],
|
||||||
|
"Status": "FAIL",
|
||||||
|
"Layer": {},
|
||||||
|
"IacMetadata": {
|
||||||
|
"Provider": "Kubernetes",
|
||||||
|
"Service": "general",
|
||||||
|
"StartLine": 121,
|
||||||
|
"EndLine": 133
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "Kubernetes Security Check",
|
||||||
|
"ID": "KSV003",
|
||||||
|
"Title": "Default capabilities not dropped",
|
||||||
|
"Description": "The container should drop all default capabilities and add only those that are needed for its execution.",
|
||||||
|
"Message": "Container 'app' of Deployment 'app' should add 'ALL' to 'securityContext.capabilities.drop'",
|
||||||
|
"Namespace": "builtin.kubernetes.KSV003",
|
||||||
|
"Query": "data.builtin.kubernetes.KSV003.deny",
|
||||||
|
"Resolution": "Add 'ALL' to containers[].securityContext.capabilities.drop.",
|
||||||
|
"Severity": "LOW",
|
||||||
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/ksv003",
|
||||||
|
"References": [
|
||||||
|
"https://kubesec.io/basics/containers-securitycontext-capabilities-drop-index-all/",
|
||||||
|
"https://avd.aquasec.com/misconfig/ksv003"
|
||||||
|
],
|
||||||
|
"Status": "FAIL",
|
||||||
|
"Layer": {},
|
||||||
|
"IacMetadata": {
|
||||||
|
"Provider": "Kubernetes",
|
||||||
|
"Service": "general",
|
||||||
|
"StartLine": 121,
|
||||||
|
"EndLine": 133
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Namespace": "default",
|
||||||
|
"Kind": "ConfigMap",
|
||||||
|
"Name": "kube-root-ca.crt"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
# Built-in Configuration Audit Policies
|
||||||
|
|
||||||
|
The following sections list built-in configuration audit policies installed with trivy-operator. They are stored in the
|
||||||
|
`trivy-operator-policies-config` ConfigMap created in the installation namespace (e.g. `trivy-system`). You can modify
|
||||||
|
them or add a new policy. For example, follow the [Writing Custom Configuration Audit Policies] tutorial to add a custom
|
||||||
|
policy that checks for recommended Kubernetes labels on any resource kind.
|
||||||
|
|
||||||
|
## General
|
||||||
|
|
||||||
|
| NAME | DESCRIPTION | KINDS |
|
||||||
|
|--------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|
|
||||||
|
| [CPU not limited] | Enforcing CPU limits prevents DoS via resource exhaustion. | Workload |
|
||||||
|
| [CPU requests not specified] | When containers have resource requests specified, the scheduler can make better decisions about which nodes to place pods on, and how to deal with resource contention. | Workload |
|
||||||
|
| [SYS_ADMIN capability added] | SYS_ADMIN gives the processes running inside the container privileges that are equivalent to root. | Workload |
|
||||||
|
| [Default capabilities not dropped] | The container should drop all default capabilities and add only those that are needed for its execution. | Workload |
|
||||||
|
| [Root file system is not read-only] | An immutable root file system prevents applications from writing to their local disk. This can limit intrusions, as attackers will not be able to tamper with the file system or write foreign executables to disk. | Workload |
|
||||||
|
| [Memory not limited] | Enforcing memory limits prevents DoS via resource exhaustion. | Workload |
|
||||||
|
| [Memory requests not specified] | When containers have memory requests specified, the scheduler can make better decisions about which nodes to place pods on, and how to deal with resource contention. | Workload |
|
||||||
|
| [hostPath volume mounted with docker.sock] | Mounting docker.sock from the host can give the container full root access to the host. | Workload |
|
||||||
|
| [Runs with low group ID] | Force the container to run with group ID > 10000 to avoid conflicts with the host’s user table. | Workload |
|
||||||
|
| [Runs with low user ID] | Force the container to run with user ID > 10000 to avoid conflicts with the host’s user table. | Workload |
|
||||||
|
| [Tiller Is Deployed] | Check if Helm Tiller component is deployed. | Workload |
|
||||||
|
| [Image tag ':latest' used] | It is best to avoid using the ':latest' image tag when deploying containers in production. Doing so makes it hard to track which version of the image is running, and hard to roll back the version. | Workload |
|
||||||
|
|
||||||
|
## Advanced
|
||||||
|
|
||||||
|
| NAME | DESCRIPTION | KINDS |
|
||||||
|
|----------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|---------------|
|
||||||
|
| [Unused capabilities should be dropped (drop any)] | Security best practices require containers to run with minimal required capabilities. | Workload |
|
||||||
|
| [hostAliases is set] | Managing /etc/hosts aliases can prevent the container engine from modifying the file after a pod’s containers have already been started. | Workload |
|
||||||
|
| [User Pods should not be placed in kube-system namespace] | ensure that User pods are not placed in kube-system namespace | Workload |
|
||||||
|
| [Protecting Pod service account tokens] | ensure that Pod specifications disable the secret token being mounted by setting automountServiceAccountToken: false | Workload |
|
||||||
|
| [Selector usage in network policies] | ensure that network policies selectors are applied to pods or namespaces to restricted ingress and egress traffic within the pod network | NetworkPolicy |
|
||||||
|
| [limit range usage] | ensure limit range policy has configure in order to limit resource usage for namespaces or nodes | LimitRange |
|
||||||
|
| [resource quota usage] | ensure resource quota policy has configure in order to limit aggregate resource usage within namespace | ResourceQuota |
|
||||||
|
| [All container images must start with the *.azurecr.io domain] | Containers should only use images from trusted registries. | Workload |
|
||||||
|
| [All container images must start with a GCR domain] | Containers should only use images from trusted GCR registries. | Workload |
|
||||||
|
|
||||||
|
## Pod Security Standard
|
||||||
|
|
||||||
|
### Baseline
|
||||||
|
|
||||||
|
| NAME | DESCRIPTION | KINDS |
|
||||||
|
|------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|
|
||||||
|
| [Access to host IPC namespace] | Sharing the host’s IPC namespace allows container processes to communicate with processes on the host. | Workload |
|
||||||
|
| [Access to host network] | Sharing the host’s network namespace permits processes in the pod to communicate with processes bound to the host’s loopback adapter. | Workload |
|
||||||
|
| [Access to host PID] | Sharing the host’s PID namespace allows visibility on host processes, potentially leaking information such as environment variables and configuration. | Workload |
|
||||||
|
| [Privileged container] | Privileged containers share namespaces with the host system and do not offer any security. They should be used exclusively for system containers that require high privileges. | Workload |
|
||||||
|
| [Non-default capabilities added] | Adding NET_RAW or capabilities beyond the default set must be disallowed. | Workload |
|
||||||
|
| [hostPath volumes mounted] | HostPath volumes must be forbidden. | Workload |
|
||||||
|
| [Access to host ports] | HostPorts should be disallowed, or at minimum restricted to a known list. | Workload |
|
||||||
|
| [Default AppArmor profile not set] | A program inside the container can bypass AppArmor protection policies. | Workload |
|
||||||
|
| [SELinux custom options set] | Setting a custom SELinux user or role option should be forbidden. | Workload |
|
||||||
|
| [Non-default /proc masks set] | The default /proc masks are set up to reduce attack surface, and should be required. | Workload |
|
||||||
|
| [Unsafe sysctl options set] | Sysctls can disable security mechanisms or affect all containers on a host, and should be disallowed except for an allowed 'safe' subset. A sysctl is considered safe if it is namespaced in the container or the Pod, and it is isolated from other Pods or processes on the same Node. | Workload |
|
||||||
|
|
||||||
|
### Restricted
|
||||||
|
|
||||||
|
| NAME | DESCRIPTION | KINDS |
|
||||||
|
|-------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|----------|
|
||||||
|
| [Non-ephemeral volume types used] | In addition to restricting HostPath volumes, usage of non-ephemeral volume types should be limited to those defined through PersistentVolumes. | Workload |
|
||||||
|
| [Process can elevate its own privileges] | A program inside the container can elevate its own privileges and run as root, which might give the program control over the container and node. | Workload |
|
||||||
|
| [Runs as root user] | 'runAsNonRoot' forces the running image to run as a non-root user to ensure least privileges. | Workload |
|
||||||
|
| [A root primary or supplementary GID set] | Containers should be forbidden from running with a root primary or supplementary GID. | Workload |
|
||||||
|
| [Default Seccomp profile not set] | The RuntimeDefault seccomp profile must be required, or allow specific additional profiles. | Workload |
|
||||||
|
|
||||||
|
|
||||||
|
[CPU not limited]: https://avd.aquasec.com/misconfig/kubernetes/ksv011/
|
||||||
|
[CPU requests not specified]: https://avd.aquasec.com/misconfig/kubernetes/ksv015/
|
||||||
|
[SYS_ADMIN capability added]: https://avd.aquasec.com/misconfig/kubernetes/ksv005/
|
||||||
|
[Default capabilities not dropped]: https://avd.aquasec.com/misconfig/kubernetes/ksv003/
|
||||||
|
[Root file system is not read-only]: https://avd.aquasec.com/misconfig/kubernetes/ksv014/
|
||||||
|
[Memory not limited]: https://avd.aquasec.com/misconfig/kubernetes/ksv018/
|
||||||
|
[Memory requests not specified]: https://avd.aquasec.com/misconfig/kubernetes/ksv016/
|
||||||
|
[hostPath volume mounted with docker.sock]: https://avd.aquasec.com/misconfig/kubernetes/ksv006/
|
||||||
|
[Runs with low group ID]: https://avd.aquasec.com/misconfig/kubernetes/ksv021/
|
||||||
|
[Runs with low user ID]: https://avd.aquasec.com/misconfig/kubernetes/ksv020/
|
||||||
|
[Tiller Is Deployed]: https://avd.aquasec.com/misconfig/kubernetes/ksv102/
|
||||||
|
[Image tag ':latest' used]: https://avd.aquasec.com/misconfig/kubernetes/ksv013/
|
||||||
|
|
||||||
|
[Unused capabilities should be dropped (drop any)]: https://avd.aquasec.com/misconfig/kubernetes/ksv004/
|
||||||
|
[hostAliases is set]: https://avd.aquasec.com/misconfig/kubernetes/ksv007/
|
||||||
|
[User Pods should not be placed in kube-system namespace]: https://avd.aquasec.com/misconfig/kubernetes/ksv037/
|
||||||
|
[Protecting Pod service account tokens]: https://avd.aquasec.com/misconfig/kubernetes/ksv036/
|
||||||
|
[Selector usage in network policies]: https://avd.aquasec.com/misconfig/kubernetes/ksv038/
|
||||||
|
[limit range usage]: https://avd.aquasec.com/misconfig/kubernetes/ksv039/
|
||||||
|
[resource quota usage]: https://avd.aquasec.com/misconfig/kubernetes/ksv040/
|
||||||
|
[All container images must start with the *.azurecr.io domain]: https://avd.aquasec.com/misconfig/kubernetes/ksv032/
|
||||||
|
[All container images must start with a GCR domain]: https://avd.aquasec.com/misconfig/kubernetes/ksv033/
|
||||||
|
|
||||||
|
[Access to host IPC namespace]: https://avd.aquasec.com/misconfig/kubernetes/ksv008/
|
||||||
|
[Access to host network]: https://avd.aquasec.com/misconfig/kubernetes/ksv009/
|
||||||
|
[Access to host PID]: https://avd.aquasec.com/misconfig/kubernetes/ksv010/
|
||||||
|
[Privileged container]: https://avd.aquasec.com/misconfig/kubernetes/ksv017/
|
||||||
|
[Non-default capabilities added]: https://avd.aquasec.com/misconfig/kubernetes/ksv022/
|
||||||
|
[hostPath volumes mounted]: https://avd.aquasec.com/misconfig/kubernetes/ksv023/
|
||||||
|
[Access to host ports]: https://avd.aquasec.com/misconfig/kubernetes/ksv024/
|
||||||
|
[Default AppArmor profile not set]: https://avd.aquasec.com/misconfig/kubernetes/ksv002/
|
||||||
|
[SELinux custom options set]: https://avd.aquasec.com/misconfig/kubernetes/ksv025/
|
||||||
|
[Non-default /proc masks set]: https://avd.aquasec.com/misconfig/kubernetes/ksv027/
|
||||||
|
[Unsafe sysctl options set]: https://avd.aquasec.com/misconfig/kubernetes/ksv026/
|
||||||
|
|
||||||
|
[Non-ephemeral volume types used]: https://avd.aquasec.com/misconfig/kubernetes/ksv028/
|
||||||
|
[Process can elevate its own privileges]: https://avd.aquasec.com/misconfig/kubernetes/ksv001/
|
||||||
|
[Runs as root user]: https://avd.aquasec.com/misconfig/kubernetes/ksv012/
|
||||||
|
[A root primary or supplementary GID set]: https://avd.aquasec.com/misconfig/kubernetes/ksv029/
|
||||||
|
[Default Seccomp profile not set]: https://avd.aquasec.com/misconfig/kubernetes/ksv030/
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Configuration Auditing
|
||||||
|
|
||||||
|
As your organization deploys containerized workloads in Kubernetes environments, you will be faced with many
|
||||||
|
configuration choices related to images, containers, control plane, and data plane. Setting these configurations
|
||||||
|
improperly creates a high-impact security and compliance risk. DevOps, and platform owners need the ability to
|
||||||
|
continuously assess build artifacts, workloads, and infrastructure against configuration hardening standards to
|
||||||
|
remediate any violations.
|
||||||
|
|
||||||
|
trivy-operator configuration audit capabilities are purpose-built for Kubernetes environments. In particular, trivy
|
||||||
|
Operator continuously checks images, workloads, and Kubernetes infrastructure components against common configurations
|
||||||
|
security standards and generates detailed assessment reports, which are then stored in the default Kubernetes database.
|
||||||
|
|
||||||
|
Kubernetes applications and other core configuration objects, such as Ingress, NetworkPolicy and ResourceQuota resources, are evaluated against [Built-in Policies].
|
||||||
|
Additionally, application and infrastructure owners can integrate these reports into incident response workflows for
|
||||||
|
active remediation.
|
||||||
|
|
||||||
|
[Built-in Policies]: ./built-in-policies.md
|
||||||
|
|
||||||
100
docs/docs/kubernetes/operator/configuration.md
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# Configuration
|
||||||
|
|
||||||
|
You can configure Trivy-Operator to control it's behavior and adapt it to your needs. Aspects of the operator machinery are configured using environment variables on the operator Pod, while aspects of the scanning behavior are controlled by ConfigMaps and Secrets.
|
||||||
|
|
||||||
|
# Operator Configuration
|
||||||
|
|
||||||
|
| NAME| DEFAULT| DESCRIPTION|
|
||||||
|
|---|---|---|
|
||||||
|
| `OPERATOR_NAMESPACE`| N/A| See [Install modes](#install-modes)|
|
||||||
|
| `OPERATOR_TARGET_NAMESPACES`| N/A| See [Install modes](#install-modes)|
|
||||||
|
| `OPERATOR_EXCLUDE_NAMESPACES`| N/A| A comma separated list of namespaces (or glob patterns) to be excluded from scanning in all namespaces [Install mode](#install-modes).|
|
||||||
|
| `OPERATOR_SERVICE_ACCOUNT`| `trivy-operator`| The name of the service account assigned to the operator's pod|
|
||||||
|
| `OPERATOR_LOG_DEV_MODE`| `false`| The flag to use (or not use) development mode (more human-readable output, extra stack traces and logging information, etc).|
|
||||||
|
| `OPERATOR_SCAN_JOB_TIMEOUT`| `5m`| The length of time to wait before giving up on a scan job|
|
||||||
|
| `OPERATOR_CONCURRENT_SCAN_JOBS_LIMIT`| `10`| The maximum number of scan jobs create by the operator|
|
||||||
|
| `OPERATOR_SCAN_JOB_RETRY_AFTER`| `30s`| The duration to wait before retrying a failed scan job|
|
||||||
|
| `OPERATOR_BATCH_DELETE_LIMIT`| `10`| The maximum number of config audit reports deleted by the operator when the plugin's config has changed.|
|
||||||
|
| `OPERATOR_BATCH_DELETE_DELAY`| `10s`| The duration to wait before deleting another batch of config audit reports.|
|
||||||
|
| `OPERATOR_METRICS_BIND_ADDRESS`| `:8080`| The TCP address to bind to for serving [Prometheus][prometheus] metrics. It can be set to `0` to disable the metrics serving.|
|
||||||
|
| `OPERATOR_HEALTH_PROBE_BIND_ADDRESS`| `:9090`| The TCP address to bind to for serving health probes, i.e. `/healthz/` and `/readyz/` endpoints.|
|
||||||
|
| `OPERATOR_VULNERABILITY_SCANNER_ENABLED`| `true`| The flag to enable vulnerability scanner|
|
||||||
|
| `OPERATOR_CONFIG_AUDIT_SCANNER_ENABLED`| `false`| The flag to enable configuration audit scanner|
|
||||||
|
| `OPERATOR_CONFIG_AUDIT_SCANNER_SCAN_ONLY_CURRENT_REVISIONS`| `false`| The flag to enable config audit scanner to only scan the current revision of a deployment|
|
||||||
|
| `OPERATOR_CONFIG_AUDIT_SCANNER_BUILTIN`| `true`| The flag to enable built-in configuration audit scanner|
|
||||||
|
| `OPERATOR_VULNERABILITY_SCANNER_SCAN_ONLY_CURRENT_REVISIONS`| `false`| The flag to enable vulnerability scanner to only scan the current revision of a deployment|
|
||||||
|
| `OPERATOR_VULNERABILITY_SCANNER_REPORT_TTL`| `""`| The flag to set how long a vulnerability report should exist. When a old report is deleted a new one will be created by the controller. It can be set to `""` to disabled the TTL for vulnerability scanner. |
|
||||||
|
| `OPERATOR_LEADER_ELECTION_ENABLED`| `false`| The flag to enable operator replica leader election|
|
||||||
|
| `OPERATOR_LEADER_ELECTION_ID`| `trivy-operator-lock`| The name of the resource lock for leader election|
|
||||||
|
|
||||||
|
The values of the `OPERATOR_NAMESPACE` and `OPERATOR_TARGET_NAMESPACES` determine the install mode, which in turn determines the multitenancy support of the operator.
|
||||||
|
|
||||||
|
| MODE| OPERATOR_NAMESPACE | OPERATOR_TARGET_NAMESPACES | DESCRIPTION|
|
||||||
|
|---|---|---|---|
|
||||||
|
| OwnNamespace| `operators`| `operators`| The operator can be configured to watch events in the namespace it is deployed in. |
|
||||||
|
| SingleNamespace| `operators`| `foo`| The operator can be configured to watch for events in a single namespace that the operator is not deployed in. |
|
||||||
|
| MultiNamespace| `operators`| `foo,bar,baz`| The operator can be configured to watch for events in more than one namespace. |
|
||||||
|
| AllNamespaces| `operators`| (blank string)| The operator can be configured to watch for events in all namespaces.|
|
||||||
|
|
||||||
|
## Example - configure namespaces to scan
|
||||||
|
|
||||||
|
To change the target namespace from all namespaces to the `default` namespace edit the `trivy-operator` Deployment and change the value of the `OPERATOR_TARGET_NAMESPACES` environment variable from the blank string (`""`) to the `default` value.
|
||||||
|
|
||||||
|
# Scanning configuration
|
||||||
|
|
||||||
|
| CONFIGMAP KEY| DEFAULT| DESCRIPTION|
|
||||||
|
|---|---|---|
|
||||||
|
| `vulnerabilityReports.scanner`| `Trivy`| The name of the plugin that generates vulnerability reports. Either `Trivy` or `Aqua`.|
|
||||||
|
| `vulnerabilityReports.scanJobsInSameNamespace` | `"false"`| Whether to run vulnerability scan jobs in same namespace of workload. Set `"true"` to enable.|
|
||||||
|
| `scanJob.tolerations`| N/A| JSON representation of the [tolerations] to be applied to the scanner pods so that they can run on nodes with matching taints. Example: `'[{"key":"key1", "operator":"Equal", "value":"value1", "effect":"NoSchedule"}]'`|
|
||||||
|
| `scanJob.annotations`| N/A| One-line comma-separated representation of the annotations which the user wants the scanner pods to be annotated with. Example: `foo=bar,env=stage` will annotate the scanner pods with the annotations `foo: bar` and `env: stage` |
|
||||||
|
| `scanJob.templateLabel`| N/A| One-line comma-separated representation of the template labels which the user wants the scanner pods to be labeled with. Example: `foo=bar,env=stage` will labeled the scanner pods with the labels `foo: bar` and `env: stage`|
|
||||||
|
|
||||||
|
## Example - patch ConfigMap
|
||||||
|
|
||||||
|
By default Trivy displays vulnerabilities with all severity levels (`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`). To display only `HIGH` and `CRITICAL` vulnerabilities by patching the `trivy.severity` value in the `trivy-operator-trivy-config` ConfigMap:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl patch cm trivy-operator-trivy-config -n trivy-operator \
|
||||||
|
--type merge \
|
||||||
|
-p "$(cat <<EOF
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"trivy.severity": "HIGH,CRITICAL"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
)"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example - patch Secret
|
||||||
|
|
||||||
|
To set the GitHub token used by Trivy scanner add the `trivy.githubToken` value to the `trivy-operator-trivy-config` Secret:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl patch secret trivy-operator-trivy-config -n trivy-operator \
|
||||||
|
--type merge \
|
||||||
|
-p "$(cat <<EOF
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"trivy.githubToken": "$(echo -n <your token> | base64)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
)"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example - delete a key
|
||||||
|
|
||||||
|
The following `kubectl patch` command deletes the `trivy.httpProxy` key:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl patch cm trivy-operator-trivy-config -n trivy-operator \
|
||||||
|
--type json \
|
||||||
|
-p '[{"op": "remove", "path": "/data/trivy.httpProxy"}]'
|
||||||
|
```
|
||||||
|
|
||||||
|
[tolerations]: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration
|
||||||
|
|
||||||
|
|
||||||
|
[prometheus]: https://github.com/prometheus
|
||||||
195
docs/docs/kubernetes/operator/getting-started.md
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
# Getting Started
|
||||||
|
|
||||||
|
## Before you Begin
|
||||||
|
|
||||||
|
You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your
|
||||||
|
cluster. If you do not already have a cluster, you can create one by installing [minikube], [kind] or [microk8s], or you can use the following [Kubernetes playground].
|
||||||
|
|
||||||
|
You also need the Trivy-Operator to be installed in the `trivy-system` namespace, e.g. with
|
||||||
|
[kubectl](./installation/kubectl.md) or [Helm](./installation/helm.md). Let's also assume that the operator is
|
||||||
|
configured to discover built-in Kubernetes resources in all namespaces, except `kube-system` and `trivy-system`.
|
||||||
|
|
||||||
|
## Workloads Scanning
|
||||||
|
|
||||||
|
Let's create the `nginx` Deployment that we know is vulnerable:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl create deployment nginx --image nginx:1.16
|
||||||
|
```
|
||||||
|
|
||||||
|
When the `nginx` Deployment is created, the operator immediately detects its current revision (aka active ReplicaSet)
|
||||||
|
and scans the `nginx:1.16` image for vulnerabilities. It also audits the ReplicaSet's specification for common pitfalls
|
||||||
|
such as running the `nginx` container as root.
|
||||||
|
|
||||||
|
If everything goes fine, the operator saves scan reports as VulnerabilityReport and ConfigAuditReport resources in the
|
||||||
|
`default` namespace. Reports are named after the scanned ReplicaSet. For image vulnerability scans, the operator creates
|
||||||
|
a VulnerabilityReport for each different container. In this example there is just one container image called `nginx`:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl get vulnerabilityreports -o wide
|
||||||
|
```
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
NAME REPOSITORY TAG SCANNER AGE CRITICAL HIGH MEDIUM LOW UNKNOWN
|
||||||
|
replicaset-nginx-78449c65d4-nginx library/nginx 1.16 Trivy 85s 33 62 49 114 1
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl get configauditreports -o wide
|
||||||
|
```
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
NAME SCANNER AGE CRITICAL HIGH MEDIUM LOW
|
||||||
|
replicaset-nginx-78449c65d4 Trivy-Operator 2m7s 0 0 6 7
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
Notice that scan reports generated by the operator are controlled by Kubernetes workloads. In our example,
|
||||||
|
VulnerabilityReport and ConfigAuditReport resources are controlled by the active ReplicaSet of the `nginx` Deployment:
|
||||||
|
|
||||||
|
```console
|
||||||
|
kubectl tree deploy nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
NAMESPACE NAME READY REASON AGE
|
||||||
|
default Deployment/nginx - 7h2m
|
||||||
|
default └─ReplicaSet/nginx-78449c65d4 - 7h2m
|
||||||
|
default ├─ConfigAuditReport/replicaset-nginx-78449c65d4 - 2m31s
|
||||||
|
default ├─Pod/nginx-78449c65d4-5wvdx True 7h2m
|
||||||
|
default └─VulnerabilityReport/replicaset-nginx-78449c65d4-nginx - 2m7s
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
The [tree] command is a kubectl plugin to browse Kubernetes object hierarchies as a tree.
|
||||||
|
|
||||||
|
Moving forward, let's update the container image of the `nginx` Deployment from `nginx:1.16` to `nginx:1.17`. This will
|
||||||
|
trigger a rolling update of the Deployment and eventually create another ReplicaSet.
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl set image deployment nginx nginx=nginx:1.17
|
||||||
|
```
|
||||||
|
|
||||||
|
Even this time the operator will pick up changes and rescan our Deployment with updated configuration:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl tree deploy nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
NAMESPACE NAME READY REASON AGE
|
||||||
|
default Deployment/nginx - 7h5m
|
||||||
|
default ├─ReplicaSet/nginx-5fbc65fff - 2m36s
|
||||||
|
default │ ├─ConfigAuditReport/replicaset-nginx-5fbc65fff - 2m36s
|
||||||
|
default │ ├─Pod/nginx-5fbc65fff-j7zl2 True 2m36s
|
||||||
|
default │ └─VulnerabilityReport/replicaset-nginx-5fbc65fff-nginx - 2m22s
|
||||||
|
default └─ReplicaSet/nginx-78449c65d4 - 7h5m
|
||||||
|
default ├─ConfigAuditReport/replicaset-nginx-78449c65d4 - 5m46s
|
||||||
|
default └─VulnerabilityReport/replicaset-nginx-78449c65d4-nginx - 5m22s
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
By following this guide you could realize that the operator knows how to attach VulnerabilityReport and
|
||||||
|
ConfigAuditReport resources to build-in Kubernetes objects. What's more, in this approach where a custom resource
|
||||||
|
inherits a life cycle of the built-in resource we could leverage Kubernetes garbage collection. For example, when the
|
||||||
|
previous ReplicaSet named `nginx-78449c65d4` is deleted the VulnerabilityReport named `replicaset-nginx-78449c65d4-nginx`
|
||||||
|
as well as the ConfigAuditReport named `replicaset-nginx-78449c65d46` are automatically garbage collected.
|
||||||
|
|
||||||
|
!!! tip
|
||||||
|
If you only want the latest ReplicaSet in your Deployment to be scanned for vulnerabilities, you can set the value
|
||||||
|
of the `OPERATOR_VULNERABILITY_SCANNER_SCAN_ONLY_CURRENT_REVISIONS` environment variable to `true` in the operator's
|
||||||
|
deployment descriptor. This is useful to identify vulnerabilities that impact only the running workloads.
|
||||||
|
|
||||||
|
!!! tip
|
||||||
|
If you only want the latest ReplicaSet in your Deployment to be scanned for config audit, you can set the value
|
||||||
|
of the `OPERATOR_CONFIG_AUDIT_SCANNER_SCAN_ONLY_CURRENT_REVISIONS` environment variable to `true` in the operator's
|
||||||
|
deployment descriptor. This is useful to identify config issues that impact only the running workloads.
|
||||||
|
|
||||||
|
!!! tip
|
||||||
|
You can get and describe `vulnerabilityreports` and `configauditreports` as built-in Kubernetes objects:
|
||||||
|
```
|
||||||
|
kubectl get vulnerabilityreport replicaset-nginx-5fbc65fff-nginx -o json
|
||||||
|
kubectl describe configauditreport replicaset-nginx-5fbc65fff
|
||||||
|
```
|
||||||
|
|
||||||
|
Notice that scaling up the `nginx` Deployment will not schedule new scans because all replica Pods refer to the same Pod
|
||||||
|
template defined by the `nginx-5fbc65fff` ReplicaSet.
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl scale deploy nginx --replicas 3
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl tree deploy nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
NAMESPACE NAME READY REASON AGE
|
||||||
|
default Deployment/nginx - 7h6m
|
||||||
|
default ├─ReplicaSet/nginx-5fbc65fff - 4m7s
|
||||||
|
default │ ├─ConfigAuditReport/replicaset-nginx-5fbc65fff - 4m7s
|
||||||
|
default │ ├─Pod/nginx-5fbc65fff-458n7 True 8s
|
||||||
|
default │ ├─Pod/nginx-5fbc65fff-fk847 True 8s
|
||||||
|
default │ ├─Pod/nginx-5fbc65fff-j7zl2 True 4m7s
|
||||||
|
default │ └─VulnerabilityReport/replicaset-nginx-5fbc65fff-nginx - 3m53s
|
||||||
|
default └─ReplicaSet/nginx-78449c65d4 - 7h6m
|
||||||
|
default ├─ConfigAuditReport/replicaset-nginx-78449c65d4 - 7m17s
|
||||||
|
default └─VulnerabilityReport/replicaset-nginx-78449c65d4-nginx - 6m53s
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
Finally, when you delete the `nginx` Deployment, orphaned security reports will be deleted in the background by the
|
||||||
|
Kubernetes garbage collection controller.
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl delete deploy nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
```console
|
||||||
|
kubectl get vuln,configaudit
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
No resources found in default namespace.
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
!!! Tip
|
||||||
|
Use `vuln` and `configaudit` as short names for `vulnerabilityreports` and `configauditreports` resources.
|
||||||
|
|
||||||
|
!!! Note
|
||||||
|
You can define the validity period for VulnerabilityReports by setting the duration as the value of the
|
||||||
|
`OPERATOR_VULNERABILITY_SCANNER_REPORT_TTL` environment variable. For example, setting the value to `24h`
|
||||||
|
would delete reports after 24 hours. When a VulnerabilityReport gets deleted Trivy-Operator will automatically
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## What's Next?
|
||||||
|
|
||||||
|
- Find out how the operator scans workloads that use container images from [Private Registries].
|
||||||
|
- By default, the operator uses Trivy as [Vulnerability Scanner] and Polaris as [Configuration Checker], but you can
|
||||||
|
choose other tools that are integrated with Trivy-Operator or even implement you own plugin.
|
||||||
|
|
||||||
|
[minikube]: https://minikube.sigs.k8s.io/docs/
|
||||||
|
[kind]: https://kind.sigs.k8s.io/docs/
|
||||||
|
[microk8s]: https://microk8s.io/
|
||||||
|
[Kubernetes playground]: http://labs.play-with-k8s.com/
|
||||||
|
[tree]: https://github.com/ahmetb/kubectl-tree
|
||||||
|
After Width: | Height: | Size: 1.6 MiB |
BIN
docs/docs/kubernetes/operator/images/design/trivy-standalone.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 361 KiB |
|
After Width: | Height: | Size: 325 KiB |
|
After Width: | Height: | Size: 368 KiB |
|
After Width: | Height: | Size: 249 KiB |
|
After Width: | Height: | Size: 529 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22"><path d="M19.90856,11.37359l-.94046,1.16318.04433.42088a.66075.66075,0,0,1,.00653.25385l-.00778.04071a.66193.66193,0,0,1-.08906.21314c-.01313.01986-.027.03932-.0384.0537l-4.57928,5.69351a.70189.70189,0,0,1-.53066.25266l-7.34439-.00171a.70458.70458,0,0,1-.52974-.25154L1.32209,13.51754a.64957.64957,0,0,1-.096-.16658.71032.71032,0,0,1-.02863-.08952.66205.66205,0,0,1-.00515-.30511l1.6348-7.10077a.66883.66883,0,0,1,.1355-.274.65915.65915,0,0,1,.22568-.17666L9.80881,2.24386a.69063.69063,0,0,1,.29475-.0667l.00515.0002.03424.00112a.68668.68668,0,0,1,.25649.06544l6.61569,3.161a.66765.66765,0,0,1,.21678.165.675.675,0,0,1,.14909.29139l.60521,2.64815,1.1606-.20569-.61853-2.70614a1.85372,1.85372,0,0,0-1.00544-1.25474l-6.616-3.16113a1.84812,1.84812,0,0,0-.67883-.17726l-.03061-.00218c-.02692-.00125-.05416-.00152-.05851-.00152L10.10146,1a1.87317,1.87317,0,0,0-.80022.18175l-6.62038,3.161a1.83083,1.83083,0,0,0-.62572.48916,1.84956,1.84956,0,0,0-.37523.75964L.04518,12.69226a1.84474,1.84474,0,0,0,.00956.8516,1.88289,1.88289,0,0,0,.07772.24244,1.826,1.826,0,0,0,.27219.46878L4.98281,19.9503a1.8815,1.8815,0,0,0,1.4473.6903l7.34394.00172a1.87874,1.87874,0,0,0,1.4475-.69182l4.58278-5.698c.03609-.04578.07026-.093.10252-.14243a1.82018,1.82018,0,0,0,.25207-.59695c.00805-.03517.01484-.07079.021-.10773a1.8273,1.8273,0,0,0-.02032-.71135Z" style="fill:#fff"/><polygon points="9.436 4.863 9.332 11.183 12.92 10.115 9.436 4.863" style="fill:#fff"/><polygon points="7.913 11.605 8.265 11.5 8.617 11.395 8.629 11.392 8.74 4.605 8.753 3.838 8.384 4.915 8.015 5.994 5.964 11.986 6.684 11.971 7.913 11.605" style="fill:#fff"/><polygon points="5.738 13.279 5.888 12.956 6.014 12.685 5.723 12.691 5.352 12.699 5.06 12.705 1.918 12.771 4.498 15.952 5.588 13.603 5.738 13.279" style="fill:#fff"/><polygon points="14.026 10.516 13.675 10.621 13.324 10.725 9.32 11.917 8.969 12.021 8.617 12.126 8.604 12.13 8.252 12.235 7.9 12.339 7.593 12.431 7.894 12.688 8.238 12.982 8.583 13.277 8.598 13.289 8.943 13.584 9.288 13.879 9.61 14.154 9.896 14.398 10.183 14.643 14.064 17.958 22 8.143 14.026 10.516" style="fill:#fff"/><polygon points="9.273 14.787 9.229 14.749 8.943 14.505 8.928 14.492 8.583 14.197 8.567 14.183 8.222 13.889 7.877 13.594 7.362 13.154 7.086 12.919 6.81 12.683 6.794 12.669 6.641 12.998 6.488 13.328 6.468 13.371 6.318 13.694 6.168 14.017 4.989 16.557 4.989 16.558 4.99 16.558 4.992 16.559 5.341 16.638 5.691 16.716 12.164 18.175 12.895 18.339 13.625 18.504 9.516 14.994 9.273 14.787" style="fill:#fff"/></svg>
|
||||||
|
After Width: | Height: | Size: 2.5 KiB |
BIN
docs/docs/kubernetes/operator/images/trivy-operator-logo.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 56 KiB |
15
docs/docs/kubernetes/operator/index.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Trivy Operator
|
||||||
|
|
||||||
|
Trivy has a native [Kubernetes Operator](operator) which continuously scans your Kubernetes cluster for security issues, and generates security reports as Kubernetes [Custom Resources](crd). It does it by watching Kubernetes for state changes and automatically triggering scans in response to changes, for example initiating a vulnerability scan when a new Pod is created.
|
||||||
|
|
||||||
|
> Trivy Operator is based on existing Aqua OSS project - [Starboard], and shares some of the design, principles and code with it. Existing content that relates to Starboard Operator might also be relevant for Trivy Operator. To learn more about the transition from Starboard from Trivy, see the [announcement discussion](starboard-announcement).
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<img src="./images/operator/trivy-operator-workloads.png" />
|
||||||
|
<figcaption>Workload reconcilers discover K8s controllers, manage scan jobs, and create VulnerabilityReport and ConfigAuditReport objects.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
[operator]: https://kubernetes.io/docs/concepts/extend-kubernetes/operator/
|
||||||
|
[crd]: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
|
||||||
|
[Starboard]: https://github.com/aquasecurity/starboard
|
||||||
|
[starboard-announcement]: https://github.com/aquasecurity/starboard/discussions/1173
|
||||||
90
docs/docs/kubernetes/operator/installation/helm.md
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# Helm
|
||||||
|
|
||||||
|
[Helm], which is a popular package manager for Kubernetes, allows installing applications from parameterized
|
||||||
|
YAML manifests called Helm [charts].
|
||||||
|
|
||||||
|
The Helm chart is available on GitHub in [https://github.com/aquasecurity/trivy-operator](https://github.com/aquasecurity/trivy-operator) under `/deploy/helm` and is also hosted in a Chart repository for your convenience under [https://aquasecurity.github.io/helm-charts/](https://aquasecurity.github.io/helm-charts/).
|
||||||
|
|
||||||
|
## Example - Chart repository
|
||||||
|
|
||||||
|
This will install the operator in the `trivy-system` namespace and configure it to scan all namespaces, except `kube-system` and `trivy-system`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add aqua https://aquasecurity.github.io/helm-charts/
|
||||||
|
helm repo update
|
||||||
|
helm install trivy-operator aqua/trivy-operator \
|
||||||
|
--namespace trivy-system \
|
||||||
|
--create-namespace \
|
||||||
|
--set="trivy.ignoreUnfixed=true" \
|
||||||
|
--version {{ var.operator_version }}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example - Download the chart
|
||||||
|
|
||||||
|
This will install the operator in the `trivy-system` namespace and configure it to scan all namespaces, except `kube-system` and `trivy-system`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone --depth 1 --branch {{ var.operator_version }} https://github.com/aquasecurity/trivy-operator.git
|
||||||
|
cd trivy-operator
|
||||||
|
helm install trivy-operator ./deploy/helm \
|
||||||
|
--namespace trivy-system \
|
||||||
|
--create-namespace \
|
||||||
|
--set="trivy.ignoreUnfixed=true"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Post install sanity check
|
||||||
|
|
||||||
|
Check that the `trivy-operator` Helm release is created in the `trivy-system` namespace, and it has status `deployed`:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ helm list -n trivy-system
|
||||||
|
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
|
||||||
|
trivy-operator trivy-system 1 2021-01-27 20:09:53.158961 +0100 CET deployed trivy-operator-{{ var.operator_version }} {{ var.operator_version[1:] }}
|
||||||
|
```
|
||||||
|
|
||||||
|
To confirm that the operator is running, check that the `trivy-operator` Deployment in the `trivy-system`
|
||||||
|
namespace is available and all its containers are ready:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ kubectl get deployment -n trivy-system
|
||||||
|
NAME READY UP-TO-DATE AVAILABLE AGE
|
||||||
|
trivy-operator 1/1 1 1 11m
|
||||||
|
```
|
||||||
|
|
||||||
|
If for some reason it's not ready yet, check the logs of the Deployment for errors:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl logs deployment/trivy-operator -n trivy-system
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Configuration
|
||||||
|
|
||||||
|
The Helm chart supports all available [installation modes](./../configuration.md#install-modes) of Trivy Operator.
|
||||||
|
|
||||||
|
Please refer to the chart's [values] file for configuration options.
|
||||||
|
|
||||||
|
## Uninstall
|
||||||
|
|
||||||
|
You can uninstall the operator with the following command:
|
||||||
|
|
||||||
|
```
|
||||||
|
helm uninstall trivy-operator -n trivy-system
|
||||||
|
```
|
||||||
|
|
||||||
|
You have to manually delete custom resource definitions created by the `helm install` command:
|
||||||
|
|
||||||
|
!!! danger
|
||||||
|
Deleting custom resource definitions will also delete all security reports generated by the operator.
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl delete crd vulnerabilityreports.aquasecurity.github.io
|
||||||
|
kubectl delete crd clustervulnerabilityreports.aquasecurity.github.io
|
||||||
|
kubectl delete crd configauditreports.aquasecurity.github.io
|
||||||
|
kubectl delete crd clusterconfigauditreports.aquasecurity.github.io
|
||||||
|
kubectl delete crd clustercompliancereports.aquasecurity.github.io
|
||||||
|
kubectl delete crd clustercompliancedetailreports.aquasecurity.github.io
|
||||||
|
```
|
||||||
|
|
||||||
|
[Helm]: https://helm.sh/
|
||||||
|
[charts]: https://helm.sh/docs/topics/charts/
|
||||||
|
[values]: https://raw.githubusercontent.com/aquasecurity/trivy-operator/{{ var.operator_version }}/deploy/helm/values.yaml
|
||||||
45
docs/docs/kubernetes/operator/installation/kubectl.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# kubectl
|
||||||
|
|
||||||
|
Kubernetes Yaml deployment files are available on GitHub in [https://github.com/aquasecurity/trivy-operator](https://github.com/aquasecurity/trivy-operator) under `/deploy/static`.
|
||||||
|
|
||||||
|
## Example - Deploy from GitHub
|
||||||
|
|
||||||
|
This will install the operator in the `trivy-system` namespace and configure it to scan all namespaces, except `kube-system` and `trivy-system`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/trivy-operator/{{ var.operator_version }}/deploy/static/trivy-operator.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
To confirm that the operator is running, check that the `trivy-operator` Deployment in the `trivy-system`
|
||||||
|
namespace is available and all its containers are ready:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment -n trivy-system
|
||||||
|
NAME READY UP-TO-DATE AVAILABLE AGE
|
||||||
|
trivy-operator 1/1 1 1 11m
|
||||||
|
```
|
||||||
|
|
||||||
|
If for some reason it's not ready yet, check the logs of the `trivy-operator` Deployment for errors:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl logs deployment/trivy-operator -n trivy-system
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Configuration
|
||||||
|
|
||||||
|
You can configure Trivy-Operator to control it's behavior and adapt it to your needs. Aspects of the operator machinery are configured using environment variables on the operator Pod, while aspects of the scanning behavior are controlled by ConfigMaps and Secrets.
|
||||||
|
To learn more, please refer to the [Configuration](config) documentation.
|
||||||
|
|
||||||
|
## Uninstall
|
||||||
|
|
||||||
|
!!! danger
|
||||||
|
Uninstalling the operator and deleting custom resource definitions will also delete all generated security reports.
|
||||||
|
|
||||||
|
You can uninstall the operator with the following command:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl delete -f https://raw.githubusercontent.com/aquasecurity/trivy-operator/{{ var.operator_version }}/deploy/static/trivy-operator.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
[Settings]: ./../../settings.md
|
||||||
|
[Helm]: ./helm.md
|
||||||
10
docs/docs/kubernetes/operator/installation/upgrade.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Upgrade
|
||||||
|
|
||||||
|
We recommend that you upgrade Trivy Operator often to stay up to date with the latest fixes and enhancements.
|
||||||
|
|
||||||
|
However, at this stage we do not provide automated upgrades. Therefore, uninstall the previous version of the operator
|
||||||
|
before you install the latest release.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Consult release notes and changelog to revisit and migrate configuration settings which may not be compatible
|
||||||
|
between different versions.
|
||||||