Запуск trivy без доступа к сети

05.10.2024 - Alexey Nurgaliev

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.

Лицензия Creative Commons
Code More Team - GitHub