วิธีการและตัวอย่างการใช้งานยูทิลิตี้เพื่อตรวจสอบความปลอดภัยของ 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 ที่บันทึกไว้ของรูปภาพ) ซึ่งจะตรวจสอบความถูกต้องและความปลอดภัยของรูปภาพนั้น ๆ วิเคราะห์เลเยอร์และการกำหนดค่า - ผู้ใช้ใดที่ถูกสร้างขึ้น คำแนะนำใดที่ใช้ ซึ่ง มีการติดตั้งไดรฟ์ข้อมูล มีรหัสผ่านว่าง ฯลฯ d. จนถึงขณะนี้จำนวนการตรวจสอบยังมีไม่มากนักและขึ้นอยู่กับการตรวจสอบและคำแนะนำหลายประการของเราเอง เกณฑ์มาตรฐาน CIS (ศูนย์ความปลอดภัยทางอินเทอร์เน็ต) สำหรับนักเทียบท่า
วิธีการและตัวอย่างการใช้งานยูทิลิตี้เพื่อตรวจสอบความปลอดภัยของ Docker

เรื่องไม่สำคัญ
https://github.com/aquasecurity/trivy

ยูทิลิตี้นี้มีวัตถุประสงค์เพื่อค้นหาช่องโหว่สองประเภท - ปัญหาเกี่ยวกับระบบปฏิบัติการบิลด์ (รองรับโดย Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu) และปัญหาเกี่ยวกับการพึ่งพา (Gemfile.lock, Pipfile.lock, composer.lock, แพ็คเกจ -lock.json ,เส้นด้าย.ล็อค,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. ติดตั้งนักเทียบท่า:

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

2. เพิ่มผู้ใช้ปัจจุบันในกลุ่มนักเทียบท่าเพื่อให้คุณสามารถทำงานกับนักเทียบท่าได้โดยไม่ต้องใช้ 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 บิต):

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 ของเราได้
ในการดำเนินการนี้ ให้เปิดหน้าการตั้งค่า 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)

หมายเหตุ: Trivy จำเป็นต้องติดตั้ง รอบต่อนาที и คอมไพล์. มิฉะนั้นจะทำให้เกิดข้อผิดพลาดเมื่อสแกนภาพที่ใช้ RedHat และรับการอัพเดตฐานข้อมูลช่องโหว่

2. หลังจากเพิ่มไฟล์ไปยังพื้นที่เก็บข้อมูล ตามคำแนะนำในไฟล์กำหนดค่าของเรา GitLab จะเริ่มกระบวนการสร้างและสแกนโดยอัตโนมัติ บนแท็บ CI/CD → ไปป์ไลน์ คุณสามารถดูความคืบหน้าของคำแนะนำได้

เป็นผลให้เรามีสี่งาน สามคนจัดการโดยตรงกับการสแกน และอันสุดท้าย (รายงาน) รวบรวมรายงานง่ายๆ จากไฟล์ที่กระจัดกระจายพร้อมผลลัพธ์การสแกน
วิธีการและตัวอย่างการใช้งานยูทิลิตี้เพื่อตรวจสอบความปลอดภัยของ Docker
ตามค่าเริ่มต้น Trivy จะหยุดทำงานหากตรวจพบช่องโหว่ที่สำคัญในภาพหรือการอ้างอิง ในขณะเดียวกัน Hadolint จะส่งกลับรหัสความสำเร็จเสมอ เนื่องจากจะส่งผลให้เกิดความคิดเห็นเสมอ ซึ่งทำให้การสร้างหยุดทำงาน

ขึ้นอยู่กับข้อกำหนดเฉพาะของคุณ คุณสามารถกำหนดค่าโค้ดทางออกได้ เพื่อที่ว่าเมื่อยูทิลิตีเหล่านี้ตรวจพบปัญหาของการวิกฤติบางอย่าง พวกเขาจะหยุดกระบวนการสร้างด้วย ในกรณีของเรา การสร้างจะหยุดเฉพาะเมื่อ Trivy ตรวจพบช่องโหว่ที่มีความวิกฤตที่เราระบุไว้ในตัวแปร SHOWSTOPPER ใน .gitlab-ci.yml.
วิธีการและตัวอย่างการใช้งานยูทิลิตี้เพื่อตรวจสอบความปลอดภัยของ Docker

คุณสามารถดูผลลัพธ์ของยูทิลิตี้แต่ละรายการได้ในบันทึกของงานการสแกนแต่ละรายการ ในไฟล์ json ในส่วนสิ่งประดิษฐ์โดยตรง หรือในรายงาน HTML แบบง่าย (เพิ่มเติมเกี่ยวกับด้านล่าง):
วิธีการและตัวอย่างการใช้งานยูทิลิตี้เพื่อตรวจสอบความปลอดภัยของ Docker

3. ในการนำเสนอรายงานยูทิลิตี้ในรูปแบบที่มนุษย์อ่านง่ายขึ้นเล็กน้อย สคริปต์ Python ขนาดเล็กจะใช้ในการแปลงไฟล์ JSON สามไฟล์เป็นไฟล์ HTML ไฟล์เดียวพร้อมตารางข้อบกพร่อง
สคริปต์นี้เปิดใช้งานโดยงานรายงานที่แยกต่างหาก และส่วนสุดท้ายคือไฟล์ HTML พร้อมรายงาน แหล่งที่มาของสคริปต์ยังอยู่ในพื้นที่เก็บข้อมูลและสามารถปรับให้เหมาะกับความต้องการ สี ฯลฯ ของคุณ
วิธีการและตัวอย่างการใช้งานยูทิลิตี้เพื่อตรวจสอบความปลอดภัยของ Docker

เชลล์สคริปต์

ตัวเลือกที่สองเหมาะสำหรับกรณีที่คุณต้องการตรวจสอบอิมเมจ Docker ภายนอกระบบ CI/CD หรือคุณต้องการคำแนะนำทั้งหมดในรูปแบบที่สามารถดำเนินการได้โดยตรงบนโฮสต์ ตัวเลือกนี้ครอบคลุมโดยเชลล์สคริปต์สำเร็จรูปที่สามารถรันบนเครื่องเสมือน (หรือของจริง) ที่ปลอดภัย สคริปต์ดำเนินการตามคำสั่งเดียวกันกับ gitlab-runner ที่อธิบายไว้ข้างต้น

เพื่อให้สคริปต์ทำงานได้สำเร็จ ต้องติดตั้ง Docker บนระบบ และผู้ใช้ปัจจุบันต้องอยู่ในกลุ่มนักเทียบท่า

สามารถดูสคริปต์ได้ที่นี่: docker_sec_check.sh

ที่จุดเริ่มต้นของไฟล์ ตัวแปรจะระบุว่ารูปภาพใดที่ต้องสแกน และข้อบกพร่องวิกฤตใดที่จะทำให้ยูทิลิตี้ Trivy ออกพร้อมกับรหัสข้อผิดพลาดที่ระบุ

ในระหว่างการดำเนินการสคริปต์ ยูทิลิตี้ทั้งหมดจะถูกดาวน์โหลดไปยังไดเร็กทอรี docker_toolsผลลัพธ์ของงานจะอยู่ในไดเร็กทอรี docker_tools/jsonและ HTML พร้อมรายงานจะอยู่ในไฟล์ result.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

ภาพนักเทียบท่าพร้อมยูทิลิตี้ทั้งหมด

ทางเลือกที่สาม ฉันรวบรวม 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 ซึ่งในความคิดของฉัน ครอบคลุมส่วนที่เหมาะสมของข้อกำหนดด้านความปลอดภัยของรูปภาพได้อย่างมีประสิทธิภาพมาก นอกจากนี้ยังมีเครื่องมือแบบเสียเงินและฟรีจำนวนมากที่สามารถตรวจสอบแบบเดียวกัน วาดรายงานที่สวยงาม หรือทำงานในโหมดคอนโซลล้วนๆ ครอบคลุมระบบการจัดการคอนเทนเนอร์ ฯลฯ ภาพรวมของเครื่องมือเหล่านี้และวิธีการรวมเข้าด้วยกันอาจปรากฏในภายหลังเล็กน้อย .

ข้อดีของชุดเครื่องมือที่อธิบายในบทความนี้คือเครื่องมือเหล่านี้เป็นโอเพ่นซอร์สทั้งหมด และคุณสามารถทดลองกับเครื่องมือเหล่านี้และเครื่องมืออื่นๆ ที่คล้ายกันเพื่อค้นหาสิ่งที่เหมาะสมกับความต้องการและโครงสร้างพื้นฐานของคุณ แน่นอนว่าช่องโหว่ทั้งหมดที่พบควรได้รับการศึกษาเพื่อการบังคับใช้ในเงื่อนไขเฉพาะ แต่นี่เป็นหัวข้อสำหรับบทความขนาดใหญ่ในอนาคต

ฉันหวังว่าคู่มือ สคริปต์ และยูทิลิตี้นี้จะช่วยคุณและเป็นจุดเริ่มต้นสำหรับการสร้างโครงสร้างพื้นฐานที่ปลอดภัยยิ่งขึ้นในด้านคอนเทนเนอร์

ที่มา: will.com

เพิ่มความคิดเห็น