Как защитить 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._