«В двух словах», 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