Что такое Trivy?

Trivy — это универсальный open-source сканер уязвимостей, разработанный Aqua Security. Trivy может сканировать контейнерные образы, файловые системы, Git репозитории, Kubernetes кластеры и Infrastructure as Code на предмет уязвимостей безопасности, misconfiguration и секретов.

Основные возможности Trivy

  • Container scanning — анализ Docker образов и их слоев
  • Filesystem scanning — сканирование локальных директорий
  • Git repository scanning — анализ кода в репозиториях
  • Kubernetes scanning — проверка кластеров и манифестов
  • IaC scanning — Terraform, CloudFormation, Dockerfile
  • Secret detection — поиск API ключей, токенов, паролей
  • SBOM generation — создание Software Bill of Materials

Установка Trivy

 1# Установка через пакетный менеджер
 2# Ubuntu/Debian
 3sudo apt-get update
 4sudo apt-get install wget apt-transport-https gnupg lsb-release
 5wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
 6echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
 7sudo apt-get update
 8sudo apt-get install trivy
 9
10# CentOS/RHEL
11sudo rpm --import https://aquasecurity.github.io/trivy-repo/rpm/public.key
12sudo curl -sfL https://aquasecurity.github.io/trivy-repo/rpm/trivy.repo | sudo tee /etc/yum.repos.d/trivy.repo
13sudo yum -y update
14sudo yum -y install trivy
15
16# Или скачать бинарник
17wget https://github.com/aquasecurity/trivy/releases/latest/download/trivy_Linux-64bit.tar.gz
18tar zxvf trivy_Linux-64bit.tar.gz
19sudo mv trivy /usr/local/bin/
20
21# Docker
22docker pull aquasec/trivy

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

 1# Сканирование Docker образа
 2trivy image python:3.9
 3
 4# Сканирование с фильтрацией по severity
 5trivy image --severity HIGH,CRITICAL nginx:latest
 6
 7# Сканирование локального образа
 8trivy image myapp:latest
 9
10# Сканирование с выводом в JSON
11trivy image --format json python:3.9
12
13# Сканирование с игнорированием unfixed уязвимостей
14trivy image --ignore-unfixed alpine:latest
15
16# Сканирование конкретного слоя
17trivy image --input docker-archive.tar

Сканирование файловых систем

 1# Сканирование текущей директории
 2trivy fs .
 3
 4# Сканирование конкретной папки
 5trivy fs /path/to/project
 6
 7# Сканирование с исключениями
 8trivy fs --skip-files "*.test.js,*.spec.py" .
 9
10# Сканирование только определенных типов файлов
11trivy fs --file-patterns "requirements.txt,package.json" .

Сканирование Git репозиториев

 1# Сканирование remote репозитория
 2trivy repo https://github.com/user/repo
 3
 4# Сканирование локального репозитория
 5trivy repo .
 6
 7# Сканирование конкретной ветки
 8trivy repo --branch develop https://github.com/user/repo
 9
10# Сканирование с определенного коммита
11trivy repo --commit abc123 https://github.com/user/repo

Kubernetes сканирование

 1# Сканирование всего кластера
 2trivy k8s --report all
 3
 4# Сканирование конкретного namespace
 5trivy k8s --namespace production
 6
 7# Сканирование workload
 8trivy k8s deployment/myapp
 9
10# Сканирование с фильтрацией
11trivy k8s --severity HIGH,CRITICAL cluster
12
13# Сканирование манифестов
14trivy config k8s-manifests/

IaC сканирование

 1# Сканирование Terraform файлов
 2trivy config terraform/
 3
 4# Сканирование CloudFormation
 5trivy config cloudformation.yaml
 6
 7# Сканирование Dockerfile
 8trivy config Dockerfile
 9
10# Сканирование Kubernetes YAML
11trivy config k8s.yaml
12
13# Сканирование с custom политиками
14trivy config --policy custom-policies/ .

Поиск секретов

 1# Поиск секретов в файловой системе
 2trivy fs --scanners secret .
 3
 4# Поиск секретов в Git репозитории
 5trivy repo --scanners secret https://github.com/user/repo
 6
 7# Поиск секретов в контейнере
 8trivy image --scanners secret python:3.9
 9
10# Комбинированное сканирование
11trivy fs --scanners vuln,secret,config .

Интеграция с CI/CD

 1# GitHub Actions
 2name: Security Scan
 3on: [push, pull_request]
 4
 5jobs:
 6  trivy-scan:
 7    runs-on: ubuntu-latest
 8    steps:
 9      - name: Checkout
10        uses: actions/checkout@v3
11
12      - name: Run Trivy vulnerability scanner
13        uses: aquasecurity/trivy-action@master
14        with:
15          scan-type: 'fs'
16          scan-ref: '.'
17          format: 'sarif'
18          output: 'trivy-results.sarif'
19
20      - name: Upload Trivy scan results
21        uses: github/codeql-action/upload-sarif@v2
22        with:
23          sarif_file: 'trivy-results.sarif'

GitLab CI интеграция

 1# .gitlab-ci.yml
 2stages:
 3  - security
 4
 5trivy-scan:
 6  stage: security
 7  image: aquasec/trivy:latest
 8  script:
 9    - trivy fs --exit-code 1 --severity HIGH,CRITICAL .
10    - trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
11  artifacts:
12    reports:
13      container_scanning: gl-container-scanning-report.json
14  only:
15    - merge_requests
16    - main

Настройка конфигурации

 1# trivy.yaml
 2format: json
 3output: trivy-report.json
 4severity:
 5  - HIGH
 6  - CRITICAL
 7ignore-unfixed: true
 8skip-files:
 9  - "*.test.js"
10  - "test_*.py"
11skip-dirs:
12  - node_modules/
13  - .git/
14timeout: 10m
15cache:
16  dir: /tmp/trivy-cache

Создание SBOM

1# Генерация SBOM для контейнера
2trivy image --format spdx-json --output sbom.json python:3.9
3
4# SBOM для файловой системы
5trivy fs --format cyclonedx --output sbom.xml .
6
7# SBOM в таблицу
8trivy image --format table --output sbom.txt python:3.9

Работа с базой данных уязвимостей

 1# Обновление базы данных
 2trivy image --download-db-only
 3
 4# Использование offline базы
 5trivy image --offline-scan python:3.9
 6
 7# Использование custom DB
 8trivy image --cache-dir /custom/cache python:3.9
 9
10# Пропуск обновления DB
11trivy image --skip-update python:3.9

Интеграция с Kubernetes Operator

 1# trivy-operator.yaml
 2apiVersion: v1
 3kind: ConfigMap
 4metadata:
 5  name: trivy-operator
 6  namespace: trivy-system
 7data:
 8  trivy.severity: "HIGH,CRITICAL"
 9  trivy.ignoreUnfixed: "true"
10---
11apiVersion: apps/v1
12kind: Deployment
13metadata:
14  name: trivy-operator
15  namespace: trivy-system
16spec:
17  replicas: 1
18  selector:
19    matchLabels:
20      app: trivy-operator
21  template:
22    metadata:
23      labels:
24        app: trivy-operator
25    spec:
26      containers:
27      - name: trivy-operator
28        image: aquasec/trivy-operator:latest
29        env:
30        - name: OPERATOR_NAMESPACE
31          valueFrom:
32            fieldRef:
33              fieldPath: metadata.namespace

Фильтрация и игнорирование

 1# .trivyignore
 2# Игнорирование по CVE ID
 3CVE-2021-12345
 4
 5# Игнорирование по пакету
 6pkg:python/django@3.0.0
 7
 8# Игнорирование с экспирацией
 9CVE-2021-67890 exp:2024-12-31
10
11# Комментарии
12# This vulnerability is not applicable to our use case
13CVE-2021-11111

Мониторинг и алерты

 1# trivy-webhook.py
 2import json
 3import requests
 4from flask import Flask, request
 5
 6app = Flask(__name__)
 7
 8@app.route('/trivy-webhook', methods=['POST'])
 9def handle_trivy_results():
10    results = request.get_json()
11    
12    critical_vulns = []
13    if results.get('Results'):
14        for result in results['Results']:
15            if result.get('Vulnerabilities'):
16                for vuln in result['Vulnerabilities']:
17                    if vuln.get('Severity') == 'CRITICAL':
18                        critical_vulns.append(vuln)
19    
20    if critical_vulns:
21        # Отправка алерта в Slack/Teams
22        send_alert(critical_vulns)
23    
24    return 'OK', 200
25
26def send_alert(vulnerabilities):
27    webhook_url = "YOUR_SLACK_WEBHOOK_URL"
28    message = {
29        "text": f"🚨 Critical vulnerabilities found: {len(vulnerabilities)}",
30        "attachments": [
31            {
32                "color": "danger",
33                "fields": [
34                    {
35                        "title": vuln.get('VulnerabilityID'),
36                        "value": vuln.get('Description', 'No description')[:100],
37                        "short": True
38                    }
39                    for vuln in vulnerabilities[:5]  # Первые 5
40                ]
41            }
42        ]
43    }
44    requests.post(webhook_url, json=message)
45
46if __name__ == '__main__':
47    app.run(host='0.0.0.0', port=8080)

Когда использовать Trivy

  • Сканирование контейнерных образов в CI/CD
  • Security аудит кодовой базы
  • Compliance проверки
  • DevSecOps практики
  • Kubernetes security мониторинг
  • IaC security анализ

Преимущества Trivy

  • Универсальность — сканирование множества типов артефактов
  • Скорость — быстрое сканирование благодаря оптимизации
  • Точность — низкий уровень false positives
  • Простота — легкая установка и использование
  • Интеграции — поддержка всех популярных CI/CD систем
  • Open Source — бесплатный и с открытым исходным кодом

Альтернативы Trivy

  • Snyk — коммерческая платформа с дополнительными функциями
  • Clair — static analysis для container security
  • Anchore — container security и compliance
  • Grype — vulnerability scanner от Anchore
  • Docker Scout — встроенное сканирование Docker
  • Twistlock — enterprise container security

FAQ

Насколько точен Trivy?

Trivy использует несколько источников данных о уязвимостях (NVD, Red Hat, Ubuntu и др.) и имеет низкий уровень false positives благодаря точному матчингу версий пакетов.

Можно ли использовать Trivy в air-gapped окружении?

Да, Trivy поддерживает offline режим. Можно скачать базу данных уязвимостей заранее и использовать флаг --offline-scan.

Поддерживает ли Trivy private registries?

Да, Trivy может сканировать образы из private Docker registries с аутентификацией через Docker credentials или переменные окружения.