В чем разница между привилегированным и непривилегированным контейнером Docker?

«В чем разница между привилегированным и непривилегированным контейнером Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Разница заключается в уровне доступа контейнера к хостовой системе, что напрямую влияет на безопасность.

Непривилегированный контейнер (режим по умолчанию):

  • Запускается от непривилегированного пользователя (обычно UID 1000+).
  • Имеет ограниченный набор capabilities (прав ядра Linux), например, не может монтировать устройства или изменять системные настройки сети.
  • Изолирован namespaces (PID, сеть, пользователи и т.д.).

Привилегированный контейнер (флаг --privileged):

  • Получает все capabilities ядра Linux.
  • Снимает многие ограничения namespaces (например, контейнер может видеть все устройства хоста /dev).
  • Фактически работает с правами root на хосте, что представляет серьезную угрозу безопасности.

Пример запуска:

# Опасный запуск с полными правами (избегать в продакшене)
docker run --privileged -it ubuntu bash

# Безопасная альтернатива: добавление только необходимых прав
# Например, для отладки сети нужен доступ к RAW-сокетам:
docker run --cap-add=NET_RAW --cap-add=NET_ADMIN -it nicolaka/netshoot

Best practice в DevOps:

  1. Всегда запускать контейнеры непривилегированными.
  2. Если приложению нужны особые права, использовать флаг --cap-add для добавления конкретных capabilities (например, NET_ADMIN, SYS_TIME).
  3. В CI/CD-пайплайнах и оркестраторах (Kubernetes) явно запрещать привилегированные контейнеры через политики безопасности.