Представьте: вы скачали готовый образ с Docker Hub, запустили контейнер, и вдруг ваш сервер становится частью ботнета. Как этого избежать? 

Рассказываем 3 простых способа сканирования образов

1.Trivy - сканер для ленивых (но эффективный)

Вот для таких)))
Вот для таких)))

Почему его любят:

  • Работает из коробки (не надо ничего настраивать)

  • Проверяет не только пакеты, но и конфиги (например, утечки паролей)

  • Можно запустить одной командой

Как использовать:

# Установка (Linux/macOS)curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin

# Сканирование образа
trivy image ваш-образ:тег

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

python:3.9 (debian 11.6)
========================
Total: 42 (CRITICAL: 5, HIGH: 12)

libssl1.1 — уязвимость (CVE-2022-4304)
Нужно обновить базовый образ!

2.Docker Scout - встроенный сканер от Docker

Плюсы:

  • Интегрирован прямо в Docker Desktop (не нужны отдельные инструменты)

  • Показывает «уровень здоровья» образа

Как включить:

  1. Обновите Docker Desktop

  2. В CLI выполните:

docker scout quickview ваш-образ:тег

Что увидите:

  • Список уязвимостей с критичностью.

  • Советы по исправлению (например, «используй образ с alpine вместо debian»)

3. GitHub Dependabot - автоматический мониторинг

Для тех, кто хранит Dockerfile в GitHub:

  • Добавьте файл .github/dependabot.yml:

yaml

version: 2
updates:
  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "daily"

Теперь GitHub будет:

  • Автоматически проверять образы в ваших репозиториях

  • Присылать PR с обновлениями, если найдёт уязвимости

Рассказываем о 3 правилах безопасности:

  1. Не используйте latest теги, а фиксируйте версии (python: 3:9:18)

  2. Удаляйте ненужные пакеты: чем меньше софта в образе, тем меньше дыр

  3. Регулярно обновляйте базовые образы, старый alpine: 3.12 сегодня опасен!

Теперь вы знаете, как сканировать образы на уязвимости, но что делать с результатами? Как миними��ировать риски? Сейчас разберём продвинутые лайфхаки для параноиков (в хорошем смысле)!

Что делать, если сканер нашёл уязвимости?

Вариант для ленивых: просто обновите базовый образ

Проблема: 90% уязвимостей - это старые пакеты в базовом образе (debian:old, alpine:3.12)

Решение:

dockerfile

# Было (опасно!)
FROM python:3.9

# Стало (безопаснее)
FROM python:3.9.18-bookworm  # или alpine:3.19

Почему работает:

  • Новые версии образов содержат исправления для известных CVE.

Вариант для перфекционистов: «собери свой» минимальный образ

Проблема: Официальные образы часто содержат лишние пакеты (например, curl в продакшн-образе, зачем?).

Решение:

dockerfile

# Многослойный билд + только нужные пакеты
FROM python:3.9-slim as builder

# Устанавливаем только необходимые зависимости
RUN pip install --no-cache-dir Flask gunicorn

# Финальный образ (минимум софта)
FROM gcr.io/distroless/python3-debian11
COPY --from=builder /usr/local/lib/python3.9 /usr/local/lib/python3.9
CMD ["app.py"]

Плюсы:

  • Distroless или scratch - образы без shell и лишних пакетов

  • Даже если уязвимость есть, эксплуатировать её сложнее

Вариант для параноиков: подпись образов (cosign + Sigstore)

Я не параноик...просто все вокруг сговорились 😔
Я не параноик...просто все вокруг сговорились 😔

Проблема: В Docker Hub можно выложить образ с малварью под видом легального.

Решение:

  • Генерируем ключ:

cosign generate-key-pair
  • Подписываем образ:

cosign sign --key cosign.key ваш-образ:тег
  • Проверяем перед запуском:

cosign verify --key cosign.pub ваш-образ:тег

Зачем это нужно:

  • Гарантия, что образ не подменили при загрузке.

  • Используется в Kubernetes для admission control.

Продвинутые инструменты: что еще попробовать?

Инструмент

Для чего

Команда/Пример

Grype

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

grip ваш-образ

Clair

Мониторинг уязвимостей в CI/CD

Интеграция с GitLab

Anchore

Политики безопасности (например, запрет образов с критичными CVE)

anchor-cli evaluate check ваш-образ

Главное правило безопасности - «Лучше потратить 10 минут на сканирование, чем 10 часов на восстановление после взлома».

Что делать прямо сейчас:

  • Просканируйте свои продакшн-образы:

bash

trivy image --severity CRITICAL ваш-образ:тег
  • Настройте автоматическое сканирование в CI (например, через GitHub Actions).

А вы проверяете свои образы? Если да, то каким инструментом пользуетесь? Делитесь в комментах! :-)