Что такое 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
Настройка конфигурации
Создание SBOM
Работа с базой данных уязвимостей
Интеграция с 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# 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 или переменные окружения.