Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker

Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker
Hei Habr!

Dalam kenyataan saat ini, karena meningkatnya peran containerisasi dalam proses pengembangan, masalah memastikan keamanan berbagai tahapan dan entitas yang terkait dengan container bukanlah yang terakhir. Melakukan pemeriksaan secara manual adalah tugas yang melelahkan, jadi alangkah baiknya mengambil setidaknya langkah awal untuk mengotomatiskan proses ini.

Pada artikel ini, saya akan membagikan skrip yang sudah jadi untuk mengimplementasikan beberapa utilitas keamanan Docker dan instruksi tentang cara menyiapkan stan demo kecil untuk menguji proses ini. Anda dapat menggunakan materi untuk bereksperimen dengan cara mengatur proses pengujian keamanan gambar dan instruksi Dockerfile. Jelas bahwa pengembangan dan penerapan infrastruktur berbeda untuk setiap orang, jadi di bawah ini saya akan memberikan beberapa opsi yang memungkinkan.

Utilitas Pemeriksaan Keamanan

Ada sejumlah besar aplikasi dan skrip pembantu berbeda yang melakukan pemeriksaan pada berbagai aspek infrastruktur Docker. Beberapa di antaranya sudah dijelaskan di artikel sebelumnya (https://habr.com/ru/company/swordfish_security/blog/518758/#docker-security), dan dalam artikel ini saya ingin fokus pada tiga di antaranya, yang mencakup bagian utama persyaratan keamanan untuk image Docker yang dibuat selama proses pengembangan. Selain itu, saya juga akan menunjukkan contoh bagaimana ketiga utilitas ini dapat digabungkan menjadi satu pipa untuk melakukan pemeriksaan keamanan.

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

Utilitas konsol yang cukup sederhana yang membantu menilai kebenaran dan keamanan instruksi Dockerfile terlebih dahulu (misalnya, hanya menggunakan pendaftar gambar yang diizinkan atau menggunakan sudo).

Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker

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

Utilitas konsol yang bekerja pada gambar (atau pada tarbal gambar yang disimpan) yang memeriksa kebenaran dan keamanan gambar tertentu dengan menganalisis lapisan dan konfigurasinya - pengguna apa yang dibuat, instruksi apa yang digunakan, volume apa yang dipasang , adanya kata sandi kosong, dll.e Sementara jumlah cek tidak terlalu besar dan didasarkan pada beberapa pemeriksaan dan rekomendasi sendiri Tolok Ukur CIS (Pusat Keamanan Internet). untuk buruh pelabuhan.
Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker

Sepele
https://github.com/aquasecurity/trivy

Utilitas ini ditujukan untuk menemukan dua jenis kerentanan - masalah pembangunan OS (Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu didukung) dan masalah ketergantungan (Gemfile.lock, Pipfile.lock, composer.lock, package-lock .json , benang.lock, Cargo.lock). Trivy dapat memindai image di repositori dan image lokal, dan juga memindai berdasarkan file .tar yang ditransfer dengan image Docker.

Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker

Opsi Implementasi Utilitas

Untuk mencoba aplikasi yang dijelaskan dalam kondisi terisolasi, saya akan memberikan instruksi untuk menginstal semua utilitas sebagai bagian dari proses yang disederhanakan.

Ide utamanya adalah untuk mendemonstrasikan bagaimana Anda dapat mengimplementasikan pemeriksaan konten otomatis untuk file Docker dan gambar Docker yang dibuat selama pengembangan.

Verifikasi itu sendiri terdiri dari langkah-langkah berikut:

  1. Memeriksa kebenaran dan keamanan instruksi Dockerfile dengan utilitas linter Hadolint
  2. Memeriksa kebenaran dan keamanan gambar akhir dan perantara - sebuah utilitas Dok
  3. Memeriksa Kerentanan yang Diketahui Umum (CVE) pada gambar dasar dan sejumlah dependensi - oleh utilitas Sepele

Nanti di artikel saya akan memberikan tiga opsi untuk menerapkan langkah-langkah ini:
Yang pertama adalah dengan mengonfigurasi pipa CI / CD menggunakan contoh GitLab (dengan deskripsi proses peningkatan instance pengujian).
Yang kedua menggunakan skrip shell.
Yang ketiga adalah dengan membuat image Docker untuk memindai image Docker.
Anda dapat memilih opsi yang paling sesuai untuk Anda, mentransfernya ke infrastruktur Anda dan menyesuaikannya dengan kebutuhan Anda.

Semua file yang diperlukan dan instruksi tambahan juga ada di repositori: https://github.com/Swordfish-Security/docker_cicd

Integrasi GitLab CI/CD

Pada opsi pertama, kita akan melihat bagaimana pemeriksaan keamanan dapat diimplementasikan menggunakan sistem repositori GitLab sebagai contoh. Di sini kita akan melalui langkah-langkahnya dan melihat cara menyiapkan lingkungan pengujian dengan GitLab dari awal, membuat proses pemindaian, dan menjalankan utilitas untuk menguji Dockerfile pengujian dan gambar acak - aplikasi JuiceShop.

Menginstal GitLab
1. Instal Docker:

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

2. Tambahkan pengguna saat ini ke grup buruh pelabuhan sehingga Anda dapat bekerja dengan buruh pelabuhan tanpa menggunakan sudo:

sudo addgroup <username> docker

3. Temukan IP Anda:

ip addr

4. Instal dan jalankan GitLab di wadah, ganti alamat IP di nama host dengan milik Anda:

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

Kami menunggu GitLab untuk menyelesaikan semua prosedur instalasi yang diperlukan (Anda dapat mengikuti proses melalui output dari file log: docker logs -f gitlab).

5. Buka IP lokal Anda di browser dan lihat halaman yang menawarkan untuk mengubah kata sandi untuk pengguna root:
Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker
Tetapkan kata sandi baru dan buka GitLab.

6. Buat proyek baru, misalnya cicd-test dan inisialisasi dengan file awal README.md:
Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker
7. Sekarang kita perlu menginstal GitLab Runner: agen yang akan menjalankan semua operasi yang diperlukan berdasarkan permintaan.
Unduh versi terbaru (dalam hal ini, di bawah 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. Jadikan itu dapat dieksekusi:

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

9. Tambahkan pengguna OS untuk Runner dan mulai layanan:

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

Seharusnya terlihat seperti ini:

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. Sekarang kita mendaftarkan Runner agar dapat berinteraksi dengan instance GitLab kita.
Untuk melakukan ini, buka halaman Pengaturan-CI/CD (http://OUR_ IP_ADDRESS/root/cicd-test/-/settings/ci_cd) dan pada tab Pelari temukan URL dan token Pendaftaran:
Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker
11. Daftarkan Runner dengan mengganti URL dan token Pendaftaran:

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"

Hasilnya, kami mendapatkan GitLab yang siap pakai, di mana kami perlu menambahkan instruksi untuk memulai utilitas kami. Dalam demo ini, kami tidak memiliki langkah-langkah pembuatan dan penampung aplikasi, tetapi dalam lingkungan nyata mereka akan mendahului langkah-langkah pemindaian dan menghasilkan gambar dan Dockerfile untuk analisis.

konfigurasi pipa

1. Tambahkan file ke repositori file docker saya.df (ini adalah Dockerfile uji yang akan kami uji) dan file konfigurasi proses GitLab CI/CD .gitlab-cicd.yml, yang mencantumkan instruksi untuk pemindai (perhatikan titik pada nama file).

File konfigurasi .yaml berisi instruksi untuk menjalankan tiga utilitas (Hadolint, Dockle, dan Trivy) yang akan menguraikan Dockerfile yang dipilih dan gambar yang ditentukan dalam variabel DOCKERFILE. Semua file yang diperlukan dapat diambil dari repositori: https://github.com/Swordfish-Security/docker_cicd/

Ekstrak dari file docker saya.df (ini adalah file abstrak dengan serangkaian instruksi arbitrer hanya untuk mendemonstrasikan cara kerja utilitas). Tautan langsung ke file: file docker saya.df

Isi 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

Konfigurasi YAML terlihat seperti ini (filenya sendiri dapat diambil dari tautan langsung di sini: .gitlab-ci.yml):

Isi .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

Jika perlu, Anda juga dapat memindai gambar yang disimpan sebagai arsip .tar (namun, Anda perlu mengubah parameter input untuk utilitas di file YAML)

NB: Trivy perlu diinstal rpm ΠΈ git. Jika tidak, itu akan menghasilkan kesalahan saat memindai gambar berbasis RedHat dan mendapatkan pembaruan ke database kerentanan.

2. Setelah menambahkan file ke repositori, sesuai petunjuk di file konfigurasi kami, GitLab akan secara otomatis memulai proses pembuatan dan pemindaian. Pada tab CI / CD β†’ Pipelines, Anda dapat melihat kemajuan instruksi.

Akibatnya, kami memiliki empat tugas. Tiga di antaranya terlibat langsung dalam pemindaian, dan yang terakhir (Laporan) mengumpulkan laporan sederhana dari file yang tersebar dengan hasil pemindaian.
Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker
Secara default, Trivy menghentikan eksekusinya jika kerentanan KRITIS ditemukan pada gambar atau dependensi. Pada saat yang sama, Hadolint selalu mengembalikan Sukses dalam kode eksekusi, karena eksekusinya selalu memiliki komentar yang menyebabkan pembangunan berhenti.

Bergantung pada persyaratan khusus Anda, Anda dapat mengonfigurasi kode keluar sehingga utilitas ini juga menghentikan proses pembuatan saat masalah dengan kekritisan tertentu terdeteksi. Dalam kasus kami, build hanya akan berhenti jika Trivy mendeteksi kerentanan dengan tingkat keparahan yang telah kami tentukan dalam variabel SHOWSTOPPER di .gitlab-ci.yml.
Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker

Hasil pengoperasian setiap utilitas dapat dilihat di log setiap tugas pemindaian, langsung di file json di bagian artefak, atau di laporan HTML sederhana (lebih lanjut di bawah):
Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker

3. Untuk menyajikan laporan utilitas dalam bentuk yang sedikit lebih mudah dibaca manusia, skrip Python kecil digunakan untuk mengonversi tiga file json menjadi satu file HTML dengan tabel cacat.
Skrip ini diluncurkan oleh tugas Laporan terpisah, dan artefak terakhirnya adalah file HTML dengan laporan. Sumber skrip juga ada di repositori dan dapat disesuaikan dengan kebutuhan, warna, dll.
Metode dan contoh penerapan utilitas pemeriksaan keamanan Docker

Skrip cangkang

Opsi kedua cocok untuk kasus di mana Anda perlu memeriksa image Docker yang tidak ada dalam sistem CI / CD, atau Anda harus memiliki semua instruksi dalam bentuk yang dapat dijalankan langsung di host. Opsi ini ditutupi oleh skrip shell siap pakai yang dapat dijalankan pada mesin virtual (atau bahkan nyata) yang bersih. Skrip mengikuti instruksi yang sama dengan gitlab-runner di atas.

Agar skrip berhasil, Docker harus diinstal pada sistem dan pengguna saat ini harus berada di grup buruh pelabuhan.

Script itu sendiri dapat ditemukan di sini: docker_sec_check.sh

Di awal file, variabel menentukan gambar mana yang harus dipindai dan tingkat keparahan cacat apa yang akan menyebabkan utilitas Trivy keluar dengan kode kesalahan yang ditentukan.

Selama eksekusi skrip, semua utilitas akan diunduh ke direktori buruh_buruh_alat, hasil pekerjaan mereka - di direktori docker_tools/json, dan HTML dengan laporan akan ada di file result.html.

Contoh keluaran skrip

~/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

Gambar Docker dengan semua utilitas

Sebagai alternatif ketiga, saya mengkompilasi dua Dockerfiles sederhana untuk membuat image dengan utilitas keamanan. Satu Dockerfile akan membantu membuat satu set untuk memindai gambar dari repositori, yang kedua (Dockerfile_tar) akan membuat satu set untuk memindai file tar dengan gambar tersebut.

1. Kami mengambil file dan skrip Docker yang sesuai dari repositori https://github.com/Swordfish-Security/docker_cicd/tree/master/Dockerfile.
2. Jalankan untuk perakitan:

docker build -t dscan:image -f docker_security.df .

3. Setelah build selesai, buat container dari image. Pada saat yang sama, kami meneruskan variabel lingkungan DOCKERIMAGE dengan nama gambar yang kami minati dan memasang Dockerfile yang ingin kami analisis dari mesin kami ke file /Dockerfile (perhatikan bahwa jalur absolut ke file ini diperlukan):

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

Temuan

Kami telah membahas hanya satu set dasar utilitas pemindaian artefak Docker, yang menurut saya mencakup sebagian besar persyaratan keamanan gambar dengan cukup efektif. Ada banyak alat berbayar dan gratis lainnya yang dapat melakukan pemeriksaan yang sama, membuat laporan yang indah, atau bekerja murni dalam mode konsol, mencakup sistem manajemen wadah, dll. Tinjauan tentang alat ini dan cara mengintegrasikannya mungkin muncul beberapa saat kemudian.

Sisi positif dari kumpulan alat yang dijelaskan dalam artikel ini adalah bahwa semuanya dibangun di atas sumber terbuka dan Anda dapat bereksperimen dengannya dan alat serupa lainnya untuk menemukan apa yang benar-benar sesuai dengan kebutuhan dan fitur infrastruktur Anda. Tentu saja, semua kerentanan yang ditemukan harus dipelajari untuk penerapan dalam kondisi tertentu, tetapi ini adalah topik untuk artikel besar mendatang.

Saya harap petunjuk, skrip, dan utilitas ini akan membantu Anda dan menjadi titik awal untuk membuat infrastruktur yang lebih aman di bidang kontainerisasi.

Sumber: www.habr.com

Tambah komentar