ืฉื™ื˜ื•ืช ื•ื“ื•ื’ืžืื•ืช ืœื™ื™ืฉื•ื ืฉืœ ื›ืœื™ ืขื–ืจ ืœื‘ื“ื™ืงืช ืื‘ื˜ื—ื” ืฉืœ 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

ื›ืœื™ ืขื–ืจ ืœืžืกื•ืฃ ืฉืขื•ื‘ื“ ืขื ืชืžื•ื ื” (ืื• ืขื ืืจื›ื™ื•ืŸ tar ืฉืžื•ืจ ืฉืœ ืชืžื•ื ื”), ืฉื‘ื•ื“ืง ืืช ื ื›ื•ื ื•ืชื” ื•ืื‘ื˜ื—ื” ืฉืœ ืชืžื•ื ื” ืžืกื•ื™ืžืช ื›ื›ื–ื•, ืžื ืชื— ืืช ื”ืฉื›ื‘ื•ืช ื•ื”ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืฉืœื” - ืื™ืœื• ืžืฉืชืžืฉื™ื ื ื•ืฆืจื•, ื‘ืื™ืœื• ื”ื•ืจืื•ืช ืžืฉืชืžืฉื™ื, ืื™ืœื• ื ืคื—ื™ื ืžื•ืจื›ื‘ื™ื, ื ื•ื›ื—ื•ืช ืฉืœ ืกื™ืกืžื” ืจื™ืงื” ื•ื›ื•'. ื“ ืขื“ ื›ื” ืžืกืคืจ ื”ืฆ'ืงื™ื ืื™ื ื• ื’ื“ื•ืœ ื‘ืžื™ื•ื—ื“ ื•ืžื‘ื•ืกืก ืขืœ ืžืกืคืจ ื‘ื“ื™ืงื•ืช ื•ื”ืžืœืฆื•ืช ืฉืœื ื•. ืžื“ื“ CIS (ืžืจื›ื– ืœืื‘ื˜ื—ืช ืื™ื ื˜ืจื ื˜). ืขื‘ื•ืจ Docker.
ืฉื™ื˜ื•ืช ื•ื“ื•ื’ืžืื•ืช ืœื™ื™ืฉื•ื ืฉืœ ื›ืœื™ ืขื–ืจ ืœื‘ื“ื™ืงืช ืื‘ื˜ื—ื” ืฉืœ Docker

ื˜ืจื™ื•ื•ื™
https://github.com/aquasecurity/trivy

ื›ืœื™ ืขื–ืจ ื–ื” ื ื•ืขื“ ืœืžืฆื•ื ืฉื ื™ ืกื•ื’ื™ื ืฉืœ ืคื’ื™ืขื•ื™ื•ืช - ื‘ืขื™ื•ืช ื‘ื‘ื ื™ื™ืช ืžืขืจื›ืช ื”ืคืขืœื” (ื ืชืžื›ืช ืขืœ ื™ื“ื™ Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu) ื•ื‘ืขื™ื•ืช ืขื ืชืœื•ืช (Gemfile.lock, Pipfile.lock, composer.lock, ื—ื‘ื™ืœื” -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 ื‘ืฉื ื”ืžืืจื— ื‘ื›ืชื•ื‘ืช ืฉืœืš:

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: ืกื•ื›ืŸ ืฉื™ืจื™ืฅ ืืช ื›ืœ ื”ืคืขื•ืœื•ืช ื”ื“ืจื•ืฉื•ืช ืœืคื™ ื‘ืงืฉื”.
ื”ื•ืจื“ ืืช ื”ื’ืจืกื” ื”ืขื“ื›ื ื™ืช ื‘ื™ื•ืชืจ (ื‘ืžืงืจื” ื–ื”, ืขื‘ื•ืจ ืœื™ื ื•ืงืก 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. ื”ื•ืกืฃ ืžืฉืชืžืฉ ืžืขืจื›ืช ื”ืคืขืœื” ืขื‘ื•ืจ 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 ืžืฆื ืืช ื›ืชื•ื‘ืช ื”ืืชืจ ื•ืืกื™ืžื•ืŸ ื”ืจื™ืฉื•ื:
ืฉื™ื˜ื•ืช ื•ื“ื•ื’ืžืื•ืช ืœื™ื™ืฉื•ื ืฉืœ ื›ืœื™ ืขื–ืจ ืœื‘ื“ื™ืงืช ืื‘ื˜ื—ื” ืฉืœ Docker
11. ื”ืจืฉื•ื ืืช ื”ืจืฅ ืขืœ ื™ื“ื™ ื”ื—ืœืคืช ื›ืชื•ื‘ืช ื”ืืชืจ ื•ืืกื™ืžื•ืŸ ื”ืจื™ืฉื•ื:

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

ื”ืชื•ื›ืŸ ืฉืœ mydockerple.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)

ื”ืขืจื”: ื˜ืจื™ื•ื•ื™ ื“ื•ืจืฉ ื”ืชืงื ื” ืกืœ"ื“ ะธ ืกื™ืœื•ืŸ. ืื—ืจืช, ื”ื•ื ื™ื™ืฆื•ืจ ืฉื’ื™ืื•ืช ื‘ืขืช ืกืจื™ืงืช ืชืžื•ื ื•ืช ืžื‘ื•ืกืกื•ืช RedHat ื•ืงื‘ืœืช ืขื“ื›ื•ื ื™ื ืœืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ ื”ืคื’ื™ืขื•ืช.

2. ืœืื—ืจ ื”ื•ืกืคืช ืงื‘ืฆื™ื ืœืžืื’ืจ, ืœืคื™ ื”ื”ื•ืจืื•ืช ื‘ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ืฉืœื ื•, GitLab ืชืชื—ื™ืœ ืื•ื˜ื•ืžื˜ื™ืช ืืช ืชื”ืœื™ืš ื”ื‘ื ื™ื™ื” ื•ื”ืกืจื™ืงื”. ื‘ื›ืจื˜ื™ืกื™ื™ื” CI/CD โ†’ Pipelines ืชื•ื›ืœ ืœืจืื•ืช ืืช ื”ืชืงื“ืžื•ืช ื”ื”ื•ืจืื•ืช.

ื›ืชื•ืฆืื” ืžื›ืš, ื™ืฉ ืœื ื• ืืจื‘ืข ืžืฉื™ืžื•ืช. ืฉืœื•ืฉื” ืžื”ื ืขื•ืกืงื™ื ื™ืฉื™ืจื•ืช ื‘ืกืจื™ืงื”, ื•ื”ืื—ืจื•ืŸ (Report) ืื•ืกืฃ ื“ื•ื— ืคืฉื•ื˜ ืžืงื‘ืฆื™ื ืžืคื•ื–ืจื™ื ืขื ืชื•ืฆืื•ืช ืกืจื™ืงื”.
ืฉื™ื˜ื•ืช ื•ื“ื•ื’ืžืื•ืช ืœื™ื™ืฉื•ื ืฉืœ ื›ืœื™ ืขื–ืจ ืœื‘ื“ื™ืงืช ืื‘ื˜ื—ื” ืฉืœ Docker
ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, Trivy ืžืคืกื™ืงื” ืœืคืขื•ืœ ืื ืžื–ื•ื”ื•ืช ืคื’ื™ืขื•ื™ื•ืช ืงืจื™ื˜ื™ื•ืช ื‘ืชืžื•ื ื” ืื• ื‘ืชืœื•ืช. ื‘ืžืงื‘ื™ืœ, Hadolint ืชืžื™ื“ ืžื—ื–ื™ืจื” ืงื•ื“ ื”ืฆืœื—ื” ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ืชืžื™ื“ ืžื‘ื™ื ืœื”ืขืจื•ืช, ืžื” ืฉื’ื•ืจื ืœื”ืคืกืงืช ื”ื‘ื ื™ื™ื”.

ื‘ื”ืชืื ืœื“ืจื™ืฉื•ืช ื”ืกืคืฆื™ืคื™ื•ืช ืฉืœืš, ืืชื” ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ ืงื•ื“ ื™ืฆื™ืื” ื›ืš ืฉื›ืืฉืจ ื›ืœื™ ืขื–ืจ ืืœื• ืžื–ื”ื™ื ื‘ืขื™ื•ืช ื‘ืขืœื•ืช ืงืจื™ื˜ื™ื•ืช ืžืกื•ื™ืžืช, ื”ื ื’ื ืขื•ืฆืจื™ื ืืช ืชื”ืœื™ืš ื”ื‘ื ื™ื™ื”. ื‘ืžืงืจื” ืฉืœื ื•, ื”-build ื™ื™ืคืกืง ืจืง ืื 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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”