Защита TCP‑сокета Docker с помощью TLS
Быстрые ссылки
- Exposing the TCP Socket
- Creating Your Certificate Authority
- Generating a Server Key and Certificate Signing Request
- Setting Up Certificate Extensions
- Generating a Signed Certificate
- Generating a Client Certificate
- Preparing to Configure Docker
- Configuring the Docker Daemon
- Configuring the Docker Client
- Заключение

Docker API по умолчанию не защищён при доступе по TCP: единственная защита — права на доступ к Unix‑сокету в файловой системе. Если вы будете экспонировать Docker API по TCP, обязательно настройте TLS — это позволит Docker Engine и клиентам проверять подлинность друг друга. Иначе любой, кто имеет доступ к открытому порту, сможет просматривать контейнеры, запускать новые и выполнять команды с правами
rootв вашей системе.
Настроенный TLS требует от клиента предоставления корректного сертификата, подписанного вашим CA. В этом руководстве вы найдёте последовательность действий: от создания CA до настройки демона и клиента Docker. Также приведены рекомендации по безопасной эксплуатации, продлению сертификатов и устранению неисправностей.
Зачем это важно
- TLS добавляет шифрование и взаимную аутентификацию между клиентом и сервером.
- Без TLS любой атакующий может получить управление Docker и, следовательно, системой.
- TLS не заменяет разграничение прав; он защищает канал и удостоверяет участников.
Условные обозначения и термины
- CA — Certificate Authority, центр сертификации, который подписывает сертификаты.
- CSR — Certificate Signing Request, запрос на подпись сертификата.
- FQDN — полностью квалифицированное доменное имя сервера.
Exposing the TCP Socket
Чтобы открыть TCP‑эндпоинт Docker, при запуске демона укажите дополнительный хост через флаг -H. Флаг можно указать несколько раз; в примере ниже будут доступны и Unix‑сокет, и TCP‑порт:
/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375Порт 2375 обычно используется для незашифрованных подключений. После настройки TLS используйте порт 2376.
Чтобы флаги применялись автоматически, измените конфигурацию systemd. Создайте или отредактируйте файл /etc/systemd/system/docker.service.d/override.conf и замените строку ExecStart так, чтобы dockerd запускался с нужными флагами.
После изменения перезагрузите конфигурацию systemd:
sudo systemctl daemon-reload
sudo systemctl restart dockerВажно: открывая порт на 0.0.0.0, вы делаете службу доступной со всех интерфейсов. По возможности ограничьте адрес (например, 192.168.1.10) или используйте firewall.
Creating Your Certificate Authority
Сначала создайте собственный CA, который будет подписывать все серверные и клиентские сертификаты. Выполняйте команды на машине, где вы планируете хранить CA (обычно это сервер или отдельная защищённая машина).
Сгенерируйте приватный ключ CA и публичный сертификат CA с помощью OpenSSL:
# Сгенерировать приватный ключ CA (шифруется паролем)
openssl genrsa -aes256 -out ca-private.pem 4096
# Создать публичный сертификат CA (самоподписанный)
openssl req -new -x509 -days 365 -key ca-private.pem -sha256 -out ca-public.pemВы будете запрошены ввести passphrase (пароль для приватного ключа), затем данные субъекта (страна, регион, организация, email и т.д.). Для автоматизации можно использовать параметры -subj, но храните приватный ключ и пароль надёжно.

Совет: храните ca-private.pem в офлайн‑хранилище или на машине с очень ограниченным доступом. Если CA будет скомпрометирован, вам придётся перевыпустить все сертификаты.
Generating a Server Key and Certificate Signing Request
Создайте приватный ключ сервера и CSR (запрос на подпись). Проверьте, что значение Common Name (CN) соответствует FQDN сервера, под которым клиенты будут к нему обращаться.
# Сгенерировать приватный ключ сервера
openssl genrsa -out server-key.pem 4096
# Создать запрос на подпись (CSR) — CN должен быть FQDN сервера
openssl req -subj "/CN=example.com" -sha256 -new -key server-key.pem -out server-request.csrЕсли вы будете подключаться по IP‑адресу или по нескольким именам, укажите это позже через subjectAltName в файле расширений.

Setting Up Certificate Extensions
Для поддержки дополнительно доменов или IP‑адресов в сертификате используйте расширения X.509 — в частности, subjectAltName и extendedKeyUsage. Создайте файл, который будет содержать нужные поля.
Пример содержания файла extfile.cnf:
subjectAltName = DNS:example.com,DNS:sub.example.com,IP:192.168.0.1
extendedKeyUsage = serverAuthВы можете динамически формировать этот файл при автоматизированной выдаче сертификатов.
Примечание: современные браузеры и клиенты игнорируют CN, опираясь на subjectAltName. Поэтому обязательно указывайте все нужные имена/адреса в subjectAltName.
Generating a Signed Certificate
Подпишите CSR вашим CA, добавив файл расширений:
openssl x509 -req -days 365 -sha256 \
-in server-request.csr \
-CA ca-public.pem \
-CAkey ca-private.pem \
-CAcreateserial \
-extfile extfile.cnf \
-out server-certificate.pemКоманда создаёт сертификат server-certificate.pem, подписанный вашим CA, который будет действителен 365 дней. При этом вам будет нужно ввести пароль от ca-private.pem.

Планируйте процесс продления заранее: настройте напоминание за 30–60 дней до истечения срока действия.
Generating a Client Certificate
Для клиентов (например, вашей рабочей станции или CI‑сервера) создайте отдельные ключ и сертификат, подписанные тем же CA. Используйте расширения extendedKeyUsage = clientAuth.
# Сгенерировать приватный ключ клиента
openssl genrsa -out client-key.pem 4096
# Создать CSR для клиента
openssl req -subj "/CN=client" -new -key client-key.pem -out client-request.csr
# Файл расширений для клиентского сертификата
echo "extendedKeyUsage = clientAuth" > extfile-client.cnf
# Подписать клиентский сертификат
openssl x509 -req -days 365 -sha256 \
-in client-request.csr \
-CA ca-public.pem \
-CAkey ca-private.pem \
-CAcreateserial \
-extfile extfile-client.cnf \
-out client-certificate.pemХраните клиентские приватные ключи (client-key.pem) безопасно. При необходимости можно дополнительно защитить их паролем.
Preparing to Configure Docker
Скопируйте сгенерированные файлы в отдельные каталоги:
- На сервере Docker:
ca-public.pem,server-certificate.pem,server-key.pem. - На каждом клиенте:
ca-public.pem,client-certificate.pem,client-key.pem.
Удалите CSR и временные файлы, если они больше не нужны. Никогда не публикуйте приватные ключи.
Краткие рекомендации по правам доступа:
chmod 600 server-key.pem
chmod 644 server-certificate.pem ca-public.pemConfiguring the Docker Daemon
Запустите демона Docker с указанием TLS‑флагов. Параметры --tlscacert, --tlscert и --tlskey указывают на соответствующие файлы:
/usr/bin/dockerd \
-H unix:///var/run/docker.sock \
-H tcp://0.0.0.0:2376 \
--tlsverify \
--tlscacert=/path/to/ca-public.pem \
--tlscert=/path/to/server-certificate.pem \
--tlskey=/path/to/server-key.pemФлаг --tlsverify включает проверку TLS и требует от клиента наличия корректного сертификата. Если флаг не задан, TLS может использоваться без проверки клиента (односторонняя аутентификация).
После изменения конфигурации перезапустите сервис Docker через systemd (см. выше).
Альтернатива: конфигурация через daemon.json
Вместо длинной строки ExecStart можно указать опции в /etc/docker/daemon.json. Однако некоторые TLS‑опции не поддерживаются напрямую в daemon.json — в таком случае удобнее управлять через systemd‑юнит.
Configuring the Docker Client
При подключении к защищённому демону укажите адрес хоста и TLS‑файлы:
docker \
-H tcp://server.example.com:2376 \
--tlsverify \
--tlscacert=/home/user/.docker/ca-public.pem \
--tlscert=/home/user/.docker/client-certificate.pem \
--tlskey=/home/user/.docker/client-key.pem \
psЧтобы не указывать флаги каждый раз, настройте переменные окружения в вашем shell‑профиле и поместите сертификаты в ~/.docker:
export DOCKER_HOST=tcp://server.example.com:2376
export DOCKER_TLS_VERIFY=1Файлы в ~/.docker должны называться ca.pem, cert.pem, key.pem либо соответствовать опциям --tlscacert, --tlscert, --tlskey.
Docker также поддерживает контексты (contexts), которые позволяют переключаться между разными хостами и профилями.
Варианты проверки TLS
- Только
--tls— сервер аутентифицируется стандартным пулом CA (системный trust store). --tlscacert+--tlsverifyбез клиентского ключа — сервер проверяется по указанному CA, а клиенты не проходят взаимную проверку.- С
--tlsverifyи клиентским сертификатом — полнофункциональная взаимная (mutual) TLS‑аутентификация.
Рекомендации по безопасности и жёсткая настройка
- Ограничьте интерфейсы, на которых слушает Docker (не 0.0.0.0 без необходимости).
- Используйте firewall (iptables, nftables) для фильтрации IP‑адресов, которым разрешён доступ.
- Храните CA‑ключ офлайн или в HSM/смарт‑карте.
- Регулярно проверяйте журналы доступа к Docker и системные логи.
- Ограничьте системные права пользователей, которые могут перезапускать Docker service.
- Подумайте о применении SELinux/AppArmor для дополнительной изоляции.
Продление сертификатов и ротация
- Ведите реестр выданных сертификатов и сроков их действия.
- Автоматизируйте процесс: скрипт, cron или CI/CD пайплайн, который генерирует новые ключи/CSR и пересылает подписанные сертификаты на сервер и клиенты.
- При ротации серверного сертификата перезапустите Docker daemon; при ротации client‑сертификата — обновите файл на клиенте.
Итоговый чек‑лист перед открытием порта в продакшн
- CA создан и приватный ключ хранится в безопасном месте
- Сертификаты выданы и проверены на соответствие CN/subjectAltName
- На сервере установлены ca-public.pem, server-certificate.pem, server-key.pem с корректными правами
- Демон Docker запущен с –tlsverify и правильными путями к сертификатам
- Клиентам выданы client-certificate.pem и client-key.pem, и они проверены
- Ограничен доступ к порту через firewall и/или привязан IP
- Настроена ротация/уведомления о сроке действия сертификатов
Чек‑лист ролей
DevOps / Сисадмин:
- Создать CA и держать приватный ключ офлайн
- Подписать серверные сертификаты
- Настроить systemd и firewall
Разработчик/инженер приложений:
- Получить клиентский сертификат
- Настроить локальный docker client/CI для использования TLS
Команда безопасности:
- Аудит прав доступа к ключам
- Мониторинг логов и проверка соответствия политик
Отладка и частые ошибки
Ошибка: “x509: certificate signed by unknown authority”
- Убедитесь, что клиент использует тот же ca-public.pem, которым подписан сервер.
- Проверьте, что путь, переданный в
--tlscacert, корректен.
Проблема: имя в сертификате не соответствует хосту
- Убедитесь, что CN или subjectAltName содержит FQDN или IP, используемые клиентом.
Проблема: неправильные права на ключи
- Docker может отказать в загрузке ключа, если права открыты (chmod 600 для приватных ключей).
Нет соединения после включения TLS
- Проверьте, что клиент и сервер используют одинаковые флаги (
--tlsverifyvs--tls). - Уточните правила firewall и прослушивание порта через
ss -ltnpилиnetstat -ltnp.
- Проверьте, что клиент и сервер используют одинаковые флаги (
Когда TLS не решит проблему
- TLS обеспечивает шифрование и взаимную аутентификацию, но не референтную модель доступа. Для тонкой фильтрации операций используйте авторизационный плагин Docker или reverse proxy с ACL.
- Если злоумышленник уже имеет root‑доступ на хосте, TLS не защитит ваши контейнеры.
Пример Playbook / SOP для обновления серверного сертификата
- На защищённой машине с CA создайте новый CSR и подпишите его:
openssl genrsa -out new-server-key.pem 4096
openssl req -subj "/CN=example.com" -new -key new-server-key.pem -out new-server-request.csr
openssl x509 -req -days 365 -sha256 -in new-server-request.csr -CA ca-public.pem -CAkey ca-private.pem -CAcreateserial -extfile extfile.cnf -out new-server-certificate.pem- Передайте
new-server-certificate.pemиnew-server-key.pemна сервер Docker (по защищённому каналу). - На сервере выполните резервное копирование старых файлов, замените их новыми и рестартаньте Docker:
sudo cp server-certificate.pem server-certificate.pem.bak
sudo cp server-key.pem server-key.pem.bak
sudo mv new-server-certificate.pem /etc/docker/server-certificate.pem
sudo mv new-server-key.pem /etc/docker/server-key.pem
sudo systemctl restart docker- Проверить подключение клиента и сервисы.
Пример конфигурации curl
Если нужно обратиться к Docker API напрямую (HTTP over TLS), curl поддерживает те же файлы:
curl --cacert ca-public.pem --cert client-certificate.pem --key client-key.pem https://server.example.com:2376/containers/jsonСовместимость, особенности и миграция
- Разные версии Docker могут не поддерживать одинаковые опции в daemon.json; systemd‑юнит остаётся универсальным решением.
- При миграции на Kubernetes или другой оркестратор планируйте интеграцию управления сертификатами централизованно.
Заключение
Защита Docker API с помощью TLS — обязательный шаг при экспонировании TCP‑порта. TLS обеспечивает шифрование и проверку подлинности, но не заменяет авторизацию и контроль доступа. Комбинируйте TLS с firewall, авторизационными плагинами или обратным прокси для многоуровневой защиты.
Дополнительные действия: автоматизируйте выдачу и продление сертификатов, храните CA‑ключ в защищённом месте, ограничьте интерфейсы прослушивания и мониторьте события доступа.
Ключевые ссылки и примеры команд приведены в теле статьи. Следуйте чек‑листам перед открытием порта в продакшн. Безопасное развёртывание Docker — это сочетание криптографии, минимизации поверхности атаки и надёжной операционной практики.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента