Skanowanie podatności w kontenerach

Zapewnienie bezpieczeństwa obrazów kontenerowych w procesie CI/CD może wydawać się dodatkowym obciążeniem, jednak w praktyce da się je zautomatyzować w prosty i powtarzalny sposób. W tym wpisie pokażę, jak zintegrować narzędzie Trivy z pipeline’em CI/CD, aby skutecznie wykrywać podatności bezpieczeństwa w budowanych obrazach kontenerowych jeszcze przed ich publikacją.
Trivy realizuje zasadę “shift left security”, czyli:
- skanowanie jak najwcześniej w cyklu wytwórczym,
- automatyczne blokowanie artefaktów niespełniających wymagań bezpieczeństwa.
Może analizować m.in.:
- obrazy kontenerowe (Docker, OCI),
- filesystem (repozytorium kodu),
- IaC (Terraform, Kubernetes YAML, Helm),
- SBOM (Software Bill of Materials).
Krok po kroku
Section titled “Krok po kroku”-
Utworzenie repozytoriów
Section titled “Utworzenie repozytoriów”Definicja repozytorium pl.rachuna-net/artifacts/containers/trivy
-
Utworzenie kontenera za pomocą image buildera
Section titled “Utworzenie kontenera za pomocą image buildera”Wydanie wersji trivy v1.0.0
-
Utworzenie joba do pipeline dla
Section titled “Utworzenie joba do pipeline dla image builder”image builderDokładny kod znajdziesz tutaj
🔬 trivy (dast): image: $IMAGE_TRIVY stage: integration-test services: - name: $IMAGE_TRIVY alias: trivy-dind allow_failure: true variables: TRIVY_NO_PROGRESS: "true" TRIVY_CACHE_DIR: ".trivycache/" before_script: - !reference [.helper_gitlab-ci.sh] script: - | export IMAGE_TO_SCAN="$CI_REGISTRY_IMAGE:$RELEASE_CANDIDATE_VERSION" # 1) Skan + surowy JSON trivy image --exit-code 0 --format json -o trivy-report.json "$IMAGE_TO_SCAN" # 2) HTML (czytelne do ręcznej analizy) trivy image --exit-code 0 --format template --template "@/opt/trivy/templates/html.tpl" -o trivy-report.html "$IMAGE_TO_SCAN" # 3) SARIF (pod zewn. analizatory / archiwizację) trivy image --exit-code 0 --format sarif -o trivy-report.sarif "$IMAGE_TO_SCAN" # 4) SBOM CycloneDX (przydatne do compliance i późniejszych analiz) trivy image --exit-code 0 --format cyclonedx -o trivy-sbom.cdx.json "$IMAGE_TO_SCAN" # 5) JUnit (żeby GitLab CE pokazał wynik jako "Test Report") trivy image --exit-code 0 --severity HIGH,CRITICAL --format template --template "@/opt/trivy/templates/junit.tpl" -o trivy-junit.xml "$IMAGE_TO_SCAN" # 6) Gate: fail pipeline jeśli są HIGH/CRITICAL (lub wg Twojej zmiennej) trivy image --exit-code 0 --severity HIGH $CI_REGISTRY_IMAGE:$RELEASE_CANDIDATE_VERSION trivy image --exit-code 1 --severity CRITICAL $CI_REGISTRY_IMAGE:$RELEASE_CANDIDATE_VERSION ls -la after_script: - !reference [.helper_readme.sh] cache: paths: - .trivycache/ artifacts: reports: junit: trivy-junit.xml paths: - trivy-report.json - trivy-report.html - trivy-report.sarif - trivy-sbom.cdx.json - trivy-junit.xml -
Uruchomienie pipeline
Section titled “Uruchomienie pipeline”Pipeline:

Raport:

[HIGH] CVE-2025-66564:
![[HIGH] CVE-2025-66564](/_astro/details.CZgSmPOo_209Y9m.webp)