Внедрение безопасных контейнеров для докеров: лучшие практики и стратегии проектирования
Контейнеры Docker произвели революцию в современном развертывании приложений, предоставив легкие, портативные и эффективные среды для запуска программного обеспечения. По мере того, как организации все чаще принимают контейнеризацию для оптимизации своих рабочих процессов разработки и развертывания, безопасность этих контейнеров стала критической проблемой. Неправильная конфигурация контейнеров и открытые изображения являются одними из главных причин нарушений облачных данных, и в то время как Docker упрощает разработку и развертывание, он также расширяет поверхность атаки. Это всеобъемлющее руководство исследует основные лучшие практики, стратегии проектирования и меры безопасности, необходимые для реализации безопасных контейнеров Docker в производственных средах.
Основы безопасности контейнеров Docker
Docker имеет свой собственный набор проблем безопасности, и обеспечение безопасности контейнеров Docker — это не просто вопрос укрепления приложения, а комплексный подход, охватывающий всю экосистему. Перед внедрением конкретных мер безопасности важно понять модель безопасности Docker и то, как она отличается от традиционных подходов виртуализации.
Архитектура безопасности Docker
Подход Docker к безопасности отличается от традиционных методов виртуализации, прежде всего, за счёт его зависимости от ядра хост-ОС. Docker использует пространства имен ядра для изоляции процессов. Пространства имен обеспечивают первую и наиболее простую форму изоляции. Процессы, работающие в контейнере, не могут видеть и ещё меньше влиять на процессы, работающие в другом контейнере или в системе хоста.
Контейнеры Docker легкие и портативные. Однако они имеют общее ядро операционной системы хоста. Эта архитектура создает уникальные проблемы безопасности. Понимание этой модели общего ядра имеет решающее значение, потому что уязвимости в ядре хоста могут повлиять на все контейнеры, работающие на этой системе.
Каждый контейнер также получает свой собственный сетевой стек, что означает, что контейнер не получает привилегированный доступ к гнездам или интерфейсам другого контейнера.Конечно, если система хоста настроена соответствующим образом, контейнеры могут взаимодействовать друг с другом через свои соответствующие сетевые интерфейсы — так же, как они могут взаимодействовать с внешними хостами.
Модель общей ответственности
Безопасность Docker включает в себя предоставление таких функций, как Docker Compose, пространства имен и Docker Content Trust (DCT), для повышения безопасности, использование безопасных конфигураций для выполнения контейнеров, сетей и хранения, регулярное сканирование изображений контейнеров и устранение известных уязвимостей, а также мониторинг действий во время выполнения и внедрение ролевых средств контроля доступа (RBAC) для ограничения несанкционированного доступа.
Неудача по обе стороны этой модели совместной ответственности может привести к тому, что контейнерные рабочие нагрузки будут раскрыты. Пользователи, которые не могут затвердеть свою среду или поддерживать свои компоненты в актуальном состоянии, особенно подвержены риску эксплуатации. Организации должны понимать, что Docker предоставляет инструменты и платформу, но выполнение мер безопасности является ответственностью групп разработки и операций.
Основные лучшие практики для обеспечения безопасности контейнеров Docker
Безопасность контейнеров не является единым инструментом или одноразовым аудитом. Это набор практик, наложенных на весь ваш конвейер — от Dockerfile, который вы пишете, до CI, который его создает, до среды выполнения, которая его выполняет. Внедрение комплексной безопасности требует внимания к нескольким слоям стека контейнеризации.
Используйте минимальные и надежные базовые изображения
Всегда стройте контейнеры из проверенных, минимальных базовых изображений. Официальные и затвердевшие изображения являются более безопасными отправными точками. Выбор базового изображения значительно влияет на положение безопасности вашего контейнера. Более крупные изображения содержат больше пакетов, библиотек и потенциальных уязвимостей, которые могут использовать злоумышленники.
Alpine содержит меньше пакетов, что уменьшает CVE и улучшает результаты сканирования. Рассмотрите возможность использования беспорядочных изображений или Alpine Linux в качестве базовых изображений для минимизации поверхности атаки. Безупречные изображения содержат только ваше приложение и его зависимости от времени выполнения, исключая менеджеры пакетов, оболочки и другие утилиты, которые не нужны для производства.
Использование официальных изображений Docker имеет решающее значение для поддержания безопасности, поскольку эти изображения регулярно обновляются и исправляются надежными объектами. Такой подход значительно снижает риск развертывания контейнеров с существующими уязвимостями или вредоносным кодом. Всегда проверяйте источник ваших базовых изображений и отдавайте предпочтение официальным изображениям из Docker Hub или других надежных реестров.
Версии изображений Pin и избегайте последних тегов
Использование последних делает сборки непредсказуемыми. Он может вытащить обновленную версию, которая вводит ломающие изменения или уязвимости без предупреждения. Вместо использования последнего тега , всегда закрепляйте конкретные версии базовых изображений с помощью их дайджеста или тегов версий.
Версии Pinning обеспечивают воспроизводимость и предотвращают неожиданные регрессии безопасности.Когда вы указываете точную версию или дайджест, вы гарантируете, что ваши сборки будут использовать одно и то же базовое изображение каждый раз, что облегчает отслеживание уязвимостей и систематическое управление обновлениями.
# Bad practice
FROM node:latest
# Good practice - pin specific version
FROM node:18.16.0-alpine
# Best practice - use digest for immutability
FROM node:18.16.0-alpine@sha256:a1e4e58...
Запуск контейнеров в качестве некорневых пользователей
Это лучшая практика Dockerfile, чтобы избежать запуска контейнеров как root (UID 0). Есть очень мало случаев использования, когда контейнер должен выполняться как root, поэтому не забудьте включить инструкцию пользователя по изменению эффективного UID по умолчанию. Запуск контейнеров как root представляет значительные риски безопасности, потому что если злоумышленник компрометирует контейнер, они получают доступ на уровне root.
Для работы в качестве нерутового файла может потребоваться несколько дополнительных шагов в вашем Dockerfile, так как теперь вам нужно убедиться, что пользователь, указанный в инструкции пользователя, существует внутри контейнера и предоставить соответствующие разрешения файловой системы в местах, где процесс будет читать или писать.
FROM alpine:3.18
# Create a non-root user
RUN addgroup -g 1000 appgroup &&
adduser -D -u 1000 -G appgroup appuser
# Set ownership of application directories
RUN chown -R appuser:appgroup /app
# Switch to non-root user
USER appuser
WORKDIR /app
COPY --chown=appuser:appgroup . .
CMD ["./myapp"]
Кроме того, среда выполнения может блокировать контейнеры, работающие как root по умолчанию (т.е. Openshift требует дополнительных ограничений контекста безопасности). Многие дистрибутивы Kubernetes и контейнерные платформы обеспечивают соблюдение политики, не связанной с root, что делает эту практику необходимой для совместимости.
Реализация файловых систем Read-Only
Запустите корневую файловую систему только для чтения, где - только чтение делает всю файловую систему контейнера только для чтения и - tmpfs предоставляет записные каталоги в памяти для нужд времени выполнения. Эта мера безопасности предотвращает изменение файлов в контейнере, даже если они получают доступ.
Этот манифест обеспечивает соблюдение правила файловой системы только для чтения. Помните, что когда вы делаете только чтение контейнера, приложение больше не может записывать на диск. Если вашему приложению нужно писать временные файлы (например, журналы или кэш), вы должны установить временный том.
docker run -d
--read-only
--tmpfs /tmp:rw,noexec,nosuid,size=64m
--tmpfs /var/run:rw,noexec,nosuid,size=32m
nginx:alpine
Для приложений, требующих постоянного хранения, используйте именованные тома для конкретных каталогов, сохраняя при этом только для чтения корневую файловую систему. Такой подход обеспечивает необходимый доступ к записи при сохранении границ безопасности.
Откажитесь от ненужных возможностей Linux
Возможности превращают двоичную дихотомию «root/non-root» в мелкозернистую систему контроля доступа. Процессы (например, веб-серверы), которые просто должны связываться на порту ниже 1024, не должны работать как root: вместо этого им можно просто предоставить возможность службы net bind .
Наилучшим способом для пользователей было бы убрать все возможности, кроме тех, которые явно необходимы для их процессов. Возможности Linux - это мелкозернистые разрешения, которые заменяют старый root/non-root двоичный код. Docker дает контейнерам набор по умолчанию, который большинству приложений не нужен.
docker run -d
--cap-drop=ALL
--cap-add=NET_BIND_SERVICE
--security-opt=no-new-privileges:true
myapp:latest
Флаг , не имеющий новых привилегий , не позволяет процессам получать дополнительные привилегии через сетуидные или сетгидные двоичные файлы, добавляя еще один уровень защиты от атак с эскалацией привилегий.
Передовые стратегии проектирования безопасности
Значительная часть этих накладных расходов может быть предотвращена путем смещения левой безопасности, решения потенциальных проблем как можно скорее в вашем рабочем процессе разработки. Внедрение безопасности на ранних этапах жизненного цикла разработки снижает риски и упрощает восстановление.
Внедрение сканирования изображений контейнера
В безопасном трубопроводе сканирование уязвимостей Docker должно быть обязательным этапом вашего процесса CI / CD, и любое изображение должно быть отсканировано и одобрено, прежде чем когда-либо входить в состояние «Бег» в производственных кластерах.
Для сканирования изображений Docker доступно несколько мощных инструментов:
- Trivy: сканер уязвимостей «все в одном» для изображений контейнеров, файловых систем и репозиториев Git. Он популярен своей простотой, скоростью и широтой охвата, включая поддержку шаблонов сканирования инфраструктуры как кода (IaC) и зависимостей приложений.
- Docker Scout: Интегрируется в Docker Desktop и Docker CLI. Он обеспечивает понимание уязвимостей, резюме CVE и прямые ссылки на руководство по исправлению.
- Anchore Engine: инструмент сканирования изображений Docker с открытым исходным кодом, который проверяет изображения контейнеров на наличие уязвимостей, проблем с конфигурацией и нарушений политики.
- Snyk Container: сканер уязвимостей, который интегрируется с CI/CD-проводами для автоматического обнаружения и исправления уязвимостей.
- Клэр : Сканирует изображения контейнеров на известные уязвимости, перечисленные в базах данных, таких как база данных общих уязвимостей и воздействий (CVE).
Перед тем, как нажимать на изображения, вы всегда должны сканировать их на наличие уязвимостей. Такие инструменты, как Trivy, делают это простым. Trivy сообщает об уязвимостях, их серьезности и рекомендуемых исправлениях.
# Scan an image with Trivy
trivy image myapp:latest
# Scan and fail on high/critical vulnerabilities
trivy image --severity HIGH,CRITICAL --exit-code 1 myapp:latest
Создание и поддержание программных счетов материалов (SBOM)
SBOM дает вам полную инвентаризацию всего, что находится внутри вашего контейнера. Когда следующий нулевой день падает, вы можете мгновенно проверить, затронуты ли вы. Закон о кибербезопасности ЕС (сентябрь 2026 года) будет предписывать генерацию SBOM для всего программного обеспечения, продаваемого на рынке ЕС - это больше не приятно иметь.
Image Provenance документирует происхождение и историю изображений контейнеров для обеспечения прослеживаемости и целостности. SBOM Generation создает Программный билль материалов (SBOM) для каждого изображения, подробно описывающий все компоненты, библиотеки и зависимости для прозрачности и управления уязвимостями.
Grype поддерживает сканирование программного обеспечения счетов материалов (SBOMs). SBOM предоставляет базу данных всех метаданных, компонентов, библиотек и пакетов, которые составляют контейнер. Такие инструменты, как Syft, могут генерировать SBOMs автоматически, которые затем могут быть отсканированы на наличие уязвимостей.
Включить Docker Content Trust и подпись изображения
Docker Engine может быть настроен на запуск только подписанных изображений. Функция проверки подписи Docker Content Trust встроена непосредственно в докердную двоичную систему. Это гарантирует, что изображения не были подделаны и получены из надежных источников.
Cosign v3 (текущий: v3.0.5) по умолчанию не проверяется на ключ через сертификатный орган Sigstore и журнал прозрачности. Это проще и безопаснее, чем управление ключами подписи самостоятельно.
# Enable Docker Content Trust
export DOCKER_CONTENT_TRUST=1
# Sign an image with Cosign
cosign sign myregistry.io/myapp:v1.0.0
# Verify a signed image
cosign verify myregistry.io/myapp:v1.0.0
Подпись изображений обеспечивает криптографическое доказательство подлинности и целостности, защищая от атак цепочки поставок, когда злоумышленники могут вводить скомпрометированные изображения в ваш реестр.
Реализация сегментации и изоляции сети
Сегментация сети является критической стратегией защиты в глубине, которая ограничивает радиус взрыва потенциальных нарушений безопасности.Выделяя контейнеры в отдельные сети на основе их функции и уровня доверия, вы можете предотвратить боковое движение злоумышленников.
Создайте пользовательские сети Docker для разных уровней приложений:
# Create isolated networks
docker network create --driver bridge frontend-net
docker network create --driver bridge backend-net
docker network create --driver bridge database-net
# Run containers on specific networks
docker run -d --name web --network frontend-net nginx:alpine
docker run -d --name api --network backend-net myapi:latest
docker run -d --name db --network database-net postgres:14
# Connect API to both frontend and backend networks
docker network connect frontend-net api
Docker Engine 28 решил связанную с этим проблему: неопубликованные контейнерные порты теперь по умолчанию заблокированы из доступа к локальной сети. Это предотвращает случайное воздействие сервисов, которые не должны быть доступны из сети.
Используйте сетевые политики в средах Kubernetes для дальнейшего ограничения трафика между контейнерами. Определите правила входа и выхода, которые явно разрешают только необходимые пути связи.
Применяйте профили безопасности Runtime
Профили безопасности во время выполнения обеспечивают дополнительные уровни защиты, ограничивая то, что контейнеры могут делать во время выполнения. Доступны три основных механизма:
Профили Seccomp
Seccomp (Secure Computing Mode) фильтрует системные вызовы, которые контейнеры могут сделать в ядро. Ограничивая доступные системные вызовы, вы значительно уменьшаете поверхность атаки.
# Run container with custom seccomp profile
docker run --security-opt seccomp=/path/to/seccomp-profile.json myapp:latest
Профили AppArmor
Загрузите профиль AppArmor и запустите контейнер с профилем AppArmor. AppArmor обеспечивает обязательный контроль доступа, ограничивая возможности программ с профилями по программам.
# Load AppArmor profile
sudo apparmor_parser -r /etc/apparmor.d/docker-webapp
# Run container with AppArmor
docker run --security-opt apparmor=docker-webapp myapp:latest
Интеграция SELinux
SELinux Integration обеспечивает дополнительный уровень безопасности, обеспечивая обязательные элементы управления доступом к контейнерам и их взаимодействие с системой хоста. На этикетках SELinux предусмотрены тонкозернистые средства контроля доступа к контейнерным процессам и ресурсам.
Управление секретами и конфиденциальная защита данных
Жесткое кодирование секретов в изображениях или переменных окружения является одной из наиболее распространенных ошибок, которые делают разработчики. Мы должны хранить и безопасно вводить секреты. Правильное управление секретами имеет решающее значение для поддержания безопасности контейнерных приложений.
Никогда не встраивайте секреты в изображения
Пароли, ключи API и токены никогда не должны храниться внутри изображения, внутри переменных среды, отображаемых в журналах или в репозиториях Git. Вместо этого, необходимо использовать их в качестве секретов Docker, секретов Kubernetes или внешних хранилищ (AWS Secrets Manager, HashiCorp Vault).
Общие ошибки, которых следует избегать:
- Учетные данные жесткого кодирования в Dockerfiles
- Совершение работы с файлами .env с секретами для контроля версий
- Прохождение секретов в качестве аргументов (они остаются в истории изображений)
- Раскрытие секретов в переменных окружающей среды, видимых в журналах
Используйте Docker Secrets для Swarm Mode
Docker предоставляет встроенную функцию секретов для зашифрованного хранения. Docker Swarm включает в себя управление нативными секретами, которое шифрует секреты в состоянии покоя и в пути.
# Create a secret
echo "my-db-password" | docker secret create db_password -
# Use secret in service
docker service create
--name myapp
--secret db_password
myapp:latest
Внутри контейнера секреты смонтированы в виде файлов в /run/secrets/, что делает их доступными только для процесса контейнера без их раскрытия в переменных среды или журналах.
Интеграция решений для управления внешними секретами
Hashicorp Vault: централизованный инструмент управления секретами, который может использоваться для безопасного хранения и управления секретами в контейнерных средах. Для производственных сред, особенно в Кубернете, рассмотрите возможность использования специализированных решений управления секретами.
Популярные варианты включают в себя:
- HashiCorp Vault: предоставляет динамические секреты, шифрование в качестве услуги и подробные журналы аудита
- Менеджер секретов AWS: Интеграция с сервисами AWS и автоматическая ротация
- Azure Key Vault: Централизованное управление секретами для рабочих нагрузок Azure
- Секретный менеджер Google: Безопасное хранение ключей API, паролей и сертификатов в GCP
В то время как Docker Secrets обычно обеспечивают безопасный способ управления конфиденциальными данными в средах Docker, этот подход не рекомендуется для Kubernetes, где секреты хранятся в открытом тексте по умолчанию.В Kubernetes рассмотрите возможность использования дополнительных мер безопасности, таких как шифрование и т.д. или сторонние инструменты.
Безопасность и техническое обслуживание Host System
Чтобы защититься от известных уязвимостей, таких как Leaky Vessels, которые обычно приводят к тому, что злоумышленник получает корневой доступ к хосту, важно поддерживать актуальность как хоста, так и Docker. Это включает в себя регулярное обновление ядра хоста, а также Docker Engine.
Обновляйте и патчируйте системы
Это связано с тем, что контейнеры разделяют ядро хоста. Если ядро хоста уязвимо, контейнеры также уязвимы. Например, эксплойт эскалации привилегий ядра, грязная COW, выполненный внутри хорошо изолированного контейнера, все равно приведет к корневому доступу на уязвимом хосте.
Контейнерные двигатели выполнения, такие как Docker, часто обновляют свое программное обеспечение с исправлениями и функциями. Вы можете смягчить уязвимости, применяя последние обновления.
Запуск docker pull один раз и забыв о нем означает доставку изображений с многомесячными уязвимостями. Автоматизация обновлений с помощью ресурса данных изображений контейнера Renovate Bot - это создает PR, когда базовые изображения имеют обновления, в сочетании с вашим конвейером сканирования CI для автоматического восстановления.
Безопасный доступ к хосту и аутентификация
Вся аутентификация непосредственно в ОС должна быть проверена и зарегистрирована. Вы должны предоставлять доступ только соответствующим пользователям и использовать ключи для удаленных входов. И вы должны внедрить брандмауэры и разрешить доступ только в доверенных сетях.
Наилучшие методы обеспечения безопасности хоста включают:
- Отключить аутентификацию пароля для SSH, используйте только аутентификацию на основе ключа
- Внедрение многофакторной аутентификации для привилегированного доступа
- Используйте хосты бастионов или серверы для доступа к производственным системам
- Включить регистрацию аудита для всех административных действий
- Ограничить доступ Docker daemon к разъему только авторизованных пользователей
Никогда не разоблачайте Docker Daemon Socket
Это плохая практика, которую следует избегать, потому что злоумышленник сможет выполнить любую команду, которую может запустить служба Docker, и потенциально получить доступ ко всей системе хоста, потому что служба Docker работает как root.
Монтаж розетки Docker (/var/run/docker.sock) внутри контейнера дает этому контейнеру полный контроль над демоном Docker, эффективно предоставляя корневой доступ к хосту.
- Использование Docker-in-Docker (DinD) с надлежащей изоляцией
- Реализация режима rootless Docker
- Использование API-интерфейсов с ограниченными разрешениями
- Использование Kubernetes CRI вместо прямого доступа к Docker
Запустите Docker в режиме Rootless
Бескорневый Docker позволяет запускать демон Docker и контейнеры как некорневой пользователь, значительно снижая влияние потенциальных уязвимостей разбиения контейнеров.Этот режим устраняет необходимость в привилегиях root на хост-системе.
# Install rootless Docker
dockerd-rootless-setuptool.sh install
# Run Docker commands as non-root user
docker run -d nginx:alpine
Хотя режим без root обеспечивает повышенную безопасность, он имеет некоторые ограничения, такие как ограниченные сетевые возможности и соображения производительности.
Мониторинг и обнаружение безопасности Runtime
Статическая безопасность улавливает проблемы перед развертыванием. Безопасность во время выполнения улавливает то, что происходит после. Даже если изображения безопасны, контейнеры все еще могут быть атакованы во время выполнения. Внедрение мониторинга безопасности во время выполнения имеет важное значение для обнаружения и реагирования на угрозы в производственных средах.
Использование Runtime Security Tools
Falco 0.43.0 (январь 2026) — Обнаруживает аномальные сискалы, доступ к файлам и сетевые соединения. Новая инициатива по вводу сискала удалила сискал входа событий из конвейера, значительно улучшив производительность. Наследный зонд eBPF обесценен в пользу современного драйвера eBPF.
Falco - это инструмент безопасности с открытым исходным кодом, который использует eBPF для мониторинга поведения контейнеров и обнаружения подозрительных действий.
- Неожиданное выполнение процесса
- Несанкционированные изменения файлов
- Подозрительные сетевые соединения
- Попытки эскалации привилегий
- Shell нерестится в контейнерах
# Example Falco rule for detecting shell in container
- rule: Shell Spawned in Container
desc: Detect shell process started in container
condition: >
spawned_process and
container and
proc.name in (bash, sh, zsh)
output: >
Shell spawned in container (user=%user.name container=%container.name
shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline)
priority: WARNING
Внедрение комплексного лесозаготовки и мониторинга
События Docker обеспечивают нативный поток аудита для жизненного цикла контейнера, отслеживание использования ресурсов Prometheus + cAdvisor в контейнере. Неожиданное выполнение процесса, сетевые соединения или модификации файлов вызывают немедленные оповещения.
Создайте комплексную стратегию лесозаготовок, которая охватывает:
- Журналы контейнеров: выход приложения и сообщения об ошибках
- Журналы демонов докеров: события жизненного цикла контейнеров и операции демонов
- Журналы систем хостов: сообщения ядра и системные события
- Аудиторские журналы : события, связанные с безопасностью, и попытки доступа
Централизуйте журналы с помощью таких инструментов, как стек ELK (Elasticsearch, Logstash, Kibana), Loki с Grafana или облачные решения, такие как AWS CloudWatch или Azure Monitor. Централизованная регистрация позволяет соотносить события в нескольких контейнерах и хостах, что облегчает обнаружение распределенных атак.
# Configure Docker to use JSON file logging driver with rotation
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"labels": "production_status",
"env": "os,customer"
}
}
Установите ограничения ресурсов для предотвращения DoS-атак
Ограничения ресурсов предотвращают атаки типа «отказ в обслуживании» и истощение ресурсов. Без надлежащих ограничений ресурсов скомпрометированный или неправильно функционирующий контейнер может потреблять все доступные системные ресурсы, затрагивая другие контейнеры и хост.
# Docker Compose with resource limits
version: "3.9"
services:
app:
image: myapp:latest
deploy:
resources:
limits:
cpus: "2.0"
memory: 512M
pids: 100
reservations:
cpus: "0.5"
memory: 256M
ulimits:
nofile:
soft: 65536
hard: 65536
nproc:
soft: 100
hard: 200
Ограничения ресурсов должны устанавливаться на основе требований к применению и планирования потенциала. Мониторинг фактического использования ресурсов для надлежащей настройки этих ограничений, обеспечение контейнеров достаточными ресурсами при предотвращении атак на истощение ресурсов.
Интеграция безопасности трубопроводов CI/CD
Трубопроводы CI/CD являются важной частью жизненного цикла разработки программного обеспечения и должны включать в себя различные проверки безопасности, такие как проверки на вязкость, статический анализ кода и сканирование контейнеров. Многие проблемы можно предотвратить, следуя некоторым лучшим практикам при написании Dockerfile. Однако добавление защитного литератора в качестве шага в конвейере сборки может иметь большое значение для предотвращения дальнейших головных болей.
Использование Dockerfile Linting
Dockerfile linters анализирует ваши Dockerfiles на предмет распространенных ошибок, проблем безопасности и нарушений перед созданием изображений. Такие инструменты, как Hadolint, могут выявить проблемы на ранних стадиях процесса разработки.
# Run Hadolint on Dockerfile
docker run --rm -i hadolint/hadolint < Dockerfile
# Example output showing issues
DL3008: Pin versions in apt get install
DL3009: Delete the apt-get lists after installing
DL3015: Avoid additional packages by specifying --no-install-recommends
Автоматическое сканирование безопасности в CI/CD
Средства сканирования контейнеров особенно важны в рамках успешной стратегии безопасности. Они могут обнаруживать известные уязвимости, секреты и неверные конфигурации в изображениях контейнеров и предоставлять отчет о результатах с рекомендациями о том, как их исправить.
Интеграция Docker Scout в ваш конвейер CI/CD позволяет автоматически проверять, что изображения, созданные из Docker Hardened Images, остаются свободными от известных уязвимостей во время процесса сборки. Этот проактивный подход обеспечивает непрерывную целостность безопасности ваших изображений на протяжении всего жизненного цикла разработки.
# GitHub Actions workflow example
name: Container Security Scan
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: myapp:${{ github.sha }}
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
exit-code: '1'
- name: Upload Trivy results to GitHub Security
uses: github/codeql-action/upload-sarif@v2
if: always()
with:
sarif_file: 'trivy-results.sarif'
- name: Push image if scan passes
if: success()
run: |
docker tag myapp:${{ github.sha }} myregistry.io/myapp:latest
docker push myregistry.io/myapp:latest
Осуществление политики
Принудительное исполнение политики гарантирует, что в производство будут использоваться только соответствующие изображения. Такие инструменты, как Open Policy Agent (OPA) и Kyverno, могут автоматически обеспечивать соблюдение организационных политик.
Общая политика по обеспечению соблюдения включает:
- Изображения должны быть отсканированы и не иметь критических уязвимостей.
- Фотографии должны быть подписаны доверенными лицами
- Контейнеры должны работать как некорневые пользователи
- Контейнеры не должны использовать привилегированный режим
- Необходимо определить лимиты ресурсов
- Изображения должны поступать из утвержденных реестров.
Кубернеты - Специальные соображения безопасности
Безопасность Kubernetes становится жизненно важной при управлении кластерами. Слабые элементы управления доступом на основе ролей (RBAC) или открытые панели управления увеличивают риск. При работе контейнеров Docker в Kubernetes необходимы дополнительные меры безопасности.
Внедрение стандартов безопасности Pod
Стандарты безопасности Kubernetes Pod определяют три уровня политики безопасности: привилегированный, базовый и ограниченный. Ограниченная политика обеспечивает соблюдение самых строгих требований безопасности и должна использоваться для производственных нагрузок, когда это возможно.
apiVersion: v1
kind: Pod
metadata:
name: secure-app
labels:
app: myapp
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: myapp:latest
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
runAsNonRoot: true
runAsUser: 1000
resources:
limits:
cpu: "1"
memory: "512Mi"
requests:
cpu: "100m"
memory: "128Mi"
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
Настройка сетевой политики
Политика сети Kubernetes обеспечивает мелкозернистый контроль над связью между стручками. По умолчанию все стручки могут общаться друг с другом, что нарушает принцип наименьших привилегий.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-network-policy
namespace: production
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432
Используйте контроллеры входа
Контроллеры доступа перехватывают запросы на сервер API Kubernetes до того, как объекты будут сохранены, что позволяет обеспечивать соблюдение политик и проверять конфигурации. Такие инструменты, как OPA Gatekeeper и Kyverno, предоставляют возможности политики в качестве кода.
Примеры политики по осуществлению:
- Требуйте, чтобы все изображения поступали из утвержденных реестров.
- Ограничение ресурсов на все контейнеры
- Предотвращение создания привилегированных контейнеров
- Требует специальных ярлыков на всех ресурсах.
- Проверка контекстов безопасности соответствует минимальным требованиям
Соответствие и нормативные соображения
Организации, работающие в регулируемых отраслях, должны обеспечить, чтобы их развертывание контейнеров соответствовало конкретным требованиям соответствия. Общие рамки и стандарты включают:
- Справочная информация о докере : Предоставляет предписывающее руководство для создания безопасной конфигурации для докера
- Справочная информация по Kubernetes: Рекомендации по безопасности для развертывания Kubernetes
- PCI DSS: Требования к организациям, обрабатывающим данные платежных карт
- HIPAA: Стандарты защиты конфиденциальной информации о здоровье пациентов
- SOC 2 (FLT: 1) — система управления данными клиентов на основе пяти принципов доверительного обслуживания
- GDPR: Требования к защите данных и конфиденциальности для резидентов ЕС
Такие инструменты, как Docker Bench for Security и kube-bench, могут автоматически оценивать окружающую среду по этим критериям и предоставлять рекомендации по исправлению.
# Run Docker Bench for Security
docker run --rm --net host --pid host --userns host --cap-add audit_control
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST
-v /var/lib:/var/lib
-v /var/run/docker.sock:/var/run/docker.sock
-v /usr/lib/systemd:/usr/lib/systemd
-v /etc:/etc --label docker_bench_security
docker/docker-bench-security
# Run kube-bench for Kubernetes
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml
kubectl logs job/kube-bench
Безопасность реестра контейнеров
Реестр контейнеров является критически важным компонентом цепочки поставок контейнеров. Обеспечение безопасности ваших реестров предотвращает несанкционированный доступ к изображениям и защищает от атак цепочки поставок.
Используйте частные реестры
В то время как публичные реестры, такие как Docker Hub, удобны, производственные рабочие нагрузки должны использовать частные реестры с надлежащим контролем доступа.
- Harbor: реестр с открытым исходным кодом с сканированием уязвимостей, подписанием изображений и RBAC
- AWS ECR: Управляемый реестр, интегрированный с сервисами AWS
- Лазурный контейнерный реестр : управляемый реестр рабочих нагрузок Azure
- Реестр контейнеров Google : управляемый реестр для GCP
- JFrog Artifactory: универсальное хранилище артефактов с расширенными функциями безопасности
Реализация контроля доступа реестра
Настройка аутентификации и авторизации для доступа к реестру:
- Использование учетных записей с минимальными разрешениями для трубопроводов CI/CD
- Внедрение ролевого контроля доступа (RBAC) для различных команд
- Включить регистрацию аудита для всех операций реестра
- Используйте токены с коротким сроком действия вместо долгосрочных учетных данных
- Внедрение белого списка IP для доступа к реестру
Автоматическое сканирование уязвимостей
Docker Hub позволяет выполнять либо сканирование статических уязвимостей в режиме «точка-в-время», либо всегда актуальный анализ изображений с помощью Docker Scout. После включения Docker Scout анализ изображений Docker Scout автоматически анализирует изображения в вашем хранилище Docker Hub. Анализ изображений извлекает программный вексель материала (SBOM) и другие метаданные изображений и оценивает его по данным уязвимостей из рекомендаций по безопасности.
Большинство современных реестров предлагают интегрированное сканирование уязвимостей, которое автоматически сканирует изображения при их толкании.
- Сканировать все изображения автоматически нажмите
- Постоянное сканирование изображений для вновь обнаруженных уязвимостей
- Блокировка изображений с критическими уязвимостями
- Отправка уведомлений при обнаружении уязвимостей
- Предоставить рекомендации по исправлению выявленных проблем
Реакция на инциденты и восстановление
Несмотря на принятие комплексных мер безопасности, инциденты все еще могут иметь место. Наличие четко определенного плана реагирования на инциденты имеет решающее значение для минимизации ущерба и быстрого восстановления.
Разработать план реагирования на инциденты
Ваш план реагирования на инциденты должен включать:
- Обнаружение : Механизмы выявления инцидентов безопасности посредством мониторинга и оповещения
- Сдерживание : Процедуры изоляции пораженных контейнеров и предотвращения распространения
- Расследование : Шаги для анализа инцидента и определения первопричины
- Искоренение: Процессы устранения угроз и закрытия уязвимостей
- Восстановление : Процедуры восстановления услуг и проверки безопасности
- Обзор после инцидента: Анализ того, что произошло и как предотвратить рецидив
Внедрение контейнерных криминалистических возможностей
Судебная экспертиза контейнеров может быть сложной из-за эфемерного характера контейнеров. Внедрить эти методы для поддержки расследований:
- Сохраняйте состояние контейнера, создавая снимки до прекращения
- Ведение всеобъемлющих журналов с достаточными сроками хранения
- Используйте неизменяемую инфраструктуру для предотвращения фальсификации доказательств
- Внедрение аудита для всех контейнерных операций
- Поддерживайте происхождение изображений и стройте историю
Практика аварийного восстановления
Регулярно тестируйте свои процедуры аварийного восстановления:
- Проведение настольных упражнений, имитирующих инциденты безопасности
- Процедуры резервного копирования и восстановления данных контейнера
- Проверить, что вы можете восстановить окружающую среду с нуля
- Обеспечить актуальность и доступность документации
- Члены команды поездов по процедурам реагирования на инциденты
Контрольный список безопасности для производственных развертываний
Начните с элементов с высокой отдачей: минимальные изображения, некорневые пользователи, сканирование CI и усвоение усвоения. Слой в мониторинге времени выполнения, сегментации сети и управлении секретами. Используйте этот всеобъемлющий контрольный список, чтобы убедиться, что ваши контейнеры Docker отвечают требованиям безопасности перед развертыванием производства:
Безопасность изображения
- Используйте минимальные базовые изображения (альпийские, без дистрибуции)
- Pin конкретные версии изображений с использованием дайджестов
- Сканирование изображений уязвимостей в трубопроводе CI/CD
- Подпишите изображения с помощью Docker Content Trust или Cosign
- Создавать и поддерживать SBOM для всех изображений
- Удалите ненужные пакеты и файлы
- Используйте многоступенчатые сборки, чтобы минимизировать окончательный размер изображения
- Никогда не включайте секреты в изображения
Контейнер Runtime Security
- Запуск контейнеров как нерутовых пользователей
- Используйте только для чтения корневые файловые системы
- Бросьте все возможности и добавьте только необходимые
- Флаг без новых привилегий
- Применяйте профили seccomp, AppArmor или SELinux
- Установите ограничения ресурсов (CPU, память, PID)
- Реализация сегментации сети
- Использование частных сетей для межконтейнерной связи
Безопасность хостинга и инфраструктуры
- Держите хост-ОС и ядро обновленными
- Обновление Docker Engine регулярно
- Никогда не разоблачайте Docker Damon Socket
- Используйте безкорневый Docker, когда это возможно
- Внедрение хост-ориентированных брандмауэров
- Включить журналирование аудита
- Ограничьте доступ к SSH с помощью аутентификации на основе ключей
- Использование хостов бастионов для доступа к производству
Секреты и управление конфигурацией
- Используйте Docker Secrets или внешние хранилища
- Никогда не жёсткие коды
- Регулярно вертите секреты
- Используйте короткоживущие токены и учетные данные
- Шифровать секреты в покое и в пути
- Секретный доступ к аудиту
Мониторинг и лесозаготовка
- Внедрение мониторинга безопасности во время выполнения (Falco)
- Централизовать бревна из всех контейнеров
- Включить Docker Daemon logging
- Мониторинг использования ресурсов
- Настройка оповещений о подозрительной деятельности
- Сохранение достаточного количества бревен
- Внедрение аудиторских процедур для соблюдения
CI/CD Безопасность трубопроводов
- Lint Dockerfiles с Hadolint
- Сканирование изображений в трубопроводе CI
- Неудача основывается на критических уязвимостях
- Осуществление политики обеспечения соблюдения
- Используйте отдельные реестры для разработки / постановки / производства
- Автоматическое тестирование безопасности
- Требуется пересмотр кода для изменений Dockerfile
Kubernetes-Specific (если применимо)
- Внедрение стандартов безопасности Pod
- Настройка сетевой политики
- Используйте контроллеры допуска для обеспечения соблюдения политики
- Включите RBAC с наименьшими привилегиями
- Защита API-сервера Kubernetes
- Шифровать и т.д. данные в состоянии покоя
- Проверка справок Kubernetes Benchmark
Новые тенденции и будущие соображения
Безопасность контейнеров продолжает развиваться с новыми технологиями и подходами. Будьте в курсе новых тенденций:
Безопасность цепочки поставок
Инциденты 2025 года — отправка бэкдорированных базовых изображений в течение нескольких месяцев, тысячи производственных учетных данных, просочившихся через Dockerfiles — доказывают, что основы по-прежнему имеют значение. Атаки цепочки поставок, нацеленные на контейнерные экосистемы, увеличиваются. Внедряйте принципы рамочной основы SLSA (Уровни цепочки поставок для артефактов программного обеспечения) для проверки целостности вашей цепочки поставок программного обеспечения.
Архитектура нулевого доверия
Применять принципы нулевого доверия к контейнерным средам, предполагая нарушение и проверяя каждый запрос. Внедрять сервисные ячеистые технологии, такие как Istio или Linkerd, для обеспечения взаимной аутентификации TLS, мелкозернистого авторизации и наблюдаемости для связи контейнер-контейнер.
Безопасность на основе eBPF
Расширенная технология Berkeley Packet Filter (eBPF) обеспечивает мощный мониторинг безопасности во время выполнения с минимальными накладными расходами. Инструменты, использующие eBPF, могут обеспечить глубокую видимость поведения контейнера без необходимости использования модулей ядра или модификаций контейнера.
Конфиденциальные вычисления
Конфиденциальные вычислительные технологии защищают данные, используемые при выполнении вычислений в аппаратных средах доверенного выполнения (TEE). Этот новый подход может защитить чувствительные рабочие нагрузки даже от привилегированных пользователей и скомпрометированных систем хоста.
Рекомендуемые инструменты и ресурсы
Создание комплексной программы безопасности контейнеров требует использования правильных инструментов. Вот рекомендуемые ресурсы, организованные по категориям:
Сканирование уязвимостей
- Trivy (Открытый источник): быстрый, комплексный сканер уязвимостей
- Docker Scout: Интегрированное сканирование с помощью Docker Desktop и CLI
- Анхорный движок (открытый источник): сканирование на основе политики и соблюдение требований
- Snyk Container: Сканирование с фокусом на разработчиках с рекомендациями по исправлению
- Клэр (Открытый источник): Статический анализ уязвимостей
Безопасность Runtime
- Falco (Открытый источник): Обнаружение угроз в режиме выполнения с использованием eBPF
- Aqua Security: Комплексная платформа безопасности контейнеров
- Sysdig Secure: Безопасность и криминалистика во время выполнения
Политика и соблюдение
- Агент открытой политики (Открытый источник): движок политики в качестве кода
- Киверно (Открытый источник): Управление политикой нативного происхождения Kubernetes
- Справка Docker для безопасности (Открытый источник): CIS Docker Benchmark checks
- kube-bench (Открытый источник): CIS Kubernetes Benchmark checks
Управление секретами
- HashiCorp Vault: Управление секретами предприятия
- Менеджер секретов AWS: облачные секреты для AWS
- Azure Key Vault: Управление секретами для Azure
- Google Secret Manager: Управление секретами для GCP
Дополнительные ресурсы
- Документация безопасности Docker
- OWASP Docker Security Cheat Sheet
- Сис Докер Бенчмарк
- Кубернеты Документация по безопасности
- SLSA Framework
Заключение
Безопасность контейнеров - это непрерывный процесс, который охватывает несколько аспектов, включая создание изображений, секретную обработку, поведение во время выполнения и постоянный мониторинг. Безопасность - это постоянный процесс. Регулярно проверяйте свои конфигурации, обновляйте базовые изображения и будьте в курсе новых уязвимостей. Усилия, которые вы инвестируете в безопасность контейнеров сегодня, защищают вашу инфраструктуру завтра.
Внедрение безопасных контейнеров Docker требует комплексного, многоуровневого подхода, который учитывает безопасность на каждом этапе жизненного цикла контейнера. От выбора минимальных базовых изображений и работы в качестве неосновных пользователей до осуществления мониторинга времени выполнения и поддержания соответствия, каждая мера безопасности способствует надежной стратегии защиты в глубине.
Контейнеры Docker предоставляют мощные инструменты для современного развития, но требуют тщательного контроля, чтобы гарантировать, что они остаются в безопасности.Устраняя риски, связанные с изображениями Docker, привилегиями контейнеров и системами хоста, организации могут минимизировать вероятность нарушений и максимизировать надежность своих контейнерных сред.
Ключом к успешной безопасности контейнеров является рассмотрение его не как одноразовой реализации, а как постоянной практики, интегрированной в вашу культуру развития. Автоматизация проверок безопасности в ваших трубопроводах CI / CD, постоянный мониторинг поведения во время выполнения, регулярное обновление компонентов и постоянное информирование о возникающих угрозах и передовой практике. Следуя стратегиям и рекомендациям, изложенным в этом руководстве, вы можете создавать и поддерживать безопасные контейнерные приложения, которые защищают активы вашей организации, обеспечивая гибкость и эффективность, которые обеспечивают контейнеры.
Помните, что безопасность - это общая ответственность. В то время как платформы Docker и контейнерной оркестровки предоставляют инструменты и возможности, команды разработчиков и операторов должны последовательно внедрять и поддерживать меры безопасности. Инвестируйте в обучение своей команды, устанавливайте четкие политики безопасности и воспитывайте культуру, в которой безопасность - это ответственность каждого. При правильном сочетании инструментов, практик и бдительности вы можете использовать всю мощь контейнеризации, сохраняя сильную позицию безопасности.