Skip to content
GitLabGitHub

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

  1. Definicja repozytorium pl.rachuna-net/artifacts/containers/trivy

  2. Utworzenie kontenera za pomocą image buildera

    Section titled “Utworzenie kontenera za pomocą image buildera”

    Wydanie wersji trivy v1.0.0

  3. Utworzenie joba do pipeline dla image builder

    Section titled “Utworzenie joba do pipeline dla image builder”

    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
  4. Pipeline:

    pipeline

    Raport:

    report

    [HIGH] CVE-2025-66564:

    [HIGH] CVE-2025-66564