Μέθοδοι και παραδείγματα υλοποίησης βοηθητικών προγραμμάτων ελέγχου ασφαλείας Docker

Μέθοδοι και παραδείγματα υλοποίησης βοηθητικών προγραμμάτων ελέγχου ασφαλείας Docker
Γεια σου Χαμπρ!

Στη σημερινή πραγματικότητα, λόγω του αυξανόμενου ρόλου της μεταφοράς εμπορευματοκιβωτίων στις διαδικασίες ανάπτυξης, το ζήτημα της διασφάλισης της ασφάλειας διαφόρων σταδίων και οντοτήτων που σχετίζονται με εμπορευματοκιβώτια δεν βρίσκεται στην τελευταία θέση. Η χειροκίνητη διενέργεια ελέγχων είναι μια επίπονη εργασία, επομένως θα ήταν καλό να κάνετε τουλάχιστον τα αρχικά βήματα για την αυτοματοποίηση αυτής της διαδικασίας.

Σε αυτό το άρθρο, θα μοιραστώ έτοιμα σενάρια για την υλοποίηση πολλών βοηθητικών προγραμμάτων ασφαλείας Docker και οδηγίες σχετικά με τον τρόπο ρύθμισης μιας μικρής βάσης επίδειξης για τη δοκιμή αυτής της διαδικασίας. Μπορείτε να χρησιμοποιήσετε τα υλικά για να πειραματιστείτε με τον τρόπο οργάνωσης της διαδικασίας δοκιμής της ασφάλειας των εικόνων και των οδηγιών του Dockerfile. Είναι σαφές ότι η υποδομή ανάπτυξης και υλοποίησης είναι διαφορετική για τον καθένα, επομένως παρακάτω θα δώσω αρκετές πιθανές επιλογές.

Βοηθητικά προγράμματα ελέγχου ασφαλείας

Υπάρχει ένας μεγάλος αριθμός διαφορετικών βοηθητικών εφαρμογών και σεναρίων που πραγματοποιούν ελέγχους σε διάφορες πτυχές της υποδομής Docker. Μερικά από αυτά έχουν ήδη περιγραφεί σε προηγούμενο άρθρο (https://habr.com/ru/company/swordfish_security/blog/518758/#docker-security), και σε αυτό το άρθρο θα ήθελα να εστιάσω σε τρία από αυτά, τα οποία καλύπτουν το μεγαλύτερο μέρος των απαιτήσεων ασφαλείας για τις εικόνες Docker που δημιουργούνται κατά τη διαδικασία ανάπτυξης. Επιπλέον, θα δείξω επίσης ένα παράδειγμα για το πώς αυτά τα τρία βοηθητικά προγράμματα μπορούν να συνδυαστούν σε έναν αγωγό για την εκτέλεση ελέγχων ασφαλείας.

Hadolint
https://github.com/hadolint/hadolint

Ένα αρκετά απλό βοηθητικό πρόγραμμα κονσόλας που σας βοηθά να αξιολογήσετε πρώτα την ορθότητα και την ασφάλεια των οδηγιών του Dockerfile (για παράδειγμα, χρησιμοποιώντας μόνο επιτρεπόμενα μητρώα εικόνων ή χρήση sudo).

Μέθοδοι και παραδείγματα υλοποίησης βοηθητικών προγραμμάτων ελέγχου ασφαλείας Docker

Dockle
https://github.com/goodwithtech/dockle

Ένα βοηθητικό πρόγραμμα κονσόλας που λειτουργεί σε μια εικόνα (ή σε μια αποθηκευμένη εικόνα tarball) που ελέγχει την ορθότητα και την ασφάλεια μιας συγκεκριμένης εικόνας, αναλύοντας τα επίπεδα και τη διαμόρφωσή της - ποιοι χρήστες δημιουργούνται, ποιες οδηγίες χρησιμοποιούνται, ποιοι τόμοι έχουν τοποθετηθεί , η παρουσία ενός κενού κωδικού πρόσβασης κ.λπ. ε. Ενώ ο αριθμός των ελέγχων δεν είναι πολύ μεγάλος και βασίζεται σε αρκετούς δικούς του ελέγχους και συστάσεις Σημείο αναφοράς CIS (Κέντρο Ασφάλειας Διαδικτύου). για λιμενεργάτης.
Μέθοδοι και παραδείγματα υλοποίησης βοηθητικών προγραμμάτων ελέγχου ασφαλείας Docker

Δευτερεύον
https://github.com/aquasecurity/trivy

Αυτό το βοηθητικό πρόγραμμα στοχεύει στην εύρεση δύο τύπων τρωτών σημείων - προβλήματα κατασκευής λειτουργικού συστήματος (υποστηρίζονται Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu) και προβλήματα εξάρτησης (Gemfile.lock, Pipfile.lock, composer.lock, πακέτο-κλείδωμα .json , yarn.lock, Cargo.lock). Το Trivy μπορεί να σαρώσει τόσο την εικόνα στο αποθετήριο όσο και την τοπική εικόνα, καθώς και να σαρώσει με βάση το μεταφερόμενο αρχείο .tar με την εικόνα Docker.

Μέθοδοι και παραδείγματα υλοποίησης βοηθητικών προγραμμάτων ελέγχου ασφαλείας Docker

Επιλογές υλοποίησης βοηθητικών προγραμμάτων

Για να δοκιμάσετε τις εφαρμογές που περιγράφονται σε μεμονωμένες συνθήκες, θα παράσχω οδηγίες για την εγκατάσταση όλων των βοηθητικών προγραμμάτων ως μέρος μιας απλοποιημένης διαδικασίας.

Η κύρια ιδέα είναι να δείξετε πώς μπορείτε να εφαρμόσετε τον αυτόματο έλεγχο περιεχομένου για Dockerfiles και εικόνες Docker που δημιουργούνται κατά την ανάπτυξη.

Η ίδια η επαλήθευση αποτελείται από τα ακόλουθα βήματα:

  1. Έλεγχος της ορθότητας και της ασφάλειας των οδηγιών Dockerfile με βοηθητικό πρόγραμμα λίπανσης Hadolint
  2. Έλεγχος της ορθότητας και της ασφάλειας των τελικών και ενδιάμεσων εικόνων - ένα βοηθητικό πρόγραμμα Dockle
  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 στο πρόγραμμα περιήγησης και δείτε μια σελίδα που προσφέρει την αλλαγή του κωδικού πρόσβασης για τον χρήστη root:
Μέθοδοι και παραδείγματα υλοποίησης βοηθητικών προγραμμάτων ελέγχου ασφαλείας 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. Προσθέστε έναν χρήστη λειτουργικού συστήματος για το 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. Καταχωρίστε το Runner αντικαθιστώντας τη διεύθυνση 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 που λειτουργεί, στο οποίο πρέπει να προσθέσουμε οδηγίες για να ξεκινήσουμε τα βοηθητικά μας προγράμματα. Σε αυτήν την επίδειξη, δεν έχουμε βήματα δημιουργίας εφαρμογών και κοντέινερ, αλλά σε πραγματικό περιβάλλον θα προηγηθούν των βημάτων σάρωσης και θα δημιουργήσουν εικόνες και ένα αρχείο Docker για ανάλυση.

διαμόρφωση αγωγού

1. Προσθέστε αρχεία στο αποθετήριο mydockerfile.df (αυτό είναι ένα δοκιμαστικό Dockerfile που θα δοκιμάσουμε) και το αρχείο διαμόρφωσης διαδικασίας GitLab CI/CD .gitlab-cicd.yml, το οποίο παραθέτει οδηγίες για σαρωτές (σημειώστε την κουκκίδα στο όνομα του αρχείου).

Το αρχείο διαμόρφωσης .yaml περιέχει οδηγίες για την εκτέλεση τριών βοηθητικών προγραμμάτων (Hadolint, Dockle και Trivy) που θα αναλύσουν το επιλεγμένο αρχείο Docker και την εικόνα που καθορίζεται στη μεταβλητή 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 απαιτεί εγκατάσταση rpm и πηγαίνω. Διαφορετικά, θα δημιουργήσει σφάλματα κατά τη σάρωση εικόνων που βασίζονται στο RedHat και τη λήψη ενημερώσεων στη βάση δεδομένων ευπάθειας.

2. Αφού προσθέσετε τα αρχεία στο αποθετήριο, σύμφωνα με τις οδηγίες στο αρχείο ρυθμίσεων, το GitLab θα ξεκινήσει αυτόματα τη διαδικασία δημιουργίας και σάρωσης. Στην καρτέλα CI / CD → Pipelines, μπορείτε να δείτε την πρόοδο των οδηγιών.

Ως αποτέλεσμα, έχουμε τέσσερις εργασίες. Τρεις από αυτούς συμμετέχουν άμεσα στη σάρωση και το τελευταίο (Αναφορά) συλλέγει μια απλή αναφορά από διάσπαρτα αρχεία με αποτελέσματα σάρωσης.
Μέθοδοι και παραδείγματα υλοποίησης βοηθητικών προγραμμάτων ελέγχου ασφαλείας Docker
Από προεπιλογή, το Trivy σταματά την εκτέλεσή του εάν βρεθούν ΚΡΙΣΙΜΕΣ ευπάθειες στην εικόνα ή εξαρτήσεις. Ταυτόχρονα, το Hadolint επιστρέφει πάντα το Success στον κώδικα εκτέλεσης, αφού η εκτέλεσή του έχει πάντα παρατηρήσεις, γεγονός που προκαλεί τη διακοπή της κατασκευής.

Ανάλογα με τις συγκεκριμένες απαιτήσεις σας, μπορείτε να διαμορφώσετε έναν κωδικό εξόδου έτσι ώστε αυτά τα βοηθητικά προγράμματα να διακόπτουν επίσης τη διαδικασία δημιουργίας όταν εντοπίζονται προβλήματα συγκεκριμένης κρισιμότητας. Στην περίπτωσή μας, η κατασκευή θα σταματήσει μόνο εάν το Trivy εντοπίσει μια ευπάθεια με μια σοβαρότητα που έχουμε καθορίσει στη μεταβλητή SHOWSTOPPER στο .gitlab-ci.yml.
Μέθοδοι και παραδείγματα υλοποίησης βοηθητικών προγραμμάτων ελέγχου ασφαλείας Docker

Το αποτέλεσμα της λειτουργίας κάθε βοηθητικού προγράμματος μπορεί να προβληθεί στο αρχείο καταγραφής κάθε εργασίας σάρωσης, απευθείας σε αρχεία json στην ενότητα artifacts ή σε μια απλή αναφορά HTML (περισσότερα για αυτό παρακάτω):
Μέθοδοι και παραδείγματα υλοποίησης βοηθητικών προγραμμάτων ελέγχου ασφαλείας Docker

3. Για την παρουσίαση των αναφορών βοηθητικών προγραμμάτων σε μια ελαφρώς πιο αναγνώσιμη από τον άνθρωπο μορφή, χρησιμοποιείται ένα μικρό σενάριο Python για τη μετατροπή τριών αρχείων json σε ένα αρχείο HTML με έναν πίνακα ελαττωμάτων.
Αυτό το σενάριο εκκινείται από μια ξεχωριστή εργασία αναφοράς και το τελικό του τεχνούργημα είναι ένα αρχείο HTML με μια αναφορά. Η πηγή του σεναρίου βρίσκεται επίσης στο αποθετήριο και μπορεί να προσαρμοστεί στις ανάγκες, τα χρώματα κ.λπ.
Μέθοδοι και παραδείγματα υλοποίησης βοηθητικών προγραμμάτων ελέγχου ασφαλείας Docker

Σενάριο Shell

Η δεύτερη επιλογή είναι κατάλληλη για περιπτώσεις όπου πρέπει να ελέγξετε τις εικόνες 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

Προσθέστε ένα σχόλιο