Представьте: вы скачали готовый образ с 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).

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

Комментарии (5)


  1. avmcoder
    18.10.2025 12:39

    А есть сканеры, ищущие уязвимости в контейнерах, сертифицированные ФСТЭК?


    1. Shaman_RSHU
      18.10.2025 12:39

      Code Scoring покрывает все потребности. Бесплатного для ФСТЭК естественно не будет :)

      А trivy, как и grype очень сильно фолзят - нужно много времени на ручной разбор.


    1. SignFinder
      18.10.2025 12:39

      Не уверен насчет ФСТЭК, но у Касперского есть продукт container security.


  1. SignFinder
    18.10.2025 12:39

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

    Это как? Почему стало безопаснее, если в теге 3.9 всегда будет последняя версия из 3.9, на текущий момент 3.9.24 на базе Debian 13.

    Да, минус то, что можно нарваться на атаку цепочки поставок и получить свежий скомпроментированный образ, но с другой стороны - всегда свежий с текущими исправлениями безопасности.


    1. GamePad64
      18.10.2025 12:39

      При переборке если не сделать pull, то подтянется старая закешированная версия образа