Сегодня мы погружаемся в ключевые стратегии безопасности контейнеров — практические шаги по защите ваших приложений, обеспечению безопасности цепочки поставок и опережению развивающихся угроз.

На дворе 2025 год, и киберугрозы стали более частыми, изощрёнными и разрушительными, чем когда-либо. Мы больше не ограничиваемся беспокойством по поводу взломанных серверов или утечки баз данных — теперь в центре внимания безопасность контейнеров. Более 85% организаций уже запускают контейнеризованные приложения в продакшене.

Но с ростом использования контейнеров растут и риски — и злоумышленники это прекрасно понимают. Именно поэтому каждому из нас — инженерам DevOps, специалистам по безопасности, разработчикам и архитекторам систем — важно сосредоточиться на безопасности контейнеров.

В этой статье мы разберём:

  • Почему безопасность контейнеров особенно важна в 2025 году
  • Ключевые best practices, которые должна применять каждая команда
  • Практические примеры с использованием Docker Scout для локального сканирования и Snyk для непрерывной проверки безопасности в GitHub Actions

Итак, поехали — время не ждёт, и безопасность тоже!


Безопасность контейнеров в 2025 году

Почему безопасность контейнеров так важна именно в 2025? Давайте зададим контекст. В 2025 году микросервисы повсюду. Наши приложения могут состоять из десятков или сотен контейнеров, взаимодействующих друг с другом. Это резко увеличивает поверхность атаки.

Почему? Каждый контейнер — это фактически отдельная среда: с собственными пакетами ОС, библиотеками и конфигурациями. Один неправильно сконфигурированный контейнер или контейнер с неактуальным ПО — и этого достаточно для серьёзной утечки или взлома.

Кроме того, растёт количество атак на цепочку поставок — когда злоумышленники целятся не в ваш код напрямую, а во внешние зависимости, базовые образы или сторонние интеграции, от которых вы зависите.

Проще говоря, сам образ контейнера может быть уязвимым. Поэтому нам нужно уделять внимание:

  • Содержимому базового образа
  • Среде выполнения (runtime)
  • Pipeline’у, который собирает и деплоит эти контейнеры

Моя цель сегодня — дать вам практический подход к стратегии «Shift Left»: выявлять проблемы безопасности ещё на этапе разработки, когда они дешевле и проще в устранении, и встроить проверки безопасности в ежедневный рабочий процесс.


Основные best practices для безопасности контейнеров

Так какие же практики действительно работают для защиты контейнеров? Давайте рассмотрим семь ключевых принципов, применимых к Docker, Kubernetes и любой контейнерной среде.


1. Используйте минимальные базовые образы

Чем больше образ — тем больше зависимостей, а значит — больше поверхность атаки для злоумышленников.

По возможности используйте легковесные образы, такие как Alpine или distroless, вместо полноценных Linux-дистрибутивов.

Почему? Alpine весит всего около 5 мегабайт, тогда как Ubuntu или Debian — десятки или даже сотни мегабайт.

Меньше пакетов — меньше рисков и меньше поверхность атаки. А это именно то, что нам нужно.


2. Фиксируйте версии

Когда вы используете базовый образ, никогда не пишите просто:

FROM python:3

Указывайте точную версию, например:

FROM python:3.13.2-alpine

Это зафиксирует стабильную версию и убережёт от неожиданностей при автоматических обновлениях или появлении новых уязвимостей.

И никогда не используйте тег latest! Если вы пишете FROM python:latest, вы не знаете, какую версию получите — она может внезапно измениться и “сломать” ваше приложение.

Хуже того — злоумышленник может загрузить скомпрометированный образ под тегом latest, и ваша система может его автоматически подтянуть без вашего ведома.

Всегда фиксируйте версии — это даёт вам контроль.


3. Сканируйте на ранних этапах и регулярно

Безопасность — это не одноразовое действие. Необходимо постоянно сканировать риски на каждом этапе:

✅ Development
✅ Staging
✅ Production

Инструменты вроде Docker Scout и Snyk помогают автоматизировать этот процесс.

Например, с помощью Docker Scout вы можете просканировать образ одной командой и сразу увидеть возможные уязвимости.

Интегрируйте безопасность в pipeline с самого первого дня — а не в качестве запоздалого патча.


4. Используйте multi-stage сборку

Если в вашем контейнере остаются лишние зависимости, библиотеки или инструменты после сборки, это увеличивает возможности для атак.

Используйте многоступенчатую сборку (multi-stage): сначала соберите приложение на одном этапе, а затем перенесите только необходимые файлы в финальный, меньший образ.

Это позволит исключить:

🚫 Отладочные инструменты
🚫 Компиляторы
🚫 Временные файлы

Результат — меньший, чище собранный и более безопасный контейнер.


5. Отключите ненужные привилегии

По умолчанию контейнеры запускаются от имени root — а это серьёзная угроза безопасности.

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

Вместо этого запускайте контейнер от обычного пользователя, указав:

USER 1000:1000

Что это значит?

  • Первая тысяча — это ID пользователя (UID) — обычный непривилегированный пользователь Linux.
  • Вторая тысяча — это ID группы (GID), означающая принадлежность к ограниченной группе.

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


6. Не включайте секреты в образы

Никогда не вшивайте чувствительные данные внутрь образа — это распространённая ошибка, которая приводит к утечке секретов при компрометации или случайной загрузке образа третьими лицами.

Храните секреты безопасно:

✅ В переменных окружения
✅ В менеджерах секретов, таких как AWS Secrets Manager, HashiCorp Vault или Kubernetes Secrets

Если вы всё же случайно закоммитили секрет в код, инструменты вроде TruffleHog или GitLeaks помогут его обнаружить до утечки.

Никогда не размещайте секреты в образах, репозиториях или логах!


7. Мониторинг поведения во время выполнения (Runtime)

Сканирования на этапе сборки недостаточно — важно также отслеживать, что происходит в продакшене.

Инструменты вроде Falco и Sysdig помогают выявлять подозрительную активность внутри контейнеров.

Например, Falco может оповестить вас, если контейнер внезапно запускает shell — это может означать, что его скомпрометировали.

Следите за другими тревожными сигналами:

🚨 Неожиданные изменения файлов
🚨 Повышенная сетевое активность из контейнера
🚨 Попытки повышения привилегий контейнером

Мониторинг поведения в рантайме позволяет выявить угрозы до того, как они перерастут в серьёзные инциденты.


Заключение по основным best practices для безопасности контейнеров

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

Меньше — значит лучше: меньше сложности, меньше привилегий, меньше секретов — всё это делает контейнер более безопасным.


Docker Scout для локального сканирования образов

Хорошо, закатываем рукава и пробуем Docker Scout в действии!

Docker Scout сканирует ваши Docker-образы на наличие уязвимостей и даёт рекомендации по best practices.

Перед началом убедитесь, что у вас есть:

  • Установленный Docker Desktop версии 4.38 или новее
  • Аккаунт Docker, и вы вошли в систему через docker login

Допустим, у нас есть пример приложения на Node.js. Вот как выглядит наш Dockerfile:

# Используем легковесный образ Node.js на базе Alpine Linux
FROM node:22.13.0-alpine

# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /usr/src/app

# Сначала копируем только package-файлы (для кэширования слоёв)
COPY package*.json ./

# Устанавливаем зависимости Node.js
RUN npm install

# Копируем весь проект (включая index.js) в контейнер
COPY . .

# Открываем порт 3000 для Node.js-сервера
EXPOSE 3000

# Команда по умолчанию для запуска приложения
CMD ["node", "index.js"]

Здесь мы используем node:22.13.0-alpine, потому что он меньше, чем node:22. Это делает контейнер легче и эффективнее, но всё равно важно проверить его на безопасность.

Теперь собираем наш Docker-образ.

docker build -t my-node-app:1.0.0 .

Эта команда упаковывает наше приложение в Docker-образ с именем my-node-app и версией 1.0.0.

Далее сканируем этот образ с помощью Docker Scout:

docker scout cves my-node-app:1.0.0

Docker Scout проанализирует образ и отобразит все потенциальные риски и уязвимости.

После завершения сканирования вы увидите отчёт со списком найденных проблем, их уровнем критичности и возможными способами исправления.

Как обеспечить безопасность контейнеров в 2025 — практики и live demo

Эти уязвимости могут быть связаны с системными библиотеками, базовыми пакетами или зависимостями приложения. Docker Scout может порекомендовать обновление компонентов или установку патчей.

Почему это важно? Потому что локальное сканирование позволяет обнаружить уязвимости на раннем этапе — до того, как образ будет отправлен в реестр или задеплоен в продакшен. Исправив их заранее, мы делаем среду сразу безопаснее.

Вот такой простой и эффективный способ повысить безопасность контейнеров с помощью Docker Scout.


Snyk в GitHub Actions

Теперь посмотрим, как автоматизировать сканирование безопасности в нашем CI/CD-пайплайне с помощью Snyk и GitHub Actions.

Перед началом убедитесь, что вы:

Как обеспечить безопасность контейнеров в 2025 — практики и live demo

  • В своём GitHub-репозитории перейдите в SettingsSecrets and variablesActions и создайте новый секрет с именем SNYK_TOKEN

Как обеспечить безопасность контейнеров в 2025 — практики и live demo

Допустим, у нас есть проект на Node.js. Цель проста: каждый раз, когда разработчик пушит код или открывает pull request, мы хотим, чтобы Snyk автоматически проверял его на наличие уязвимостей.

  • Snyk проверит контейнерный образ на риски в базовом образе и пакетах ОС
  • Также он просканирует зависимости приложения — package.json и другие библиотеки — на наличие уязвимостей

Создание workflow в GitHub Actions

Для этого создадим новый workflow-файл GitHub Actions. Поместим его в папку .github/workflows и назовём snyk.yml

Как обеспечить безопасность контейнеров в 2025 — практики и live demo

name: Snyk Security Scan
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repository
        uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Build Docker image
        run: docker build -t my-node-app:1.0.0 .

      - name: Snyk Container Scan
        uses: snyk/actions/docker@master
        env:
          SNYK_TOKEN: $
        with:
          image: 'my-node-app:1.0.0'
          args: '--file=Dockerfile'

      - name: Snyk Code & Dependency Scan
        uses: snyk/actions/node@master
        env:
          SNYK_TOKEN: $
        with:
          args: '--file=package.json'

Этот workflow автоматически сканирует как наш Docker-образ, так и зависимости приложения на предмет уязвимостей. Здесь мы используем SNYK_TOKEN из GitHub Secrets — это best practice, поскольку такой подход защищает наши учётные данные и предотвращает их случайную утечку.

Как обеспечить безопасность контейнеров в 2025 — практики и live demo

Завершение и финальные советы

Сегодня мы разобрали много важного:

  1. Почему безопасность контейнеров критична в 2025 году
  2. Семь основных принципов — от минимальных образов до ограничения привилегий
  3. Живую демонстрацию Docker Scout для локального сканирования образов
  4. Как автоматизировать сканирование с помощью Snyk и GitHub Actions

Но главный вывод такой: безопасность контейнеров — это не просто инструменты и настройки. Это образ мышления. Каждый член команды играет роль в обеспечении безопасности.

Перед тем как завершить, вот несколько быстрых и практичных советов для улучшения безопасности контейнеров:

  • Мониторьте поведение в рантайме с помощью таких инструментов, как Falco или Sysdig, чтобы выявлять подозрительную активность.
  • Следите за актуальностью всего ПО — обновление пакетов ОС и зависимостей — один из самых простых и эффективных шагов.
  • Применяйте политики безопасности, например, блокировку деплоя при наличии критических уязвимостей. Даже одно такое правило может значительно повысить защиту.
  • Обучайте свою команду — безопасность касается не только DevOps или инженеров, а всех: разработчиков, QA и специалистов по безопасности.

Спасибо за прочтение! Не забудьте посмотреть видеоверсию — там больше наглядности и полезной информации.


Подпишись

Telegram | Блог
🎬 YouTube
🐦 Twitter
🎨 Instagram
🐘 Mastodon
🧵 Threads
🎸 Facebook
🧊 Bluesky
🎥 TikTok
💻 LinkedIn
📣 daily.dev Squad
🧩 LeetCode
🐈 GitHub


Комьюнити IT-экспертов

🚀 Telegram | Чат
👾 Discord


Этот контент создан искусственным интеллектом?

Нет! Каждая статья — результат моей работы, наполненной страстью к Docker и десятилетиями опыта в IT. Я применяю ИИ для улучшения грамматики, чтобы обеспечить четкость технических деталей, однако все идеи, стратегии и рекомендации исключительно мои. Этот метод иногда может вызывать срабатывание детекторов ИИ, но можете быть уверены, что вся представленная информация и опыт — подлинно мои.

Владимир Михалев
Я — Владимир Михалев, Капитан Docker, но друзья называют меня Вальдемарыч.

DevOps комьюнити

Привет! 👋 Если у тебя есть вопросы по установке или настройке, то задайте их мне и другим IT-экспертам нашего сообщества:


Stop Russian Aggression!

See what you can do