Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker

Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker
Čau Habr!

V dnešnej realite vzhľadom na narastajúcu úlohu kontajnerizácie vo vývojových procesoch nie je otázka zabezpečenia bezpečnosti rôznych etáp a subjektov spojených s kontajnermi na poslednom mieste. Manuálne vykonávanie kontrol je namáhavá úloha, preto by bolo pekné urobiť aspoň počiatočné kroky smerom k automatizácii tohto procesu.

V tomto článku sa podelím o hotové skripty na implementáciu niekoľkých bezpečnostných utilít Docker a návod, ako nastaviť malý demo stojan na testovanie tohto procesu. Materiály môžete použiť na experimentovanie s tým, ako organizovať proces testovania bezpečnosti obrázkov a pokynov Dockerfile. Je jasné, že infraštruktúra vývoja a implementácie je pre každého iná, preto nižšie uvediem niekoľko možných možností.

Pomôcky na kontrolu zabezpečenia

Existuje veľké množstvo rôznych pomocných aplikácií a skriptov, ktoré vykonávajú kontroly rôznych aspektov infraštruktúry Docker. Niektoré z nich už boli popísané v predchádzajúcom článku (https://habr.com/ru/company/swordfish_security/blog/518758/#docker-security), a v tomto článku by som sa chcel zamerať na tri z nich, ktoré pokrývajú väčšinu bezpečnostných požiadaviek na obrázky Docker, ktoré sa vytvárajú počas procesu vývoja. Okrem toho tiež ukážem príklad, ako možno tieto tri nástroje spojiť do jedného potrubia na vykonávanie bezpečnostných kontrol.

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

Pomerne jednoduchá konzolová utilita, ktorá pomáha najskôr posúdiť správnosť a bezpečnosť pokynov Dockerfile (napríklad pomocou iba povolených registrov obrázkov alebo pomocou sudo).

Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker

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

Nástroj konzoly, ktorý pracuje s obrázkom (alebo s uloženým tarballom obrázku), ktorý kontroluje správnosť a bezpečnosť konkrétneho obrázka ako takého analýzou jeho vrstiev a konfigurácie – akí používatelia sú vytvorení, aké inštrukcie sa používajú, aké zväzky sú pripojené , prítomnosť prázdneho hesla atď. e. Zatiaľ čo počet kontrol nie je príliš veľký a je založený na niekoľkých vlastných kontrolách a odporúčaniach Benchmark CIS (Centrum pre internetovú bezpečnosť). pre docker.
Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker

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

Tento nástroj je zameraný na nájdenie dvoch typov zraniteľností – problémy so zostavovaním OS (podporované sú Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu) a problémy so závislosťou (Gemfile.lock, Pipfile.lock, skladateľ.lock, package-lock .json , yarn.lock, Cargo.lock). Trivy dokáže skenovať obraz v úložisku aj lokálny obraz a tiež skenovať na základe preneseného súboru .tar s obrazom Docker.

Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker

Možnosti implementácie utilít

Aby ste si mohli popísané aplikácie vyskúšať v izolovaných podmienkach, poskytnem v rámci zjednodušeného procesu návod na inštaláciu všetkých utilít.

Hlavnou myšlienkou je ukázať, ako môžete implementovať automatickú kontrolu obsahu súborov Dockerfiles a obrázkov Docker, ktoré sú vytvorené počas vývoja.

Samotné overenie pozostáva z nasledujúcich krokov:

  1. Kontrola správnosti a bezpečnosti pokynov Dockerfile pomocou pomôcky linter Hadolint
  2. Kontrola správnosti a bezpečnosti finálnych a prechodných obrázkov - pomôcka Dockle
  3. Kontrola bežne známych zraniteľností (CVE) v základnom obraze a niekoľkých závislostí - pomocou nástroja Trivy

Ďalej v článku uvediem tri možnosti implementácie týchto krokov:
Prvým je konfigurácia CI / CD potrubia pomocou príkladu GitLab (s popisom procesu vytvárania testovacej inštancie).
Druhým je použitie skriptu shell.
Tretím je vytvorenie obrazu Docker na skenovanie obrázkov Docker.
Môžete si vybrať možnosť, ktorá vám najviac vyhovuje, preniesť ju do vašej infraštruktúry a prispôsobiť ju vašim potrebám.

Všetky potrebné súbory a ďalšie pokyny sú tiež v úložisku: https://github.com/Swordfish-Security/docker_cicd

Integrácia GitLab CI/CD

V prvej možnosti sa pozrieme na to, ako je možné na príklade implementovať bezpečnostné kontroly pomocou systému úložiska GitLab. Tu si prejdeme kroky a uvidíme, ako od začiatku nastaviť testovacie prostredie s GitLab, vytvoriť proces skenovania a spustiť pomocné programy na testovanie testovacieho súboru Dockerfile a náhodného obrázka – aplikácie JuiceShop.

Inštalácia GitLab
1. Nainštalujte Docker:

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

2. Pridajte aktuálneho používateľa do skupiny docker, aby ste mohli pracovať s dockerom bez použitia sudo:

sudo addgroup <username> docker

3. Nájdite svoju IP adresu:

ip addr

4. Nainštalujte a spustite GitLab v kontajneri a nahraďte IP adresu v názve hostiteľa svojou vlastnou:

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

Čakáme, kým GitLab dokončí všetky potrebné inštalačné postupy (proces môžete sledovať cez výstup zo súboru denníka: docker logs -f gitlab).

5. V prehliadači otvorte svoju lokálnu IP a pozrite si stránku ponúkajúcu zmenu hesla pre užívateľa root:
Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker
Nastavte si nové heslo a prejdite na GitLab.

6. Vytvorte nový projekt, napríklad cicd-test a inicializujte ho pomocou štartovacieho súboru README.md:
Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker
7. Teraz musíme nainštalovať GitLab Runner: agenta, ktorý na požiadanie spustí všetky potrebné operácie.
Stiahnite si najnovšiu verziu (v tomto prípade pod Linuxom 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. Spravte ho spustiteľným:

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

9. Pridajte používateľa operačného systému pre Runner a spustite službu:

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

Malo by to vyzerať asi takto:

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. Teraz zaregistrujeme Runnera, aby mohol interagovať s našou inštanciou GitLab.
Ak to chcete urobiť, otvorte stránku Settings-CI/CD (http://OUR_IP_ADDRESS/root/cicd-test/-/settings/ci_cd) a na karte Runners nájdite URL a registračný token:
Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker
11. Zaregistrujte bežca nahradením adresy URL a registračného tokenu:

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"

Výsledkom je, že dostaneme pripravený funkčný GitLab, do ktorého musíme pridať pokyny na spustenie našich utilít. V tejto ukážke nemáme kroky na zostavenie aplikácie a kontajnerizáciu, ale v reálnom prostredí budú predchádzať krokom skenovania a vygenerovať obrázky a súbor Docker na analýzu.

konfigurácia potrubia

1. Pridajte súbory do úložiska mydockerfile.df (toto je testovací súbor Dockerfile, ktorý budeme testovať) a konfiguračný súbor procesu GitLab CI/CD .gitlab-cicd.yml, v ktorom sú uvedené pokyny pre skenery (všimnite si bodku v názve súboru).

Konfiguračný súbor .yaml obsahuje pokyny na spustenie troch nástrojov (Hadolint, Dockle a Trivy), ktoré analyzujú vybratý súbor Dockerfile a obrázok špecifikovaný v premennej DOCKERFILE. Všetky potrebné súbory je možné prevziať z úložiska: https://github.com/Swordfish-Security/docker_cicd/

Výpis z mydockerfile.df (toto je abstraktný súbor so súborom ľubovoľných inštrukcií len na demonštráciu toho, ako nástroj funguje). Priamy odkaz na súbor: mydockerfile.df

Obsah súboru 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

Konfigurácia YAML vyzerá takto (samotný súbor možno prevziať z priameho odkazu tu: .gitlab-ci.yml):

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

V prípade potreby môžete tiež skenovať uložené obrázky ako archív .tar (budete však musieť zmeniť vstupné parametre pre nástroje v súbore YAML)

Poznámka: Trivy vyžaduje inštaláciu rpm и ísť. V opačnom prípade bude generovať chyby pri skenovaní obrázkov založených na RedHat a získavaní aktualizácií databázy zraniteľností.

2. Po pridaní súborov do úložiska, podľa pokynov v našom konfiguračnom súbore, GitLab automaticky spustí proces zostavovania a skenovania. Na karte CI / CD → Pipelines môžete vidieť priebeh pokynov.

V dôsledku toho máme štyri úlohy. Tri z nich sa priamo podieľajú na skenovaní a posledný (Report) zhromažďuje jednoduchú správu z rozptýlených súborov s výsledkami kontroly.
Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker
V predvolenom nastavení Trivy zastaví svoje vykonávanie, ak sa v obraze alebo v závislostiach nájdu KRITICKÉ zraniteľnosti. Zároveň Hadolint vždy vracia úspešný kód, pretože jeho vykonanie má vždy poznámky, čo vedie k zastaveniu zostavovania.

V závislosti od vašich špecifických požiadaviek môžete nakonfigurovať ukončovací kód tak, aby tieto pomocné programy zastavili aj proces zostavovania, keď sa zistia problémy určitej kritickosti. V našom prípade sa zostavovanie zastaví iba vtedy, ak Trivy zistí zraniteľnosť so závažnosťou, ktorú sme špecifikovali v premennej SHOWSTOPPER v .gitlab-ci.yml.
Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker

Výsledok činnosti každej pomôcky je možné zobraziť v protokole každej úlohy skenovania, priamo v súboroch json v sekcii artefakty alebo v jednoduchej HTML správe (viac o tom nižšie):
Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker

3. Na prezentáciu správ o nástrojoch v trochu čitateľnejšej forme sa používa malý skript Python na konverziu troch súborov json do jedného súboru HTML s tabuľkou chýb.
Tento skript sa spúšťa samostatnou úlohou Report a jeho konečným artefaktom je súbor HTML s reportom. Zdroj skriptu je tiež v úložisku a môže byť prispôsobený vašim potrebám, farbám atď.
Metódy a príklady implementácie nástrojov bezpečnostnej kontroly Docker

Shell skript

Druhá možnosť je vhodná v prípadoch, keď potrebujete skontrolovať obrázky Docker mimo systému CI / CD, alebo potrebujete mať všetky pokyny vo forme, ktorú je možné vykonať priamo na hostiteľovi. Túto možnosť zastrešuje už hotový shell skript, ktorý je možné spustiť na čistom virtuálnom (alebo aj skutočnom) stroji. Skript sa riadi rovnakými pokynmi ako gitlab-runner vyššie.

Aby skript úspešne fungoval, musí byť v systéme nainštalovaný Docker a aktuálny používateľ musí byť v skupine dockerov.

Samotný skript nájdete tu: docker_sec_check.sh

Na začiatku súboru premenné určujú, ktorý obrázok sa má naskenovať a aká závažnosť defektov spôsobí ukončenie pomôcky Trivy so zadaným kódom chyby.

Počas vykonávania skriptu sa všetky pomocné programy stiahnu do adresára docker_tools, výsledky ich práce - v adresári docker_tools/jsona kód HTML s prehľadom bude v súbore výsledky.html.

Príklad výstupu skriptu

~/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 image so všetkými nástrojmi

Ako tretiu alternatívu som zostavil dva jednoduché súbory Dockerfiles na vytvorenie obrazu s bezpečnostnými pomôckami. Jeden Dockerfile pomôže zostaviť sadu na skenovanie obrázka z úložiska, druhý (Dockerfile_tar) zostaví sadu na skenovanie súboru tar s obrázkom.

1. Z úložiska vezmeme príslušný súbor Docker a skripty https://github.com/Swordfish-Security/docker_cicd/tree/master/Dockerfile.
2. Spustite ho na montáž:

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

3. Po dokončení montáže vytvoríme z obrázku kontajner. Zároveň odovzdáme premennú prostredia DOCKERIMAGE s názvom obrázka, ktorý nás zaujíma, a pripojíme súbor Dockerfile, ktorý chceme analyzovať, z nášho počítača do súboru /Dockerfile (všimnite si, že sa vyžaduje absolútna cesta k tomuto súboru):

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

výsledky

Pokryli sme len jednu základnú sadu nástrojov na skenovanie artefaktov Docker, ktorá podľa mňa pokrýva veľkú časť požiadaviek na bezpečnosť obrázkov celkom efektívne. Existuje mnoho ďalších platených a bezplatných nástrojov, ktoré môžu vykonávať rovnaké kontroly, kresliť krásne zostavy alebo pracovať čisto v režime konzoly, pokryť systémy správy kontajnerov atď. Prehľad týchto nástrojov a ich integrácie sa môže objaviť o niečo neskôr.

Pozitívnou stránkou sady nástrojov opísanej v článku je, že sú všetky postavené na open source a môžete s nimi a inými podobnými nástrojmi experimentovať, aby ste našli to, čo presne vyhovuje vašim požiadavkám a funkciám infraštruktúry. Samozrejme, všetky nájdené zraniteľnosti by sa mali preštudovať z hľadiska použiteľnosti v konkrétnych podmienkach, ale toto je téma na budúci veľký článok.

Dúfam, že vám tieto pokyny, skripty a nástroje pomôžu a stanú sa východiskovým bodom pre vytvorenie bezpečnejšej infraštruktúry v oblasti kontajnerizácie.

Zdroj: hab.com

Pridať komentár