Перейти к содержимому
Главная страница » Trivy — полное руководство по сканированию уязвимостей Docker-образов в 2025 году

Trivy — полное руководство по сканированию уязвимостей Docker-образов в 2025 году

Trivy — это мощный open-source инструмент от Aqua Security, который за несколько секунд находит уязвимости в Docker-образах, конфигурационных файлах и репозиториях кода. В этом подробном руководстве разберём, почему Trivy стал индустриальным стандартом безопасности контейнеров, как его правильно установить, настроить и встроить в ваш CI/CD pipeline.

Содержание

Что такое Trivy и зачем он нужен

Trivy (от англ. «trivial» — простой) — это универсальный сканер безопасности, который проверяет:

  • Docker-образы на наличие уязвимостей в установленных пакетах
  • Конфигурационные файлы (Dockerfile, Kubernetes, Terraform, Ansible)
  • Git-репозитории на проблемы в зависимостях
  • Файловые системы и контейнеры в реальном времени

Зачем сканировать Docker-образы?

По статистике Snyk State of Open Source Security 202484% Docker-образов содержат как минимум одну критическую уязвимость. Основные причины:

1. Уязвимости в базовых образах

Даже если ваш код идеален, базовый образ может содержать устаревшие версии системных библиотек:

FROM python:3.9-slim  # Может содержать CVE-2023-5678 в OpenSSL
COPY . /app
RUN pip install -r requirements.txt

Пример реальной проблемы:

  • Образ node:16-alpine от 2022 года содержит уязвимость CVE-2023-38545 в curl
  • CVSS Score: 9.8 (Critical)
  • Эксплуатация: удалённое выполнение кода через HTTP/2

2. Проблемные зависимости в package.json/requirements.txt

{
  "dependencies": {
    "express": "^4.17.1",  // Может содержать CVE-2022-24999
    "lodash": "4.17.20"    // Известные проблемы с prototype pollution
  }
}

3. Ошибки конфигурации Dockerfile

# ❌ ПЛОХО: запуск от root
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
CMD ["nginx"]

# ✅ ХОРОШО: не-root пользователь
FROM ubuntu:20.04
RUN useradd -m -u 1000 appuser && \
    apt-get update && apt-get install -y nginx
USER appuser
CMD ["nginx"]

Trivy находит такие проблемы и предлагает исправления.

4. Лицензионные проблемы

Trivy показывает GPL-, AGPL-зависимости, которые могут требовать открытия исходного кода вашего продукта.

Реальные последствия уязвимостей

Кейс 1: Log4Shell (CVE-2021-44228)

  • Уязвимость в Apache Log4j позволяла удалённое выполнение кода
  • Затронуты миллионы Java-приложений
  • Компании потратили недели на обновление зависимостей

Кейс 2: Heartbleed (CVE-2014-0160)

  • Уязвимость в OpenSSL позволяла читать память сервера
  • Затронуты 17% HTTPS-серверов в интернете
  • Ущерб: утечки паролей, приватных ключей

Без регулярного сканирования ваш релиз может содержать критические уязвимости с CVSS 9.0+, которые легко эксплуатировать.

Почему именно Trivy: сравнение с альтернативами

Trivy vs Clair vs Snyk vs Docker Scout

КритерийTrivyClairSnykDocker Scout
ТипOpen-sourceOpen-sourceКоммерческийКоммерческий
Скорость сканирования⚡ Очень быстрый🐌 Медленный⚡ Быстрый⚡ Быстрый
Простота установки✅ Одна команда❌ Требует PostgreSQL✅ Простая✅ Простая
Поддержка K8s✅ Да❌ Нет✅ Да✅ Да
Сканирование конфигов✅ Да❌ Нет✅ Да✅ Да
Стоимость💰 Бесплатно💰 Бесплатно💰 От $52/мес💰 От $5/образ/мес
GitHub Stars⭐ 20k+⭐ 10k+⭐ 8k+⭐ 1k+

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

  1. Нулевая конфигурация — работает из коробки
  2. Быстрое сканирование — средний образ сканируется за 10-30 секунд
  3. Широкий охват — поддерживает 20+ пакетных менеджеров
  4. Активное сообщество — регулярные обновления, быстрое исправление багов
  5. Интеграция с GitHub/GitLab — встроенная поддержка CI/CD

Когда выбрать альтернативу?

  • Snyk — если нужна интеграция с Jira, Slack и детальная аналитика
  • Docker Scout — если вы полностью на экосистеме Docker
  • Clair — если нужен enterprise-grade сканер с собственной инфраструктурой

Вывод: Для большинства проектов Trivy — оптимальный выбор благодаря простоте и бесплатности.


Установка Trivy: все способы

Способ 1: Docker (рекомендуется для быстрого старта)

Самый простой способ — использовать официальный Docker-образ:

# Сканирование образа без установки
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/trivy image python:3.11

# Сканирование локального образа
docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /tmp/trivy-cache:/root/.cache/trivy \
  aquasec/trivy image myapp:latest

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

  • Не требует установки
  • Всегда актуальная версия
  • Изоляция от системы

Недостатки:

  • Медленнее, чем нативная установка
  • Требует Docker

Способ 2: Binary (Linux/macOS/Windows)

Linux (x86_64)

# Скачать последнюю версию
wget https://github.com/aquasecurity/trivy/releases/latest/download/trivy_0.50.1_Linux-64bit.tar.gz

# Распаковать
sudo tar zxvf trivy_0.50.1_Linux-64bit.tar.gz -C /usr/local/bin trivy

# Проверить установку
trivy --version

macOS (Homebrew)

brew install trivy

Windows (Chocolatey)

choco install trivy

Windows (Scoop)

scoop install trivy

Способ 3: Установка через скрипт (универсальный)

# Автоматическая установка для Linux/macOS
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin

Способ 4: Установка в контейнер (для CI/CD)

FROM alpine:latest
RUN apk add --no-cache curl
RUN curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | \
    sh -s -- -b /usr/local/bin

Обновление Trivy

# Автоматическое обновление
trivy --self-update

# Или через пакетный менеджер
brew upgrade trivy  # macOS
choco upgrade trivy  # Windows

Первоначальная настройка

После установки Trivy автоматически загрузит базу данных уязвимостей при первом запуске:

# Первый запуск займёт 1-2 минуты (загрузка БД)
trivy image nginx:latest

# Последующие запуски будут быстрее

База данных сохраняется в ~/.cache/trivy/ (Linux/macOS) или %LOCALAPPDATA%\trivy\ (Windows).


Базовое сканирование Docker-образов

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

trivy image nginx:1.25-alpine

Вывод будет выглядеть так:

2025-12-05T10:30:15.123Z    INFO    Vulnerability scanning is enabled
2025-12-05T10:30:15.456Z    INFO    Detected OS: alpine
2025-12-05T10:30:15.789Z    INFO    Detecting Alpine vulnerabilities...

nginx:1.25-alpine (alpine 3.18.4)
==================================
Total: 15 (HIGH: 3, MEDIUM: 8, LOW: 4)

┌──────────────────┬────────────────┬──────────┬──────────────────┬─────────────┬───────────┐
│    Library       │  Vulnerability │ Severity │   Installed Ver. │ Fixed Ver.  │  Layer    │
├──────────────────┼────────────────┼──────────┼──────────────────┼─────────────┼───────────┤
│ openssl          │ CVE-2023-5678  │ HIGH     │ 1.1.1l-r0        │ 1.1.1w-r0   │ apk:A…    │
│ libcrypto1.1    │ CVE-2023-4807  │ HIGH     │ 1.1.1l-r0        │ 1.1.1w-r0   │ apk:A…    │
│ busybox          │ CVE-2023-4237  │ MEDIUM   │ 1.36.1-r2        │ 1.36.1-r3   │ apk:A…    │
└──────────────────┴────────────────┴──────────┴──────────────────┴─────────────┴───────────┘

Понимание результатов

  • Library — название пакета/библиотеки
  • Vulnerability — идентификатор CVE (Common Vulnerabilities and Exposures)
  • Severity — уровень критичности:
    • CRITICAL (9.0-10.0) — немедленное исправление
    • HIGH (7.0-8.9) — исправить в ближайшее время
    • MEDIUM (4.0-6.9) — исправить при возможности
    • LOW (0.1-3.9) — низкий приоритет
  • Installed Version — текущая версия в образе
  • Fixed Version — версия, в которой уязвимость исправлена
  • Layer — слой Docker-образа, где найдена проблема

Сканирование локального образа

Если образ уже собран локально:

# Сканирование образа по имени
trivy image myapp:latest

# Сканирование образа по ID
trivy image abc123def456

# Сканирование образа из приватного registry
trivy image registry.example.com/myapp:v1.0.0

Сканирование с фильтрацией по серьёзности

# Показать только CRITICAL и HIGH
trivy image --severity HIGH,CRITICAL nginx:latest

# Показать все, кроме LOW
trivy image --severity HIGH,CRITICAL,MEDIUM nginx:latest

Игнорирование исправленных уязвимостей

Иногда полезно скрыть уязвимости, для которых ещё нет патча:

# Показать только уязвимости с доступными исправлениями
trivy image --ignore-unfixed nginx:latest

Детальный отчёт с описаниями

# Получить подробное описание каждой уязвимости
trivy image --format json nginx:latest | jq '.[] | .Vulnerabilities[] | {id, severity, description}'

Расширенные возможности Trivy

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

Trivy может сканировать репозитории напрямую, анализируя файлы зависимостей:

# Сканирование публичного репозитория
trivy repo https://github.com/yourorg/awesome-app

# Сканирование локального репозитория
trivy repo /path/to/local/repo

# Сканирование с указанием ветки
trivy repo https://github.com/yourorg/awesome-app --branch main

Что сканируется:

  • package.json (Node.js)
  • requirements.txtPipfilepoetry.lock (Python)
  • GemfileGemfile.lock (Ruby)
  • pom.xmlbuild.gradle (Java)
  • go.modgo.sum (Go)
  • Cargo.tomlCargo.lock (Rust)
  • composer.json (PHP)
  • И другие…

Пример вывода:

yourorg/awesome-app (package.json)
===================================
Total: 8 (HIGH: 2, MEDIUM: 4, LOW: 2)

┌──────────────────┬────────────────┬──────────┬──────────────────┬─────────────┐
│    Library       │  Vulnerability │ Severity │   Installed Ver. │ Fixed Ver.  │
├──────────────────┼────────────────┼──────────┼──────────────────┼─────────────┤
│ express          │ CVE-2022-24999  │ HIGH     │ 4.17.1           │ 4.18.2      │
│ lodash           │ CVE-2021-23337  │ MEDIUM   │ 4.17.20          │ 4.17.21     │
└──────────────────┴────────────────┴──────────┴──────────────────┴─────────────┘

2. Сканирование Kubernetes-кластеров

Trivy может анализировать весь кластер Kubernetes:

# Сканирование всего кластера
trivy k8s --report summary cluster

# Сканирование конкретного namespace
trivy k8s --namespace production cluster

# Сканирование с выводом в JSON
trivy k8s --format json --report all cluster > k8s-report.json

Что проверяется:

  • Уязвимости в образах контейнеров
  • Небезопасные настройки (запуск от root, привилегированные контейнеры)
  • Отсутствие security contexts
  • Проблемы с network policies

Пример вывода:

k8s-cluster
===========
Total: 42 vulnerabilities found

Namespaces:
  default: 15 vulnerabilities
  production: 20 vulnerabilities
  staging: 7 vulnerabilities

Critical Issues:
  - Deployment 'webapp' uses image with CVE-2023-5678 (CRITICAL)
  - Pod 'api-server' runs as root (HIGH)
  - Service 'database' exposes port without network policy (MEDIUM)

3. Сканирование конфигурационных файлов

Trivy проверяет Dockerfile, Kubernetes-манифесты, Terraform и другие конфиги:

# Сканирование Dockerfile
trivy config Dockerfile

# Сканирование всех конфигов в директории
trivy config ./k8s/

# Сканирование Terraform
trivy config --config-policy ./policies/ ./terraform/

Примеры найденных проблем:

# ❌ Проблема: запуск от root
FROM ubuntu:20.04
USER root
CMD ["nginx"]

# ✅ Рекомендация Trivy:
FROM ubuntu:20.04
RUN useradd -m -u 1000 appuser
USER appuser
CMD ["nginx"]

4. Генерация отчётов в разных форматах

JSON (для автоматической обработки)

trivy image --format json -o report.json nginx:latest

SARIF (для GitHub Advanced Security)

trivy image --format sarif -o trivy.sarif myapp:latest

Затем загрузите в GitHub:

gh api repos/yourorg/yourrepo/code-scanning/sarifs \
  -X POST \
  -f commit_sha=$(git rev-parse HEAD) \
  -f ref=refs/heads/main \
  -f sarif=@trivy.sarif

CycloneDX (для SBOM)

trivy image --format cyclonedx -o sbom.json nginx:latest

HTML (для визуализации)

trivy image --format template --template "@contrib/html.tpl" -o report.html nginx:latest

5. Настройка кэша и прокси

Использование локального кэша

# Указать кастомную директорию кэша
export TRIVY_CACHE_DIR=/tmp/trivy-cache
trivy image nginx:latest

# Или через флаг
trivy image --cache-dir /tmp/trivy-cache nginx:latest

Работа через прокси

export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080
export NO_PROXY=localhost,127.0.0.1

trivy image nginx:latest

Обновление базы данных без сканирования

# Обновить базу CVE
trivy --download-db-only

# Указать кастомный источник базы
trivy --db-repository aquasecurity/trivy-db image nginx:latest

6. Игнорирование конкретных уязвимостей

Создайте файл .trivyignore:

# Игнорировать конкретную CVE
CVE-2023-5678

# Игнорировать с комментарием
CVE-2023-4807 # Ложное срабатывание, исправлено в следующем релизе

Или через флаг:

trivy image --ignorefile .trivyignore nginx:latest

Интеграция в CI/CD: GitHub Actions, GitLab CI, Jenkins

GitHub Actions

Базовый пример

name: Security Scan

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  trivy-scan:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write
    
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      
      - name: Build Docker image
        run: |
          docker build -t myapp:${{ github.sha }} .
      
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@0.13.0
        with:
          image-ref: myapp:${{ github.sha }}
          format: 'sarif'
          output: 'trivy-results.sarif'
          severity: 'CRITICAL,HIGH'
          exit-code: '1'
      
      - name: Upload Trivy results to GitHub Security
        uses: github/codeql-action/upload-sarif@v2
        with:
          sarif_file: 'trivy-results.sarif'

Продвинутый пример с кэшированием

name: Security Scan

on:
  push:
    branches: [ main ]
  schedule:
    - cron: '0 0 * * *'  # Ежедневно в полночь

jobs:
  trivy-scan:
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Build Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: false
          tags: myapp:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
      
      - name: Cache Trivy DB
        uses: actions/cache@v3
        with:
          path: ~/.cache/trivy
          key: trivy-db-${{ runner.os }}
          restore-keys: |
            trivy-db-${{ runner.os }}
      
      - name: Run Trivy scanner
        uses: aquasecurity/trivy-action@0.13.0
        with:
          image-ref: myapp:${{ github.sha }}
          format: 'table'
          severity: 'CRITICAL,HIGH'
          exit-code: '1'
          cache-dir: ~/.cache/trivy
      
      - name: Generate HTML report
        if: failure()
        uses: aquasecurity/trivy-action@0.13.0
        with:
          image-ref: myapp:${{ github.sha }}
          format: 'template'
          template: '@contrib/html.tpl'
          output: 'trivy-report.html'
      
      - name: Upload HTML report
        if: failure()
        uses: actions/upload-artifact@v3
        with:
          name: trivy-report
          path: trivy-report.html

GitLab CI

stages:
  - build
  - security

variables:
  TRIVY_VERSION: "latest"
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: "/certs"

build:
  stage: build
  image: docker:24
  services:
    - docker:24-dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

trivy-scan:
  stage: security
  image: aquasec/trivy:latest
  script:
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  only:
    - main
    - merge_requests

Jenkins

pipeline {
    agent any
    
    environment {
        TRIVY_CACHE_DIR = "${WORKSPACE}/.trivy-cache"
    }
    
    stages {
        stage('Build') {
            steps {
                sh 'docker build -t myapp:${BUILD_NUMBER} .'
            }
        }
        
        stage('Security Scan') {
            steps {
                sh '''
                    docker run --rm \
                        -v /var/run/docker.sock:/var/run/docker.sock \
                        -v ${TRIVY_CACHE_DIR}:/root/.cache/trivy \
                        aquasec/trivy:latest \
                        image --exit-code 1 --severity HIGH,CRITICAL \
                        myapp:${BUILD_NUMBER}
                '''
            }
        }
        
        stage('Publish Report') {
            when {
                anyOf {
                    branch 'main'
                    branch 'develop'
                }
            }
            steps {
                sh '''
                    docker run --rm \
                        -v /var/run/docker.sock:/var/run/docker.sock \
                        -v ${TRIVY_CACHE_DIR}:/root/.cache/trivy \
                        -v ${WORKSPACE}:/workspace \
                        aquasec/trivy:latest \
                        image --format template --template "@contrib/html.tpl" \
                        -o /workspace/trivy-report.html \
                        myapp:${BUILD_NUMBER}
                '''
                publishHTML([
                    reportName: 'Trivy Security Report',
                    reportDir: '.',
                    reportFiles: 'trivy-report.html',
                    keepAll: true
                ])
            }
        }
    }
}

Azure DevOps

trigger:
  branches:
    include:
      - main

pool:
  vmImage: 'ubuntu-latest'

steps:
  - task: Docker@2
    displayName: 'Build Docker image'
    inputs:
      command: 'build'
      repository: 'myapp'
      tags: '$(Build.BuildId)'
  
  - script: |
      docker run --rm \
        -v /var/run/docker.sock:/var/run/docker.sock \
        aquasec/trivy:latest \
        image --exit-code 1 --severity HIGH,CRITICAL \
        myapp:$(Build.BuildId)
    displayName: 'Run Trivy scan'

Практические примеры и кейсы

Пример 1: Сканирование перед деплоем

#!/bin/bash
# deploy-with-scan.sh

IMAGE="myapp:latest"
THRESHOLD="HIGH"

echo "🔍 Сканирование образа $IMAGE..."

# Сканируем образ
trivy image --exit-code 1 --severity $THRESHOLD,CRITICAL $IMAGE

if [ $? -eq 0 ]; then
    echo "✅ Уязвимостей не найдено, деплоим..."
    docker push $IMAGE
    kubectl set image deployment/myapp app=$IMAGE
else
    echo "❌ Найдены критические уязвимости, деплой отменён"
    exit 1
fi

Пример 2: Ежедневный мониторинг

#!/bin/bash
# daily-scan.sh

IMAGES=(
    "nginx:latest"
    "postgres:15"
    "redis:7"
    "myapp:latest"
)

for image in "${IMAGES[@]}"; do
    echo "Сканирование $image..."
    trivy image --format json -o "reports/${image//\//_}.json" $image
done

# Отправка отчёта в Slack
curl -X POST -H 'Content-type: application/json' \
  --data "{\"text\":\"Ежедневный отчёт безопасности готов\"}" \
  $SLACK_WEBHOOK_URL

Пример 3: Сканирование всех образов в registry

#!/bin/bash
# scan-registry.sh

REGISTRY="registry.example.com"
PROJECT="myproject"

# Получаем список всех тегов
TAGS=$(curl -s "https://$REGISTRY/v2/$PROJECT/tags/list" | jq -r '.tags[]')

for tag in $TAGS; do
    echo "Сканирование $REGISTRY/$PROJECT:$tag..."
    trivy image --format json \
        -o "reports/${PROJECT}_${tag}.json" \
        "$REGISTRY/$PROJECT:$tag"
done

Пример 4: Интеграция с мониторингом

# trivy_monitor.py
import subprocess
import json
import requests

def scan_image(image_name):
    """Сканирует образ и возвращает результаты"""
    result = subprocess.run(
        ['trivy', 'image', '--format', 'json', image_name],
        capture_output=True,
        text=True
    )
    return json.loads(result.stdout)

def check_critical_vulnerabilities(scan_result):
    """Проверяет наличие критических уязвимостей"""
    for result in scan_result:
        for vuln in result.get('Vulnerabilities', []):
            if vuln.get('Severity') == 'CRITICAL':
                return True
    return False

def send_alert(message):
    """Отправляет алерт в Telegram"""
    bot_token = "YOUR_BOT_TOKEN"
    chat_id = "YOUR_CHAT_ID"
    url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
    requests.post(url, json={'chat_id': chat_id, 'text': message})

# Использование
if __name__ == "__main__":
    result = scan_image("myapp:latest")
    if check_critical_vulnerabilities(result):
        send_alert("🚨 Обнаружены критические уязвимости в myapp:latest!")

Оптимизация производительности

1. Использование кэша

# Создать общий кэш для всех сканирований
export TRIVY_CACHE_DIR=/shared/trivy-cache

# В CI/CD использовать кэш между запусками
# GitHub Actions
- uses: actions/cache@v3
  with:
    path: ~/.cache/trivy
    key: trivy-db-${{ runner.os }}

2. Параллельное сканирование

# Сканировать несколько образов параллельно
parallel -j 4 trivy image ::: image1:latest image2:latest image3:latest image4:latest

3. Сканирование только изменённых слоёв

# Trivy автоматически кэширует результаты для слоёв
# При повторном сканировании образа с теми же слоями результат берётся из кэша

4. Использование локальной базы данных

# Обновить базу один раз
trivy --download-db-only

# Использовать локальную базу (быстрее, чем загрузка из интернета)
trivy image --skip-db-update nginx:latest

5. Ограничение сканируемых пакетных менеджеров

# Сканировать только OS-пакеты (быстрее)
trivy image --scanners vuln nginx:latest

# Исключить сканирование секретов (если не нужно)
trivy image --scanners vuln,config nginx:latest

Часто задаваемые вопросы (FAQ)

Q1: Как часто нужно сканировать образы?

Ответ: Рекомендуется:

  • При каждом коммите — в CI/CD pipeline
  • Ежедневно — для production-образов
  • Еженедельно — для всех образов в registry

База данных CVE обновляется ежедневно, поэтому важно регулярно обновлять и сканировать.

Q2: Trivy находит уязвимости, но исправлений нет. Что делать?

Ответ: Используйте флаг --ignore-unfixed для скрытия таких уязвимостей в отчётах, но отслеживайте их отдельно. Когда появится патч, Trivy покажет его в следующих сканированиях.

Q3: Можно ли сканировать приватные registry?

Ответ: Да, Trivy поддерживает аутентификацию:

# Docker Hub
docker login
trivy image username/image:tag

# AWS ECR
aws ecr get-login-password | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
trivy image <account-id>.dkr.ecr.<region>.amazonaws.com/image:tag

# Google Container Registry
gcloud auth configure-docker
trivy image gcr.io/project/image:tag

Q4: Как интегрировать Trivy с Jira/Slack?

Ответ: Используйте JSON-формат и парсите результаты:

# Генерация JSON
trivy image --format json -o report.json myapp:latest

# Парсинг и отправка в Slack
jq -r '.Vulnerabilities[] | select(.Severity=="CRITICAL") | "\(.VulnerabilityID): \(.Title)"' report.json | \
  while read vuln; do
    curl -X POST -H 'Content-type: application/json' \
      --data "{\"text\":\"🚨 $vuln\"}" \
      $SLACK_WEBHOOK_URL
  done

Q5: Trivy медленно сканирует большие образы. Как ускорить?

Ответ:

  1. Используйте кэш: --cache-dir /fast/ssd/trivy-cache
  2. Сканируйте только OS-пакеты: --scanners vuln
  3. Используйте более быстрый диск для кэша
  4. Рассмотрите использование Trivy в режиме server (Trivy Server)

Q6: Можно ли использовать Trivy для compliance (соответствия стандартам)?

Ответ: Да, Trivy поддерживает политики через Rego (Open Policy Agent):

# Сканирование с политиками
trivy config --policy ./policies/ ./k8s/

Создайте файл политики policies/deny-root.rego:

package trivy

deny[msg] {
    input.kind == "Deployment"
    not input.spec.template.spec.securityContext.runAsNonRoot
    msg := "Deployment must run as non-root user"
}

Q7: Как сравнить результаты двух сканирований?

Ответ: Используйте diff-режим:

# Сканировать два образа и сравнить
trivy image --format json -o old.json old-image:tag
trivy image --format json -o new.json new-image:tag

# Сравнить с помощью jq
diff <(jq -S . old.json) <(jq -S . new.json)

Q8: Trivy показывает ложные срабатывания. Как их игнорировать?

Ответ: Создайте .trivyignore файл:

# Ложное срабатывание в тестовой библиотеке
CVE-2023-12345

# Уязвимость не применима к нашему use case
CVE-2023-67890 # Не используется в production

Или используйте флаг:

trivy image --ignorefile .trivyignore myapp:latest

Заключение и следующие шаги

Trivy — это мощный и простой инструмент для обеспечения безопасности Docker-контейнеров. Он стал индустриальным стандартом благодаря:

  • ✅ Простоте использования — работает из коробки
  • ✅ Быстроте сканирования — средний образ за 10-30 секунд
  • ✅ Широкому охвату — поддерживает 20+ пакетных менеджеров
  • ✅ Активному развитию — регулярные обновления и быстрое исправление багов
  • ✅ Бесплатности — полностью open-source

Рекомендуемый план внедрения

  1. Неделя 1: Установите Trivy локально, просканируйте существующие образы
  2. Неделя 2: Интегрируйте в CI/CD pipeline (начните с warning-режима)
  3. Неделя 3: Настройте блокировку деплоя при CRITICAL-уязвимостях
  4. Неделя 4: Настройте ежедневные автоматические сканирования

Полезные ресурсы

Связанные статьи


Остались вопросы? Пишите в наш Telegram-чат или оставляйте комментарии ниже. Мы поможем настроить Trivy для вашего проекта!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *