Перейти к содержанию

▍Trivy

Trivy Logo

Настройка сканера уязвимостей Docker-контейнеров Trivy в Gitlab

Trivy – это инструмент с открытым исходным кодом от Aqua Security для поиска уязвимостей и ошибок неправильных настроек. В основном полезен для обнаружения уязвимостей и зависимостей на уровне контейнера. По своей сути, это в основном сканер CVE, полезный для поиска уже существующих и публично раскрытых уязвимостей.

Для начала у нас должен быть настроен сам Gitlab c Gitlab-runner. В качестве примера возьмем простенький проект api в контейнере на базе node:alpine и посмотрим какие есть уязвимости:

nano .gitlab-ci.yml
variables:
  IMAGES: $REGISTRY_NAME/$CI_PROJECT_NAME:latest

stages:
  - docker_push
  - devsecops

docker_push:
  stage: docker_push
  tags: [api]
  image: docker
  only:
    - /^main$/
  before_script:
    - echo "$CI_REGISTRY_PASSWORD" docker login $CI_REGISTRY --username $CI_REGISTRY_USER --password-stdin
    - mkdir /root/.docker && echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
  script:
    - docker build --no-cache -f Dockerfile -t $IMAGES .  
    - docker push $IMAGES
    - docker logout $CI_REGISTRY

trivy:
  stage: devsecops
  tags: [api]
  image:
    name: docker.io/aquasec/trivy:latest
    entrypoint: [""]
  variables:
    GIT_STRATEGY: none
    TRIVY_NO_PROGRESS: "true"
    TRIVY_CACHE_DIR: ".trivycache/"
  before_script:
    - echo "$CI_REGISTRY_PASSWORD" docker login $CI_REGISTRY --username $CI_REGISTRY_USER --password-stdin
    - mkdir /root/.docker && echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
  script:
    - trivy --version
    # cache cleanup is needed when scanning images with the same tags, it does not remove the database
    - time trivy image --clear-cache
    # update vulnerabilities db
    - time trivy image --download-db-only
    # Builds report and puts it in the default workdir $CI_PROJECT_DIR, so `artifacts:` can take it from there
    - time trivy image --exit-code 0 --format template --template "@/contrib/gitlab.tpl"
        --output "$CI_PROJECT_DIR/gl-container-scanning-report.json" "$IMAGES"
    # Prints full report
    - time trivy image --exit-code 0 "$IMAGES"
    # Fail on critical vulnerabilities
    - time trivy image --exit-code 1 --severity CRITICAL "$IMAGES"
  cache:
    paths:
      - .trivycache/
  artifacts:
    paths:
      - gl-container-scanning-report.json
    reports:
      codequality: gl-container-scanning-report.json
В данном примере собирается такой контейнер:

nano Dockerfile
FROM node:alpine

WORKDIR /usr/src/app
COPY package*.json ./

RUN npm audit fix && npm install

# Bundle app source
COPY . .

EXPOSE 3001

CMD [ "node", "index.js" ]
После сборки он загружается в локальный Registry, далее Trivy скачивает и проверяет его на уязвимости. В выводе задания можно увидеть примерно такой отчёт:

Trivy prints full report

В разделе с артефактами есть ещё файл с более подробной информацией:

Trivy prints full report

Обновляем библиотеки до последних версий и снова запускаем проверку, при хорошем раскладе должно получиться примерно так 😎 :

Trivy prints full report

К началу