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 скачивает и проверяет его на уязвимости. В выводе задания можно увидеть примерно такой отчёт:
В разделе с артефактами есть ещё файл с более подробной информацией:
Обновляем библиотеки до последних версий и снова запускаем проверку, при хорошем раскладе должно получиться примерно так :
Was this helpful?
0 / 0