Gymterview
middle

Как сканировать 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). Упомяните необходимость регулярного пересканирования уже задеплоенных образов – это показывает зрелое понимание процесса.