เดกเต‹เด•เตเด•เตผ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดšเต†เด•เตเด•เต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฐเต€เดคเดฟเด•เดณเตเด‚ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚

เดกเต‹เด•เตเด•เตผ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดšเต†เด•เตเด•เต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฐเต€เดคเดฟเด•เดณเตเด‚ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚
เดนเต‡ เดนเดฌเตผ!

เด†เดงเตเดจเดฟเด• เดฏเดพเดฅเดพเตผเดคเตเดฅเตเดฏเดคเตเดคเดฟเตฝ, เดตเดฟเด•เดธเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเดฟเตฝ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตˆเดธเต‡เดทเดจเตเดฑเต† เดตเตผเดฆเตเดงเดฟเดšเตเดšเตเดตเดฐเตเดจเตเดจ เดชเด™เตเด•เต เด•เดพเดฐเดฃเด‚, เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เดณเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เดตเดฟเดตเดฟเดง เด˜เดŸเตเดŸเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เดŽเดจเตเดฑเดฟเดฑเตเดฑเดฟเด•เดณเตเดŸเต†เดฏเตเด‚ เดธเตเดฐเด•เตเดท เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดถเตโ€Œเดจเด‚ เดเดฑเตเดฑเดตเตเด‚ เดชเตเดฐเดงเดพเดจเดชเตเดชเต†เดŸเตเดŸ เดชเตเดฐเดถเตโ€Œเดจเดฎเดฒเตเดฒ. เดฎเดพเดจเตเดตเตฝ เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เดจเดŸเดคเตเดคเตเดจเตเดจเดคเต เดธเดฎเดฏเดฎเต†เดŸเตเด•เตเด•เตเดจเตเดจเดคเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เดˆ เดชเตเดฐเด•เตเดฐเดฟเดฏ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดพเดฐเด‚เดญ เดจเดŸเดชเดŸเดฟเด•เดณเต†เด™เตเด•เดฟเดฒเตเด‚ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเดคเต เดจเดฒเตเดฒเดคเดพเดฃเต.

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เดจเดฟเดฐเดตเดงเดฟ เดกเต‹เด•เตเด•เตผ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเด‚ เดˆ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดกเต†เดฎเต‹ เดธเตเดฑเตเดฑเดพเตปเดกเต เดŽเด™เตเด™เดจเต† เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเด‚ เดžเดพเตป เดชเด™เตเด•เดฟเดŸเตเด‚. เดกเต‹เด•เตเด•เตผเดซเตˆเตฝ เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เดธเตเดฐเด•เตเดท เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดŽเด™เตเด™เดจเต† เดธเด‚เด˜เดŸเดฟเดชเตเดชเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเต†เดฑเตเดฑเต€เดฐเดฟเดฏเดฒเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เดŽเดฒเตเดฒเดพเดตเดฐเตเดŸเต†เดฏเตเด‚ เดตเดฟเด•เดธเดจเดตเตเด‚ เดจเดŸเดชเตเดชเดพเด•เตเด•เดฒเตเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเด™เตเด™เตพ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฃเต†เดจเตเดจเต เดตเตเดฏเด•เตเดคเดฎเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เดคเดพเดดเต† เดžเดพเตป เดธเดพเดงเตเดฏเดฎเดพเดฏ เดจเดฟเดฐเดตเดงเดฟ เด“เดชเตเดทเดจเตเด•เตพ เดจเตฝเด•เตเด‚.

เดธเตเดฐเด•เตเดทเดพ เดชเดฐเดฟเดถเต‹เดงเดจ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ

เดกเต‹เด•เตเด•เตผ เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเดฑเดฟเดจเตเดฑเต† เดตเดฟเดตเดฟเดง เดตเดถเด™เตเด™เดณเดฟเตฝ เดชเดฐเดฟเดถเต‹เดงเดจ เดจเดŸเดคเตเดคเตเดจเตเดจ เดตเดฟเดตเดฟเดง เดธเดนเดพเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเตเด‚ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเด‚ เดงเดพเดฐเดพเดณเด‚ เด‰เดฃเตเดŸเต. เด…เดตเดฏเดฟเตฝ เดšเดฟเดฒเดคเต เดฎเตเดฎเตเดชเดคเตเดคเต† เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต (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, เดชเดพเด•เตเด•เต‡เดœเต -lock.json , yarn.lock, cargo.lock). เดŸเตเดฐเดฟเดตเดฟเด•เตเด•เต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเดฒเต† เด’เดฐเต เดšเดฟเดคเตเดฐเดตเตเด‚ เด’เดฐเต เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เดšเดฟเดคเตเดฐเดตเตเด‚ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚, เด•เต‚เดŸเดพเดคเต† เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดšเต†เดฏเตเดค .tar เดซเดฏเดฒเดฟเดจเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚.

เดกเต‹เด•เตเด•เตผ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดšเต†เด•เตเด•เต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฐเต€เดคเดฟเด•เดณเตเด‚ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚

เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด“เดชเตเดทเดจเตเด•เตพ

เดตเดฟเดตเดฐเดฟเดšเตเดš เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เด’เดฐเต เด’เดฑเตเดฑเดชเตเดชเต†เดŸเตเดŸ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเตฝ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เด•เตเดฑเดšเตเดšเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดฟเตฝ เดŽเดฒเตเดฒเดพ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตเด‚ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดžเดพเตป เดจเตฝเด•เตเด‚.

เดกเดตเดฒเดชเตโ€Œเดฎเต†เดจเตเดฑเต เดธเดฎเดฏเดคเตเดคเต เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดš เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดกเต‹เด•เตเด•เตผ เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เดธเตเดตเดฏเดฎเต‡เดตเดฏเตเดณเตเดณ เด‰เดณเตเดณเดŸเด•เตเด• เดชเดฐเดฟเดถเต‹เดงเดจ เดŽเด™เตเด™เดจเต† เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเด‚ เดŽเดจเตเดจเต เด•เดพเดฃเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดชเตเดฐเดงเดพเดจ เด†เดถเดฏเด‚.

เดšเต†เด•เตเด•เต เดคเดจเตเดจเต† เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด˜เดŸเตเดŸเด™เตเด™เตพ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจเต:

  1. เด’เดฐเต เดฒเดฟเดจเตเดฑเตผ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Dockerfile เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เด•เตƒเดคเตเดฏเดคเดฏเตเด‚ เดธเตเดฐเด•เตเดทเดฏเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต เดนเดพเดกเต‹เดฒเดฟเดจเตเดฑเต
  2. เด’เดฐเต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดจเตเดคเดฟเดฎ, เด‡เดจเตเดฑเตผเดฎเต€เดกเดฟเดฏเดฑเตเดฑเต เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เด•เตƒเดคเตเดฏเดคเดฏเตเด‚ เดธเตเดฐเด•เตเดทเดฟเดคเดคเตเดตเดตเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต เดกเต‹เด•เตเด•เดฟเตพ
  3. เด…เดŸเดฟเดธเตเดฅเดพเดจ เด‡เดฎเต‡เดœเดฟเตฝ เดชเตŠเดคเตเดตเดพเดฏเดฟ เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจ เด•เต‡เดŸเตเดชเดพเดŸเตเด•เดณเตเดŸเต† (CVE) เดธเดพเดจเตเดจเดฟเดงเตเดฏเดตเตเด‚ เดจเดฟเดฐเดตเดงเดฟ เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เดณเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต - เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดฟเดตเดฟ

เดˆ เด˜เดŸเตเดŸเด™เตเด™เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฎเต‚เดจเตเดจเต เด“เดชเตเดทเดจเตเด•เตพ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดชเดฟเดจเตเดจเต€เดŸเต เดžเดพเตป เดจเตฝเด•เตเด‚:
เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ GitLab เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต CI/CD เดชเตˆเดชเตเดชเตเดฒเตˆเตป เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเด•เดฏเดพเดฃเต เด†เดฆเตเดฏเดคเตเดคเต‡เดคเต (เด’เดฐเต เดŸเต†เดธเตเดฑเตเดฑเต เด‡เตปเดธเตเดฑเตเดฑเตปเดธเต เด‰เดฏเตผเดคเตเดคเตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเตเดŸเต† เดตเดฟเดตเดฐเดฃเดคเตเดคเต‹เดŸเต†).
เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต เด’เดฐเต เดทเต†เตฝ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.
เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเตเด•เตพ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเต เดฎเต‚เดจเตเดจเดพเดฎเดคเตเดคเต‡เดคเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเต.
เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดเดฑเตเดฑเดตเตเด‚ เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เด“เดชเตเดทเตป เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เดพเดจเตเด‚ เด…เดคเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเดฑเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเดพเดจเตเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดตเดถเตเดฏเด™เตเด™เตพเด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚.

เด†เดตเดถเตเดฏเดฎเดพเดฏ เดŽเดฒเตเดฒเดพ เดซเดฏเดฒเตเด•เดณเตเด‚ เด…เดงเดฟเด• เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเด‚ เดถเต‡เด–เดฐเดคเตเดคเดฟเตฝ เดธเตเดฅเดฟเดคเดฟเดšเต†เดฏเตเดฏเตเดจเตเดจเต: https://github.com/Swordfish-Security/docker_cicd

GitLab CI/CD-เดฏเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดธเด‚เดฏเต‹เดœเดจเด‚

เด†เดฆเตเดฏ เด“เดชเตเดทเดจเดฟเตฝ, เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ GitLab เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเด™เตเด™เดจเต† เดธเตเดฐเด•เตเดทเดพ เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดจเต‹เด•เตเด•เตเด‚. เด‡เดตเดฟเดŸเต† เดžเด™เตเด™เตพ เด˜เดŸเตเดŸเด™เตเด™เดณเดฟเดฒเต‚เดŸเต† เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเด•เดฏเตเด‚ เด†เดฆเตเดฏเด‚ เดฎเตเดคเตฝ GitLab เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดŸเต†เดธเตเดฑเตเดฑเต เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดŽเด™เตเด™เดจเต† เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเด‚, เด’เดฐเต เดธเตเด•เดพเดจเดฟเด‚เด—เต เดชเตเดฐเด•เตเดฐเดฟเดฏ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดŸเต†เดธเตเดฑเตเดฑเต Dockerfile, เด’เดฐเต เดฑเดพเตปเดกเด‚ เด‡เดฎเต‡เดœเต เดŽเดจเตเดจเดฟเดต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚ - JuiceShop เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป.

GitLab เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต
1. เดกเต‹เด•เตเด•เตผ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•:

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

2. เดจเดฟเดฒเดตเดฟเดฒเต† เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต† เดกเต‹เด•เตเด•เตผ เด—เตเดฐเต‚เดชเตเดชเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเด•, เด…เดคเตเดตเดดเดฟ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเตเดกเต‹ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดคเต† เดกเต‹เด•เตเด•เดฑเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚:

sudo addgroup <username> docker

3. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดเดชเดฟ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•:

ip addr

4. เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเตฝ GitLab เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตโ€Œเดคเต เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด•, เดนเต‹เดธเตเดฑเตเดฑเต เดจเต†เดฏเดฟเดฎเดฟเดฒเต† 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 เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เตเดจเตเดจเดคเต เดตเดฐเต† เดžเด™เตเด™เตพ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต (เดฒเต‹เด—เต เดซเดฏเตฝ เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดตเดดเดฟ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเด•เตเดฐเดฟเดฏ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚: เดกเต‹เด•เตเด•เตผ เดฒเต‹เด—เตเด•เตพ -f gitlab).

5. เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• IP เดคเตเดฑเดจเตเดจเต เดฑเต‚เดŸเตเดŸเต เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเตเดณเตเดณ เดชเดพเดธเตโ€Œเดตเต‡เดกเต เดฎเดพเดฑเตเดฑเดพเตป เด†เดตเดถเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจ เด’เดฐเต เดชเต‡เดœเต เด•เดพเดฃเตเด•:
เดกเต‹เด•เตเด•เตผ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดšเต†เด•เตเด•เต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฐเต€เดคเดฟเด•เดณเตเด‚ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚
เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดพเดธเตโ€Œเดตเต‡เดกเต เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเต GitLab-เดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเด•.

6. เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเตเดฐเต‹เดœเด•เตโ€Œเดฑเตเดฑเต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต cicd-เดŸเต†เดธเตเดฑเตเดฑเต, เด†เดฐเด‚เดญ เดซเดฏเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดคเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด• README.md:
เดกเต‹เด•เตเด•เตผ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดšเต†เด•เตเด•เต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฐเต€เดคเดฟเด•เดณเตเด‚ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚
7. เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตพ GitLab Runner เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต: เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดชเตเดฐเด•เดพเดฐเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฏ เดŽเดฒเตเดฒเดพ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดเดœเดจเตเดฑเต.
เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด• (เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, 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. เด‡เดชเตเดชเต‹เตพ เดžเด™เตเด™เตพ เดฑเดฃเตเดฃเดฑเต† เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด…เดคเตเดตเดดเดฟ เด…เดคเดฟเดจเต เดžเด™เตเด™เดณเตเดŸเต† 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 เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเดฟเตฝ เดฎเต‚เดจเตเดจเต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ (เดนเดพเดกเต‹เดฒเดฟเดจเตเดฑเต, เดกเต‹เด•เตเด•เดฟเตพ, เดŸเตเดฐเดฟเดตเดฟ) เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดค เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเตเด‚ เดกเต‹เด•เตเด•เตผเดซเตˆเตฝ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏ เดšเดฟเดคเตเดฐเดตเตเด‚ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเด‚. เด†เดตเดถเตเดฏเดฎเดพเดฏ เดŽเดฒเตเดฒเดพ เดซเดฏเดฒเตเด•เดณเตเด‚ เดถเต‡เด–เดฐเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดŸเตเด•เตเด•เดพเด‚: 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: Trivy เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต เด†เตผเดชเดฟเดŽเด‚ ะธ เดœเดฟเดฑเตเดฑเดฟเดจเต†. เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, RedHat-เด…เดงเดฟเดทเตโ€Œเด เดฟเดค เด‡เดฎเต‡เดœเตเด•เตพ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เดดเตเด‚ เดฆเตเตผเดฌเดฒเดค เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเตเด•เตพ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เดดเตเด‚ เด‡เดคเต เดชเดฟเดถเด•เตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด‚.

2. เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดซเดฏเดฒเตเด•เตพ เดšเต‡เตผเดคเตเดค เดถเต‡เดทเด‚, เดžเด™เตเด™เดณเตเดŸเต† เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเดฟเดฒเต† เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต, GitLab เดฏเดพเดจเตเดคเตเดฐเดฟเด•เดฎเดพเดฏเดฟ เดฌเดฟเตฝเดกเต, เดธเตเด•เดพเตป เดชเตเดฐเด•เตเดฐเดฟเดฏ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด‚. CI/CD โ†’ เดชเตˆเดชเตเดชเต เดฒเตˆเดจเตเด•เตพ เดŸเดพเดฌเดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เดคเดฟ เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเด‚.

เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดžเด™เตเด™เตพเด•เตเด•เต เดจเดพเดฒเต เดœเต‹เดฒเดฟเด•เดณเตเดฃเตเดŸเต. เด…เดตเดฏเดฟเตฝ เดฎเต‚เดจเตเดจเต†เดฃเตเดฃเด‚ เดธเตเด•เดพเดจเดฟเด‚เด—เตเดฎเดพเดฏเดฟ เดจเต‡เดฐเดฟเดŸเตเดŸเต เด‡เดŸเดชเต†เดŸเตเดจเตเดจเต, เด…เดตเดธเดพเดจเดคเตเดคเต‡เดคเต (เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต) เดธเตเด•เดพเดจเดฟเด‚เด—เต เดซเดฒเด™เตเด™เดณเตเดณเตเดณ เดšเดฟเดคเดฑเดฟเด•เตเด•เดฟเดŸเด•เตเด•เตเดจเตเดจ เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดถเต‡เด–เดฐเดฟเด•เตเด•เตเดจเตเดจเต.
เดกเต‹เด•เตเด•เตผ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดšเต†เด•เตเด•เต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฐเต€เดคเดฟเด•เดณเตเด‚ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚
เดกเดฟเดซเต‹เตพเดŸเตเดŸเดพเดฏเดฟ, เดšเดฟเดคเตเดฐเดคเตเดคเดฟเดฒเต‹ เดกเดฟเดชเตปเดกเตปเดธเดฟเดฏเดฟเดฒเต‹ เด—เตเดฐเตเดคเดฐเดฎเดพเดฏ เด•เต‡เดŸเตเดชเดพเดŸเตเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏเดพเตฝ เดŸเตเดฐเดฟเดตเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต เดจเดฟเตผเดคเตเดคเตเดจเตเดจเต. เด…เดคเต‡ เดธเดฎเดฏเด‚, เดนเดพเดกเต‹เดฒเดฟเดจเตเดฑเต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เด’เดฐเต เดตเดฟเดœเดฏ เด•เต‹เดกเต เดจเตฝเด•เตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ เด…เดคเต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเดฟเตฝ เด•เดฒเดพเดถเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เดฌเดฟเตฝเดกเต เดจเดฟเตผเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เด•เดพเดฐเดฃเดฎเดพเด•เตเดจเตเดจเต.

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เด†เดตเดถเตเดฏเด•เดคเด•เดณเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดŽเด•เตเดธเดฟเดฑเตเดฑเต เด•เต‹เดกเต เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚, เด…เดคเตเดตเดดเดฟ เดˆ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค เดจเดฟเตผเดฃเดพเดฏเด•เดคเดฏเตเดŸเต† เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเดฎเตเดชเต‹เตพ, เด…เดต เดจเดฟเตผเดฎเตเดฎเดพเดฃ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเตเด‚ เดจเดฟเตผเดคเตเดคเตเดจเตเดจเต. เดžเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, SHOWSTOPPER เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ เดžเด™เตเด™เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏ เด•เตเดฐเดฟเดŸเตเดŸเดฟเด•เตเด•เดฒเดฟเดฑเตเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Trivy เด’เดฐเต เด…เดชเด•เดŸเดธเดพเดงเตเดฏเดค เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏเดพเตฝ เดฎเดพเดคเตเดฐเดฎเต‡ เดฌเดฟเตฝเดกเต เดจเดฟเตผเดคเตเดคเตเด•เดฏเตเดณเตเดณเต‚. .gitlab-ci.yml.
เดกเต‹เด•เตเด•เตผ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดšเต†เด•เตเด•เต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฐเต€เดคเดฟเด•เดณเตเด‚ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚

เด“เดฐเต‹ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเดฏเตเดŸเต†เดฏเตเด‚ เดซเดฒเด‚ เด“เดฐเต‹ เดธเตโ€Œเด•เดพเดจเดฟเด‚เด—เต เดŸเดพเดธเตโ€Œเด•เตเด•เดฟเดจเตเดฑเต†เดฏเตเด‚ เดฒเต‹เด—เดฟเดฒเต‹, เด†เตผเดŸเตเดŸเดฟเดซเดพเด•เตโ€ŒเดŸเตโ€Œเดธเต เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดฒเต† json เดซเดฏเดฒเตเด•เดณเดฟเดฒเต‹, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฒเดณเดฟเดคเดฎเดพเดฏ เด’เดฐเต HTML เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเดฟเดฒเต‹ (เดคเดพเดดเต†เดฏเตเดณเตเดณเดคเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ):
เดกเต‹เด•เตเด•เตผ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดšเต†เด•เตเด•เต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฐเต€เดคเดฟเด•เดณเตเด‚ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚

3. เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เตพ เด•เตเดฑเดšเตเดšเต เด•เต‚เดŸเตเดคเตฝ เดฎเดจเตเดทเตเดฏเตผเด•เตเด•เต เดตเดพเดฏเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เดฐเต‚เดชเดคเตเดคเดฟเตฝ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดฎเต‚เดจเตเดจเต JSON เดซเดฏเดฒเตเด•เดณเต† เด’เดฐเต เดŽเดšเตเดšเตเดŸเดฟเดŽเด‚เดŽเตฝ เดซเดฏเดฒเดพเดฏเดฟ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเดพเตป เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดชเตˆเดคเตเดคเตบ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.
เดˆ เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดŸเดพเดธเตโ€Œเด•เต เดฎเตเด–เต‡เดจเดฏเดพเดฃเต เดธเดฎเดพเดฐเด‚เดญเดฟเดšเตเดšเดคเต, เด…เดคเดฟเดจเตเดฑเต† เด…เดจเตเดคเดฟเดฎ เด†เตผเดŸเตเดŸเดฟเดซเดพเด•เตเดฑเตเดฑเต เด’เดฐเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเดณเตเดณ เด’เดฐเต 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

เดŽเดฒเตเดฒเดพ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตเดฎเตเดณเตเดณ เดกเต‹เด•เตเด•เตผ เดšเดฟเดคเตเดฐเด‚

เด’เดฐเต เดฎเต‚เดจเตเดจเดพเด‚ เดฌเดฆเดฒเดพเดฏเดฟ, เดธเตเดฐเด•เตเดทเดพ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตเดณเตเดณ เด’เดฐเต เด‡เดฎเต‡เดœเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดžเดพเตป เดฐเดฃเตเดŸเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเตเด•เตพ เดธเดฎเดพเดนเดฐเดฟเดšเตเดšเต. เด’เดฐเต เดถเต‡เด–เดฐเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดšเดฟเดคเตเดฐเด‚ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดธเต†เดฑเตเดฑเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เด’เดฐเต เดกเต‹เด•เตเด•เตผเดซเดฟเตฝ เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚, เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต (Dockerfile_tar) เด’เดฐเต เด‡เดฎเต‡เดœเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดŸเดพเตผ เดซเดฏเตฝ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดธเต†เดฑเตเดฑเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚.

1. เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดจเตเดฌเดจเตเดง เดกเต‹เด•เตเด•เตผ เดซเดฏเดฒเตเด‚ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเด‚ เดŽเดŸเตเด•เตเด•เตเด• https://github.com/Swordfish-Security/docker_cicd/tree/master/Dockerfile.
2. เด…เดธเด‚เดฌเตเดฒเดฟเด•เตเด•เดพเดฏเดฟ เดžเด™เตเด™เตพ เด‡เดคเต เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต:

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

3. เด…เดธเด‚เดฌเตเดฒเดฟ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟเดฏ เดถเต‡เดทเด‚, เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพ เด’เดฐเต เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เด‰เดฃเตเดŸเดพเด•เตเด•เตเดจเตเดจเต. เด…เดคเต‡ เดธเดฎเดฏเด‚, เดžเด™เตเด™เตพ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณ เดšเดฟเดคเตเดฐเดคเตเดคเดฟเดจเตเดฑเต† เดชเต‡เดฐเดฟเดจเตŠเดชเตเดชเด‚ DOCKERIMAGE เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เด•เตˆเดฎเดพเดฑเตเด•เดฏเตเด‚ เดžเด™เตเด™เดณเตเดŸเต† เดฎเต†เดทเต€เดจเดฟเตฝ เดจเดฟเดจเตเดจเต เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจ Dockerfile เดฎเตŒเดฃเตเดŸเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. /เดกเต‹เด•เตเด•เตผเดซเดฟเตฝ (เดˆ เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดธเดฎเตเดชเต‚เตผเดฃเตเดฃ เดชเดพเดค เด†เดตเดถเตเดฏเดฎเดพเดฃเต†เดจเตเดจเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•):

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•