trivy - статический opensource-сканер уязвимостей в контейнерах, репозиториях и т.п.
По умолчанию скачивает БД уязвимостей из интернета, здесь будет описано, как его запустить полностью локально (если на сервере нет доступа в интернет или скачивание внешних файлов нежелательно).
Описание запуска trivy без доступа в интернет описано в документации.
Для работы нужен установленный docker (podman и другие OCI runtime тоже должны поддерживаться).
Сначала нужно установить trivy любым из описанных способов Например:
mkdir trivy && cd trivy
wget "https://github.com/aquasecurity/trivy/releases/download/v0.56.1/trivy_0.56.1_Linux-64bit.tar.gz"
tar -xvf trivy_0.56.1_Linux-64bit.tar.gz
chmod +x trivy
sudo cp trivy /usr/local/bin
Далее нужно скачать образы с БД уязвимостей в локальный container registry - на той же машине или работающий в локальной сети. Всего три образа, скачать их можно при помощи утилиты ORAS. Сохранить можно в локальном registry, который запускается например таким образом:
mkdir registry && cd registry
mkdir -m 0777 data
Поместить файл docker-compose.yml
services:
registry:
image: "registry:2"
container_name: "registry"
ports:
- "127.0.0.1:5000:5000"
volumes:
- "./data:/var/lib/registry"
restart: always
Запуск:
docker compose up -d
Скачивание и загрузка образов:
oras pull ghcr.io/aquasecurity/trivy-db:2
oras push localhost:5000/trivy/trivy-db:2 \
db.tar.gz:application/vnd.aquasec.trivy.db.layer.v1.tar+gzip \
--artifact-type application/vnd.aquasec.trivy.config.v1+json
oras pull ghcr.io/aquasecurity/trivy-java-db:1
oras push localhost:5000/trivy/trivy-java-db:1 \
javadb.tar.gz:application/vnd.aquasec.trivy.javadb.layer.v1.tar+gzip \
--artifact-type application/vnd.aquasec.trivy.config.v1+json
oras pull ghcr.io/aquasecurity/trivy-checks:0
oras push localhost:5000/trivy/trivy-checks:0 \
bundle.tar.gz:application/vnd.cncf.openpolicyagent.layer.v1.tar+gzip \
--config /dev/null:application/vnd.cncf.openpolicyagent.config.v1+json
Далее нужно запустить локальный VEX Hub. Это будет простой статический сайт на nginx.
Создание каталогов и скачивание необходимых файлов:
mkdir vexhub && cd vexhub
mkdir -m 0777 data manifest vhost
wget -O "data/main.zip" "https://github.com/aquasecurity/vexhub/archive/refs/heads/main.zip"
wget -O "manifest/vex-repository.json" "https://github.com/aquasecurity/vexhub/blob/main/vex-repository.json"
Поместить файл docker-compose.yml
:
services:
vexhub:
image: "nginx:latest"
container_name: "vexhub"
ports:
- "127.0.0.1:5001:80"
volumes:
- "./vhost:/etc/nginx/conf.d"
- "./data:/opt/data"
- "./manifest:/opt/manifest"
restart: always
Конфигурация nginx vhost/vhost.conf
:
server {
listen 80 default_server;
location / {
root /opt/data;
}
location /.well-known/ {
root /opt/manifest;
}
}
Запуск:
docker compose up -d
Определение расположения файла конфигурации:
$ trivy vex repo init
2024-10-05T17:09:27+03:00 INFO [vex] The default repository config has been created file_path="/home/user/.trivy/vex/repository.yaml"
Внести изменения в /home/user/.trivy/vex/repository.yaml
, отключить репозиторий по умолчанию и добавить локальный:
repositories:
- name: default
url: https://github.com/aquasecurity/vexhub
enabled: false
username: ""
password: ""
token: ""
- name: custom
url: http://localhost:5001
enabled: true
Далее можно запускать trivy. Например, сканирование образа ubuntu:24.04
trivy image \
--db-repository localhost:5000/trivy/trivy-db:2 \
--java-db-repository localhost:5000/trivy/trivy-java-db:1 \
--checks-bundle-repository localhost:5000/trivy/trivy-checks:0 \
--offline-scan \
ubuntu:24.04
Проверено, сканирование работает без подключения к интернету (предварительно проверяемый образ нужно скачать в локальный registry).
БД уязвимостей нужно регулярно обновлять, т.е. повторять процесс для образов и файлов VEXhub.