
ããã«ã¡ã¯ãHabrïŒ
çŸä»£ã®çŸå®ã§ã¯ãéçºããã»ã¹ã«ãããã³ã³ããåã®åœ¹å²ãå¢å€§ããŠãããããã³ã³ããã«é¢é£ããããŸããŸãªæ®µéããšã³ãã£ãã£ã®ã»ãã¥ãªãã£ã確ä¿ãããšããåé¡ã¯æåŸã®å Žæã§ã¯ãããŸãããæåã¢ãŒãã§ãã§ãã¯ãå®è¡ããã«ã¯æéãããããããå°ãªããšãæåã®æé ãå®è¡ããŠãã®ããã»ã¹ãèªååãããšããã§ãããã
ãã®èšäºã§ã¯ãããã€ãã®Dockerã»ãã¥ãªãã£ãŠãŒãã£ãªãã£ãå®è£ ããããã®æ¢è£œã®ã¹ã¯ãªãããšããã®ããã»ã¹ããã¹ãããããã®å°ããªãã¢ã¹ã¿ã³ããå±éããæ¹æ³ã«ã€ããŠèª¬æããŸãããªãœãŒã¹ã䜿çšããŠãã€ã¡ãŒãžãšDockerfileåœä»€ã®ã»ãã¥ãªãã£ãã¹ãããã»ã¹ãæŽçããæ¹æ³ã詊ãããšãã§ããŸããéçºãšå®è£ ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã¯äººã«ãã£ãŠç°ãªãããšã¯æãããªã®ã§ã以äžã«ããã€ãã®å¯èœãªãªãã·ã§ã³ã瀺ããŸãã
ã»ãã¥ãªãã£ãã§ãã¯ãŠãŒãã£ãªãã£
Dockerã€ã³ãã©ã¹ãã©ã¯ãã£ã®ããŸããŸãªåŽé¢ããã¹ãããããŸããŸãªãã«ããŒã¢ããªã±ãŒã·ã§ã³ãšã¹ã¯ãªããããããŸãããããã®ããã€ãã¯ãåã®èšäºïŒhttps://habr.com/ru/company/swordfish_security/blog/518758/#docker-securityïŒã§ãã§ã«èª¬æãããŠããŸãããã®è³æã§ã¯ãã¡ã€ã³ãã«ããŒãã3ã€ã«çŠç¹ãåœãŠãããšæããŸããéçºäžã«æ§ç¯ãããDockerã€ã¡ãŒãžã®ã»ãã¥ãªãã£èŠä»¶ã®äžéšãããã«ãã»ãã¥ãªãã£ãã§ãã¯ãå®è¡ããããã«ããã3ã€ã®ãŠãŒãã£ãªãã£ã1ã€ã®ãã€ãã©ã€ã³ã«æ¥ç¶ããæ¹æ³ã®äŸã瀺ããŸãã
ãããªã³ã
https://github.com/hadolint/hadolint
æåã®æŠç®ãšããŠãDockerfileåœä»€ã®æ£ç¢ºæ§ãšã»ãã¥ãªãã£ãè©äŸ¡ããã®ã«åœ¹ç«ã€éåžžã«åçŽãªã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ïŒããšãã°ãèš±å¯ãããã€ã¡ãŒãžã¬ãžã¹ããªã®ã¿ã䜿çšããããsudoã䜿çšããïŒã

Dockle
https://github.com/goodwithtech/dockle
ç¹å®ã®ç»åèªäœã®æ£ç¢ºæ§ãšã»ãã¥ãªãã£ããã§ãã¯ãããã®ã¬ã€ã€ãŒãšæ§æïŒäœæããããŠãŒã¶ãŒãæé ïŒãåæãããç»åïŒãŸãã¯ç»åã®ä¿åãããtarã¢ãŒã«ã€ãïŒãæäœããã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ããŠã³ããããŠããããªã¥ãŒã ã空ã®ãã¹ã¯ãŒãã®ååšãªã©ã䜿çšããŸããããã§ãã¯ã®æ°ã¯ããã»ã©å€ãã¯ãªããDockerã®CISïŒCenter for Internet SecurityïŒãã³ãããŒã¯ã®ç¬èªã®ãã§ãã¯ãšæšå¥šäºé ã®ããã€ãã«åºã¥ããŠããŸãã

ããªããŒ
https://github.com/aquasecurity/trivy
ãã®ãŠãŒãã£ãªãã£ã¯ãOSãã«ãã®åé¡ïŒAlpineãRedHatïŒELïŒãCentOSãDebian GNUãUbuntuã§ãµããŒãïŒãšäŸåé¢ä¿ã®åé¡ïŒGemfile.lockãPipfileïŒã®2çš®é¡ã®è匱æ§ãèŠã€ããããšãç®çãšããŠããŸãã lockãcomposer.lockãpackage-lock.jsonãyarn.lockãCargo.lockïŒãTrivyã¯ããªããžããªå ã®ã€ã¡ãŒãžãšããŒã«ã«ã€ã¡ãŒãžã®äž¡æ¹ãã¹ãã£ã³ã§ããã ãã§ãªããDockerã€ã¡ãŒãžã䜿çšããŠè»¢éããã.tarãã¡ã€ã«ã«åºã¥ããŠã¹ãã£ã³ããããšãã§ããŸãã

ãŠãŒãã£ãªãã£ã®å®è£ ãªãã·ã§ã³
説æããã¢ããªã±ãŒã·ã§ã³ãåé¢ããç¶æ ã§è©Šãããã«ããã¹ãŠã®ãŠãŒãã£ãªãã£ãç°¡åãªããã»ã¹ã§ã€ã³ã¹ããŒã«ããããã®æé ã説æããŸãã
äž»ãªã¢ã€ãã¢ã¯ãéçºäžã«äœæãããDockerfileããã³Dockerã€ã¡ãŒãžã®èªåã³ã³ãã³ãæ€èšŒãå®è£ ããæ¹æ³ã瀺ãããšã§ãã
ãã§ãã¯èªäœã¯ãæ¬¡ã®æé ã§æ§æãããŠããŸãã
- Dockerfileåœä»€ã®æ£ç¢ºæ§ãšå®å šæ§ã®ç¢ºèª-Hadolintãªã³ã¿ãŒã䜿çš
- DockleãŠãŒãã£ãªãã£ã䜿çšããŠã¿ãŒã²ããã€ã¡ãŒãžãšäžéã€ã¡ãŒãžã®æ£ç¢ºæ§ãšã»ãã¥ãªãã£ã確èªãã
- TrivyãŠãŒãã£ãªãã£ã䜿çšããŠãããŒã¹ã€ã¡ãŒãžã®æ¢ç¥ã®è匱æ§ïŒCVEïŒãšå€æ°ã®äŸåé¢ä¿ã確èªããŸãã
ãã®èšäºã®åŸåã§ããããã®æé ãå®è£ ããããã®3ã€ã®ãªãã·ã§ã³ã瀺ããŸãã
æåã«ãGitLabã®äŸã䜿çšããŠCI / CDãã€ãã©ã€ã³ãæ§æããŸãïŒãã¹ãã€ã³ã¹ã¿ã³ã¹ãçºçãããããã»ã¹ã®èª¬æä»ãïŒã
2ã€ç®ã¯ãã·ã§ã«ã¹ã¯ãªããã䜿çšããããšã§ãã
3ã€ç®ã¯ã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ã°ã«ãŒãã«è¿œå ããŠãsudoãä»ããã«dockerãæäœã§ããããã«ããŸãã
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 -fgitlabïŒã
5.ãã©ãŠã¶ã§ããŒã«ã«IPãéããrootãŠãŒã¶ãŒã®ãã¹ã¯ãŒãã倿Žããææ¡ã®ããããŒãžã衚瀺ããŸãã

æ°ãããã¹ã¯ãŒããèšå®ããŠGitLabã«ç§»åããŸãã
6.æ°ãããããžã§ã¯ããäŸãã°CICDãã¹ããäœæããèµ·åãã¡ã€ã«ã§åæåREADME.mdïŒ

èŠæ±ã«å¿ããŠãå¿ èŠãªãã¹ãŠã®æäœãèµ·åãããšãŒãžã§ã³ãïŒ7.ä»ãç§ãã¡ã¯GitLabã©ã³ããŒãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
ææ°ããŒãžã§ã³ãããŠã³ããŒãããŸãïŒãã®å ŽåãLinux 64ãããã®å ŽåïŒã
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
8.å®è¡å¯èœã«ããŸãã
sudo chmod +x /usr/local/bin/gitlab-runner
9.ã©ã³ããŒã®OSãŠãŒã¶ãŒã远å ãããµãŒãã¹ãéå§ããŸãã
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
次ã®ããã«ãªããŸãã
local@osboxes:~$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
Runtime platform arch=amd64 os=linux pid=8438 revision=0e5417a3 version=12.0.1
local@osboxes:~$ sudo gitlab-runner start
Runtime platform arch=amd64 os=linux pid=8518 revision=0e5417a3 version=12.0.1
10.次ã«ãã©ã³ããŒãç»é²ããŠãGitLabã€ã³ã¹ã¿ã³ã¹ãšå¯Ÿè©±ã§ããããã«ããŸãã
ãããè¡ãã«ã¯ã[èšå®] -CI / CDããŒãžïŒhttpïŒ// OUR_ IP_ADDRESS / root / cicd-test /-/ settings / ci_cdïŒãéãã[ã©ã³ããŒ]ã¿ãã§URLãšç»é²ããŒã¯ã³ãèŠã€ããŸãã11ãURLãšç»é²ããŒã¯ã³

ã眮ãæããŠã©ã³ããŒãç»é²ããŸãã
sudo gitlab-runner register \
--non-interactive \
--url "http://<URL>/" \
--registration-token "<Registration Token>" \
--executor "docker" \
--docker-privileged \
--docker-image alpine:latest \
--description "docker-runner" \
--tag-list "docker,privileged" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"
ãã®çµæãæ¢è£œã®åäœããGitLabãåŸããããŠãŒãã£ãªãã£ãèµ·åããããã®æé ã远å ããå¿ èŠããããŸãããã®ãã¢ã®å Žåãã¢ããªã±ãŒã·ã§ã³ãšãã®ã³ã³ããåãæ§ç¯ããããã®æé ã¯ãããŸããããå®éã®ç°å¢ã§ã¯ãã¹ãã£ã³æé ã®åã«å®è¡ãããåæçšã®ã€ã¡ãŒãžãšDockerfileãçæãããŸãã
ãã€ãã©ã€ã³ã®æ§æ
1.ãªããžããªã«ãã¡ã€ã«mydockerfile.dfïŒããã¯ãã§ãã¯ãããã¹ãDockerfileã§ãïŒãšGitLab CI / CDããã»ã¹æ§æãã¡ã€ã«.gitlab-cicd.ymlã远å ããŸããããã«ã¯ãã¹ãã£ããŒã®æé ããªã¹ããããŠããŸãïŒãã¡ã€ã«åã®ãããã«æ³šæããŠãã ããïŒã ïŒã
YAMLæ§æãã¡ã€ã«ã«ã¯ãéžæããDockerfileãšDOCKERFILE倿°ã§æå®ãããã€ã¡ãŒãžãè§£æãã3ã€ã®ãŠãŒãã£ãªãã£ïŒHadolintãDocleãããã³TrivyïŒãå®è¡ããããã®åœä»€ãå«ãŸããŠããŸããå¿ èŠãªãã¹ãŠã®ãã¡ã€ã«ã¯ããªããžããªããååŸã§ããŸãã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 <rhys@arkins.net>"
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-based .
2.ãã¡ã€ã«ããªããžããªã«è¿œå ããåŸãæ§æãã¡ã€ã«ã®æç€ºã«åŸã£ãŠãGitLabã¯èªåçã«ãã«ãããã³ã¹ãã£ã³ããã»ã¹ãéå§ããŸãã [CI / CD]â[ãã€ãã©ã€ã³]ã¿ãã§ãæé ã®é²è¡ç¶æ³ã確èªã§ããŸãã
ãã®çµæã4ã€ã®ã¿ã¹ã¯ããããŸãããããã®ãã¡ã®3ã€ã¯ã¹ãã£ã³ãçŽæ¥åŠçããæåŸã®ïŒã¬ããŒãïŒã¯ã¹ãã£ã³çµæãšãšãã«æ£åšãããã¡ã€ã«ããåçŽãªã¬ããŒããåéããŸãã

ããã©ã«ãã§ã¯ãç»åãŸãã¯äŸåé¢ä¿ã«é倧ãªè匱æ§ãèŠã€ãã£ãå ŽåãTrivyã¯å®è¡ã忢ããŸããåæã«ãHadolintã¯åžžã«Successå®è¡ã³ãŒããè¿ããŸããããã¯ãå®è¡ã®çµæãšããŠåžžã«ã³ã¡ã³ããããããã«ãã®åæ¢ã«ã€ãªããããã§ãã
ç¹å®ã®èŠä»¶ã«å¿ããŠããããã®ãŠãŒãã£ãªãã£ãç¹å®ã®é倧床ã®åé¡ãæ€åºãããšãã«ãã«ãããã»ã¹ã忢ããããã«ãçµäºã³ãŒããæ§æã§ããŸãããã®å Žåããã«ãã¯ãTrivyã.gitlab-ci.ymlã®SHOWSTOPPER倿°ã§æå®ããé倧ãªè匱æ§ãæ€åºããå Žåã«ã®ã¿åæ¢ããŸãã

åãŠãŒãã£ãªãã£ã®æäœã®çµæã¯ãåã¹ãã£ã³ã¿ã¹ã¯ã®ãã°ãã¢ãŒãã£ãã¡ã¯ãã»ã¯ã·ã§ã³ã®jsonãã¡ã€ã«ããŸãã¯åçŽãªHTMLã¬ããŒãïŒè©³çްã¯ä»¥äžïŒã§ç¢ºèªã§ããŸã

ã3ããŠãŒãã£ãªãã£ã¬ããŒããããå°ã人éãèªã¿ããã圢åŒã§è¡šç€ºããã«ã¯ãå°ããªPythonã¹ã¯ãªããã䜿çšããŸãã 3ã€ã®jsonãã¡ã€ã«ãæ¬ é¥ã®ããŒãã«ãæã€1ã€ã®HTMLãã¡ã€ã«ã«å€æããŸãã
ãã®ã¹ã¯ãªããã¯å¥ã®ã¬ããŒãã¿ã¹ã¯ã«ãã£ãŠèµ·åããããã®æçµçãªã¢ãŒãã£ãã¡ã¯ãã¯ã¬ããŒããå«ãHTMLãã¡ã€ã«ã§ããã¹ã¯ãªããã®ãœãŒã¹ããªããžããªã«ãããããŒãºãè²ãªã©ã«åãããŠèª¿æŽã§ããŸãã

ã·ã§ã«ã¹ã¯ãªãã
2çªç®ã®ãªãã·ã§ã³ã¯ãCI / CDã·ã¹ãã ã®å€éšã§Dockerã€ã¡ãŒãžããã§ãã¯ããå¿ èŠãããå ŽåããŸãã¯ãã¹ãäžã§çŽæ¥å®è¡ã§ãã圢åŒã§ãã¹ãŠã®åœä»€ãçšæããå¿ èŠãããå Žåã«é©ããŠããŸãããã®ãªãã·ã§ã³ã¯ãã¯ãªãŒã³ãªä»®æ³ïŒãŸãã¯å®éã®ïŒãã·ã³ã§å®è¡ã§ããæ¢è£œã®ã·ã§ã«ã¹ã¯ãªããã§ã«ããŒãããŠããŸããã¹ã¯ãªããã¯ãäžèšã®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ã€ã¡ãŒãž
3çªç®ã®æ¹æ³ãšããŠã2ã€ã®åçŽãªDockerfileãã³ã³ãã€ã«ããŠãã»ãã¥ãªãã£ãŠãŒãã£ãªãã£ã䜿çšããŠã€ã¡ãŒãžãäœæããŸããã1ã€ã®Dockerfileã¯ããªããžããªããã€ã¡ãŒãžãã¹ãã£ã³ããããã®ã»ãããæ§ç¯ããã®ã«åœ¹ç«ã¡ãŸãã2ã€ç®ïŒ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ã¢ãŒãã£ãã¡ã¯ããã¹ãã£ã³ããããã®åºæ¬çãªããŒã«ã»ããã1ã€ã ãåãäžããŸãããããã¯ãç§ã®æèŠã§ã¯ãã€ã¡ãŒãžã»ãã¥ãªãã£èŠä»¶ã®ããªãã®éšåãéåžžã«å¹æçã«ã«ããŒããŠããŸããåããã§ãã¯ãå®è¡ããããçŸããã¬ããŒããäœæããããçŽç²ã«ã³ã³ãœãŒã«ã¢ãŒãã§äœæ¥ããããã³ã³ãã管çã·ã¹ãã ãã«ããŒãããã§ããç¡æããã³ææã®ããŒã«ã¯ä»ã«ããããããããŸãããããã®ããŒã«ã®æŠèŠãšçµ±åæ¹æ³ã«ã€ããŠã¯ãå°ãåŸã§èª¬æããŸãã
ãã®èšäºã§èª¬æãããŠããäžé£ã®ããŒã«ã®è¯ãé¢ã¯ããã¹ãŠãªãŒãã³ãœãŒã¹ã³ãŒãã«åºã¥ããŠæ§ç¯ãããŠãããããããä»ã®åæ§ã®ããŒã«ã詊ããŠãèŠä»¶ãã€ã³ãã©ã¹ãã©ã¯ãã£æ©èœã«æ£ç¢ºã«é©åãããã®ãèŠã€ããããšãã§ããããšã§ãããã¡ãããçºèŠããããã¹ãŠã®è匱æ§ã¯ãç¹å®ã®æ¡ä»¶ã§ã®é©çšå¯èœæ§ã«ã€ããŠèª¿æ»ããå¿ èŠããããŸãããããã¯å°æ¥ã®å€§ããªèšäºã®ãããã¯ã§ãã
ãã®ãã¥ãŒããªã¢ã«ãã¹ã¯ãªãããããã³ãŠãŒãã£ãªãã£ãã圹ã«ç«ãŠã°ãã³ã³ããåã®åéã§ããå®å šãªã€ã³ãã©ã¹ãã©ã¯ãã£ãäœæããããã®åºçºç¹ã«ãªãããšãé¡ã£ãŠããŸãã