Knowledge Base

Docker Daemon API открыт публично (порт 2375 / 2376)

Docker Daemon API открыт публично

Категория: Server Hardening · Риск: critical

Docker Daemon API открыт публично

Это хуже root-доступа к серверу

Docker Daemon без TLS (порт 2375) даёт **полный контроль над хостом**:

# Атакующий видит все контейнеры
curl http://<IP>:2375/v1.41/containers/json

# Запускает контейнер с монтированием хостовой файловой системы
curl -X POST http://<IP>:2375/v1.41/containers/create \
  -H "Content-Type: application/json" \
  -d '{
    "Image": "alpine",
    "Cmd": ["sh", "-c", "cat /host/etc/shadow"],
    "Binds": ["/:/host"]
  }'
# Результат: читает /etc/shadow хоста → пароли всех пользователей
# Или: записывает backdoor в /host/etc/cron.d/

Это полный RCE (Remote Code Execution) и container escape в одном шаге.

Как проверить

curl -s http://<IP>:2375/v1.41/info | jq .ServerVersion
# Если вернул данные — критическая уязвимость

Немедленное исправление

Полностью отключить TCP-сокет Docker

# Проверить текущую конфигурацию
cat /etc/docker/daemon.json
# или
systemctl cat docker | grep ExecStart
// /etc/docker/daemon.json — убрать tcp-listener
{
    "hosts": ["unix:///var/run/docker.sock"]
    // НЕТ "tcp://0.0.0.0:2375"
}
# /etc/systemd/system/docker.service.d/override.conf
# Убрать -H tcp://0.0.0.0:2375 из ExecStart
systemctl daemon-reload && systemctl restart docker

Закрыть файрволом

ufw deny 2375
ufw deny 2376

Если нужен удалённый доступ — только через TLS (порт 2376)

# Генерация TLS-сертификатов для Docker daemon
# Официальная документация: https://docs.docker.com/engine/security/protect-access/

# daemon.json с TLS
{
  "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"],
  "tls": true,
  "tlscert": "/etc/docker/server-cert.pem",
  "tlskey": "/etc/docker/server-key.pem",
  "tlscacert": "/etc/docker/ca.pem",
  "tlsverify": true
}

Альтернатива — SSH туннель

# Безопасный удалённый доступ через SSH (не открывает порт)
export DOCKER_HOST="ssh://user@remote-host"
docker ps  # подключается через SSH, не через открытый порт

Docker socket (/var/run/docker.sock)

Unix socket `/var/run/docker.sock` **не менее опасен**, если смонтирован в контейнер:

# ОПАСНО:
volumes:
  - /var/run/docker.sock:/var/run/docker.sock

# Если нужно — ограничьте правами (только чтение, docker proxy)

Связанные проверки