เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker

เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker
Hey Habr!

เปƒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เป€เบ›เบฑเบ™โ€‹เบˆเบดเบ‡โ€‹เบ—เบตเปˆโ€‹เบ—เบฑเบ™โ€‹เบชเบฐโ€‹เป„เบซเบกโ€‹, เป€เบ™เบทเปˆเบญเบ‡โ€‹เบˆเบฒเบโ€‹เบžเบฒโ€‹เบฅเบฐโ€‹เบšเบปเบ”โ€‹เบšเบฒเบ”โ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เบเบฒเบ™โ€‹เป€เบžเบตเปˆเบกโ€‹เบ‚เบถเป‰เบ™โ€‹, เบšเบฑเบ™โ€‹เบซเบฒโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบšโ€‹เบ›เบฐโ€‹เบเบฑเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบ›เบญเบ”โ€‹เป„เบžโ€‹เบ‚เบญเบ‡โ€‹เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบ•เปˆเบฒเบ‡เป†โ€‹เปเบฅเบฐโ€‹เบซเบ™เปˆเบงเบโ€‹เบ‡เบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบเปˆเบฝเบงโ€‹เบ‚เป‰เบญเบ‡โ€‹เบเบฑเบšโ€‹เบ•เบนเป‰โ€‹เบšเบฑเบ™โ€‹เบˆเบธโ€‹เปเบกเปˆเบ™โ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เบ—เบตเปˆโ€‹เบชเปเบฒโ€‹เบ„เบฑเบ™โ€‹เบซเบ™เป‰เบญเบโ€‹. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบนเปˆเบกเบทเปเบกเปˆเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบ, เบชเบฐเบ™เบฑเป‰เบ™เบกเบฑเบ™เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เป€เบžเบทเปˆเบญเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบตเป‰.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบญเบเบˆเบฐเปเบšเปˆเบ‡เบ›เบฑเบ™เบชเบฐเบ„เบดเบšเบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบธเบ›เบฐเบเบญเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker เบซเบผเบฒเบเบญเบฑเบ™เปเบฅเบฐเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบชเบฐเปเบ”เบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเป€เบžเบทเปˆเบญเบ—เบปเบ”เบชเบญเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบตเป‰. เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบญเบธโ€‹เบ›เบฐโ€‹เบเบญเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบฅเบญเบ‡โ€‹เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เบ„เบงเบฒเบกโ€‹เบ›เบญเบ”โ€‹เป„เบžโ€‹เบ‚เบญเบ‡โ€‹เบฎเบนเบšโ€‹เบžเบฒเบš Dockerfile เปเบฅเบฐโ€‹เบ„เปเบฒโ€‹เปเบ™เบฐโ€‹เบ™เปเบฒโ€‹. เบกเบฑเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ—เบธเบเป†เบ„เบปเบ™เปเบกเปˆเบ™เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบ‚เป‰เบญเบเบˆเบฐเปƒเบซเป‰เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบซเบผเบฒเบเบขเปˆเบฒเบ‡.

เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบ„เบงเบฒเบกโ€‹เบ›เบญเบ”โ€‹เป„เบžโ€‹เบญเบธโ€‹เบ›เบฐโ€‹เบเบญเบ™โ€‹

เบกเบตเบซเบผเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ•เบปเบงเบŠเปˆเบงเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปเบฅเบฐเบชเบฐเบ„เบดเบšเบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ”เป‰เบฒเบ™เบ•เปˆเบฒเบ‡เป†เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™ Docker. เบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเปเบฅเป‰เบงเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ (https://habr.com/ru/company/swordfish_security/blog/518758/#docker-security), เปเบฅเบฐเปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™เบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเบˆเบฐเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบชเบฒเบกเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เป€เบŠเบดเปˆเบ‡เบเบงเบกเป€เบญเบปเบฒเบชเปˆเบงเบ™เปƒเบซเบเปˆเบ‚เบญเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบชเปเบฒเบฅเบฑเบšเบฎเบนเบšเบžเบฒเบš Docker เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เบˆเบฐเบชเบฐเปเบ”เบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบชเบฒเบกเบชเบดเปˆเบ‡เบญเปเบฒเบ™เบงเบเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ—เปเปˆเบ”เบฝเบงเป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž.

เบฎเบฒเป‚เบ”เบฅเบดเบ™
https://github.com/hadolint/hadolint

เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบ„เบญเบ™เป‚เบŠเบ™เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบŠเปˆเบงเบ, เป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบฐเบกเบฒเบ™เบ—เปเบฒเบญเบดเบ”, เบ›เบฐเป€เบกเบตเบ™เบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ Dockerfile (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบฎเบนเบšเบžเบฒเบšเบซเบผเบทเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ sudo).

เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker

Dockle
https://github.com/goodwithtech/dockle

console utility เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบฎเบนเบšเบžเบฒเบš (เบซเบผเบทเบเบฑเบš tar archive เบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเปƒเบ”เบซเบ™เบถเปˆเบ‡), เป€เบŠเบดเปˆเบ‡เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบฑเป‰เบ™, เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบŠเบฑเป‰เบ™เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบกเบฑเบ™ - เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เป€เบŠเบดเปˆเบ‡. เบ›เบฐเบฅเบดเบกเบฒเบ™เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡, เบกเบตเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เปเบฅเบฐเบญเบทเปˆเบ™เป†. d. เบกเบฒเบฎเบญเบ”เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบเบฒเบ™เบเบงเบ”เบชเบญเบšเปเบกเปˆเบ™เบšเปเปˆเปƒเบซเบเปˆเบซเบผเบฒเบเปเบฅเบฐเปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบเบงเบ”เบชเบญเบšเปเบฅเบฐเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡. CIS (เบชเบนเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ—เบฒเบ‡เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”) Benchmark เบชเปเบฒเบฅเบฑเบš Docker.
เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker

เป€เบฅเบฑเบเป†เบ™เป‰เบญเบเป†
https://github.com/aquasecurity/trivy

เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ™เบตเป‰เบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบชเบญเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆ - เบšเบฑเบ™เบซเบฒเบเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ OS (เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป‚เบ”เบ Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu) เปเบฅเบฐเบšเบฑเบ™เบซเบฒเบเบฑเบš dependencies (Gemfile.lock, Pipfile.lock, composer.lock, package -lock.json , yarn.lock, cargo.lock). Trivy เบชเบฒเบกเบฒเบ”เบชเบฐเปเบเบ™เป„เบ”เป‰เบ—เบฑเบ‡เบฎเบนเบšเบžเบฒเบšเปƒเบ™ repository เปเบฅเบฐเบฎเบนเบšเบžเบฒเบšเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™, เปเบฅเบฐเบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบชเบฐเปเบเบ™เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเป„เบŸเบฅเปŒ .tar เบ—เบตเปˆเป‚เบญเบ™เบ”เป‰เบงเบเบฎเบนเบšเบžเบฒเบš Docker.

เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker

เบ—เบฒเบ‡โ€‹เป€เบฅเบทเบญเบโ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบญเบธโ€‹เบ›เบฐโ€‹เบเบญเบ™โ€‹

เป€เบžเบทเปˆเบญเบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเป‚เบ”เบ”เบ”เปˆเบฝเบง, เบ‚เป‰เบญเบเบˆเบฐเปƒเบซเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบญเบธเบ›เบฐเบเบญเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบšเบฒเบ‡เบขเปˆเบฒเบ‡.

เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเป€เบ™เบทเป‰เบญเบซเบฒเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡ Dockerfiles เปเบฅเบฐเบฎเบนเบšเบžเบฒเบš Docker เบ—เบตเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ.

เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  1. เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ Dockerfile เป‚เบ”เบเปƒเบŠเป‰ linter utility เบฎเบฒเป‚เบ”เบฅเบดเบ™
  2. เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเบชเบธเบ”เบ—เป‰เบฒเบเปเบฅเบฐเบฅเบฐเบ”เบฑเบšเบเบฒเบ‡เป‚เบ”เบเปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ” Dockle
  3. เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเป‚เบ”เบเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ (CVE) เปƒเบ™เบฎเบนเบšเบžเบฒเบšเบžเบทเป‰เบ™เบ–เบฒเบ™ เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบช - เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ” เป€เบฅเบฑเบเป†เบ™เป‰เบญเบเป†

เบ•เปเปˆเบกเบฒเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเปƒเบซเป‰เบชเบฒเบกเบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰:
เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เป‚เบ”เบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เปเปˆ CI / CD เป‚เบ”เบเปƒเบŠเป‰ GitLab เป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡ (เบกเบตเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบเปˆเบฝเบงเบเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš).
เบญเบฑเบ™เบ—เบตเบชเบญเบ‡เปเบกเปˆเบ™เบเบฒเบ™เปƒเบŠเป‰ Shell script.
เบญเบฑเบ™เบ—เบตเบชเบฒเบกเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš Docker เป€เบžเบทเปˆเบญเบชเบฐเปเบเบ™เบฎเบนเบšเบžเบฒเบš Docker.
เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบทเบญเบเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเป€เบˆเบปเป‰เบฒเบ—เบตเปˆเบชเบธเบ”, เป‚เบญเบ™เบกเบฑเบ™เป„เบ›เบชเบนเปˆเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบฅเบฐเบ›เบฑเบšเบกเบฑเบ™เปƒเบซเป‰เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เป„เบŸเบฅเปŒเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบฑเบ‡เปเบปเบ” เปเบฅเบฐเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™: https://github.com/Swordfish-Security/docker_cicd

เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เป€เบ‚เบปเป‰เบฒเปƒเบ™ GitLab CI/CD

เปƒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเป‚เบ”เบเปƒเบŠเป‰เบฅเบฐเบšเบปเบšเป€เบเบฑเบšเบฎเบฑเบเบชเบฒ GitLab เป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡. เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ›เป‚เบ”เบเบœเปˆเบฒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เปเบฅเบฐเบ„เบดเบ”เบญเบญเบเบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฑเบš GitLab เบˆเบฒเบ scratch, เบชเป‰เบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเบฐเปเบเบ™เปเบฅเบฐเป€เบ›เบตเบ”เบ•เบปเบง utilities เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบš Dockerfile เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเบฐเบฎเบนเบšเบžเบฒเบšเบชเบธเปˆเบก - เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ JuiceShop .

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ GitLab
1. เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Docker:

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

2. เป€เบžเบตเปˆเบกเบœเบนเป‰เปƒเบŠเป‰เบ›เบฐเบˆเบธเบšเบฑเบ™เป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบธเปˆเบก docker เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš docker เป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เปƒเบŠเป‰ sudo:

sudo addgroup <username> docker

3. เบŠเบญเบเบซเบฒ IP เบ‚เบญเบ‡เบ—เปˆเบฒเบ™:

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 เบชเปเบฒเป€เบฅเบฑเบ”เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ” (เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฒเบกเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบญเบญเบเป„เบŸเบฅเปŒเบšเบฑเบ™เบ—เบถเบ: docker logs -f gitlab).

5. เป€เบ›เบตเบ” IP เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเปเบฅเบฐเป€เบšเบดเปˆเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ›เปˆเบฝเบ™เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบฎเบฒเบ:
เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker
เบ•เบฑเป‰เบ‡เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เปƒเปเปˆ เปเบฅเบฐเป„เบ›เบ—เบตเปˆ GitLab.

6. เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปƒเบซเบกเปˆ, เบ•เบปเบงเบขเปˆเบฒเบ‡ cicd-test เปเบฅเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบกเบฑเบ™เบ”เป‰เบงเบเป„เบŸเบฅเปŒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ README.md:
เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker
7. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡ GitLab Runner: เบ•เบปเบงเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เบฒเบกเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป.
เบ”เบฒเบงเป‚เบซเบฅเบ”เป€เบงเบตเบŠเบฑเบ™เบซเบผเป‰เบฒเบชเบธเบ” (เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบชเปเบฒเบฅเบฑเบš Linux 64-bit):

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 เบชเปเบฒเบฅเบฑเบš Runner เปเบฅเบฐเป€เบฅเบตเปˆเบกเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™:

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. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ Runner เป€เบžเบทเปˆเบญเปƒเบซเป‰เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบžเบปเบงเบžเบฑเบ™เบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡ GitLab เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.
เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เป€เบ›เบตเบ”เบซเบ™เป‰เบฒ Settings-CI/CD (http://OUR_IP_ADDRESS/root/cicd-test/-/settings/ci_cd) เปเบฅเบฐเปƒเบ™เปเบ–เบš Runners เบŠเบญเบเบซเบฒ URL เปเบฅเบฐ token เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™:
เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker
11. เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ Runner เป‚เบ”เบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ—เบ™ URL เปเบฅเบฐ Registration token:

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 เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบ, เป€เบŠเบดเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบกเบตเบ‚เบฑเป‰เบ™เบ•เบญเบ™เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปเบฅเบฐเบšเบฑเบ™เบˆเบธเบกเบฑเบ™, เปเบ•เปˆเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบชเบดเปˆเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบˆเบฐเบ™เปเบฒเบซเบ™เป‰เบฒเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบชเบฐเปเบเบ™เปเบฅเบฐเบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบšเปเบฅเบฐ Dockerfile เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ.

เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบ—เปเปˆโ€‹

1. เป€เบžเบตเปˆเบกเป„เบŸเบฅเปŒเปƒเบชเปˆเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ mydockerfile.df (เบ™เบตเป‰เปเบกเปˆเบ™ Dockerfile เบ—เบปเบ”เบชเบญเบšเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเบงเบ”เบชเบญเบš) เปเบฅเบฐเป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™ GitLab CI/CD .gitlab-cicd.yml, เป€เบŠเบดเปˆเบ‡เบฅเบฒเบเบŠเบทเปˆเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบชเบฐเปเบเบ™ (เบซเบกเบฒเบเป€เบซเบ”เบˆเบธเบ”เปƒเบ™เบŠเบทเปˆเป„เบŸเบฅเปŒ).

เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ YAML เบกเบตเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเบฒเบกเบญเบฑเบ™ (Hadolint, Dockle, เปเบฅเบฐ Trivy) เบ—เบตเปˆเบˆเบฐเบงเบดเป€เบ„เบฒเบฐ Dockerfile เบ—เบตเปˆเป€เบฅเบทเบญเบเปเบฅเบฐเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบ•เบปเบงเปเบ› DOCKERFILE. เป„เบŸเบฅเปŒเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบกเบฒเบˆเบฒเบ repository: 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 archive (เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบ›เปˆเบฝเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบชเปเบฒเบฅเบฑเบšเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เปƒเบ™เป„เบŸเบฅเปŒ YAML).

NB: Trivy เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ rpm ะธ เป„เบ›. เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบกเบฑเบ™เบˆเบฐเบชเป‰เบฒเบ‡เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบชเบฐเปเบเบ™เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆ RedHat เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเปˆเบฝเบ‡.

2. เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบžเบตเปˆเบกเป„เบŸเบฅเปŒเปƒเบชเปˆ repository, เบญเบตเบ‡เบ•เบฒเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ™เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, GitLab เบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบฅเบฐเบชเบฐเปเบเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เปƒเบ™เปเบ–เบš CI/CD โ†’ Pipelines เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเบ„เบทเบšเบซเบ™เป‰เบฒเบ‚เบญเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบกเบต 4 เบงเบฝเบเบ‡เบฒเบ™. เบชเบฒเบกเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบเบฒเบ™เบชเบฐเปเบเบ™เป‚เบ”เบเบเบปเบ‡, เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบ (เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™) เบฅเบงเบšเบฅเบงเบกเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ‡เปˆเบฒเบเป†เบˆเบฒเบเป„เบŸเบฅเปŒเบ—เบตเปˆเบเบฐเปเบˆเบเบเบฐเบˆเบฒเบเบ”เป‰เบงเบเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเปเบเบ™.
เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker
เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, Trivy เบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบ–เป‰เบฒเบกเบตเบˆเบธเบ”เบญเปˆเบญเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบเบ–เบทเบเบเบงเบ”เบžเบปเบšเปƒเบ™เบฎเบนเบšเบžเบฒเบš เบซเบผเบทเบเบฒเบ™เบ‚เบถเป‰เบ™เบเบฑเบš. เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, Hadolint เบชเบฐเป€เบซเบกเบตเบชเบปเปˆเบ‡เบ„เบทเบ™เบฅเบฐเบซเบฑเบ”เบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบชเบฐเป€เบซเบกเบตเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบขเบธเบ”เป€เบŠเบปเบฒ.

เบญเบตเบ‡เบ•เบฒเบกเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ„เปˆเบฒเบฅเบฐเบซเบฑเบ”เบญเบญเบเป€เบžเบทเปˆเบญเบงเปˆเบฒเป€เบกเบทเปˆเบญเบชเบดเปˆเบ‡เบญเปเบฒเบ™เบงเบเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบเบงเบ”เบžเบปเบšเบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™, เบžเบงเบเป€เบ‚เบปเบฒเบเปเปˆเบขเบธเบ”เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบˆเบฐเบขเบธเบ”เป€เบŠเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒ Trivy เบเบงเบ”เบžเบปเบšเบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเบเบฑเบšเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบ•เบปเบงเปเบ› SHOWSTOPPER เปƒเบ™ .gitlab-ci.yml.
เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป„เบ”เป‰เปƒเบ™เบšเบฑเบ™เบ—เบถเบเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบงเบฝเบเบ‡เบฒเบ™เบเบฒเบ™เบชเบฐเปเบเบ™, เป‚เบ”เบเบเบปเบ‡เปƒเบ™เป„เบŸเบฅเปŒ json เปƒเบ™เบชเปˆเบงเบ™ artifacts, เบซเบผเบทเปƒเบ™เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™ HTML เปเบšเบšเบ‡เปˆเบฒเบเบ”เบฒเบ (เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบงเปˆเบฒเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰):
เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker

3. เป€เบžเบทเปˆเบญเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบกเบฐเบ™เบธเบ”เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เป€เบฅเบฑเบเบ™เป‰เบญเบ, script Python เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ›เปˆเบฝเบ™เบชเบฒเบกเป„เบŸเบฅเปŒ JSON เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบŸเบฅเปŒ HTML เบ—เบตเปˆเบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡.
เบชเบฐเบ„เบฃเบดเบšเบ™เบตเป‰เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเป‚เบ”เบเบงเบฝเบเบ‡เบฒเบ™เบฅเบฒเบเบ‡เบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เปเบฅเบฐเบชเบดเปˆเบ‡เบ›เบญเบกเบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เป„เบŸเบฅเปŒ HTML เบ—เบตเปˆเบกเบตเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™. เปเบซเบผเปˆเบ‡ script เบเบฑเบ‡เบขเบนเปˆเปƒเบ™ repository เปเบฅเบฐเบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ•เบปเบงเปƒเบซเป‰เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™, เบชเบต, เปเบฅเบฐเบญเบทเปˆเบ™เป†.
เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Docker

Shell script

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเบชเบญเบ‡เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเบงเบ”เป€เบšเบดเปˆเบ‡เบฎเบนเบšเบžเบฒเบš Docker เบขเบนเปˆเบ™เบญเบเบฅเบฐเบšเบปเบš CI / CD เบซเบผเบทเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบเบปเบ‡เปƒเบ™เป€เบˆเบปเป‰เบฒเบžเบฒเบš. เบ•เบปเบงเป€เบฅเบทเบญเบเบ™เบตเป‰เบ–เบทเบเบ›เบปเบเบ„เบธเบกเบ”เป‰เบงเบเบชเบฐเบ„เบดเบšเปเบเบฐเบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป„เบ”เป‰เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡ virtual (เบซเบผเบทเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบˆเบดเบ‡) เบ—เบตเปˆเบชเบฐเบญเบฒเบ”. script เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ”เบฝเบงเบเบฑเบ™เบเบฑเบš gitlab-runner เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡.

เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฐเบ„เบฃเบดเบšเป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบชเบณเป€เบฅเบฑเบ”, Docker เบ•เป‰เบญเบ‡เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบฅเบฐเบšเบปเบš เปเบฅเบฐเบœเบนเป‰เปƒเบŠเป‰เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ•เป‰เบญเบ‡เบขเบนเปˆเปƒเบ™เบเบธเปˆเบก docker.

script เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เบ—เบตเปˆเบ™เบตเป‰: docker_sec_check.sh

เปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡เป„เบŸเบฅเปŒ, เบ•เบปเบงเปเบ›เบฅเบฐเบšเบธเบงเปˆเบฒเบฎเบนเบšเบžเบฒเบšเปƒเบ”เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฐเปเบเบ™ เปเบฅเบฐเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ”เป‰เบฒเบ™เบงเบดเบˆเบฒเบ™เบญเบฑเบ™เปƒเบ”เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰ Trivy utility เบญเบญเบเบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ”เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰.

เปƒเบ™โ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ” scriptโ€‹, เบญเบธโ€‹เบ›เบฐโ€‹เบเบญเบ™โ€‹เบ›เบฐโ€‹เป‚เบซเบเบ”โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ”เบฒเบงโ€‹เป‚เบซเบผเบ”โ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบšเบปเบšโ€‹ 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

เบฎเบนเบšเบžเบฒเบš Docker เบ—เบตเปˆเบกเบตเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”

เป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเบชเบฒเบก, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบฅเบงเบšเบฅเบงเบกเบชเบญเบ‡ Dockerfiles เบ‡เปˆเบฒเบเป†เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบตเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ”เป‰เบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž. เบซเบ™เบถเปˆเบ‡ Dockerfile เบˆเบฐเบŠเปˆเบงเบเบชเป‰เบฒเบ‡เบŠเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเปเบเบ™เบฎเบนเบšเบžเบฒเบšเบˆเบฒเบ repository, เบ—เบตเบชเบญเบ‡ (Dockerfile_tar) เบˆเบฐเบŠเปˆเบงเบเบชเป‰เบฒเบ‡เบŠเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเปเบเบ™เป„เบŸเบฅเปŒ tar เบเบฑเบšเบฎเบนเบšเบžเบฒเบš.

1. เป€เบญเบปเบฒเป„เบŸเบฅเปŒ Docker เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เปเบฅเบฐ scripts เบˆเบฒเบ repository https://github.com/Swordfish-Security/docker_cicd/tree/master/Dockerfile.
2. เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เบ•เบปเบงเบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบเบญเบš:

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

3. เบซเบผเบฑเบ‡เบˆเบฒเบเบ›เบฐเบเบญเบšเบชเปเบฒเป€เบฅเบฑเบ”เปเบฅเป‰เบง, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบตเบˆเบฒเบเบฎเบนเบš. เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™เบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก DOCKERIMAGE เบ”เป‰เบงเบเบŠเบทเปˆเบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบปเบ™เปƒเบˆเปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ Dockerfile เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบซเบฒเป„เบŸเบฅเปŒ. /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

ะ ะตะทัƒะปัŒั‚ะฐั‚ั‹

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบŠเบธเบ”เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบญเบธเบ›เบฐเบเบญเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเปเบเบ™ Docker artifacts, เป€เบŠเบดเปˆเบ‡, เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ, เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเบเบงเบกเป€เบญเบปเบฒเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบ‚เบญเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบฎเบนเบšเบžเบฒเบš. เบเบฑเบ‡เบกเบตเบˆเปเบฒเบ™เบงเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบˆเปˆเบฒเบเปเบฅเบฐเบšเปเปˆเป€เบชเบเบ„เปˆเบฒเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ”เบฝเบงเบเบฑเบ™, เปเบ•เป‰เบกเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ—เบตเปˆเบชเบงเบเบ‡เบฒเบกเบซเบผเบทเป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ”เบฝเบงเปƒเบ™เป‚เบซเบกเบ” console, เบเบฒเบ™เบ›เบปเบเบซเบธเป‰เบกเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบชเบฐเบžเบฒเบšเบฅเบงเบกเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ›เบฒเบเบปเบ”เบ‚เบถเป‰เบ™เป€เบฅเบฑเบเบ™เป‰เบญเบเบ•เปเปˆเบกเบฒ. .

เบชเบดเปˆเบ‡เบ—เบตเปˆเบ”เบตเบเปˆเบฝเบงเบเบฑเบšเบŠเบธเบ”เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เปเบฅเบฐเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ—เบปเบ”เบฅเบญเบ‡เบเบฑเบšเบžเบงเบเบกเบฑเบ™เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบญเบทเปˆเบ™เป†เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบฅเบฐเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เปเบ™เปˆเบ™เบญเบ™, เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบžเบปเบšเป€เบซเบฑเบ™เบ„เบงเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบถเบเบชเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบชเบฐเป€เบžเบฒเบฐ, เปเบ•เปˆเบ™เบตเป‰เปเบกเปˆเบ™เบซเบปเบงเบ‚เปเป‰เบชเปเบฒเบฅเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบกเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบ„เบนเปˆเบกเบทเบ™เบตเป‰, เบชเบฐเบ„เบดเบšเปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปƒเบŠเป‰เบ•เปˆเบฒเบ‡เป†เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เปเบฅเบฐเบเบฒเบเป€เบ›เบฑเบ™เบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบ›เบญเบ”เป„เบžเบเบงเปˆเบฒเปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เบšเบฑเบ™เบˆเบธ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™