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ą.
Note
Trivy to narzędzie typu open-source do analizy bezpieczeństwa (security scanning), zaprojektowane przede wszystkim z myślą o kontenerach i pipeline’ach CI/CD. Jego głównym celem jest wczesne wykrywanie podatności oraz problemów bezpieczeństwa zanim artefakt trafi na środowisko testowe lub produkcyjne.
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).
Definicja repozytorium pl.rachuna-net/artifacts/containers/trivy
Wydanie wersji trivy v1.0.0
Dokł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
Pipeline:
Raport:
[HIGH] CVE-2025-66564: