Docker سيڪيورٽي چيڪ ڪرڻ لاء افاديت لاڳو ڪرڻ جا طريقا ۽ مثال

Docker سيڪيورٽي چيڪ ڪرڻ لاء افاديت لاڳو ڪرڻ جا طريقا ۽ مثال
اي حبر!

جديد حقيقتن ۾، ترقياتي عملن ۾ ڪنٽينرائيزيشن جي وڌندڙ ڪردار جي ڪري، ڪنٽينرز سان لاڳاپيل مختلف مرحلن ۽ ادارن جي حفاظت کي يقيني بڻائڻ جو مسئلو گهٽ ۾ گهٽ اهم مسئلو ناهي. دستي چيڪن کي کڻڻ ۾ وقت لڳندو آهي، تنهن ڪري اهو هڪ سٺو خيال هوندو ته هن عمل کي خودڪار ڪرڻ لاءِ گهٽ ۾ گهٽ ابتدائي قدم کڻڻ.

هن آرٽيڪل ۾، مان شيئر ڪندس تيار ٿيل اسڪرپٽس کي لاڳو ڪرڻ لاءِ ڪيترن ئي ڊڪر سيڪيورٽي يوٽيلٽيز ۽ هدايتون ته ڪيئن هن عمل کي جانچڻ لاءِ نن demo ڊيمو اسٽينڊ کي ترتيب ڏيو. توهان مواد استعمال ڪري سگهو ٿا تجربو ڪرڻ لاءِ ته ڪيئن منظم ڪجي ڊاڪرفائل تصويرن ۽ هدايتن جي سيڪيورٽي کي جانچڻ جي عمل کي. اهو واضح آهي ته هر ڪنهن جي ترقي ۽ عملدرآمد جو بنيادي ڍانچو مختلف آهي، تنهن ڪري هيٺ آئون ڪيترن ئي ممڪن اختيارن کي فراهم ڪندس.

سيڪيورٽي چيڪ افاديت

هتي مختلف مددگار ايپليڪيشنون ۽ اسڪرپٽ جو هڪ وڏو تعداد آهي جيڪي ڊاکر انفراسٽرڪچر جي مختلف حصن تي چيڪ ڪندا آهن. انهن مان ڪجهه اڳئين مضمون ۾ بيان ڪيا ويا آهن (https://habr.com/ru/company/swordfish_security/blog/518758/#docker-security)، ۽ هن مواد ۾ آئون انهن مان ٽن تي ڌيان ڏيڻ چاهيان ٿو، جيڪي ڊولپمينٽ جي عمل دوران ٺاهيل ڊاکر تصويرن لاء سيڪيورٽي گهرجن جي وڏي تعداد کي ڍڪيندا آهن. ان کان علاوه، مان پڻ هڪ مثال ڏيکاريندس ته ڪيئن اهي ٽي افاديت هڪ پائپ لائن ۾ ڳنڍجي سگھجن ٿيون سيڪيورٽي چيڪ ڪرڻ لاءِ.

هيڊولنٽ
https://github.com/hadolint/hadolint

هڪ بلڪل سادو ڪنسول افاديت جيڪا مدد ڪري ٿي، پهرين تقريبن جي طور تي، Dockerfile جي هدايتن جي درستگي ۽ حفاظت جو جائزو وٺو (مثال طور، صرف بااختيار تصويري رجسٽري استعمال ڪندي يا sudo استعمال ڪندي).

Docker سيڪيورٽي چيڪ ڪرڻ لاء افاديت لاڳو ڪرڻ جا طريقا ۽ مثال

ڊاکول
https://github.com/goodwithtech/dockle

هڪ ڪنسول افاديت جيڪا هڪ تصوير سان ڪم ڪري ٿي (يا تصوير جي محفوظ ٿيل ٽار آرڪائيو سان)، جيڪا ڪنهن خاص تصوير جي درستي ۽ حفاظت کي چيڪ ڪري ٿي، جيئن ته ان جي پرت ۽ ترتيب جو تجزيو ڪندي - ڪهڙا صارف ٺاهيا ويا آهن، ڪهڙيون هدايتون استعمال ڪيون ويون آهن، جيڪي حجم نصب ٿيل آهن، هڪ خالي پاسورڊ جي موجودگي، وغيره. ڊي. اڃا تائين چيڪن جو تعداد تمام وڏو ناهي ۽ اسان جي ڪيترن ئي چيڪن ۽ سفارشن تي ٻڌل آهي CIS (انٽرنيٽ سيڪيورٽي لاء مرڪز) معيار Docker لاء.
Docker سيڪيورٽي چيڪ ڪرڻ لاء افاديت لاڳو ڪرڻ جا طريقا ۽ مثال

ٽريو
https://github.com/aquasecurity/trivy

هن افاديت جو مقصد ٻن قسمن جي ڪمزورين کي ڳولڻ آهي - OS تعميرات سان مسئلا (الپائن، 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 هدايتون جي درستگي ۽ حفاظت جي جانچ ڪندي هيڊولنٽ
  2. افاديت استعمال ڪندي حتمي ۽ وچولي تصويرن جي درستگي ۽ حفاظت جي جانچ ڪندي ڊاکول
  3. بنيادي تصوير ۾ عوامي طور تي سڃاتل ڪمزورين (CVE) جي موجودگي جي چڪاس ۽ ڪيترن ئي انحصار - يوٽيلٽي استعمال ڪندي ٽريو

بعد ۾ آرٽيڪل ۾ آئون انهن قدمن تي عمل ڪرڻ لاء ٽي اختيار ڏيندس:
پهريون مثال طور GitLab استعمال ڪندي CI/CD پائپ لائن کي ترتيب ڏيڻ سان (هڪ ٽيسٽ مثال کي وڌائڻ جي عمل جي وضاحت سان).
ٻيو شيل اسڪرپٽ استعمال ڪري رهيو آهي.
ٽيون هڪ ڊاکر تصويرن کي اسڪين ڪرڻ لاءِ ڊاڪر تصوير ٺاهڻ ۾ شامل آهي.
توھان اھو اختيار چونڊي سگھو ٿا جيڪو توھان لاءِ بھترين مناسب آھي، ان کي پنھنجي انفراسٽرڪچر ڏانھن منتقل ڪريو ۽ ان کي پنھنجي ضرورتن مطابق ترتيب ڏيو.

سڀئي ضروري فائلون ۽ اضافي هدايتون پڻ مخزن ۾ واقع آهن: https://github.com/Swordfish-Security/docker_cicd

GitLab CI/CD ۾ انضمام

پهرين آپشن ۾، اسان ڏسنداسين ته ڪيئن توهان مثال طور GitLab مخزن واري نظام کي استعمال ڪندي سيڪيورٽي چيڪ لاڳو ڪري سگهو ٿا. هتي اسان قدمن ذريعي وڃون ٿا ۽ اهو معلوم ڪنداسين ته ڪيئن نصب ڪيو ٽيسٽ ماحول کي شروع کان GitLab سان، هڪ اسڪيننگ پروسيس ٺاهيو ۽ ٽيسٽ ڊاکرفائل ۽ بي ترتيب واري تصوير کي جانچڻ لاءِ يوٽيلٽيز لانچ ڪيو - جوس شاپ ايپليڪيشن.

GitLab انسٽال ڪرڻ
1. Docker انسٽال ڪريو:

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

2. موجوده استعمال ڪندڙ کي ڊڪر گروپ ۾ شامل ڪريو ته جيئن توھان سوڊو استعمال ڪرڻ کانسواءِ ڊڪر سان ڪم ڪري سگھو.

sudo addgroup <username> docker

3. پنھنجو IP ڳوليو:

ip addr

4. انسٽال ڪريو ۽ لانچ ڪريو GitLab ڪنٽينر ۾، IP پتي کي ميزبان جي نالي سان تبديل ڪندي:

docker run --detach 
--hostname 192.168.1.112 
--publish 443:443 --publish 80:80 
--name gitlab 
--restart always 
--volume /srv/gitlab/config:/etc/gitlab 
--volume /srv/gitlab/logs:/var/log/gitlab 
--volume /srv/gitlab/data:/var/opt/gitlab 
gitlab/gitlab-ce:latest

اسان انتظار ڪريون ٿا جيستائين GitLab سڀني ضروري انسٽاليشن جي طريقيڪار کي مڪمل ڪري ٿو (توهان لاگ فائل آئوٽ ذريعي پروسيس مانيٽر ڪري سگهو ٿا: docker logs -f gitlab).

5. برائوزر ۾ پنھنجو مقامي IP کوليو ۽ ھڪڙو صفحو ڏسو جيڪو توھان کي روٽ استعمال ڪندڙ لاءِ پاسورڊ تبديل ڪرڻ لاءِ پڇي ٿو:
Docker سيڪيورٽي چيڪ ڪرڻ لاء افاديت لاڳو ڪرڻ جا طريقا ۽ مثال
نئون پاسورڊ سيٽ ڪريو ۽ وڃو GitLab.

6. هڪ نئون پروجيڪٽ ٺاهيو، مثال طور cicd-test ۽ ان کي شروعاتي فائل سان شروع ڪريو README.md:
Docker سيڪيورٽي چيڪ ڪرڻ لاء افاديت لاڳو ڪرڻ جا طريقا ۽ مثال
7. ھاڻي اسان کي انسٽال ڪرڻ جي ضرورت آھي GitLab Runner: ھڪڙو ايجنٽ جيڪو ھلندو سڀني ضروري عملن کي درخواست تي.
جديد نسخو ڊائون لوڊ ڪريو (هن صورت ۾، Linux 64-bit لاء):

sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

8. ان کي قابل عمل بڻايو:

sudo chmod +x /usr/local/bin/gitlab-runner

9. رنر لاءِ او ايس يوزر شامل ڪريو ۽ سروس شروع ڪريو:

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 ۽ رجسٽريشن ٽوڪن ڳولھيو:
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، جنهن ۾ اسان کي اسان جي افاديت کي شروع ڪرڻ لاء هدايتون شامل ڪرڻ جي ضرورت آهي. هن ڊيم ۾ اسان وٽ ايپليڪيشن ٺاهڻ ۽ ان کي ڪنٽرول ڪرڻ جا مرحلا نه آهن، پر حقيقي ماحول ۾ اهي اسڪيننگ مرحلن کان اڳ هوندا ۽ تصويرون ٺاهيندا ۽ تجزيو لاءِ هڪ ڊڪر فائل.

پائپ لائن جي تشڪيل

1. مخزن ۾ فائلون شامل ڪريو mydockerfile.df (هي هڪ ٽيسٽ Dockerfile آهي جنهن کي اسين چيڪ ڪنداسين) ۽ GitLab CI/CD پروسيسنگ فائيل gitlab-cicd.yml، جيڪو اسڪينر لاءِ هدايتون لسٽ ڪري ٿو (فائل جي نالي ۾ ڊٽ نوٽ ڪريو).

YAML ترتيب واري فائل ۾ ٽن افاديت کي هلائڻ لاءِ هدايتون شامل آهن (Hadolint، Dockle، ۽ Trivy) جيڪي چونڊيل ڊاڪر فائل ۽ 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 انسٽال ڪرڻ جي ضرورت آهي آر ايم پي и اٿي. ٻي صورت ۾، اهو غلطيون پيدا ڪندو جڏهن RedHat-based تصويرن کي اسڪين ڪرڻ ۽ نقصان جي ڊيٽابيس ۾ تازه ڪاريون حاصل ڪندي.

2. مخزن ۾ فائلون شامل ڪرڻ کان پوء، اسان جي ترتيب واري فائل ۾ هدايتون مطابق، GitLab خودڪار طريقي سان تعمير ۽ اسڪين عمل شروع ڪندو. CI/CD → Pipelines ٽيب تي توهان هدايتن جي ترقي ڏسي سگهو ٿا.

نتيجي طور، اسان وٽ چار ڪم آهن. انهن مان ٽي سڌو سنئون اسڪيننگ سان معاملو ڪن ٿا، ۽ آخري هڪ (رپورٽ) اسڪيننگ نتيجن سان ڀريل فائلن مان هڪ سادي رپورٽ گڏ ڪري ٿي.
Docker سيڪيورٽي چيڪ ڪرڻ لاء افاديت لاڳو ڪرڻ جا طريقا ۽ مثال
ڊفالٽ طور، ٽريوي کي هلائڻ بند ڪري ٿو جيڪڏهن CRITICAL ڪمزورين تصوير يا انحصار ۾ ڳولي رهيا آهن. ساڳئي وقت، Hadolint هميشه هڪ ڪامياب ڪوڊ واپس ڪري ٿو ڇاڪاڻ ته اهو هميشه تبصرن ۾ نتيجو آهي، جنهن جي تعمير کي روڪڻ جو سبب بڻائيندو آهي.

توهان جي مخصوص ضرورتن تي مدار رکندي، توهان هڪ نڪرڻ واري ڪوڊ کي ترتيب ڏئي سگهو ٿا ته جيئن اهي افاديت هڪ خاص تنقيد جي مسئلن کي ڳوليندا آهن، اهي پڻ تعمير جي عمل کي روڪيندا آهن. اسان جي صورت ۾، اڏاوت صرف بند ٿي ويندي جڏهن Trivy تنقيد سان هڪ خطري کي ڳولي ٿو جنهن کي اسان SHOWSTOPPER متغير ۾ بيان ڪيو آهي. gitlab-ci.yml.
Docker سيڪيورٽي چيڪ ڪرڻ لاء افاديت لاڳو ڪرڻ جا طريقا ۽ مثال

هر يوٽيلٽي جو نتيجو ڏسي سگهجي ٿو هر اسڪيننگ ٽاسڪ جي لاگ ۾، سڌو سنئون json فائلن ۾ آرٽيڪل سيڪشن ۾، يا هڪ سادي HTML رپورٽ ۾ (وڌيڪ هيٺ ڏنل تي):
Docker سيڪيورٽي چيڪ ڪرڻ لاء افاديت لاڳو ڪرڻ جا طريقا ۽ مثال

3. افاديت جي رپورٽن کي ٿورڙي وڌيڪ انساني پڙهڻ جي قابل فارم ۾ پيش ڪرڻ لاء، هڪ ننڍڙو Python اسڪرپٽ استعمال ڪيو ويندو آهي ٽن JSON فائلن کي هڪ HTML فائل ۾ خرابين جي جدول سان.
هي اسڪرپٽ هڪ الڳ رپورٽ ٽاسڪ ذريعي شروع ڪيو ويو آهي، ۽ ان جي آخري نموني هڪ رپورٽ سان گڏ هڪ HTML فائل آهي. اسڪرپٽ جو ذريعو پڻ مخزن ۾ آهي ۽ توهان جي ضرورتن، رنگن وغيره کي ترتيب ڏيڻ لاء ترتيب ڏئي سگهجي ٿو.
Docker سيڪيورٽي چيڪ ڪرڻ لاء افاديت لاڳو ڪرڻ جا طريقا ۽ مثال

شيل اسڪرپٽ

ٻيو اختيار انھن ڪيسن لاءِ موزون آھي جڏھن توھان کي CI/CD سسٽم کان ٻاھر Docker تصويرن جي جانچ ڪرڻ جي ضرورت آھي يا توھان کي ھدايتون ھجڻ گھرجن ھڪڙي فارم ۾ جيڪي سڌو سنئون ھوسٽ تي لاڳو ڪري سگھجن ٿيون. هي اختيار هڪ تيار ڪيل شيل اسڪرپٽ سان ڍڪيل آهي جيڪو صاف مجازي (يا اڃا به حقيقي) مشين تي هلائي سگهجي ٿو. اسڪرپٽ ساڳئي هدايتن تي عمل ڪري ٿو جيئن مٿي بيان ڪيل گٽلب-رنر.

اسڪرپٽ ڪاميابيءَ سان هلائڻ لاءِ، ڊڪر کي سسٽم تي نصب ڪيو وڃي ۽ موجوده صارف کي ڊاکر گروپ ۾ هجڻ گهرجي.

رسم الخط پاڻ هتي ڳولي سگھجي ٿو: docker_sec_check.sh

فائل جي شروعات ۾، متغير بيان ڪن ٿا ته ڪھڙي تصوير کي اسڪين ڪرڻ جي ضرورت آھي ۽ ڪھڙي تنقيدي نقص سبب ٽريو يوٽيلٽي کي مخصوص نقص ڪوڊ سان نڪرڻو پوندو.

اسڪرپٽ جي عمل جي دوران، سڀني افاديت کي ڊاريڪٽري ۾ ڊائون لوڊ ڪيو ويندو 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

ڊڪر تصوير سڀني افاديت سان

ٽئين متبادل جي طور تي، مون مرتب ڪيو ٻه سادي Dockerfiles حفاظتي افاديت سان تصوير ٺاهڻ لاءِ. هڪ Dockerfile هڪ ريپوزٽري مان تصوير کي اسڪين ڪرڻ لاءِ هڪ سيٽ ٺاهڻ ۾ مدد ڪندو، ٻيو (Dockerfile_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

نتيجا

اسان ڏٺو ته صرف هڪ بنيادي سيٽ افاديت جي اسڪيننگ لاءِ ڊاڪر آرٽيڪٽس، جيڪي، منهنجي خيال ۾، تمام مؤثر طريقي سان تصويري سيڪيورٽي گهرجن جي هڪ مهذب حصي کي ڍڪيندا آهن. ادا ڪيل ۽ مفت اوزارن جو هڪ وڏو تعداد پڻ آهن جيڪي ساڳيون چيڪون انجام ڏئي سگهن ٿا، خوبصورت رپورٽون ٺاهي سگهن ٿا يا ڪنسول موڊ ۾ خالص ڪم ڪري سگهن ٿا، ڪنٽينر مئنيجمينٽ سسٽم وغيره. انهن اوزارن جو هڪ جائزو ۽ انهن کي ضم ڪرڻ جو طريقو ٿوري دير بعد ظاهر ٿي سگھي ٿو. .

هن آرٽيڪل ۾ بيان ڪيل اوزارن جي سيٽ بابت سٺي شيءِ اها آهي ته اهي سڀئي اوپن سورس آهن ۽ توهان انهن سان ۽ ٻين ساڳين اوزارن سان تجربو ڪري سگهو ٿا اهو ڳولڻ لاءِ ته توهان جي ضرورتن ۽ انفراسٽرڪچر کي ڪهڙي مناسب آهي. يقينن، سڀئي خطرات جيڪي مليا آهن انهن کي مخصوص حالتن ۾ لاڳو ڪرڻ لاء مطالعو ڪيو وڃي، پر اهو مستقبل جي وڏي مضمون لاء هڪ موضوع آهي.

مون کي اميد آهي ته هي گائيڊ، اسڪرپٽس ۽ افاديتون توهان جي مدد ڪنديون ۽ ڪنٽينرائيزيشن جي علائقي ۾ وڌيڪ محفوظ زيربنا ٺاهڻ لاءِ هڪ شروعاتي نقطو بڻجي وينديون.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو