Используем trivy для сканирования уязвимостей

«В двух словах», trivy — инструмент для сканирования безопасности. Он позволяет определить потенциальные угрозы в программном коде, конфигурации, установленных пакетах операционной системы, контейнерах и некоторое другое.

В нашей инструкции мы рассмотрим простой установку trivy на Linux и пример его использования.

Установка

На странице Github можно ознакомиться с программным продуктом и посмотреть его версии. На момент обновления данной инструкции, последняя версия была 0.46.0, поэтому мы будем устанавливать ее.

Для удобства, создадим переменную с версией:

TR_VER=0.46.0

Для разных типов Linux действия будут немного отличаться.

а) Для RPM (Rocky Linux, РЕД ОС, CentOS):

rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v${TR_VER}/trivy_${TR_VER}_Linux-64bit.rpm

б) Для Deb (Debian, Ubuntu, Astra Linux):

wget https://github.com/aquasecurity/trivy/releases/download/v${TR_VER}/trivy_${TR_VER}_Linux-64bit.deb

dpkg -i trivy_*_Linux-64bit.deb

На этом установка завершена. Можно использовать команду trivy.

Сканирование

В данном разделе рассмотрим синтаксис использования утилиты trivy. Он выглядит таким образом:

trivy [global flags] command [flags] target

Важно знать про command . Существуют следующие направления для сканирования:

  • fs — сканирование всех файлов по определенному пути. Находит уязвимости, неправильные конфигурации, оставленные в проекте секреты и лицензии.
  • vm — образы виртуальных машин.
  • k8s — для кластеров kubernetes.
  • aws — сканирует учетную запись AWS на наличие неправильных конфигураций.
  • repo — репозитории GIT.
  • rootfs — корневой файловой системы.
  • image — docker-образы.
  • config — проверка корректности для конфигурационных файлов.

* возможно, в более поздних версиях trivy их будет больше.

Примеры использования

Для получения более дополнительной информации по применению trivy можно воспользоваться командой:

trivy —help

Мы же рассмотрим несколько примеров запуска сканирования, с которыми сталкивался автор.

1. Сканирование образа docker:

trivy image python:3.8

* где python:3.8 — образ с тегом.

2. Проверка всех файлов по определенному пути (в текущем расположении):

trivy fs ./

3. По умолчанию, trivy заканчивает работу с кодом 0. Но если нам нужен код 1, когда обнаружены уязвимости, то используем опцию exit-code :

trivy fs ./ —exit-code 1

4. Чтобы получить отчет о сканировании в отдельном файле html, вводим:

trivy image —format template —template «@/usr/local/share/trivy/templates/html.tpl» -o report.html golang:1.12-alpine

* в данном примере мы просканируем docker-образ golang:1.12-alpine и после утилита сохранит отчет в файл report.html . В качестве шаблона для отчета мы возьмем файл /usr/local/share/trivy/templates/html.tpl .

5. Утилита trivy вернет ошибку, если найдет хоть какую-либо уязвимость. Но мы моем ему указать, какие уровни уязвимостей для нас являются критичными:

trivy fs ./ -s HIGH,CRITICAL

* trivy вернет ошибку только если найдет уязвимости уровня HIGH и CRITICAL .

Сканирование паролей

Trivy по умолчанию выполняет сканирование кода на предмет наличия в нем оставленных паролей. Однако, для этого используются внутренние шаблоны поиска ключевых слов, которые, мягко говоря, подходят для частных случаев.

Для поиска паролей необходимо использовать собственный файл политики. Это файл с названием trivy-secret.yaml , который создается в каталоге, в котором мы находимся, когда запускаем trivy.

Подробнее про работу сканирования секретов написана в официальной документации . Мы рассмотрим пример. Создадим файл с политикой:

vi trivy-secret.yaml

rules:
— id: rule_passwd
category: general
title: Generic Rule
severity: CRITICAL
regex: (?i)(?P<key>password|pass|passwd|secret)[ ]*(=|:| ){1}s*[‘»]?(?P<secret>.*?)(‘|»|s|\n){1}
secret-group-name: secret

allow-rules:
— id: skip-variable-repo-pass
description: skip variable repo pass
regex: $REPO_PASS
— id: skip-keywords
description: skip keywords
regex: (dbpass|false)
— id: skip-nodejs-nodes
description: skip nodejs nodes
path: .*/nodes/.*.(html|js)$

* где:

  • rules — раздел для описания правил поиска паролей.
    • id — идентификатор правила.
    • category — произвольная категория (для метаданных и отчетов).
    • title — произвольный заголовок для удобства чтения человеком.
    • severity — какой уровень серьезности.
    • regex — регулярное выражение для поиска паролей. Используется синтаксис языка Golang .
    • secret-group-name — обратите внимание, что в регулярном выражении мы используем группу захвата secret . Это означает, что в нашем случае парольная часть соответствует тому, что попало в регулярное выражение группы secret .
  • allow-rules — правила исключения, которые позволяют исключить некоторые пароли, которые соответствуют данным правилам.
    • regex — регулярные выражения. Применяются по найденному secret . Если найдется соответствие, то данный пароль не будет учитываться trivy.
    • path — путь до файлов, которые не будут проверяться. Можно указывать путь в виде regex.

Для поиска паролей, можно запускать команду:

trivy fs ./ -s CRITICAL

EnglishRussianUkrainian