เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹

เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹
เชนเซ‡ เชนเชฌเชฐ!

เช†เชœเชจเซ€ เชตเชพเชธเซเชคเชตเชฟเช•เชคเชพเชฎเชพเช‚, เชตเชฟเช•เชพเชธ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชฎเชพเช‚ เช•เชจเซเชŸเซ‡เชจเชฐเชพเช‡เชเซ‡เชถเชจเชจเซ€ เชตเชงเชคเซ€ เชœเชคเซ€ เชญเซ‚เชฎเชฟเช•เชพเชจเซ‡ เช•เชพเชฐเชฃเซ‡, เช•เชจเซเชŸเซ‡เชจเชฐ เชธเชพเชฅเซ‡ เชธเช‚เช•เชณเชพเชฏเซ‡เชฒเชพ เชตเชฟเชตเชฟเชง เชคเชฌเช•เซเช•เชพเช“ เช…เชจเซ‡ เชธเช‚เชธเซเชฅเชพเช“เชจเซ€ เชธเซเชฐเช•เซเชทเชพ เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เชฎเซเชฆเซเชฆเซ‹ เช›เซ‡เชฒเซเชฒเชพ เชธเซเชฅเชพเชจเซ‡ เชจเชฅเซ€. เชœเชพเชคเซ‡ เชคเชชเชพเชธ เช•เชฐเชตเซ€ เช เชเช• เช•เชชเชฐเซเช‚ เช•เชพเชฐเซเชฏ เช›เซ‡, เชคเซ‡เชฅเซ€ เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชชเช—เชฒเชพเช‚ เชฒเซ‡เชตเชพเชจเซเช‚ เชธเชฐเชธ เชฐเชนเซ‡เชถเซ‡.

เช† เชฒเซ‡เช–เชฎเชพเช‚, เชนเซเช‚ เช˜เชฃเซ€ เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เช…เชจเซ‡ เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชšเช•เชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชจเชพเชจเซเช‚ เชกเซ‡เชฎเซ‹ เชธเซเชŸเซ‡เชจเซเชก เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเซเช‚ เชคเซ‡เชจเซ€ เชธเซ‚เชšเชจเชพเช“ เชถเซ‡เชฐ เช•เชฐเซ€เชถ. เชคเชฎเซ‡ เชกเซ‹เช•เชฐเชซเชพเช‡เชฒ เช›เชฌเซ€เช“ เช…เชจเซ‡ เชธเซ‚เชšเชจเชพเช“เชจเซ€ เชธเซเชฐเช•เซเชทเชพเชจเชพ เชชเชฐเซ€เช•เซเชทเชฃเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเซ€ เชคเซ‡ เช…เช‚เช—เซ‡ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชคเซ‡ เชธเซเชชเชทเซเชŸ เช›เซ‡ เช•เซ‡ เชตเชฟเช•เชพเชธ เช…เชจเซ‡ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชฆเชฐเซ‡เช• เชฎเชพเชŸเซ‡ เช…เชฒเช— เช›เซ‡, เชคเซ‡เชฅเซ€ เชจเซ€เชšเซ‡ เชนเซเช‚ เช•เซ‡เชŸเชฒเชพเช• เชธเช‚เชญเชตเชฟเชค เชตเชฟเช•เชฒเซเชชเซ‹ เช†เชชเซ€เชถ.

เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“

เชกเซ‹เช•เชฐ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเชพ เชตเชฟเชตเชฟเชง เชชเชพเชธเชพเช“ เชชเชฐ เชคเชชเชพเชธ เช•เชฐเชคเซ€ เชตเชฟเชตเชฟเชง เชธเชนเชพเชฏเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เช…เชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชฎเซ‹เชŸเซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เช›เซ‡. เชคเซ‡เชฎเชพเช‚เชฅเซ€ เช•เซ‡เชŸเชฒเชพเช•เชจเซเช‚ เช…เช—เชพเช‰เชจเชพ เชฒเซ‡เช–เชฎเชพเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡ (https://habr.com/ru/company/swordfish_security/blog/518758/#docker-security), เช…เชจเซ‡ เช† เชฒเซ‡เช–เชฎเชพเช‚ เชนเซเช‚ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชคเซเชฐเชฃ เชชเชฐ เชงเซเชฏเชพเชจ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚, เชœเซ‡ เชตเชฟเช•เชพเชธ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชฌเชพเช‚เชงเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชกเซ‹เช•เชฐ เช›เชฌเซ€เช“ เชฎเชพเชŸเซ‡เชจเซ€ เชธเซเชฐเช•เซเชทเชพ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹เชจเซ‡ เช†เชตเชฐเซ€ เชฒเซ‡ เช›เซ‡. เชตเชงเซเชฎเชพเช‚, เชนเซเช‚ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช† เชคเซเชฐเชฃ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเซ‡ เชเช• เชชเชพเช‡เชชเชฒเชพเช‡เชจเชฎเชพเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเซ‹เชกเซ€ เชถเช•เชพเชฏ เชคเซ‡เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชชเชฃ เชฌเชคเชพเชตเซ€เชถ.

เชนเซ‡เชกเซ‹เชฒเชฟเชจเซเชŸ
https://github.com/hadolint/hadolint

เชเช•เชฆเชฎ เชธเชฐเชณ เช•เชจเซเชธเซ‹เชฒ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ เช•เซ‡ เชœเซ‡ เชกเซ‹เช•เชฐเชซเชพเชˆเชฒ เชธเซ‚เชšเชจเชพเช“เชจเซ€ เชธเชšเซ‹เชŸเชคเชพ เช…เชจเซ‡ เชธเชฒเชพเชฎเชคเซ€เชจเซเช‚ เชชเซเชฐเชฅเชฎ เชฎเซ‚เชฒเซเชฏเชพเช‚เช•เชจ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชซเช•เซเชค เชฎเชพเชจเซเชฏ เช‡เชฎเซ‡เชœ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชฅเชตเชพ เชธเซเชกเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡).

เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹

เชกเซ‹เช•เชฒ
https://github.com/goodwithtech/dockle

เช•เชจเซเชธเซ‹เชฒ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ เช•เซ‡ เชœเซ‡ เช‡เชฎเซ‡เชœ (เช…เชฅเชตเชพ เชธเซ‡เชต เช•เชฐเซ‡เชฒเซ€ เช‡เชฎเซ‡เชœ เชŸเชพเชฐเชฌเซ‹เชฒ เชชเชฐ) เชชเชฐ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชšเซ‹เช•เซเช•เชธ เช‡เชฎเซ‡เชœเชจเซ€ เชšเซ‹เช•เชธเชพเชˆ เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธเซ‡ เช›เซ‡ เชœเซ‡เชฎ เช•เซ‡ เชคเซ‡เชจเชพ เชธเซเชคเชฐเซ‹ เช…เชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เชจเซ‡ - เชถเซเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡, เช•เชˆ เชธเซ‚เชšเชจเชพเช“ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เช›เซ‡, เช•เชฏเชพ เชตเซ‹เชฒเซเชฏเซเชฎเซ‹ เชฎเชพเช‰เชจเซเชŸ เชฅเชฏเซ‡เชฒ เช›เซ‡. , เช–เชพเชฒเซ€ เชชเชพเชธเชตเชฐเซเชกเชจเซ€ เชนเชพเชœเชฐเซ€, เชตเช—เซ‡เชฐเซ‡. เชฆเชพ.เชค. เชœเซเชฏเชพเชฐเซ‡ เชšเซ‡เช•เชจเซ€ เชธเช‚เช–เซเชฏเชพ เชฌเชนเซ เชฎเซ‹เชŸเซ€ เชจเชฅเซ€ เช…เชจเซ‡ เชคเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชชเซ‹เชคเชพเชจเชพ เชšเซ‡เช• เช…เชจเซ‡ เชญเชฒเชพเชฎเชฃเซ‹ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡ CIS (เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชธเซเชฐเช•เซเชทเชพ เชฎเชพเชŸเซ‡ เช•เซ‡เชจเซเชฆเซเชฐ) เชฌเซ‡เชจเซเชšเชฎเชพเชฐเซเช• เชกเซ‹เช•เชฐ เชฎเชพเชŸเซ‡.
เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹

เชŸเซเชฐเซ€เชตเซ€
https://github.com/aquasecurity/trivy

เช† เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ‹ เชนเซ‡เชคเซ เชฌเซ‡ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชจเชฌเชณเชพเชˆเช“ เชถเซ‹เชงเชตเชพเชจเซ‹ เช›เซ‡ - OS เชฌเชฟเชฒเซเชก เชธเชฎเชธเซเชฏเชพเช“ (Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu เชธเชฎเชฐเซเชฅเชฟเชค เช›เซ‡) เช…เชจเซ‡ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชธเชฎเชธเซเชฏเชพเช“ (Gemfile.lock, Pipfile.lock, composer.lock, เชชเซ‡เช•เซ‡เชœ-เชฒเซ‹เช•) .json , yarn.lock, Cargo.lock). เชŸเซเชฐเชพเช‡เชตเซ€ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚เชจเซ€ เชˆเชฎเซ‡เชœ เช…เชจเซ‡ เชฒเซ‹เช•เชฒ เชˆเชฎเซ‡เชœ เชฌเช‚เชจเซ‡เชจเซ‡ เชธเซเช•เซ‡เชจ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœ เชธเชพเชฅเซ‡ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เชฐเซ‡เชฒ .tar เชซเชพเชˆเชฒเชจเชพ เช†เชงเชพเชฐเซ‡ เชชเชฃ เชธเซเช•เซ‡เชจ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹

เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชตเชฟเช•เชฒเซเชชเซ‹

เชตเชฐเซเชฃเชตเซ‡เชฒ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹เชจเซ‡ เช…เชฒเช—-เช…เชฒเช— เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“เชฎเชพเช‚ เช…เชœเชฎเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชนเซเช‚ เชธเชฐเชณ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเชพ เชญเชพเช— เชฐเซ‚เชชเซ‡ เชคเชฎเชพเชฎ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชธเซ‚เชšเชจเชพเช“ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ€เชถ.

เชฎเซเช–เซเชฏ เชตเชฟเชšเชพเชฐ เช เชฆเชฐเซเชถเชพเชตเชตเชพเชจเซ‹ เช›เซ‡ เช•เซ‡ เชคเชฎเซ‡ เชตเชฟเช•เชพเชธ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชฌเชจเชพเชตเซ‡เชฒ เชกเซ‹เช•เชฐเชซเชพเช‡เชฒเซเชธ เช…เชจเซ‡ เชกเซ‹เช•เชฐ เช›เชฌเซ€เช“ เชฎเชพเชŸเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เชธเชพเชฎเช—เซเชฐเซ€ เชคเชชเชพเชธเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซ€ เชถเช•เซ‹ เช›เซ‹.

เชšเช•เชพเชธเชฃเซ€ เชชเซ‹เชคเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชชเช—เชฒเชพเช‚เช“ เชธเชฎเชพเชตเซ‡ เช›เซ‡:

  1. เชฒเชฟเชจเชŸเชฐ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชธเชพเชฅเซ‡ เชกเซ‹เช•เชฐเชซเชพเช‡เชฒ เชธเซ‚เชšเชจเชพเช“เชจเซ€ เชถเซเชฆเซเชงเชคเชพ เช…เชจเซ‡ เชธเชฒเชพเชฎเชคเซ€ เชคเชชเชพเชธเชตเซ€ เชนเซ‡เชกเซ‹เชฒเชฟเชจเซเชŸ
  2. เช…เช‚เชคเชฟเชฎ เช…เชจเซ‡ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เช›เชฌเซ€เช“เชจเซ€ เชถเซเชฆเซเชงเชคเชพ เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธเชตเซ€ - เชเช• เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชกเซ‹เช•เชฒ
  3. เชฌเซ‡เช เชˆเชฎเซ‡เชœเชฎเชพเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชœเชพเชฃเซ€เชคเซ€ เชจเชฌเชณเชพเชˆเช“ (CVE) เช…เชจเซ‡ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เช…เชตเชฒเช‚เชฌเชจ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ - เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชฆเซเชตเชพเชฐเชพ เชŸเซเชฐเซ€เชตเซ€

เชฒเซ‡เช–เชฎเชพเช‚ เชชเชพเช›เชณเชฅเซ€ เชนเซเช‚ เช† เชชเช—เชฒเชพเช‚เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เชฎเชพเชŸเซ‡ เชคเซเชฐเชฃ เชตเชฟเช•เชฒเซเชชเซ‹ เช†เชชเซ€เชถ:
เชชเชนเซ‡เชฒเซเช‚ เช›เซ‡ เช—เชฟเชŸเชฒเซ‡เชฌเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ CI/CD เชชเชพเช‡เชชเชฒเชพเช‡เชจเชจเซ‡ เช—เซ‹เช เชตเซ€เชจเซ‡ (เชŸเซ‡เชธเซเชŸ เช‡เชจเซเชธเซเชŸเชจเซเชธ เชตเชงเชพเชฐเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเชพ เชตเชฐเซเชฃเชจ เชธเชพเชฅเซ‡).
เชฌเซ€เชœเซเช‚ เชถเซ‡เชฒ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡.
เชคเซเชฐเซ€เชœเซเช‚ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœเชจเซ‡ เชธเซเช•เซ‡เชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เช›เซ‡.
เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชธเซŒเชฅเซ€ เช…เชจเซเช•เซ‚เชณ เชนเซ‹เชฏ เชคเซ‡ เชตเชฟเช•เชฒเซเชช เชชเชธเช‚เชฆ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชคเซ‡เชจเซ‡ เชคเชฎเชพเชฐเชพ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชฎเชพเช‚ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชคเชฎเชพเชฐเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹ เช…เชจเซเชธเชพเชฐ เชธเซเชตเซ€เช•เชพเชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชฌเชงเซ€ เชœเชฐเซ‚เชฐเซ€ เชซเชพเช‡เชฒเซ‹ เช…เชจเซ‡ เชตเชงเชพเชฐเชพเชจเซ€ เชธเซ‚เชšเชจเชพเช“ เชชเชฃ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เช›เซ‡: https://github.com/Swordfish-Security/docker_cicd

GitLab CI/CD เชเช•เซ€เช•เชฐเชฃ

เชชเซเชฐเชฅเชฎ เชตเชฟเช•เชฒเซเชชเชฎเชพเช‚, เช…เชฎเซ‡ เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ GitLab เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เชธเชฟเชธเซเชŸเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเชพเช—เซ เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡ เชœเซ‹เชˆเชถเซเช‚. เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชชเช—เชฒเชพเช‚เช“เชฎเชพเช‚เชฅเซ€ เชชเชธเชพเชฐ เชฅเชˆเชถเซเช‚ เช…เชจเซ‡ เชœเซ‹เชˆเชถเซเช‚ เช•เซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชถเชฐเซ‚เช†เชคเชฅเซ€ เช—เชฟเชŸเชฒเซ‡เชฌ เชธเชพเชฅเซ‡ เชŸเซ‡เชธเซเชŸ เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซ‡เชจเซเชŸ เชธเซ‡เชŸ เช•เชฐเชตเซเช‚, เชธเซเช•เซ‡เชจ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซ€ เช…เชจเซ‡ เชŸเซ‡เชธเซเชŸ เชกเซ‹เช•เชฐเชซเชพเชˆเชฒ เช…เชจเซ‡ เชฐเซ‡เชจเซเชกเชฎ เชˆเชฎเซ‡เชœ - เชœเซเชฏเซเชธเชถเซ‹เชช เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชšเช•เชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เชšเชฒเชพเชตเชตเซ€.

GitLab เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡
1. เชกเซ‹เช•เชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹:

sudo apt-get update && sudo apt-get install docker.io

2. เชตเชฐเซเชคเชฎเชพเชจ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชกเซ‹เช•เชฐ เชœเซ‚เชฅเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ‹ เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ เชคเชฎเซ‡ sudo เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เชกเซ‹เช•เชฐ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ‹:

sudo addgroup <username> docker

3. เชคเชฎเชพเชฐเซ‹ IP เชถเซ‹เชงเซ‹:

ip addr

4. เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เช—เชฟเชŸเชฒเซ‡เชฌ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹ เช…เชจเซ‡ เชšเชฒเชพเชตเซ‹, เชนเซ‹เชธเซเชŸเชจเชพเชฎเชฎเชพเช‚ IP เชเชกเซเชฐเซ‡เชธเชจเซ‡ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชธเชพเชฅเซ‡ เชฌเชฆเชฒเซ€เชจเซ‡:

docker run --detach 
--hostname 192.168.1.112 
--publish 443:443 --publish 80:80 
--name gitlab 
--restart always 
--volume /srv/gitlab/config:/etc/gitlab 
--volume /srv/gitlab/logs:/var/log/gitlab 
--volume /srv/gitlab/data:/var/opt/gitlab 
gitlab/gitlab-ce:latest

เช…เชฎเซ‡ GitLab เชฆเซเชตเชพเชฐเชพ เชคเชฎเชพเชฎ เชœเชฐเซ‚เชฐเซ€ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชชเซ‚เชฐเซเชฃ เช•เชฐเชตเชพเชจเซ€ เชฐเชพเชน เชœเซ‹เชˆ เชฐเชนเซเชฏเชพ เช›เซ€เช (เชคเชฎเซ‡ เชฒเซ‹เช— เชซเชพเช‡เชฒเชจเชพ เช†เช‰เชŸเชชเซเชŸ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เช…เชจเซเชธเชฐเซ€ เชถเช•เซ‹ เช›เซ‹: docker logs -f gitlab).

5. เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เชคเชฎเชพเชฐเซ‹ เชธเซเชฅเชพเชจเชฟเช• IP เช–เซ‹เชฒเซ‹ เช…เชจเซ‡ เชฐเซ‚เชŸ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฎเชพเชŸเซ‡ เชชเชพเชธเชตเชฐเซเชก เชฌเชฆเชฒเชตเชพเชจเซ€ เช“เชซเชฐ เช•เชฐเชคเซเช‚ เชชเซƒเชทเซเช  เชœเซเช“:
เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹
เชจเชตเซ‹ เชชเชพเชธเชตเชฐเซเชก เชธเซ‡เชŸ เช•เชฐเซ‹ เช…เชจเซ‡ GitLab เชชเชฐ เชœเชพเช“.

6. เชเช• เชจเชตเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ‹, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ cicd-เชŸเซ‡เชธเซเชŸ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชธเซเชŸเชพเชฐเซเชŸ เชซเชพเชˆเชฒ เชธเชพเชฅเซ‡ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ‹ README.md:
เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹
7. เชนเชตเซ‡ เช†เชชเชฃเซ‡ เช—เชฟเชŸเชฒเซ‡เชฌ เชฐเชจเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡: เชเช• เชเชœเชจเซเชŸ เช•เซ‡ เชœเซ‡ เชตเชฟเชจเช‚เชคเซ€ เชชเชฐ เชคเชฎเชพเชฎ เชœเชฐเซ‚เชฐเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€เช“ เชšเชฒเชพเชตเชถเซ‡.
เชจเชตเซ€เชจเชคเชฎ เชธเช‚เชธเซเช•เชฐเชฃ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‹ (เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, Linux 64-เชฌเซ€เชŸ เชนเซ‡เช เชณ):

sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

8. เชคเซ‡เชจเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเซ‹:

sudo chmod +x /usr/local/bin/gitlab-runner

9. เชฐเชจเชฐ เชฎเชพเชŸเซ‡ OS เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช‰เชฎเซ‡เชฐเซ‹ เช…เชจเซ‡ เชธเซ‡เชตเชพ เชถเชฐเซ‚ เช•เชฐเซ‹:

sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

เชคเซ‡ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เช•เช‚เชˆเช• เชฆเซ‡เช–เชพเชตเซเช‚ เชœเซ‹เชˆเช:

local@osboxes:~$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
Runtime platform arch=amd64 os=linux pid=8438 revision=0e5417a3 version=12.0.1
local@osboxes:~$ sudo gitlab-runner start
Runtime platform arch=amd64 os=linux pid=8518 revision=0e5417a3 version=12.0.1

10. เชนเชตเซ‡ เช…เชฎเซ‡ เชฐเชจเชฐเชจเซ‡ เชฐเชœเซ€เชธเซเชŸเชฐ เช•เชฐเซ€เช เช›เซ€เช เชœเซ‡เชฅเซ€ เชคเซ‡ เช…เชฎเชพเชฐเชพ เช—เชฟเชŸเชฒเซ‡เชฌ เช‡เชจเซเชธเซเชŸเชจเซเชธ เชธเชพเชฅเซ‡ เชธเช‚เชชเชฐเซเช• เช•เชฐเซ€ เชถเช•เซ‡.
เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, Settings-CI/CD เชชเซƒเชทเซเช  เช–เซ‹เชฒเซ‹ (http://OUR_ IP_ADDRESS/root/cicd-test/-/settings/ci_cd) เช…เชจเซ‡ เชฐเชจเชฐเซเชธ เชŸเซ‡เชฌ เชชเชฐ URL เช…เชจเซ‡ เชจเซ‹เช‚เชงเชฃเซ€ เชŸเซ‹เช•เชจ เชถเซ‹เชงเซ‹:
เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹
11. URL เช…เชจเซ‡ เชฐเชœเซ€เชธเซเชŸเซเชฐเซ‡เชถเชจ เชŸเซ‹เช•เชจเชจเซ‡ เชฌเชฆเชฒเซ€เชจเซ‡ เชฐเชจเชฐเชจเซ€ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเซ‹:

sudo gitlab-runner register 
--non-interactive 
--url "http://<URL>/" 
--registration-token "<Registration Token>" 
--executor "docker" 
--docker-privileged 
--docker-image alpine:latest 
--description "docker-runner" 
--tag-list "docker,privileged" 
--run-untagged="true" 
--locked="false" 
--access-level="not_protected"

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชฎเชจเซ‡ เชคเซˆเชฏเชพเชฐ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ GitLab เชฎเชณเซ‡ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เช…เชฎเชพเชฐเซ‡ เช…เชฎเชพเชฐเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซ‚เชšเชจเชพเช“ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เชกเซ‡เชฎเซ‹เชฎเชพเช‚, เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชฌเชฟเชฒเซเชก เช…เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชพเช‡เชเซ‡เชถเชจ เชธเซเชŸเซ‡เชชเซเชธ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชตเชพเชธเซเชคเชตเชฟเช• เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เชคเซ‡เช“ เชธเซเช•เซ‡เชจ เชธเซเชŸเซ‡เชชเซเชธเชจเซ€ เช†เช—เชณ เช†เชตเชถเซ‡ เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เช‡เชฎเซ‡เชœ เช…เชจเซ‡ เชกเซ‹เช•เชฐเชซเชพเช‡เชฒ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชถเซ‡.

เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ

1. เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชซเชพเช‡เชฒเซ‹ เช‰เชฎเซ‡เชฐเซ‹ mydockerfile.df (เช† เชเช• เชŸเซ‡เชธเซเชŸ เชกเซ‹เช•เชฐเชซเชพเช‡เชฒ เช›เซ‡ เชœเซ‡ เช…เชฎเซ‡ เชšเช•เชพเชธเซ€เชถเซเช‚) เช…เชจเซ‡ GitLab CI/CD เชชเซเชฐเซ‹เชธเซ‡เชธ เช•เชจเซเชซเชฟเช—เชฐเซ‡เชถเชจ เชซเชพเช‡เชฒ .gitlab-cicd.yml, เชœเซ‡ เชธเซเช•เซ‡เชจเชฐเซเชธ เชฎเชพเชŸเซ‡เชจเซ€ เชธเซ‚เชšเชจเชพเช“เชจเซ‡ เชธเซ‚เชšเชฟเชฌเชฆเซเชง เช•เชฐเซ‡ เช›เซ‡ (เชซเชพเช‡เชฒเชจเชพ เชจเชพเชฎเชฎเชพเช‚ เชฌเชฟเช‚เชฆเซเชจเซ€ เชจเซ‹เช‚เชง เช•เชฐเซ‹).

.yaml เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเชˆเชฒเชฎเชพเช‚ เชคเซเชฐเชฃ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ (เชนเซ‡เชกเซ‹เชฒเชฟเชจเซเชŸ, เชกเซ‹เช•เชฒ เช…เชจเซ‡ เชŸเซเชฐเชฟเชตเซ€) เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชธเซ‚เชšเชจเชพเช“ เช›เซ‡ เชœเซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒเซ€ เชกเซ‹เช•เชฐเชซเชพเชˆเชฒ เช…เชจเซ‡ DOCKERFILE เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชˆเชฎเซ‡เชœเชจเซ‡ เชชเชพเชฐเซเชธ เช•เชฐเชถเซ‡. เชฌเชงเซ€ เชœเชฐเซ‚เชฐเซ€ เชซเชพเช‡เชฒเซ‹ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚เชฅเซ€ เชฒเชˆ เชถเช•เชพเชฏ เช›เซ‡: https://github.com/Swordfish-Security/docker_cicd/

เชฎเชพเช‚เชฅเซ€ เช…เชฐเซเช• mydockerfile.df (เช† เชเช• เช…เชฎเซ‚เชฐเซเชค เชซเชพเช‡เชฒ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชฆเชฐเซเชถเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฎเชจเชธเซเชตเซ€ เชธเซ‚เชšเชจเชพเช“เชจเซ‹ เชธเชฎเซ‚เชน เช›เซ‡). เชซเชพเช‡เชฒเชจเซ€ เชธเซ€เชงเซ€ เชฒเชฟเช‚เช•: mydockerfile.df

mydockerfile.df เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€

FROM amd64/node:10.16.0-alpine@sha256:f59303fb3248e5d992586c76cc83e1d3700f641cbcd7c0067bc7ad5bb2e5b489 AS tsbuild
COPY package.json .
COPY yarn.lock .
RUN yarn install
COPY lib lib
COPY tsconfig.json tsconfig.json
COPY tsconfig.app.json tsconfig.app.json
RUN yarn build
FROM amd64/ubuntu:18.04@sha256:eb70667a801686f914408558660da753cde27192cd036148e58258819b927395
LABEL maintainer="Rhys Arkins <[email protected]>"
LABEL name="renovate"
...
COPY php.ini /usr/local/etc/php/php.ini
RUN cp -a /tmp/piik/* /var/www/html/
RUN rm -rf /tmp/piwik
RUN chown -R www-data /var/www/html
ADD piwik-cli-setup /piwik-cli-setup
ADD reset.php /var/www/html/
## ENTRYPOINT ##
ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
USER root

YAML เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ (เชซเชพเชˆเชฒ เชชเซ‹เชคเซ‡ เช…เชนเซ€เช‚ เชธเซ€เชงเซ€ เชฒเชฟเช‚เช• เชชเชฐเชฅเซ€ เชฒเชˆ เชถเช•เชพเชฏ เช›เซ‡: .gitlab-ci.yml):

.gitlab-ci.yml เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€

variables:
    DOCKER_HOST: "tcp://docker:2375/"
    DOCKERFILE: "mydockerfile.df" # name of the Dockerfile to analyse   
    DOCKERIMAGE: "bkimminich/juice-shop" # name of the Docker image to analyse
    # DOCKERIMAGE: "knqyf263/cve-2018-11235" # test Docker image with several CRITICAL CVE
    SHOWSTOPPER_PRIORITY: "CRITICAL" # what level of criticality will fail Trivy job
    TRIVYCACHE: "$CI_PROJECT_DIR/.cache" # where to cache Trivy database of vulnerabilities for faster reuse
    ARTIFACT_FOLDER: "$CI_PROJECT_DIR"
 
services:
    - docker:dind # to be able to build docker images inside the Runner
 
stages:
    - scan
    - report
    - publish
 
HadoLint:
    # Basic lint analysis of Dockerfile instructions
    stage: scan
    image: docker:git
 
    after_script:
    - cat $ARTIFACT_FOLDER/hadolint_results.json
 
    script:
    - export VERSION=$(wget -q -O - https://api.github.com/repos/hadolint/hadolint/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/1/')
    - wget https://github.com/hadolint/hadolint/releases/download/v${VERSION}/hadolint-Linux-x86_64 && chmod +x hadolint-Linux-x86_64
     
    # NB: hadolint will always exit with 0 exit code
    - ./hadolint-Linux-x86_64 -f json $DOCKERFILE > $ARTIFACT_FOLDER/hadolint_results.json || exit 0
 
    artifacts:
        when: always # return artifacts even after job failure       
        paths:
        - $ARTIFACT_FOLDER/hadolint_results.json
 
Dockle:
    # Analysing best practices about docker image (users permissions, instructions followed when image was built, etc.)
    stage: scan   
    image: docker:git
 
    after_script:
    - cat $ARTIFACT_FOLDER/dockle_results.json
 
    script:
    - export VERSION=$(wget -q -O - https://api.github.com/repos/goodwithtech/dockle/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/1/')
    - wget https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.tar.gz && tar zxf dockle_${VERSION}_Linux-64bit.tar.gz
    - ./dockle --exit-code 1 -f json --output $ARTIFACT_FOLDER/dockle_results.json $DOCKERIMAGE   
     
    artifacts:
        when: always # return artifacts even after job failure       
        paths:
        - $ARTIFACT_FOLDER/dockle_results.json
 
Trivy:
    # Analysing docker image and package dependencies against several CVE bases
    stage: scan   
    image: docker:git
 
    script:
    # getting the latest Trivy
    - apk add rpm
    - export VERSION=$(wget -q -O - https://api.github.com/repos/knqyf263/trivy/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/1/')
    - wget https://github.com/knqyf263/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz && tar zxf trivy_${VERSION}_Linux-64bit.tar.gz
     
    # displaying all vulnerabilities w/o failing the build
    - ./trivy -d --cache-dir $TRIVYCACHE -f json -o $ARTIFACT_FOLDER/trivy_results.json --exit-code 0 $DOCKERIMAGE    
    
    # write vulnerabilities info to stdout in human readable format (reading pure json is not fun, eh?). You can remove this if you don't need this.
    - ./trivy -d --cache-dir $TRIVYCACHE --exit-code 0 $DOCKERIMAGE    
 
    # failing the build if the SHOWSTOPPER priority is found
    - ./trivy -d --cache-dir $TRIVYCACHE --exit-code 1 --severity $SHOWSTOPPER_PRIORITY --quiet $DOCKERIMAGE
         
    artifacts:
        when: always # return artifacts even after job failure
        paths:
        - $ARTIFACT_FOLDER/trivy_results.json
 
    cache:
        paths:
        - .cache
 
Report:
    # combining tools outputs into one HTML
    stage: report
    when: always
    image: python:3.5
     
    script:
    - mkdir json
    - cp $ARTIFACT_FOLDER/*.json ./json/
    - pip install json2html
    - wget https://raw.githubusercontent.com/shad0wrunner/docker_cicd/master/convert_json_results.py
    - python ./convert_json_results.py
     
    artifacts:
        paths:
        - results.html

เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹, เชคเชฎเซ‡ เชธเชพเชšเชตเซ‡เชฒเซ€ เช›เชฌเซ€เช“เชจเซ‡ .tar เช†เชฐเซเช•เชพเช‡เชต เชคเชฐเซ€เช•เซ‡ เชชเชฃ เชธเซเช•เซ‡เชจ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ (เชœเซ‹ เช•เซ‡, เชคเชฎเชพเชฐเซ‡ YAML เชซเชพเช‡เชฒเชฎเชพเช‚ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เชฎเชพเชŸเซ‡ เช‡เชจเชชเซเชŸ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡)

NB: เชŸเซเชฐเซ€เชตเซ€ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ RPM ะธ เช—เชฟเชŸ. เชจเชนเชฟเช‚เชคเชฐ, เชคเซ‡ RedHat-เช†เชงเชพเชฐเชฟเชค เชˆเชฎเซ‡เชœเซ‹เชจเซ‡ เชธเซเช•เซ‡เชจ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช…เชจเซ‡ เชจเชฌเชณเชพเชˆ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เช…เชชเชกเซ‡เชŸ เชฎเซ‡เชณเชตเชคเซ€ เชตเช–เชคเซ‡ เชญเซ‚เชฒเซ‹ เชชเซ‡เชฆเชพ เช•เชฐเชถเซ‡.

2. เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชซเชพเช‡เชฒเซ‹ เช‰เชฎเซ‡เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเชพเชฐเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเชฎเชพเช‚เชจเซ€ เชธเซ‚เชšเชจเชพเช“ เช…เชจเซเชธเชพเชฐ, GitLab เช†เชชเซ‹เช†เชช เชฌเชฟเชฒเซเชก เช…เชจเซ‡ เชธเซเช•เซ‡เชจ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เช•เชฐเชถเซ‡. CI / CD โ†’ เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ เชŸเซ‡เชฌ เชชเชฐ, เชคเชฎเซ‡ เชธเซ‚เชšเชจเชพเช“เชจเซ€ เชชเซเชฐเช—เชคเชฟ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹.

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชšเชพเชฐ เช•เชพเชฐเซเชฏเซ‹ เช›เซ‡. เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชคเซเชฐเชฃ เชธเซ€เชงเชพ เชธเซเช•เซ‡เชจเชฟเช‚เช—เชฎเชพเช‚ เชธเชพเชฎเซ‡เชฒ เช›เซ‡, เช…เชจเซ‡ เช›เซ‡เชฒเซเชฒเซ‹ (เชฐเชฟเชชเซ‹เชฐเซเชŸ) เชธเซเช•เซ‡เชจ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชธเชพเชฅเซ‡ เชตเชฟเช–เชฐเชพเชฏเซ‡เชฒเซ€ เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚เชฅเซ€ เชเช• เชธเชฐเชณ เชฐเชฟเชชเซ‹เชฐเซเชŸ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡.
เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹
เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡, เชœเซ‹ เช•เซเชฐเชฟเชŸเซ€เช•เชฒ เชจเชฌเชณเชพเชˆเช“ เชˆเชฎเซ‡เชœ เช…เชฅเชตเชพ เชกเชฟเชชเซ‡เชจเซเชกเชจเซเชธเซ€เชฎเชพเช‚ เชœเซ‹เชตเชพ เชฎเชณเซ‡ เชคเซ‹ เชŸเซเชฐเซ€เชตเซ€ เชคเซ‡เชจเชพ เช…เชฎเชฒเชจเซ‡ เช…เชŸเช•เชพเชตเซ‡ เช›เซ‡. เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เชนเซ‡เชกเซ‹เชฒเชฟเชจเซเชŸ เชนเช‚เชฎเซ‡เชถเชพ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เช•เซ‹เชกเชฎเชพเช‚ เชธเชซเชณเชคเชพ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡เชจเชพ เช…เชฎเชฒเชฎเชพเช‚ เชนเช‚เชฎเซ‡เชถเชพ เชŸเชฟเชชเซเชชเชฃเซ€เช“ เชนเซ‹เชฏ เช›เซ‡, เชœเซ‡เชจเชพ เช•เชพเชฐเชฃเซ‡ เชฌเชฟเชฒเซเชก เชฌเช‚เชง เชฅเชพเชฏ เช›เซ‡.

เชคเชฎเชพเชฐเซ€ เชšเซ‹เช•เซเช•เชธ เช†เชตเชถเซเชฏเช•เชคเชพเช“เชจเซ‡ เช†เชงเชพเชฐเซ‡, เชคเชฎเซ‡ เชเช•เซเชเชฟเชŸ เช•เซ‹เชกเชจเซ‡ เช—เซ‹เช เชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชšเซ‹เช•เซเช•เชธ เชœเชŸเชฟเชฒเชคเชพเชจเซ€ เชธเชฎเชธเซเชฏเชพเช“ เชฎเชณเซ€ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ เช† เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เชฌเชฟเชฒเซเชก เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชชเชฃ เชฐเซ‹เช•เซ‡. เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฌเชฟเชฒเซเชก เชซเช•เซเชค เชคเซเชฏเชพเชฐเซ‡ เชœ เชฌเช‚เชง เชฅเชถเซ‡ เชœเซ‹ เชŸเซเชฐเชฟเชตเซ€ เช—เช‚เชญเซ€เชฐเชคเชพ เชธเชพเชฅเซ‡ เชจเชฌเชณเชพเชˆ เชถเซ‹เชงเซ‡ เชœเซ‡ เช…เชฎเซ‡ เชถเซ‹เชธเซเชŸเซ‹เชชเชฐ เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช•เชฐเซ€ เช›เซ‡. .gitlab-ci.yml.
เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹

เชฆเชฐเซ‡เช• เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€เชจเชพ เช“เชชเชฐเซ‡เชถเชจเชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ เชฆเชฐเซ‡เช• เชธเซเช•เซ‡เชจเชฟเช‚เช— เช•เชพเชฐเซเชฏเชจเชพ เชฒเซ‹เช—เชฎเชพเช‚ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡, เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชธเซ€เชงเชพ เชœ json เชซเชพเชˆเชฒเซ‹เชฎเชพเช‚ เช…เชฅเชตเชพ เชธเชพเชฆเชพ HTML เชฐเชฟเชชเซ‹เชฐเซเชŸเชฎเชพเช‚ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡ (เชจเซ€เชšเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชตเชงเซ):
เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹

3. เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช…เชนเซ‡เชตเชพเชฒเซ‹เชจเซ‡ เชฅเซ‹เชกเชพ เชตเชงเซ เชฎเชพเชจเชต-เชตเชพเช‚เชšเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชฐเชœเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชเช• เชจเชพเชจเซ€ เชชเชพเชฏเชฅเซ‹เชจ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชคเซเชฐเชฃ json เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชเช• HTML เชซเชพเช‡เชฒเชฎเชพเช‚ เช–เชพเชฎเซ€เช“เชจเชพ เช•เซ‹เชทเซเชŸเช• เชธเชพเชฅเซ‡ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡.
เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชเช• เช…เชฒเช— เชฐเชฟเชชเซ‹เชฐเซเชŸ เชŸเชพเชธเซเช• เชฆเซเชตเชพเชฐเชพ เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชจเซ€ เช…เช‚เชคเชฟเชฎ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชฐเชฟเชชเซ‹เชฐเซเชŸ เชธเชพเชฅเซ‡เชจเซ€ HTML เชซเชพเช‡เชฒ เช›เซ‡. เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเซเชคเซเชฐเซ‹เชค เชชเชฃ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเชพเชฐเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹, เชฐเช‚เช—เซ‹ เชตเช—เซ‡เชฐเซ‡เชจเซ‡ เช…เชจเซเช•เซ‚เชฒเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.
เชกเซ‹เช•เชฐ เชธเซเชฐเช•เซเชทเชพ เชคเชชเชพเชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹

เชถเซ‡เชฒ เชธเซเช•เซเชฐเชฟเชชเซเชŸ

เชฌเซ€เชœเซ‹ เชตเชฟเช•เชฒเซเชช เชเชตเชพ เช•เชฟเชธเซเชธเชพเช“ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เชœเซเชฏเชพเช‚ เชคเชฎเชพเชฐเซ‡ CI/CD เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชจ เชนเซ‹เชฏ เชคเซ‡เชตเซ€ เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœเซ‹ เชคเชชเชพเชธเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช…เชฅเชตเชพ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชซเซ‹เชฐเซเชฎเชฎเชพเช‚ เชฌเชงเซ€ เชธเซ‚เชšเชจเชพเช“ เชนเซ‹เชตเซ€ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ เช•เซ‡ เชœเซ‡ เชธเซ€เชงเชพ เชœ เชนเซ‹เชธเซเชŸ เชชเชฐ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เชฅเชˆ เชถเช•เซ‡. เช† เชตเชฟเช•เชฒเซเชช เชคเซˆเชฏเชพเชฐ เชถเซ‡เชฒ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฆเซเชตเชพเชฐเชพ เช†เชตเชฐเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡ เชœเซ‡ เชธเซเชตเชšเซเช› เชตเชฐเซเชšเซเชฏเซเช…เชฒ (เช…เชฅเชตเชพ เชตเชพเชธเซเชคเชตเชฟเช•) เชฎเชถเซ€เชจ เชชเชฐ เชชเชฃ เชšเชฒเชพเชตเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช‰เชชเชฐ เช—เชฟเชŸเชฒเซ‡เชฌ-เชฐเชจเชฐ เชœเซ‡เชตเซ€ เชœ เชธเซ‚เชšเชจเชพเช“เชจเซ‡ เช…เชจเซเชธเชฐเซ‡ เช›เซ‡.

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เช•เชพเชฎ เช•เชฐเซ‡ เชคเซ‡ เชฎเชพเชŸเซ‡, เชกเซ‹เช•เชฐ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเซเช‚ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช เช…เชจเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชกเซ‹เช•เชฐ เชœเซ‚เชฅเชฎเชพเช‚ เชนเซ‹เชตเซ‹ เชœเซ‹เชˆเช.

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชชเซ‹เชคเซ‡ เช…เชนเซ€เช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡: docker_sec_check.sh

เชซเชพเช‡เชฒเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚, เชตเซ‡เชฐเซ€เชเชฌเชฒเซเชธ เชธเซเชชเชทเซเชŸ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เช•เชˆ เช‡เชฎเซ‡เชœ เชธเซเช•เซ‡เชจ เช•เชฐเชตเซ€ เชœเซ‹เชˆเช เช…เชจเซ‡ เช–เชพเชฎเซ€เชจเซ€ เช•เชˆ เช—เช‚เชญเซ€เชฐเชคเชพเชจเซ‡ เชฒเซ€เชงเซ‡ เชŸเซเชฐเชพเช‡เชตเซ€ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ เชธเซเชชเชทเซเชŸ เชญเซ‚เชฒ เช•เซ‹เชก เชธเชพเชฅเซ‡ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ€ เชœเชถเซ‡.

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชคเชฎเชพเชฎ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชกเซ‹เช•เชฐ_เชŸเซ‚เชฒเซเชธ, เชคเซ‡เชฎเชจเชพ เช•เชพเชฐเซเชฏเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ - เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ docker_tools/json, เช…เชจเซ‡ เชฐเชฟเชชเซ‹เชฐเซเชŸ เชธเชพเชฅเซ‡เชจเซเช‚ HTML เชซเชพเช‡เชฒเชฎเชพเช‚ เชนเชถเซ‡ results.html.

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช†เช‰เชŸเชชเซเชŸเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ

~/docker_cicd$ ./docker_sec_check.sh

[+] Setting environment variables
[+] Installing required packages
[+] Preparing necessary directories
[+] Fetching sample Dockerfile
2020-10-20 10:40:00 (45.3 MB/s) - โ€˜Dockerfileโ€™ saved [8071/8071]
[+] Pulling image to scan
latest: Pulling from bkimminich/juice-shop
[+] Running Hadolint
...
Dockerfile:205 DL3015 Avoid additional packages by specifying `--no-install-recommends`
Dockerfile:248 DL3002 Last USER should not be root
...
[+] Running Dockle
...
WARN    - DKL-DI-0006: Avoid latest tag
        * Avoid 'latest' tag
INFO    - CIS-DI-0005: Enable Content trust for Docker
        * export DOCKER_CONTENT_TRUST=1 before docker pull/build
...
[+] Running Trivy
juice-shop/frontend/package-lock.json
=====================================
Total: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 2, CRITICAL: 0)

+---------------------+------------------+----------+---------+-------------------------+
|       LIBRARY       | VULNERABILITY ID | SEVERITY | VERSION |             TITLE       |
+---------------------+------------------+----------+---------+-------------------------+
| object-path         | CVE-2020-15256   | HIGH     | 0.11.4  | Prototype pollution in  |
|                     |                  |          |         | object-path             |
+---------------------+------------------+          +---------+-------------------------+
| tree-kill           | CVE-2019-15599   |          | 1.2.2   | Code Injection          |
+---------------------+------------------+----------+---------+-------------------------+
| webpack-subresource | CVE-2020-15262   | LOW      | 1.4.1   | Unprotected dynamically |
|                     |                  |          |         | loaded chunks           |
+---------------------+------------------+----------+---------+-------------------------+

juice-shop/package-lock.json
============================
Total: 20 (UNKNOWN: 0, LOW: 1, MEDIUM: 6, HIGH: 8, CRITICAL: 5)

...

juice-shop/package-lock.json
============================
Total: 5 (CRITICAL: 5)

...
[+] Removing left-overs
[+] Making the output look pretty
[+] Converting JSON results
[+] Writing results HTML
[+] Clean exit ============================================================
[+] Everything is done. Find the resulting HTML report in results.html

เชคเชฎเชพเชฎ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เชธเชพเชฅเซ‡ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ

เชคเซเชฐเซ€เชœเชพ เชตเชฟเช•เชฒเซเชช เชคเชฐเซ€เช•เซ‡, เชฎเซ‡เช‚ เชธเซเชฐเช•เซเชทเชพ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เชธเชพเชฅเซ‡ เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฌเซ‡ เชธเชฐเชณ เชกเซ‹เช•เชฐเชซเชพเช‡เชฒเซเชธเชจเซเช‚ เชธเช‚เช•เชฒเชจ เช•เชฐเซเชฏเซเช‚. เชเช• เชกเซ‹เช•เชฐเชซเชพเชˆเชฒ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚เชฅเซ€ เชˆเชฎเซ‡เชœ เชธเซเช•เซ‡เชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซ‡เชŸ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡, เชฌเซ€เชœเซ€ (เชกเซ‹เช•เชฐเชซเชพเชˆเชฒ_เชŸเชพเชฐ) เชˆเชฎเซ‡เชœ เชธเชพเชฅเซ‡ เชŸเชพเชฐ เชซเชพเชˆเชฒเชจเซ‡ เชธเซเช•เซ‡เชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชธเซ‡เชŸ เชฌเชจเชพเชตเชถเซ‡.

1. เช…เชฎเซ‡ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚เชฅเซ€ เชฏเซ‹เช—เซเชฏ เชกเซ‹เช•เชฐ เชซเชพเชˆเชฒ เช…เชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชฒเชˆเช เช›เซ€เช https://github.com/Swordfish-Security/docker_cicd/tree/master/Dockerfile.
2. เชคเซ‡เชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฎเชพเชŸเซ‡ เชšเชฒเชพเชตเซ‹:

docker build -t dscan:image -f docker_security.df .

3. เชฌเชฟเชฒเซเชก เชชเซ‚เชฐเซเชฃ เชฅเชฏเชพ เชชเช›เซ€, เช‡เชฎเซ‡เชœเชฎเชพเช‚เชฅเซ€ เช•เชจเซเชŸเซ‡เชจเชฐ เชฌเชจเชพเชตเซ‹. เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เช…เชฎเซ‡ เชœเซ‡ เช‡เชฎเซ‡เชœเชฎเชพเช‚ เชฐเชธ เชงเชฐเชพเชตเซ€เช เช›เซ€เช เชคเซ‡เชจเชพ เชจเชพเชฎ เชธเชพเชฅเซ‡ DOCKERIMAGE เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซ‡เชจเซเชŸ เชตเซ‡เชฐเซ€เชเชฌเชฒ เชชเชพเชธ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชกเซ‹เช•เชฐเชซเชพเช‡เชฒเชจเซ‡ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ€เช เช›เซ€เช เชœเซ‡เชจเซเช‚ เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชฎเชถเซ€เชจเชฅเซ€ เชซเชพเช‡เชฒเชฎเชพเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชฎเชพเช—เซ€เช เช›เซ€เช. /เชกเซ‹เช•เชฐเชซเชพเช‡เชฒ (เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เช† เชซเชพเช‡เชฒเชจเซ‹ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฎเชพเชฐเซเช— เชœเชฐเซ‚เชฐเซ€ เช›เซ‡):

docker run --rm -v $(pwd)/results:/results -v $(pwd)/docker_security.df:/Dockerfile -e DOCKERIMAGE="bkimminich/juice-shop" dscan:image


[+] Setting environment variables
[+] Running Hadolint
/Dockerfile:3 DL3006 Always tag the version of an image explicitly
[+] Running Dockle
WARN    - DKL-DI-0006: Avoid latest tag
        * Avoid 'latest' tag
INFO    - CIS-DI-0005: Enable Content trust for Docker
        * export DOCKER_CONTENT_TRUST=1 before docker pull/build
INFO    - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
        * not found HEALTHCHECK statement
INFO    - DKL-LI-0003: Only put necessary files
        * unnecessary file : juice-shop/node_modules/sqlite3/Dockerfile
        * unnecessary file : juice-shop/node_modules/sqlite3/tools/docker/architecture/linux-arm64/Dockerfile
        * unnecessary file : juice-shop/node_modules/sqlite3/tools/docker/architecture/linux-arm/Dockerfile
[+] Running Trivy
...
juice-shop/package-lock.json
============================
Total: 20 (UNKNOWN: 0, LOW: 1, MEDIUM: 6, HIGH: 8, CRITICAL: 5)
...
[+] Making the output look pretty
[+] Starting the main module ============================================================
[+] Converting JSON results
[+] Writing results HTML
[+] Clean exit ============================================================
[+] Everything is done. Find the resulting HTML report in results.html

เชฐเชฟเชเชฒเซเชŸ

เช…เชฎเซ‡ เชกเซ‹เช•เชฐ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชธเซเช•เซ‡เชจเซ€เช‚เช— เชŸเซ‚เชฒเซเชธเชจเซ‹ เชฎเชพเชคเซเชฐ เชเช• เชฎเซ‚เชณเชญเซ‚เชค เชธเซ‡เชŸ เช†เชตเชฐเซ€ เชฒเซ€เชงเซ‹ เช›เซ‡, เชœเซ‡ เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เช‡เชฎเซ‡เชœ เชธเซเชฐเช•เซเชทเชพ เช†เชตเชถเซเชฏเช•เชคเชพเช“เชจเซ‡ เชเช•เชฆเชฎ เช…เชธเชฐเช•เชพเชฐเช• เชฐเซ€เชคเซ‡ เช†เชตเชฐเซ€ เชฒเซ‡ เช›เซ‡. เช…เชจเซเชฏ เช˜เชฃเชพ เชชเซ‡เช‡เชก เช…เชจเซ‡ เชซเซเชฐเซ€ เชŸเซ‚เชฒเซเชธ เช›เซ‡ เชœเซ‡ เชธเชฎเชพเชจ เชคเชชเชพเชธ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชธเซเช‚เชฆเชฐ เช…เชนเซ‡เชตเชพเชฒเซ‹ เชฆเซ‹เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชฅเชตเชพ เช•เชจเซเชธเซ‹เชฒ เชฎเซ‹เชกเชฎเชพเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เช•เชตเชฐ เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸ เชธเชฟเชธเซเชŸเชฎเซเชธ เชตเช—เซ‡เชฐเซ‡. เช† เชธเชพเชงเชจเซ‹เชจเซ€ เชเชพเช‚เช–เซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชเช•เซ€เช•เซƒเชค เช•เชฐเชตเซเช‚ เชคเซ‡ เชฅเซ‹เชกเซ€ เชตเชพเชฐ เชชเช›เซ€ เชฆเซ‡เช–เชพเชถเซ‡.

เชฒเซ‡เช–เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เชธเชพเชงเชจเซ‹เชจเชพ เชธเชฎเซ‚เชนเชจเซ€ เชธเช•เชพเชฐเชพเชคเซเชฎเช• เชฌเชพเชœเซ เช เช›เซ‡ เช•เซ‡ เชคเซ‡ เชฌเชงเชพ เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชชเชฐ เชฌเชจเซ‡เชฒเชพ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเชพเชฐเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹ เช…เชจเซ‡ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชธเซเชตเชฟเชงเชพเช“เชจเซ‡ เชฌเชฐเชพเชฌเชฐ เชถเซเช‚ เช…เชจเซเชฐเซ‚เชช เช›เซ‡ เชคเซ‡ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเซ‡ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡ เช…เชจเซ‡ เช…เชจเซเชฏ เชธเชฎเชพเชจ เชธเชพเชงเชจเซ‹ เชธเชพเชฅเซ‡ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เช…เชฒเชฌเชคเซเชค, เชคเชฎเชพเชฎ เชจเชฌเชณเชพเชˆเช“ เช•เซ‡ เชœเซ‡ เชœเซ‹เชตเชพ เชฎเชณเซ‡ เช›เซ‡ เชคเซ‡เชจเซ‹ เชšเซ‹เช•เซเช•เชธ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“เชฎเชพเช‚ เชฒเชพเช—เซ เชฅเชตเชพ เชฎเชพเชŸเซ‡ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเซ‹ เชœเซ‹เชˆเช, เชชเชฐเช‚เชคเซ เช† เชญเชตเชฟเชทเซเชฏเชจเชพ เชฎเซ‹เชŸเชพ เชฒเซ‡เช– เชฎเชพเชŸเซ‡เชจเซ‹ เชตเชฟเชทเชฏ เช›เซ‡.

เชนเซเช‚ เช†เชถเชพ เชฐเชพเช–เซเช‚ เช›เซเช‚ เช•เซ‡ เช† เชธเซ‚เชšเชจเชพเช“, เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เช…เชจเซ‡ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เชคเชฎเชจเซ‡ เชฎเชฆเชฆ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชพเช‡เชเซ‡เชถเชจเชจเชพ เช•เซเชทเซ‡เชคเซเชฐเชฎเชพเช‚ เชตเชงเซ เชธเซเชฐเช•เซเชทเชฟเชค เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชฌเชฟเช‚เชฆเซ เชฌเชจเชถเซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹