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 2024, 84% 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
| Критерий | Trivy | Clair | Snyk | Docker Scout |
|---|---|---|---|---|
| Тип | Open-source | Open-source | Коммерческий | Коммерческий |
| Скорость сканирования | ⚡ Очень быстрый | 🐌 Медленный | ⚡ Быстрый | ⚡ Быстрый |
| Простота установки | ✅ Одна команда | ❌ Требует PostgreSQL | ✅ Простая | ✅ Простая |
| Поддержка K8s | ✅ Да | ❌ Нет | ✅ Да | ✅ Да |
| Сканирование конфигов | ✅ Да | ❌ Нет | ✅ Да | ✅ Да |
| Стоимость | 💰 Бесплатно | 💰 Бесплатно | 💰 От $52/мес | 💰 От $5/образ/мес |
| GitHub Stars | ⭐ 20k+ | ⭐ 10k+ | ⭐ 8k+ | ⭐ 1k+ |
Преимущества Trivy
- Нулевая конфигурация — работает из коробки
- Быстрое сканирование — средний образ сканируется за 10-30 секунд
- Широкий охват — поддерживает 20+ пакетных менеджеров
- Активное сообщество — регулярные обновления, быстрое исправление багов
- Интеграция с 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.txt,Pipfile,poetry.lock(Python)Gemfile,Gemfile.lock(Ruby)pom.xml,build.gradle(Java)go.mod,go.sum(Go)Cargo.toml,Cargo.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 медленно сканирует большие образы. Как ускорить?
Ответ:
- Используйте кэш:
--cache-dir /fast/ssd/trivy-cache - Сканируйте только OS-пакеты:
--scanners vuln - Используйте более быстрый диск для кэша
- Рассмотрите использование 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: Установите Trivy локально, просканируйте существующие образы
- Неделя 2: Интегрируйте в CI/CD pipeline (начните с warning-режима)
- Неделя 3: Настройте блокировку деплоя при CRITICAL-уязвимостях
- Неделя 4: Настройте ежедневные автоматические сканирования
Полезные ресурсы
Связанные статьи
Остались вопросы? Пишите в наш Telegram-чат или оставляйте комментарии ниже. Мы поможем настроить Trivy для вашего проекта!