Безопасность контейнеров во время выполнения
Применяйте лучшие практики защиты контейнеров во время выполнения, включая настройку прав пользователей и ограничений ресурсов.
«Безопасность контейнеров во время выполнения» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Основы безопасности во время выполнения
Добро пожаловать в раздел Безопасность контейнеров во время выполнения! Создание безопасных образов крайне важно, но что происходит после запуска контейнера?
В этом уроке рассматриваются рекомендации по защите приложений во время их работы и ограничению возможного ущерба от уязвимостей или атак.

Принцип наименьших привилегий
Один из основополагающих принципов безопасности — принцип наименьших привилегий. Он означает, что сущности (например, контейнеру или пользователю) предоставляются только разрешения, абсолютно необходимые для выполнения её функции, и не более того.
Применение этого принципа уменьшает поверхность атаки и ограничивает последствия компрометации контейнера.
Не запускайте процессы от имени root
По умолчанию процессы внутри контейнера Docker запускаются от имени пользователя root, обладающего полными административными правами внутри контейнера.
- Риск: если злоумышленник получит контроль над контейнером с привилегиями root, он потенциально сможет использовать уязвимости в службе Docker или ядре, чтобы получить доступ root к хост-системе.
- Рекомендация: всегда запускайте процессы контейнера от имени пользователя, не являющегося root.
Запуск от имени пользователя без прав root
Можно указать пользователя (по имени или UID) для процесса контейнера с помощью флага --user команды docker run. В этом примере команда id запускается в контейнере Alpine от имени пользователя 1000.
Если пользователя 1000 не существует, Docker всё равно будет использовать этот UID.
docker run --rm -it --user 1000 alpine idПонимание возможностей Linux
В традиционных системах Linux пользователь root обладает полномочиями по принципу «всё или ничего». Возможности Linux разделяют мощные привилегии root на небольшие отдельные наборы.
Благодаря этому процесс может получить только необходимые ему полномочия уровня root (например, привязку к портам с низкими номерами или доступ к необработанной сети), не получая полный набор прав root.
Удаление ненужных возможностей
По умолчанию контейнеры Docker запускаются с большим набором возможностей. Вы можете удалить ненужные возможности с помощью --cap-drop, дополнительно ограничив действия контейнера.
В этом примере мы удаляем возможность NET_RAW. После этого команда ping, которой требуется NET_RAW, завершится с ошибкой, демонстрируя установленное ограничение.
docker run --rm -it --cap-drop=NET_RAW alpine ping -c 1 localhost || echo "Ping failed: NET_RAW capability dropped!"Ограничение ресурсов контейнера
Контейнеры совместно используют ядро и ресурсы хост-системы. Неконтролируемое использование ресурсов одним контейнером может привести к отказу в обслуживании (DoS) других контейнеров или даже самой хост-системы.
- Ограничения CPU: не позволяют контейнеру монополизировать вычислительные циклы CPU.
- Ограничения памяти: не позволяют контейнеру использовать всю доступную RAM, предотвращая нестабильность системы.
Установка ограничений ресурсов
Ограничения CPU и памяти можно задать непосредственно с помощью docker run. В этом примере объём памяти ограничен значением 128 МБ, а использование CPU — значением 0.5 (половина одного ядра CPU).
Это позволяет контейнеру работать корректно и не лишать другие процессы необходимых ресурсов.
docker run --rm -it --memory="128m" --cpus="0.5" alpine sh -c "echo 'Container running with limited resources.' && free -h"Файловые системы только для чтения
Многим приложениям не требуется выполнять запись в корневую файловую систему после запуска. Если сделать файловую систему доступной только для чтения, Вы получите значительные преимущества в безопасности:
- Предотвращение изменений: злоумышленник не сможет изменить существующие файлы или записать новые вредоносные файлы.
- Ограничение сохранения изменений: все внесённые изменения будут временными и исчезнут после перезапуска контейнера.
- Обеспечение неизменяемости: это способствует созданию архитектуры, в которой контейнеры являются одноразовыми, а конфигурация хранится отдельно.
Развёртывание контейнеров только для чтения
Используйте флаг --read-only при запуске контейнера. Любая попытка записи в файловую систему контейнера (за исключением явно подключённых томов) завершится с ошибкой.
Попробуйте создать файл в этом контейнере, доступном только для чтения:
docker run --rm -it --read-only alpine sh -c "touch /test.txt || echo 'Error: Cannot write to read-only filesystem!'"Проверка безопасности во время выполнения
Какие из перечисленных ниже практик подходят для защиты контейнеров во время выполнения?
Повторение: безопасность во время выполнения
Отличная работа! Вы узнали, как повысить безопасность контейнеров во время их работы:
- Наименьшие привилегии: предоставляйте только необходимые разрешения.
- Пользователи без прав root: не запускайте процессы от имени
root. - Возможности: удаляйте ненужные возможности Linux.
- Ограничения ресурсов: контролируйте использование CPU и памяти.
- Только для чтения: делайте файловые системы неизменяемыми, чтобы предотвратить запись.
Эти практики значительно уменьшают поверхность атаки и последствия возможной компрометации. Продолжайте практиковаться!
Часто задаваемые вопросы
Урок «Безопасность контейнеров во время выполнения» бесплатный?
Да — полный текст урока «Безопасность контейнеров во время выполнения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «Безопасность контейнеров во время выполнения»?
Применяйте лучшие практики защиты контейнеров во время выполнения, включая настройку прав пользователей и ограничений ресурсов. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Безопасность контейнеров во время выполнения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Проверка безопасности образов контейнеров
- Безопасность контейнеров во время выполнения
- Управление секретами и RBAC
- Сетевые политики и минимальные привилегии в сети