Как сканировать Docker-образы на уязвимости?
Сканирование Docker-образов на уязвимости – это процесс автоматического анализа пакетов ОС и зависимостей приложения внутри образа с последующей сверкой с базами данных известных уязвимостей (NVD, GitHub Advisory, Alpine SecDB и др.).
Trivy (Aqua Security)
Trivy – один из самых популярных open-source сканеров. Поддерживает сканирование образов, файловых систем, Git-репозиториев, конфигураций Kubernetes и IaC.
Пример
# Сканирование образа
trivy image my-registry/banking-service:1.0.0
# Только CRITICAL и HIGH уязвимости
trivy image --severity CRITICAL,HIGH my-registry/banking-service:1.0.0
# Только уязвимости с доступным исправлением
trivy image --ignore-unfixed my-registry/banking-service:1.0.0
# Комплексное сканирование проекта (уязвимости + секреты + misconfig)
trivy fs --scanners vuln,secret,misconfig .
# Вывод в JSON для интеграции с CI/CD
trivy image --format json --output report.json my-registry/banking-service:1.0.0
# Завершить с ошибкой при наличии CRITICAL уязвимостей (для CI/CD gate)
trivy image --exit-code 1 --severity CRITICAL my-registry/banking-service:1.0.0
Пример вывода:
Пример
banking-service:1.0.0 (alpine 3.20)
====================================
Total: 3 (CRITICAL: 1, HIGH: 2)
┌───────────────┬──────────────────┬──────────┬─────────┬───────────────┐
│ Library │ Vulnerability │ Severity │ Version │ Fixed Version │
├───────────────┼──────────────────┼──────────┼─────────┼───────────────┤
│ libssl3 │ CVE-2024-XXXXX │ CRITICAL │ 3.1.4 │ 3.1.5 │
│ spring-web │ CVE-2024-YYYYY │ HIGH │ 6.1.2 │ 6.1.5 │
│ jackson-core │ CVE-2024-ZZZZZ │ HIGH │ 2.16.0 │ 2.16.1 │
└───────────────┴──────────────────┴──────────┴─────────┴───────────────┘
Другие инструменты сканирования
| Инструмент | Тип | Особенности |
|---|---|---|
| Trivy | Open-source CLI | Универсальный, быстрый, поддерживает SBOM |
| Snyk | Коммерческий (есть бесплатный tier) | Мониторинг новых уязвимостей, интеграция с IDE |
| Clair (Quay) | Серверный | Интеграция с реестрами (Harbor, Quay) при push |
| Grype (Anchore) | Open-source CLI | Быстрый, поддерживает сканирование SBOM |
Snyk
Пример
# Сканирование Docker-образа
snyk container test my-registry/banking-service:1.0.0
# Постоянный мониторинг (уведомления о новых CVE)
snyk container monitor my-registry/banking-service:1.0.0
# Сканирование зависимостей проекта
snyk test --all-projects
Grype
Пример
grype my-registry/banking-service:1.0.0
grype sbom:./sbom.spdx.json # сканирование на основе SBOM
Интеграция в CI/CD
Пример Jenkinsfile со сканированием
pipeline {
agent any
stages {
stage('Build') {
steps {
sh './mvnw clean package -DskipTests'
sh 'docker build -t banking-service:${BUILD_NUMBER} .'
}
}
stage('Security Scan') {
steps {
sh '''
trivy image \
--exit-code 1 \
--severity CRITICAL,HIGH \
--ignore-unfixed \
--format table \
banking-service:${BUILD_NUMBER}
'''
}
}
stage('Push') {
when {
expression { currentBuild.result == null }
}
steps {
sh 'docker push registry.bank.local/banking-service:${BUILD_NUMBER}'
}
}
}
}
Пример GitHub Actions со сканированием
- name: Scan image with Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: 'my-registry/banking-service:${{ github.sha }}'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
exit-code: '1'
- name: Upload Trivy scan results
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'trivy-results.sarif'
Вывод
Сканирование образов должно быть обязательным этапом CI/CD-пайплайна. Для банковских систем рекомендуется сканировать образы при каждой сборке и периодически (ежедневно) пересканировать уже развёрнутые образы, так как новые CVE появляются постоянно. Блокировка деплоя при наличии CRITICAL-уязвимостей – обязательная практика.
На собеседовании: назовите Trivy как основной инструмент, покажите знание ключевых флагов (
--exit-code 1,--severity,--ignore-unfixed). Упомяните необходимость регулярного пересканирования уже задеплоенных образов – это показывает зрелое понимание процесса.