เจกเฉŒเจ•เจฐ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจš เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚

เจกเฉŒเจ•เจฐ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจš เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚
เจนเฉ‡ เจนเจฌเจฐ!

เจ†เจงเฉเจจเจฟเจ• เจนเจ•เฉ€เจ•เจค เจตเจฟเฉฑเจš, เจตเจฟเจ•เจพเจธ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจตเจฟเฉฑเจš เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจฆเฉ€ เจตเจง เจฐเจนเฉ€ เจญเฉ‚เจฎเจฟเจ•เจพ เจฆเฉ‡ เจ•เจพเจฐเจจ, เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเจพเจฒ เจœเฉเฉœเฉ‡ เจตเฉฑเจ–-เจตเฉฑเจ– เจชเฉœเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจธเฉฐเจธเจฅเจพเจตเจพเจ‚ เจฆเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจจเฉ‚เฉฐ เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฆเจพ เจฎเฉเฉฑเจฆเจพ เจ˜เฉฑเจŸ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจฎเฉเฉฑเจฆเจพ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจฆเจธเจคเฉ€ เจœเจพเจ‚เจšเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจเจพ เจธเจฎเฉ‡เจ‚ เจฆเฉ€ เจ–เจชเจค เจนเฉˆ, เจ‡เจธเจฒเจˆ เจ‡เจธ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจ•เจฆเจฎ เจšเฉเฉฑเจ•เจฃเจพ เจ‡เฉฑเจ• เจšเฉฐเจ—เจพ เจตเจฟเจšเจพเจฐ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš, เจฎเฉˆเจ‚ เจ•เจˆ เจกเฉŒเจ•เจฐ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจคเจฟเจ†เจฐ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจ…เจคเฉ‡ เจ‡เจธ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ‡ เจกเฉˆเจฎเฉ‹ เจธเจŸเฉˆเจ‚เจก เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจคเฉˆเจจเจพเจค เจ•เจฐเจจเจพ เจนเฉˆ เจฌเจพเจฐเฉ‡ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจจเฉ‚เฉฐ เจธเจพเจ‚เจเจพ เจ•เจฐเจพเจ‚เจ—เจพเฅค เจคเฉเจธเฉ€เจ‚ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจ…เจคเฉ‡ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจตเจฟเจตเจธเจฅเจฟเจค เจ•เจฐเจจเจพ เจนเฉˆ เจ‡เจธ เจจเจพเจฒ เจชเฉเจฐเจฏเฉ‹เจ— เจ•เจฐเจจ เจฒเจˆ เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจนเฉˆ เจ•เจฟ เจนเจฐเฉ‡เจ• เจฆเจพ เจตเจฟเจ•เจพเจธ เจ…เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเจพ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเจพ เจตเฉฑเจ–เจฐเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจนเฉ‡เจ เจพเจ‚ เจฎเฉˆเจ‚ เจ•เจˆ เจธเฉฐเจญเจต เจตเจฟเจ•เจฒเจช เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจพเจ‚เจ—เจพเฅค

เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจš เจธเจนเฉ‚เจฒเจคเจพเจ‚

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

เจนเฉˆเจกเฉ‹เจฒเจฟเฉฐเจŸ
https://github.com/hadolint/hadolint

เจ‡เฉฑเจ• เจ•เจพเจซเจผเฉ€ เจธเจงเจพเจฐเจจ เจ•เฉฐเจธเฉ‹เจฒ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจœเฉ‹ เจฎเจฆเจฆ เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจ‡เฉฑเจ• เจชเจนเจฟเจฒเฉ‡ เจ…เจจเฉเจฎเจพเจจ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเฉ€ เจธเจผเฉเฉฑเจงเจคเจพ เจ…เจคเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเจพ เจฎเฉเจฒเจพเจ‚เจ•เจฃ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเจฆเฉ€ เจนเฉˆ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจธเจฟเจฐเจซเจผ เจ…เจงเจฟเจ•เจพเจฐเจค เจšเจฟเฉฑเจคเจฐ เจฐเจœเจฟเจธเจŸเจฐเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจœเจพเจ‚ sudo เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ)เฅค

เจกเฉŒเจ•เจฐ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจš เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚

เจกเฉŒเจ•เจฒ
https://github.com/goodwithtech/dockle

เจ‡เฉฑเจ• เจ•เฉฐเจธเฉ‹เจฒ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจœเฉ‹ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ (เจœเจพเจ‚ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจฆเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจŸเจพเจฐ เจ†เจฐเจ•เจพเจˆเจต เจฆเฉ‡ เจจเจพเจฒ) เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ€ เจนเฉˆ เจœเฉ‹ เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจธเจผเฉเฉฑเจงเจคเจพ เจ…เจคเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ€ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ, เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจฒเฉ‡เจ…เจฐเจพเจ‚ เจ…เจคเฉ‡ เจธเฉฐเจฐเจšเจจเจพ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจฆเฉ€ เจนเฉˆ - เจ•เจฟเจนเฉœเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฌเจฃเจพเจ เจ—เจ เจนเจจ, เจ•เจฟเจนเฉœเฉ€เจ†เจ‚ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจตเจฐเจคเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ, เจ•เจฟเจนเฉœเฉ€เจ†เจ‚ เจตเฉŒเจฒเจฏเฉ‚เจฎ เจฎเจพเจŠเจ‚เจŸ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจ, เจ‡เฉฑเจ• เจ–เจพเจฒเฉ€ เจชเจพเจธเจตเจฐเจก เจฆเฉ€ เจฎเฉŒเจœเฉ‚เจฆเจ—เฉ€, เจ†เจฆเจฟ. d. เจนเฉเจฃ เจคเฉฑเจ• เจšเฉˆเจ•เจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจน เจธเจพเจกเฉ€เจ†เจ‚ เจ†เจชเจฃเฉ€เจ†เจ‚ เจ•เจˆ เจœเจพเจ‚เจšเจพเจ‚ เจ…เจคเฉ‡ เจธเจฟเจซเจผเจพเจฐเจธเจผเจพเจ‚ 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจนเฉˆเฅค CIS (เจ‡เฉฐเจŸเจฐเจจเฉˆเฉฑเจŸ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฒเจˆ เจ•เฉ‡เจ‚เจฆเจฐ) เจฌเฉˆเจ‚เจšเจฎเจพเจฐเจ• เจกเฉŒเจ•เจฐ เจฒเจˆ.
เจกเฉŒเจ•เจฐ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจš เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚

เจคเฉเจฐเจฟเจตเฉ€
https://github.com/aquasecurity/trivy

เจ‡เจธ เจธเจนเฉ‚เจฒเจค เจฆเจพ เจ‰เจฆเฉ‡เจธเจผ เจฆเฉ‹ เจ•เจฟเจธเจฎเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจ•เจฎเจœเจผเฉ‹เจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฒเฉฑเจญเจฃเจพ เจนเฉˆ - OS เจฌเจฟเจฒเจกเจพเจ‚ (เจเจฒเจชเจพเจˆเจจ, เจฐเฉˆเฉฑเจกเจนเฉˆเจŸ (เจˆเจเจฒ), เจธเฉˆเจ‚เจŸเจฐเฉ‹เจธ, เจกเฉ‡เจฌเฉ€เจ…เจจ เจœเฉ€เจเจจเจฏเฉ‚, เจ‰เจฌเฉฐเจŸเฉ‚ เจฆเฉเจ†เจฐเจพ เจธเจฎเจฐเจฅเจฟเจค) เจ…เจคเฉ‡ เจจเจฟเจฐเจญเจฐเจคเจพ (Gemfile.lock, Pipfile.lock, composer.lock, เจชเฉˆเจ•เฉ‡เจœ) เจจเจพเจฒ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚เฅค -lock.json , yarn.lock, cargo.lock)เฅค เจŸเฉเจฐเฉ€เจตเฉ€ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจธเจฅเจพเจจเจ• เจšเจฟเฉฑเจคเจฐ เจฆเฉ‹เจตเจพเจ‚ เจจเฉ‚เฉฐ เจธเจ•เฉˆเจจ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจจเจพเจฒ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เฉ€เจคเฉ€ .tar เจซเจพเจˆเจฒ เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจตเฉ€ เจธเจ•เฉˆเจจ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจกเฉŒเจ•เจฐ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจš เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚

เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจตเจฟเจ•เจฒเจช

เจ‡เฉฑเจ• เจ…เจฒเฉฑเจ— เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจตเจฐเจฃเจฟเจค เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจœเจผเจฎเจพเจ‰เจฃ เจฒเจˆ, เจฎเฉˆเจ‚ เจ•เฉเจ เจธเจฐเจฒ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจธเจพเจฐเฉ€เจ†เจ‚ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจพเจ‚เจ—เจพเฅค

เจฎเฉเฉฑเจ– เจตเจฟเจšเจพเจฐ เจ‡เจน เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐเจจเจพ เจนเฉˆ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒเจพเจ‚ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ€ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจธเจฎเจ—เจฐเฉ€ เจคเจธเจฆเฉ€เจ• เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเฉ‹ เจตเจฟเจ•เจพเจธ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ เจฌเจฃเจพเจ เจ—เจ เจนเจจ.

เจšเฉˆเฉฑเจ• เจ†เจชเจฃเฉ‡ เจ†เจช เจตเจฟเฉฑเจš เจนเฉ‡เจ  เจฒเจฟเจ–เฉ‡ เจ•เจฆเจฎเจพเจ‚ เจฆเฉ‡ เจธเจผเจพเจฎเจฒ เจนเจจ:

  1. เจฒเจฟเฉฐเจŸเจฐ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเฉ€ เจธเจผเฉเฉฑเจงเจคเจพ เจ…เจคเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพ เจนเฉˆเจกเฉ‹เจฒเจฟเฉฐเจŸ
  2. เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ…เฉฐเจคเจฎ เจ…เจคเฉ‡ เจตเจฟเจšเจ•เจพเจฐเจฒเฉ‡ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ€ เจธเจผเฉเฉฑเจงเจคเจพ เจ…เจคเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพ เจกเฉŒเจ•เจฒ
  3. เจฌเฉ‡เจธ เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจœเจจเจคเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจœเจพเจฃเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจ•เจฎเจœเจผเฉ‹เจฐเฉ€เจ†เจ‚ (CVE) เจฆเฉ€ เจฎเฉŒเจœเฉ‚เจฆเจ—เฉ€ เจ…เจคเฉ‡ เจ•เจˆ เจจเจฟเจฐเจญเจฐเจคเจพเจตเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพ - เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจคเฉเจฐเจฟเจตเฉ€

เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจ‡เจนเจจเจพเจ‚ เจ•เจฆเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจคเจฟเฉฐเจจ เจตเจฟเจ•เจฒเจช เจฆเฉ‡เจตเจพเจ‚เจ—เจพ:
เจชเจนเจฟเจฒเจพ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ GitLab เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ CI/CD เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจเจพ เจนเฉˆ (เจ‡เฉฑเจ• เจŸเฉˆเจธเจŸ เจ‰เจฆเจพเจนเจฐเจจ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ‡ เจตเจฐเจฃเจจ เจฆเฉ‡ เจจเจพเจฒ)เฅค
เจฆเฉ‚เจœเจพ เจธเจผเฉˆเฉฑเจฒ เจธเจ•เฉเจฐเจฟเจชเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ.
เจคเฉ€เจœเฉ‡ เจตเจฟเฉฑเจš เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเจ•เฉˆเจจ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจ‰เจฃเจพ เจธเจผเจพเจฎเจฒ เจนเฉˆเฅค
เจคเฉเจธเฉ€เจ‚ เจ‰เจน เจตเจฟเจ•เจฒเจช เจšเฉเจฃ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเฉ‹ เจคเฉเจนเจพเจกเฉ‡ เจฒเจˆ เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† เจนเฉˆ, เจ‡เจธเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจตเจฟเฉฑเจš เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจฒเฉ‹เฉœเจพเจ‚ เจฎเฉเจคเจพเจฌเจ• เจขเจพเจฒ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจธเจพเจฐเฉ€เจ†เจ‚ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจ…เจคเฉ‡ เจตเจพเจงเฉ‚ เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจตเฉ€ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจธเจฅเจฟเจค เจนเจจ: https://github.com/Swordfish-Security/docker_cicd

GitLab CI/CD เจตเจฟเฉฑเจš เจเจ•เฉ€เจ•เจฐเจฃ

เจชเจนเจฟเจฒเฉ‡ เจตเจฟเจ•เจฒเจช เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจตเจœเฉ‹เจ‚ GitLab เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจธเจฟเจธเจŸเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจšเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจชเฉœเจพเจตเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฒเฉฐเจ˜เจพเจ‚เจ—เฉ‡ เจ…เจคเฉ‡ เจ‡เจน เจชเจคเจพ เจฒเจ—เจพเจตเจพเจ‚เจ—เฉ‡ เจ•เจฟ GitLab เจจเจพเจฒ เจ‡เฉฑเจ• เจŸเฉˆเจธเจŸ เจตเจพเจคเจพเจตเจฐเจฃ เจจเฉ‚เฉฐ เจธเจ•เฉเจฐเฉˆเจš เจคเฉ‹เจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพ เจนเฉˆ, เจ‡เฉฑเจ• เจธเจ•เฉˆเจจเจฟเฉฐเจ— เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฌเจฃเจพเจ‰เจฃเจพ เจนเฉˆ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจฌเฉ‡เจคเจฐเจคเฉ€เจฌ เจšเจฟเฉฑเจคเจฐ - เจœเฉ‚เจธเจธเจผเฉŒเจช เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ‚เจš เจ•เจฐเจจเจพ เจนเฉˆเฅค

GitLab เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจเจพ
1. เจกเฉŒเจ•เจฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเฉ‹:

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

2. เจฎเฉŒเจœเฉ‚เจฆเจพ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจกเฉŒเจ•เจฐ เจธเจฎเฉ‚เจน เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ เจคเจพเจ‚ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจธเฉ‚เจกเฉ‹ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐ เจธเจ•เฉ‹:

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. เจนเฉเจฃ เจธเจพเจจเฉ‚เฉฐ GitLab Runner เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ: เจ‡เฉฑเจ• เจเจœเฉฐเจŸ เจœเฉ‹ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจจ 'เจคเฉ‡ เจธเจพเจฐเฉ‡ เจœเจผเจฐเฉ‚เจฐเฉ€ เจ“เจชเจฐเฉ‡เจธเจผเจจ เจšเจฒเจพเจเจ—เจพเฅค
เจจเจตเฉ€เจจเจคเจฎ เจธเฉฐเจธเจ•เจฐเจฃ เจกเจพเจ‰เจจเจฒเฉ‹เจก เจ•เจฐเฉ‹ (เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจฒเฉ€เจจเจ•เจธ 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. เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจฐเจจเจฐ เจจเฉ‚เฉฐ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจคเจพเจ‚ เจœเฉ‹ เจ‡เจน เจธเจพเจกเฉ‡ GitLab เจ‰เจฆเจพเจนเจฐเจจ เจจเจพเจฒ เจ‡เฉฐเจŸเจฐเฉˆเจ•เจŸ เจ•เจฐ เจธเจ•เฉ‡เฅค
เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, 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 เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฒเจˆ เจ‡เจจเจชเฉเจŸ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€)

เจจเฉ‹เจŸ: เจŸเฉเจฐเฉ€เจตเฉ€ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ Rpm ะธ Git. เจจเจนเฉ€เจ‚ เจคเจพเจ‚, เจ‡เจน RedHat-เจ…เจงเจพเจฐเจฟเจค เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเจ•เฉˆเจจ เจ•เจฐเจจ เจ…เจคเฉ‡ เจ•เจฎเจœเจผเฉ‹เจฐเฉ€ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฒเจˆ เจ…เฉฑเจชเจกเฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจ—เจฒเจคเฉ€เจ†เจ‚ เจชเฉˆเจฆเจพ เจ•เจฐเฉ‡เจ—เจพเฅค

2. เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจธเจพเจกเฉ€ เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฆเจฟเฉฑเจคเฉ€เจ†เจ‚ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ, GitLab เจ†เจชเจฃเฉ‡ เจ†เจช เจฌเจฟเจฒเจก เจ…เจคเฉ‡ เจธเจ•เฉˆเจจ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฆเฉ‡เจตเฉ‡เจ—เฉ€เฅค CI/CD โ†’ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจŸเฉˆเจฌ 'เจคเฉ‡ เจคเฉเจธเฉ€เจ‚ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจฆเฉ€ เจชเฉเจฐเจ—เจคเฉ€ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจšเจพเจฐ เจ•เฉฐเจฎ เจนเจจ. เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจคเจฟเฉฐเจจ เจธเจ•เฉˆเจจเจฟเฉฐเจ— เจจเจพเจฒ เจธเจฟเฉฑเจงเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจจเจœเจฟเฉฑเจ เจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจ†เจ–เจฐเฉ€ เจ‡เฉฑเจ• (เจฐเจฟเจชเฉ‹เจฐเจŸ) เจธเจ•เฉˆเจจเจฟเฉฐเจ— เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ–เจฟเฉฐเจกเฉ‡ เจนเฉ‹เจ เจซเจพเจˆเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจฐเจฟเจชเฉ‹เจฐเจŸ เจ‡เจ•เฉฑเจ เฉ€ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค
เจกเฉŒเจ•เจฐ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจš เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚
เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจŸเฉเจฐเฉ€เจตเฉ€ เจšเฉฑเจฒเจฃเจพ เจฌเฉฐเจฆ เจ•เจฐ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจœเจพเจ‚ เจจเจฟเจฐเจญเจฐเจคเจพ เจตเจฟเฉฑเจš เจ—เฉฐเจญเฉ€เจฐ เจ•เจฎเจœเจผเฉ‹เจฐเฉ€เจ†เจ‚ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚, เจนเฉˆเจกเฉ‹เจฒเจฟเฉฐเจŸ เจนเจฎเฉ‡เจธเจผเจพ เจ‡เฉฑเจ• เจธเจซเจฒเจคเจพ เจ•เฉ‹เจก เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจนเจฎเฉ‡เจธเจผเจพ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจจเจคเฉ€เจœเจพ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจจเจพเจฒ เจฌเจฟเจฒเจก เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ.

เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจ–เจพเจธ เจฒเฉ‹เฉœเจพเจ‚ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจเจ—เจœเจผเจฟเจŸ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจœเฉ‹ เจœเจฆเฉ‹เจ‚ เจ‡เจน เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจ—เฉฐเจญเฉ€เจฐเจคเจพ เจฆเฉ€เจ†เจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ, เจคเจพเจ‚ เจ‰เจน เจฌเจฟเจฒเจก เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจตเฉ€ เจฐเฉ‹เจ•เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจฌเจฟเจฒเจก เจคเจพเจ‚ เจนเฉ€ เจฌเฉฐเจฆ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพ เจœเฉ‡เจ•เจฐ เจŸเฉเจฐเฉ€เจตเฉ€ เจ‰เจธ เจจเจพเจœเจผเฉเจ•เจคเจพ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจ•เจฎเจœเจผเฉ‹เจฐเฉ€ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจธเจผเฉŒเจธเจŸเฉŒเจชเจฐ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจตเจฟเฉฑเจš เจฆเจฐเจธเจพเจˆ เจนเฉˆเฅค .gitlab-ci.yml.
เจกเฉŒเจ•เจฐ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจš เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚

เจนเจฐเฉ‡เจ• เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเจพ เจจเจคเฉ€เจœเจพ เจนเจฐเฉ‡เจ• เจธเจ•เฉˆเจจเจฟเฉฐเจ— เจ•เจพเจฐเจœ เจฆเฉ‡ เจฒเฉŒเจ— เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจ†เจฐเจŸเฉ€เจซเฉˆเจ•เจŸ เจญเจพเจ— เจตเจฟเฉฑเจš เจธเจฟเฉฑเจงเฉ‡ json เจซเจพเจˆเจฒเจพเจ‚ เจตเจฟเฉฑเจš, เจœเจพเจ‚ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ HTML เจฐเจฟเจชเฉ‹เจฐเจŸ เจตเจฟเฉฑเจš (เจนเฉ‡เจ เจพเจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ):
เจกเฉŒเจ•เจฐ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจš เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚

3. เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฅเฉ‹เฉœเฉเจนเจพ เจนเฉ‹เจฐ เจฎเจจเฉเฉฑเจ–เฉ€-เจชเฉœเฉเจนเจจ เจฏเฉ‹เจ— เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจชเฉ‡เจธเจผ เจ•เจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ€ เจชเจพเจˆเจฅเจจ เจธเจ•เฉเจฐเจฟเจชเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจคเจฟเฉฐเจจ JSON เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• HTML เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจจเฉเจ•เจธ เจฆเฉ‡ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค
เจ‡เจน เจธเจ•เฉเจฐเจฟเจชเจŸ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ เจฐเจฟเจชเฉ‹เจฐเจŸ เจŸเจพเจธเจ• เจฆเฉเจ†เจฐเจพ เจฒเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจธเจฆเจพ เจ…เฉฐเจคเจฎ เจ†เจฐเจŸเฉ€เจซเฉˆเจ•เจŸ เจ‡เฉฑเจ• เจฐเจฟเจชเฉ‹เจฐเจŸ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• HTML เจซเจพเจˆเจฒ เจนเฉˆเฅค เจธเจ•เฉเจฐเจฟเจชเจŸ เจธเจฐเฉ‹เจค เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจตเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจฒเฉ‹เฉœเจพเจ‚, เจฐเฉฐเจ—เจพเจ‚ เจ†เจฆเจฟ เจฆเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจฌเจฃเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค
เจกเฉŒเจ•เจฐ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจš เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚

เจธเจผเฉˆเฉฑเจฒ เจธเจ•เฉเจฐเจฟเจชเจŸ

เจฆเฉ‚เจœเจพ เจตเจฟเจ•เจฒเจช เจ‰เจนเจจเจพเจ‚ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจฒเจˆ เจขเฉเจ•เจตเจพเจ‚ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ CI/CD เจธเจฟเจธเจŸเจฎ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ เจœเจพเจ‚ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจซเจพเจฐเจฎ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ€เจ†เจ‚ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจนเฉ‹เจฃเฉ€เจ†เจ‚ เจšเจพเจนเฉ€เจฆเฉ€เจ†เจ‚ เจนเจจ เจœเฉ‹ เจธเจฟเฉฑเจงเฉ‡ เจนเฉ‹เจธเจŸ 'เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจ‡เจน เจตเจฟเจ•เจฒเจช เจ‡เฉฑเจ• เจฐเฉˆเจกเฉ€เจฎเฉ‡เจก เจธเจผเฉˆเฉฑเจฒ เจธเจ•เฉเจฐเจฟเจชเจŸ เจฆเฉเจ†เจฐเจพ เจ•เจตเจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจœเฉ‹ เจ‡เฉฑเจ• เจธเจพเจซเจผ เจตเจฐเจšเฉเจ…เจฒ (เจœเจพเจ‚ เจ…เจธเจฒเฉ€) เจฎเจธเจผเฉ€เจจ เจคเฉ‡ เจšเจฒเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจธเจ•เฉเจฐเจฟเจชเจŸ เจ‰เจนเฉ€ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเฉ‡ เจ—เจฟเจŸเจฒเฉˆเจฌ-เจฐเจจเจฐ.

เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจšเจฒเจพเจ‰เจฃ เจฒเจˆ, เจกเฉŒเจ•เจฐ เจธเจฟเจธเจŸเจฎ เจคเฉ‡ เจธเจฅเจพเจชเจฟเจค เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจกเฉŒเจ•เจฐ เจธเจฎเฉ‚เจน เจตเจฟเฉฑเจš เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

เจธเจ•เฉเจฐเจฟเจชเจŸ เจ–เฉเจฆ เจ‡เฉฑเจฅเฉ‡ เจฒเฉฑเจญเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ: docker_sec_check.sh

เจซเจพเจˆเจฒ เจฆเฉ‡ เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš, เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจ‡เจน เจฆเจฐเจธเจพเจ‰เจ‚เจฆเฉ‡ เจนเจจ เจ•เจฟ เจ•เจฟเจธ เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจธเจ•เฉˆเจจ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡ เจ•เจฟเจนเฉœเฉ€เจ†เจ‚ เจจเจพเจœเจผเฉเจ•เจคเจพ เจจเฉเจ•เจธ เจŸเฉเจฐเฉ€เจตเฉ€ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจค เจ—เจฒเจคเฉ€ เจ•เฉ‹เจก เจจเจพเจฒ เจฌเจพเจนเจฐ เจœเจพเจฃ เจฆเจพ เจ•เจพเจฐเจจ เจฌเจฃเจฆเฉ‡ เจนเจจเฅค

เจธเจ•เฉเจฐเจฟเจชเจŸ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจฆเฉŒเจฐเจพเจจ, เจธเจพเจฐเฉ€เจ†เจ‚ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ docker_tools, เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจ•เฉฐเจฎ เจฆเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจนเจจ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹