Ответ
Контейнер, по умолчанию, изолирован, но неправильная конфигурация или предоставление избыточных привилегий может привести к компрометации хоста. Вот реальные векторы атак, которые мы учитываем при настройке безопасности.
1. Монтирование чувствительных директорий хоста:
Если смонтировать корневую файловую систему хоста (/) или директорию с Docker socket (/var/run/docker.sock) в режиме записи, контейнер получит над ней полный контроль.
# Критически опасный запуск
docker run -v /:/hostfs -it alpine rm -rf /hostfs/etc
2. Запуск контейнера в привилегированном режиме (--privileged):
Это дает контейнеру доступ ко всем устройствам хоста и отключает многие механизмы изоляции. Контейнер может, например, перемонтировать корневую ФС хоста.
docker run --privileged -it ubuntu
# Внутри контейнера:
mount /dev/sda1 /mnt
echo "malicious_code" > /mnt/etc/crontab
3. Неограниченное использование ресурсов: Контейнер без лимитов CPU и памяти может исчерпать ресурсы хоста, вызвав отказ в обслуживании (DoS).
4. Использование уязвимостей ядра (например, Dirty COW): Если в ядре хоста есть неисправленная уязвимость, процесс в контейнере может ее эксплуатировать для получения root-прав на хосте.
Меры защиты, которые мы применяем:
- Никогда не использовать
--privileged. Вместо этого предоставляем только необходимые Linux Capabilities через--cap-add. - Сбрасываем все capabilities по умолчанию:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE. - Запускаем контейнер от непривилегированного пользованого UID:
--user 1000:1000. - Монтируем файловые системы только для чтения:
--read-only. - Устанавливаем жесткие лимиты на ресурсы:
--memory="512m" --cpus="1.0". - Используем Security-контексты в Kubernetes:
securityContext.readOnlyRootFilesystem: true. - Регулярно обновляем ядро хоста и сканируем образы на уязвимости с помощью Trivy или Grype.