• Русский
  • Обновление базы уязвимостей Trivy в офлайн-средах

    Это руководство объясняет, как поддерживать сканер Trivy в Harbor в актуальном состоянии в изолированных от сети средах, создавая и публикуя собственный образ офлайн-базы уязвимостей.

    По умолчанию Trivy загружает базу уязвимостей из интернета. В офлайн-среде это невозможно, из-за чего результаты сканирования быстро устаревают или становятся недоступными. Harbor поддерживает загрузку базы из заранее подготовленного образа — в этом руководстве показано, как собрать такой образ и указать Harbor на него.

    Предварительные требования

    • Запущенный экземпляр Harbor, управляемый этим оператором.
    • Машина с доступом в интернет для сборки образа базы.
    • Приватный контейнерный реестр, доступный из кластера Harbor, с учетными данными для push-операций с образами.
    • Доступ на редактирование Harbor CR (harbors.operator.alaudadevops.io).

    Шаг 1 — Сборка офлайн-образа базы

    На машине с доступом в интернет создайте файл Dockerfile со следующим содержимым. Замените <TRIVY_VERSION> на последнюю доступную на момент сборки версию Trivy.

    FROM jitesoft/trivy:<TRIVY_VERSION> AS source
    WORKDIR /opt/trivy
    RUN TRIVY_TEMP_DIR=$(mktemp -d) && \
        trivy --cache-dir $TRIVY_TEMP_DIR image --download-db-only && \
        tar -czf ./trivy-offline.db.tgz -C $TRIVY_TEMP_DIR/db metadata.json trivy.db
    
    FROM alpine:3.17
    COPY --from=source /opt/trivy/ /
    RUN apk add --no-cache jq

    Соберите образ и отправьте его в приватный реестр:

    podman build -t <PRIVATE_REGISTRY>/<PROJECT>/trivy-offline-db:<TAG> .
    podman push <PRIVATE_REGISTRY>/<PROJECT>/trivy-offline-db:<TAG>

    Итоговый образ должен содержать /trivy-offline.db.tgz в корне — init-контейнер Harbor ожидает именно этот путь.

    Шаг 2 — Включение офлайн-сканирования в Harbor CR

    Отредактируйте Harbor CR и установите trivy.offlineScan в значение true, затем укажите global.images.trivyOfflineDB на образ, собранный на шаге 1:

    spec:
      helmValues:
        trivy:
          offlineScan: true
          skipUpdate: true
          skipJavaDBUpdate: true
        global:
          images:
            trivyOfflineDB:
              repository: <PROJECT>/trivy-offline-db
              tag: <TAG>

    Если init-контейнер офлайн-базы при извлечении trivy-offline.db.tgz исчерпывает память, можно увеличить ресурсы только для init-контейнера, не повышая постоянные ресурсы основного контейнера Trivy:

    spec:
      helmValues:
        trivy:
          offlineDBInitResources:
            requests:
              cpu: 200m
              memory: 512Mi
            limits:
              cpu: 1
              memory: 2Gi

    Справка по полям:

    ПолеНазначение
    trivy.offlineScanВключает init-контейнер, который извлекает офлайн-базу в каталог кэша Trivy.
    trivy.offlineDBInitResourcesНеобязательные запросы и лимиты ресурсов для init-контейнера init-offline-db. Используйте это поле, когда для извлечения офлайн-базы требуется больше памяти, чем основному контейнеру Trivy нужно во время работы.
    trivy.skipUpdateЗапрещает Trivy пытаться обновлять основную базу из интернета. Рекомендуется в полностью изолированных от сети средах.
    trivy.skipJavaDBUpdateЗапрещает Trivy обновлять Java-базу из интернета. Рекомендуется в полностью изолированных от сети средах.
    global.images.trivyOfflineDB.repository / .tagУказывает на образ, собранный на шаге 1. Полный образ формируется с учетом настроенного префикса реестра образов.

    Примените изменения и дождитесь обновления Pod Trivy.

    Шаг 3 — Проверка загрузки базы

    Убедитесь, что init-контейнер завершился успешно и что Trivy подхватил новую базу:

    # The init container should have completed successfully
    kubectl -n <NAMESPACE> describe pod <RELEASE>-harbor-trivy-0 | grep -A5 init-offline-db
    
    # The database metadata inside the Trivy Pod should reflect a recent build timestamp
    kubectl -n <NAMESPACE> exec -it <RELEASE>-harbor-trivy-0 -- \
      cat /home/scanner/.cache/trivy/db/metadata.json

    Запустите сканирование любого образа в пользовательском интерфейсе Harbor и убедитесь, что уязвимости отображаются ожидаемым образом.

    Как поддерживать базу в актуальном состоянии

    Поскольку база уязвимостей часто меняется, регулярно пересобирайте и публикуйте новый образ, чтобы результаты сканирования не устаревали. Хорошим вариантом является запланированная задача CI, которая выполняет сборку из шага 1 и обновляет значение tag в Harbor CR.

    Примечания

    • ARM / multi-arch. Если кластер работает не на архитектуре amd64, соберите образ trivyOfflineDB как multi-arch или соберите его для архитектуры узлов, на которых работает Pod Trivy.
    • Получение образа. Убедитесь, что кластер Harbor может загружать образы из вашего приватного реестра. Если требуется аутентификация, настройте image pull secret в пространстве имен Harbor.