Как защитить Docker VPS: чек-лист безопасности 2026
Docker-серверы взламывают не «взломом», а конфигурацией. Открытый порт 2375, root внутри контейнера, docker.sock в маунте и секреты в переменных окружения — это 80% реальных инцидентов. Ниже чек-лист, который закрывает их за один вечер.
Собрано ServerScan по практике администрирования Docker-хостов: собственные серверы, кейсы хостинга контейнеров и отчёты docker-bench-security. Каждый пункт проверен на реальных инсталляциях, а не взят из маркетинговых гайдов.
Почему Docker-серверы ломают: 5 типичных ошибок
- Порт 2375/2376 открыт наружу. Docker API без TLS — это root-доступ к хосту без пароля:
docker run -v /:/host— и сервер ваш. Ошибка №1. - Контейнер работает от root. Компрометация приложения = root на хосте. Хватит
USER nonrootв Dockerfile. - /var/run/docker.sock в маунте. Кто имеет доступ к сокету — имеет root. Обычному боту сокет не нужен.
- Секреты в env и в коде. Переменные окружения видны через
docker inspectи утекают в логи. Токены должны жить в файлах с правами 0600. - Вечные
latest. Образ без пина версии — это сюрпризы при каждом пересоздании и невозможность откатиться.
Чек-лист защиты Docker VPS
1. Обновления и образы
apt update && apt upgrade -y раз в неделю (или unattended-upgrades для безопасности). Образы — только с пином версии (postgres:17-alpine, а не postgres:latest) и из проверенных реестров. Сканируйте образы: docker run --rm aquasec/trivy image ваш-образ.
2. Контейнеры без root
В Dockerfile: USER nonroot, файловая система --read-only, минимальные capabilities. В docker-compose: cap_drop: [ALL], security_opt: [no-new-privileges:true].
3. Docker API — только по TLS или через туннель
Никогда не публикуйте порты 2375/2376 в интернет. Удалённое управление — через SSH-туннель (ssh -L 2375:/var/run/docker.sock), VPN или TLS-сертификаты с клиентской авторизацией.
4. docker.sock — не маунтить без нужды
Панели вроде Portainer получают root через сокет — это осознанный компромисс. Любой другой контейнер (бот, веб-приложение) не должен видеть сокет вообще.
5. Секреты — в файлы, не в env
Токены и ключи — в файлы с chmod 600, монтируемые в контейнер, или в Docker secrets. Если хостинг шифрует переменные окружения — используйте это. И никогда не коммитьте секреты в git: проверьте историю git log -p | grep -i token.
6. Сети и файрвол
Своя сеть docker network create app вместо --network host. Файрвол по умолчанию закрывает всё: ufw default deny, открыть только 22/80/443. Проверка: ss -tlnp | grep -E '2375|2376' — пусто, если всё правильно.
7. Лимиты ресурсов
Каждому контейнеру — --memory 512m --cpus 1 --pids-limit 256. Контейнер, съевший всю память хоста, роняет соседей. На хостингах контейнеров лимиты задаются тарифом — это нормальная практика, а не ограничение.
8. Логи — с лимитом
--log-opt max-size=10m --log-opt max-file=3 — и логи не съедят диск (знакомая беда: сервер падает из-за переполненного диска json-логами). Мониторинг: docker stats, cAdvisor/Prometheus или панель хостинга с алертами.
9. Бэкапы томов — не на той же ноде
Тома переживают пересоздание контейнера, но не смерть сервера. Выгрузка архивов на отдельное хранилище (S3, другой сервер) раз в сутки — минимум для продакшена.
10. Аудит одной командой
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 \
aquasec/docker-bench-security
Выдаст список слабых мест с рекомендациями. Пять самых частых закрываются за час.
Быстрая проверка за 10 минут
ss -tlnp | grep -E '2375|2376'— порты Docker API наружу (должно быть пусто);docker ps --format '{{.Names}} {{.Image}}'— посмотрите, кто на root и на latest;docker run --rm ... aquasec/docker-bench-security— полный аудит;grep -ri 'token\|secret' .env docker-compose.yml— секреты в открытом виде.
Правило: если вы используете Docker-хостинг с панелью (Portainer и управление контейнерами из коробки) — проверьте, что панель закрыта паролем и включена двухфакторка, а Docker API наружу не торчит. Остальной чек-лист работает одинаково и для своего VPS, и для хостинга.
FAQ: защита Docker-сервера
Открытый порт 2375 — это опасно?
Да. Docker API без TLS на порту 2375 — это root-доступ к серверу без пароля: любой может запустить контейнер с маунтом всего диска. Порт должен быть закрыт извне.
Можно ли маунтить docker.sock в контейнер?
Только если контейнеру доверяете на 100%: доступ к /var/run/docker.sock равен root-доступу на хосте. Для панелей вроде Portainer это осознанный риск, для обычного бота — нет.
Что делать, если секреты уже лежат в переменных окружения?
Вынести их в файлы с правами 0600 или в Docker secrets, убрать из кода и репозитория, затем пересоздать контейнер. Переменные окружения видны через docker inspect и в логах.
Нужен ли Docker rootless?
Для мульти-аренды (несколько недоверенных пользователей на одном сервере) — да, это обязательный минимум. Для одного сервера с вашими контейнерами достаточно non-root пользователей внутри контейнеров.
Как быстро проверить защищённость Docker-сервера?
Запустите docker-bench-security (одна команда) и проверьте открытые порты: ss -tlnp | grep -E '2375|2376'. Пять предупреждений из чек-листа выше закрываются за час.
По теме: подборка Docker VPS — serverscan.ru/collections/docker-vps.html, каталог ServerScan — serverscan.ru. Готовый Docker-хостинг с Portainer и лимитами тарифов — dockerhosting.ru.
_Статья обновлена 30 августа 2026 по материалам каталога ServerScan._