αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker
ហេហេ!

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αžαž“αžΆαž–αŸαž›αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸαŸ‡ αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž“αžΌαžœαžαž½αž“αžΆαž‘αžΈαž“αŸƒαž€αž»αž„αžαžΊαž“αŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž”αž‰αŸ’αž αžΆαž“αŸƒαž€αžΆαžšαž’αžΆαž“αžΆαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž“αŸƒαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž•αŸ’αžŸαŸαž„αŸ— αž“αž·αž„αž’αž„αŸ’αž‚αž—αžΆαž–αžŠαŸ‚αž›αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž‡αžΆαž˜αž½αž™αž€αž»αž„αžαžΊαž“αŸαžšαž‚αžΊαž˜αž·αž“αžŸαŸ’αžαž·αžαž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸ„αŸ‡αž‘αŸαŸ” αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ„αž™αžŠαŸƒαž‚αžΊαž‡αžΆαž€αžΆαžšαž„αžΆαžšαžŠαŸαž›αŸ†αž”αžΆαž€ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αžΆαžαŸ‹αžœαž·αž’αžΆαž“αž€αžΆαžšαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž‡αŸ†αž αžΆαž“αžŠαŸ†αž”αžΌαž„αž†αŸ’αž–αŸ„αŸ‡αž‘αŸ…αžšαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker αž‡αžΆαž…αŸ’αžšαžΎαž“ αž“αž·αž„αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αžαžΌαž…αž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αŸ” αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž”αŸ’αžšαžΎβ€‹αžŸαž˜αŸ’αž—αžΆαžšβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž–αž·αžŸαŸ„αž’αž“αŸβ€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αžšαž”αŸ€αž”β€‹αžšαŸ€αž”αž…αŸ†β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αžŸαžΆαž€αž›αŸ’αž”αž„β€‹αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–β€‹αž“αŸƒβ€‹αžšαžΌαž”αž—αžΆαž– Dockerfile αž“αž·αž„β€‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αŸ” αžœαžΆαž…αŸ’αž”αžΆαžŸαŸ‹αžŽαžΆαžŸαŸ‹αžαžΆαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‚αžΊαžαž»αžŸαž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž“αž»αžŸαŸ’αžŸαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž‡αž˜αŸ’αžšαžΎαžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ”

αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–

αž˜αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αŸ†αž“αž½αž™ αž“αž·αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ†αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž›αžΎαž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž•αŸ’αžŸαŸαž„αŸ—αž“αŸƒαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Docker αŸ” αž–αž½αž€αžœαžΆαžαŸ’αž›αŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžšαž½αž…αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž˜αž»αž“ (https://habr.com/ru/company/swordfish_security/blog/518758/#docker-security) αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž•αŸ’αžαŸ„αžαž›αžΎαž”αžΈαž“αŸƒαž–αž½αž€αžœαžΆ αžŠαŸ‚αž›αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž“αŸƒαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΌαž”αž—αžΆαž– Docker αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž§αž‘αžΆαž αžšαžŽαŸαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΆαŸ†αž„αž”αžΈαž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž”αŸ†αž–αž„αŸ‹αžαŸ‚αž˜αž½αž™ αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ”

αž αžΆαžŠαžΌαž›αžΈαž“
https://github.com/hadolint/hadolint

αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž»αž„αžŸαžΌαž›αžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αžŠαŸ‚αž›αž‡αž½αž™αžœαžΆαž™αžαž˜αŸ’αž›αŸƒαž–αžΈαž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž“αž·αž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž“αŸƒαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† Dockerfile αž‡αžΆαžŠαŸ†αž”αžΌαž„ (αž§αž‘αžΆαž αžšαžŽαŸ αž”αŸ’αžšαžΎαžαŸ‚αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αž‰αŸ’αž‰αžΆαž αž¬αž”αŸ’αžšαžΎ sudo)αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker

αž…αž
https://github.com/goodwithtech/dockle

αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž»αž„αžŸαžΌαž›αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαžšαžΌαž”αž—αžΆαž– (αž¬αž“αŸ…αž›αžΎαž•αŸ’αž‘αžΆαŸ†αž„αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€) αžŠαŸ‚αž›αž–αž·αž“αž·αžαŸ’αž™αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž“αž·αž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž“αŸƒαžšαžΌαž”αž—αžΆαž–αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™ αžŠαžΌαž…αž“αŸαŸ‡αžŠαŸ„αž™αž€αžΆαžšαžœαž·αž—αžΆαž‚αžŸαŸ’αžšαž‘αžΆαž”αŸ‹ αž“αž·αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž”αžŸαŸ‹αžœαžΆ - αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎ αž”αžšαž·αž˜αžΆαžŽαžαŸ’αžšαžΌαžœαž”αžΆαž“αž˜αŸ‰αŸ„αž“ αžœαžαŸ’αžαž˜αžΆαž“αž“αŸƒαž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αž‘αŸαŸ” CIS (Center for Internet Security) Benchmark αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ docker αŸ”
αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker

αž˜αž·αž“αžŸαŸ’αž˜αŸ„αŸ‡αžαŸ’αžšαž„αŸ‹
https://github.com/aquasecurity/trivy

αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸαŸ‡αž˜αžΆαž“αž‚αŸ„αž›αž”αŸ†αžŽαž„αžŸαŸ’αžœαŸ‚αž„αžšαž€αž—αžΆαž–αž„αžΆαž™αžšαž„αž‚αŸ’αžšαŸ„αŸ‡αž–αžΈαžšαž”αŸ’αžšαž—αŸαž‘ - αž”αž‰αŸ’αž αžΆαž”αž„αŸ’αž€αžΎαž OS (Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αžΆαŸ†αž‘αŸ’αžš) αž“αž·αž„αž”αž‰αŸ’αž αžΆαž’αžΆαžŸαŸ’αžšαŸαž™ (Gemfile.lock, Pipfile.lock, composer.lock, package-lock .json, yarn.lock, Cargo.lock)αŸ” Trivy αž’αžΆαž…αžŸαŸ’αž€αŸαž“αž‘αžΆαŸ†αž„αžšαžΌαž”αž—αžΆαž–αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ αž“αž·αž„αžšαžΌαž”αž—αžΆαž–αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹ αž αžΎαž™αž€αŸαž’αžΆαž…αžŸαŸ’αž€αŸαž“αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž―αž€αžŸαžΆαžš .tar αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‘αŸαžšαž‡αžΆαž˜αž½αž™αžšαžΌαž”αž—αžΆαž– Docker αž•αž„αžŠαŸ‚αžšαŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker

αž‡αž˜αŸ’αžšαžΎαžŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹

αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžΆαž€αž›αŸ’αž”αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαžŠαžΆαž…αŸ‹αž†αŸ’αž„αžΆαž™ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‡αžΆαž•αŸ’αž“αŸ‚αž€αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αŸ”

αž‚αŸ†αž“αž·αžαž…αž˜αŸ’αž”αž„αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž˜αžΆαžαž·αž€αžΆαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒ Dockerfiles αž“αž·αž„αžšαžΌαž”αž—αžΆαž– Docker αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž€αŸ†αž‘αž»αž„αž–αŸαž›αž’αž—αž·αžœαžŒαŸ’αžαŸ”

αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžαŸ’αž›αž½αž“αž―αž„αž˜αžΆαž“αž‡αŸ†αž αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

  1. αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž“αž·αž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž“αŸƒαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† Dockerfile αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ linter αž αžΆαžŠαžΌαž›αžΈαž“
  2. αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αž·αž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž“αŸƒαžšαžΌαž”αž—αžΆαž–αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αž·αž„αž˜αž’αŸ’αž™αž˜ - αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αž½αž™αŸ” αž…αž
  3. αž–αž·αž“αž·αžαŸ’αž™αžšαž€αž—αžΆαž–αž„αžΆαž™αžšαž„αž‚αŸ’αžšαŸ„αŸ‡αžŠαŸ‚αž›αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αž‡αžΆαž‘αžΌαž‘αŸ… (CVE) αž“αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž“αž·αž„αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸƒαž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™ - αžŠαŸ„αž™αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž˜αž·αž“αžŸαŸ’αž˜αŸ„αŸ‡αžαŸ’αžšαž„αŸ‹

αž’αžαŸ’αžαž”αž‘αž”αž“αŸ’αž‘αžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž‡αž˜αŸ’αžšαžΎαžŸαž”αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αž“αž»αžœαžαŸ’αžαž‡αŸ†αž αžΆαž“αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ–
αž‘αžΈαž˜αž½αž™αž‚αžΊαžŠαŸ„αž™αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ†αž–αž„αŸ‹ CI / CD αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαžšαž”αžŸαŸ‹ GitLab (αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž§αž‘αžΆαž αžšαžŽαŸαžŸαžΆαž€αž›αŸ’αž”αž„) αŸ”
αž‘αžΈαž–αžΈαžšαž‚αžΊαž”αŸ’αžšαžΎαžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŸαŸ‚αž›αŸ”
αž‘αžΈαž”αžΈαž‚αžΊαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– Docker αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αž€αŸαž“αžšαžΌαž”αž—αžΆαž– Docker αŸ”
αž’αŸ’αž“αž€αž’αžΆαž…αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‡αž˜αŸ’αžšαžΎαžŸαžŠαŸ‚αž›αžŸαžΆαž€αžŸαž˜αž“αžΉαž„αž’αŸ’αž“αž€αž”αŸ†αž•αž»αž αž•αŸ’αž‘αŸαžšαžœαžΆαž‘αŸ…αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž αžΎαž™αžŸαž˜αŸ’αžšαž”αžœαžΆαž‘αŸ…αžαžΆαž˜αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž―αž€αžŸαžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž“αž·αž„αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž”αž“αŸ’αžαŸ‚αž˜αž€αŸαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž•αž„αžŠαŸ‚αžšαŸ– https://github.com/Swordfish-Security/docker_cicd

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› GitLab CI/CD

αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž˜αŸ’αžšαžΎαžŸαž‘αžΈαž˜αž½αž™ αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αž‘αž»αž€ GitLab αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž‡αŸ†αž αžΆαž“ αž“αž·αž„αž˜αžΎαž›αž–αžΈαžšαž”αŸ€αž”αžšαŸ€αž”αž…αŸ†αž”αžšαž·αž™αžΆαž€αžΆαžŸαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ GitLab αž–αžΈαžŠαŸ†αž”αžΌαž„ αž”αž„αŸ’αž€αžΎαžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αž€αŸαž“ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžΆαž€αž›αŸ’αž”αž„ 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 αž‡αžΆ hostname αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ–

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 αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€ αž αžΎαž™αž˜αžΎαž›αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ rootαŸ–
αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker
αž€αŸ†αžŽαžαŸ‹αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžαŸ’αž˜αžΈ αž αžΎαž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ GitLab αŸ”

6. αž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αžαŸ’αž˜αžΈ αž§αž‘αžΆαž αžšαžŽαŸ cicd-test αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžœαžΆαž‡αžΆαž˜αž½αž™αž―αž€αžŸαžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ README.md:
αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker
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 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 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 αž“αž·αž„αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αŸ–
αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker
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 αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž… αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αž“αŸαŸ‡ αž™αžΎαž„αž˜αž·αž“αž˜αžΆαž“αž‡αŸ†αž αžΆαž“αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžšαž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž–αž½αž€αž‚αŸαž“αžΉαž„αž“αžΆαŸ†αž˜αž»αžαž‡αŸ†αž αžΆαž“αžŸαŸ’αž€αŸαž“ αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– αž“αž·αž„ Dockerfile αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ†αž–αž„αŸ‹

1. αž”αž“αŸ’αžαŸ‚αž˜αž―αž€αžŸαžΆαžšαž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„ mydockerfile.df (αž“αŸαŸ‡αž‚αžΊαž‡αžΆ Dockerfile αžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αžŸαžΆαž€αž›αŸ’αž”αž„) αž“αž·αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš GitLab CI/CD .gitlab-cicd.ymlαžŠαŸ‚αž›αžšαžΆαž™αž”αž‰αŸ’αž‡αžΈαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŸαŸ’αž€αŸαž“ (αž…αŸ†αžŽαžΆαŸ†αž…αŸ†αžŽαž»αž…αž€αŸ’αž“αž»αž„αžˆαŸ’αž˜αŸ„αŸ‡αž―αž€αžŸαžΆαžš)αŸ”

αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ YAML αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž…αŸ†αž“αž½αž“αž”αžΈ (Hadolint, Dockle αž“αž·αž„ Trivy) αžŠαŸ‚αž›αž“αžΉαž„αžœαž·αž—αžΆαž‚ Dockerfile αžŠαŸ‚αž›αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ αž“αž·αž„αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸαžš DOCKERFILE αŸ” αž―αž€αžŸαžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αž€αž…αŸαž‰αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„αŸ– https://github.com/Swordfish-Security/docker_cicd/

αžŠαž€αžŸαŸ’αžšαž„αŸ‹αž…αŸαž‰αž–αžΈ mydockerfile.df (αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž―αž€αžŸαžΆαžšβ€‹αž’αžšαžΌαž”αžΈβ€‹αžŠαŸ‚αž›β€‹αž˜αžΆαž“β€‹αžŸαŸ†αžŽαž»αŸ†β€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αžŽαŸ‚αž“αžΆαŸ†β€‹αžŠαŸ„αž™β€‹αž”αŸ†αž–αžΆαž“β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž”αž„αŸ’αž αžΆαž‰β€‹αž–αžΈβ€‹αžšαž”αŸ€αž”β€‹αžŠαŸ‚αž›β€‹αž§αž”αž€αžšαžŽαŸβ€‹αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš)αŸ” αžαŸ†αžŽαž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžšαŸ– mydockerfile.df

αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒ mydockerfile.df

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

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ YAML αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡ (αž―αž€αžŸαžΆαžšαžαŸ’αž›αž½αž“αž―αž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αž€αž…αŸαž‰αž–αžΈαžαŸ†αžŽαž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ– .gitlab-ci.yml):

αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒ .gitlab-ci.yml

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

αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αžŸαŸ’αž€αŸαž“αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‡αžΆαž”αžŽαŸ’αžŽαžŸαžΆαžš .tar αž•αž„αžŠαŸ‚αžš (αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž”αž‰αŸ’αž…αžΌαž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš YAML)

NB: Trivy αž‘αžΆαž˜αž‘αžΆαžšαžŠαŸ†αž‘αžΎαž„ rpm ΠΈ Git. αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αžœαžΆαž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž€αŸ†αž αž»αžŸαž“αŸ…αž–αŸαž›αžŸαŸ’αž€αŸαž“αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎ RedHat αž“αž·αž„αž‘αž‘αž½αž›αž”αžΆαž“αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž—αžΆαž–αž„αžΆαž™αžšαž„αž‚αŸ’αžšαŸ„αŸ‡αŸ”

2. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž“αŸ’αžαŸ‚αž˜αž―αž€αžŸαžΆαžšαž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„ αž™αŸ„αž„αž‘αŸ…αžαžΆαž˜αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž™αžΎαž„ GitLab αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹ αž“αž·αž„αžŸαŸ’αž€αŸαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αŸ” αž“αŸ…αž›αžΎαž•αŸ’αž‘αžΆαŸ†αž„ CI/CD β†’ Pipelines αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αžœαžŒαŸ’αžαž“αž—αžΆαž–αž“αŸƒαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αŸ”

αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž™αžΎαž„αž˜αžΆαž“αž—αžΆαžšαž€αž·αž…αŸ’αž…αž…αŸ†αž“αž½αž“αž”αž½αž“αŸ” αž–αž½αž€αž‚αŸαž”αžΈαž“αžΆαž€αŸ‹αž‡αžΆαž”αŸ‹αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αž€αŸαž“ αž αžΎαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™ (αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸ) αž”αŸ’αžšαž˜αžΌαž›αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αž–αžΈαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αžαŸ’αž…αžΆαžαŸ‹αžαŸ’αž…αžΆαž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž›αž‘αŸ’αž’αž•αž›αžŸαŸ’αž€αŸαž“αŸ”
αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker
αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ Trivy αž”αž‰αŸ’αžˆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αžœαžΆ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž—αžΆαž–αž„αžΆαž™αžšαž„αž‚αŸ’αžšαŸ„αŸ‡ CRITICAL αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž– αž¬αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αŸ” αž€αŸ’αž“αž»αž„αž–αŸαž›αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαž“αŸαŸ‡ Hadolint αžαŸ‚αž„αžαŸ‚αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž“αžΌαžœαž—αžΆαž–αž‡αŸ„αž‚αž‡αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αžœαžΆαžαŸ‚αž„αžαŸ‚αž˜αžΆαž“αž€αžΆαžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ αžŠαŸ‚αž›αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαžαŸ’αžšαžΌαžœαž”αž‰αŸ’αžˆαž”αŸ‹αŸ”

αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΌαžŠαž…αŸαž‰ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž€αŸαž”αž‰αŸ’αžˆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž•αž„αžŠαŸ‚αžš αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αž‰αŸ’αž αžΆαž“αŸƒαž€αžΆαžšαžšαž·αŸ‡αž‚αž“αŸ‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαž“αžΉαž„αž”αž‰αŸ’αžˆαž”αŸ‹αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚ Trivy αžšαž€αžƒαžΎαž‰αž—αžΆαž–αž„αžΆαž™αžšαž„αž‚αŸ’αžšαŸ„αŸ‡αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž—αžΆαž–αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸαžš SHOWSTOPPER αž“αŸ…αž€αŸ’αž“αž»αž„ .gitlab-ci.yml.
αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker

αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αžΈαž˜αž½αž™αŸ—αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž˜αžΎαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŸαŸ’αž€αŸαž“αž“αžΈαž˜αž½αž™αŸ—αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš json αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ αž¬αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸ HTML αžŸαžΆαž˜αž‰αŸ’αž‰ (αž”αž“αŸ’αžαŸ‚αž˜αž›αžΎαžœαžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜)αŸ–
αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker

3. αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αžŠαŸ‚αž›αž˜αž“αž»αžŸαŸ’αžŸαž’αžΆαž…αž’αžΆαž“αž”αžΆαž“αž”αž“αŸ’αžαž·αž… αžŸαŸ’αž‚αŸ’αžšαžΈαž” Python αžαžΌαž…αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ†αž”αŸ’αž›αŸ‚αž„αž―αž€αžŸαžΆαžš json αž”αžΈαž‘αŸ…αž‡αžΆαž―αž€αžŸαžΆαžš HTML αžαŸ‚αž˜αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“αžαžΆαžšαžΆαž„αž–αž·αž€αžΆαžšαž—αžΆαž–αŸ”
αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž€αž·αž…αŸ’αž…αž€αžΆαžšαžšαžΆαž™αž€αžΆαžšαžŽαŸαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αž αžΎαž™αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž…αž»αž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹αžœαžΆαž‚αžΊαž―αž€αžŸαžΆαžš HTML αžŠαŸ‚αž›αž˜αžΆαž“αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαŸ” αž”αŸ’αžšαž—αž–αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž€αŸαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŠαŸ‚αžš αž αžΎαž™αž’αžΆαž…αž”αŸ’αžšαŸ‚αž”αŸ’αžšαž½αž›αž‘αŸ…αžαžΆαž˜αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž–αžŽαŸŒαž‡αžΆαžŠαžΎαž˜αŸ”
αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– Docker

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŸαŸ‚αž›

αž‡αž˜αŸ’αžšαžΎαžŸαž‘αžΈαž–αžΈαžšαž‚αžΊαžŸαž˜αžšαž˜αŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžšαžŽαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžšαžΌαž”αž—αžΆαž– Docker αž˜αž·αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’ CI/CD αž¬αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αžŠαŸ‚αž›αž’αžΆαž…αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αŸ” αž‡αž˜αŸ’αžšαžΎαžŸαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αžŠαŸ„αž™αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŸαŸ‚αž›αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŠαŸ‚αž›αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŸαŸ’αž’αžΆαž (αž¬αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠ) αŸ” αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž’αŸ’αžœαžΎαžαžΆαž˜αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„ gitlab-runner αžαžΆαž„αž›αžΎαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ Docker αžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž“αŸ…αž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž αžΎαž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžαŸ’αžšαžΌαžœαžαŸ‚αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜ docker αŸ”

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαŸ’αž›αž½αž“αžœαžΆαž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ– docker_sec_check.sh

αž“αŸ…αžŠαžΎαž˜αž―αž€αžŸαžΆαžš αž’αžαŸαžšβ€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹β€‹αžαžΆβ€‹αžšαžΌαž”αž—αžΆαž–β€‹αž˜αž½αž™αžŽαžΆβ€‹αž‚αž½αžšβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αžŸαŸ’αž€αŸ‚αž“ αž αžΎαž™β€‹αž—αžΆαž–β€‹αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšβ€‹αž“αŸƒβ€‹αž–αž·αž€αžΆαžšαž—αžΆαž–β€‹αž“αžΉαž„β€‹αž’αŸ’αžœαžΎβ€‹αž±αŸ’αž™β€‹αž§αž”αž€αžšαžŽαŸβ€‹αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Trivy αž…αŸαž‰β€‹αžŠαŸ„αž™β€‹αž€αžΌαžŠβ€‹αž€αŸ†αž αž»αžŸβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αŸ”

αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž” αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž‰αž™αž€αž‘αŸ…αžαž 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 αž˜αž½αž™αž“αžΉαž„αž‡αž½αž™αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαž»αŸ†αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αž€αŸαž“αžšαžΌαž”αž—αžΆαž–αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„ αž‘αžΈαž–αžΈαžš (Dockerfile_tar) αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαž»αŸ†αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αž€αŸαž“αž―αž€αžŸαžΆαžš tar αž‡αžΆαž˜αž½αž™αžšαžΌαž”αž—αžΆαž–αŸ”

1. αž™αž€αž―αž€αžŸαžΆαžš Docker αž“αž·αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„ 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 αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž‚αž·αžαžαžΆαž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αžŠαŸαž›αŸ’αž’αž“αŸƒαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžšαžΌαž”αž—αžΆαž–αž™αŸ‰αžΆαž„αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αŸ” αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž”αž„αŸ‹αž”αŸ’αžšαžΆαž€αŸ‹ αž“αž·αž„αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒαž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αžαžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαžΌαž…αž‚αŸ’αž“αžΆ αž‚αžΌαžšαžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžŠαŸαžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαž αž¬αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž»αž‘αŸ’αž’αžŸαžΆαž’αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αž€αž»αž„αžŸαžΌαž› αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αž»αž„αžαžΊαž“αŸαžš αž‡αžΆαžŠαžΎαž˜αŸ” αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ…αž“αŸƒαž§αž”αž€αžšαžŽαŸαž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž“αž·αž„αžšαž”αŸ€αž”αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž–αž½αž€αžœαžΆαž’αžΆαž…αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αž”αž“αŸ’αžαž·αž…αŸ”

αž•αŸ’αž“αŸ‚αž€αžœαž·αž‡αŸ’αž‡αž˜αžΆαž“αž“αŸƒαžŸαŸ†αžŽαž»αŸ†αž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž‚αžΊαžαžΆαž–αž½αž€αžœαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž›αžΎαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž  αž αžΎαž™αž’αŸ’αž“αž€αž’αžΆαž…αž–αž·αžŸαŸ„αž’αž“αŸαž‡αžΆαž˜αž½αž™αž–αž½αž€αžœαžΆ αž“αž·αž„αž§αž”αž€αžšαžŽαŸαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αžšαž€αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŸαžΆαž€αžŸαž˜αž“αžΉαž„αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžš αž“αž·αž„αž›αž€αŸ’αžαžŽαŸˆαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž—αžΆαž–αž„αžΆαž™αžšαž„αž‚αŸ’αžšαŸ„αŸ‡αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž·αž€αŸ’αžŸαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž”αŸ’αžšαž’αžΆαž“αž”αž‘αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžαŸ’αžαž”αž‘αžŠαŸαž’αŸ†αž˜αž½αž™αž“αžΆαž–αŸαž›αž’αž“αžΆαž‚αžαŸ”

αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž˜αž‚αŸ’αž‚αž»αž‘αŸ’αž‘αŸαžŸαž€αŸαž“αŸαŸ‡ αžŸαŸ’αž‚αŸ’αžšαžΈαž” αž“αž·αž„αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αžΉαž„αž‡αž½αž™αž’αŸ’αž“αž€ αž“αž·αž„αž€αŸ’αž›αžΆαž™αž‡αžΆαž…αŸ†αžŽαž»αž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž‡αžΆαž„αž˜αž»αž“αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αž“αŸƒαž€αžΆαžšαž€αž»αž„αžαžΊαž“αŸαžšαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹