7.9 KiB
Настройка Docker с mTLS (mutual TLS)
mTLS (mutual Transport Layer Security) обеспечивает двустороннюю аутентификацию: клиент и сервер проверяют друг друга с помощью сертификатов. Это повышает безопасность при удалённом управлении Docker.
Требования
- ОС: Linux (например, CentOS/RHEL/Fedora)
- Права:
rootилиsudo - Установленный
docker,openssl,dnf(илиyum)
Шаг 1: Подготовка директории для TLS-сертификатов
sudo mkdir -p /etc/docker/tls
cd /etc/docker/tls
Шаг 2: Установка OpenSSL (если не установлен)
sudo dnf install -y openssl
Шаг 3: Генерация CA (Certificate Authority)
CA будет подписывать все остальные сертификаты.
# Генерация закрытого ключа CA (с паролем)
sudo openssl genrsa -aes256 -out ca-key.pem 4096
При выполнении команды будет запрошен пароль. Запомните его или сохраните в секрете.
# Генерация корневого сертификата CA (действует 1 год)
sudo openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
При выполнении
req -newбудет предложено ввести данные (страна, организация и т.д.). Можно заполнить или оставить пустыми, критичное поле — Common Name (CN). Например:Docker CA.
Шаг 4: Генерация серверного сертификата (для Docker daemon)
# Генерация закрытого ключа сервера
sudo openssl genrsa -out server-key.pem 4096
# Создание CSR (Certificate Signing Request)
sudo openssl req -subj "/CN=dev01.tnt.local" -sha256 -new -key server-key.pem -out server.csr
Убедитесь, что
CNсовпадает с DNS-именем или IP-адресом, по которому будут обращаться клиенты.
Настройка расширений для серверного сертификата
echo "subjectAltName = DNS:dev01.tnt.local,IP:10.2.24.21,IP:127.0.0.1" | sudo tee extfile.cnf
echo "extendedKeyUsage = serverAuth" | sudo tee -a extfile.cnf
Добавьте все IP и домены, по которым будет доступен Docker.
Подписываем серверный сертификат с помощью CA
sudo openssl x509 -req -days 365 -sha256 -in server.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out server-cert.pem -extfile extfile.cnf
Шаг 5: Генерация клиентского сертификата
Клиент (например, docker CLI с другого хоста) будет использовать эти файлы для аутентификации.
# Генерация ключа клиента
sudo openssl genrsa -out key.pem 4096
# Создание CSR для клиента
sudo openssl req -subj '/CN=client' -new -key key.pem -out client.csr
Поле
CN=clientможет быть любым, но лучше указать имя клиента.
Расширение для клиентского сертификата
echo "extendedKeyUsage = clientAuth" | sudo tee extfile-client.cnf
Подписываем клиентский сертификат
sudo openssl x509 -req -days 365 -sha256 -in client.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out cert.pem -extfile extfile-client.cnf
Шаг 6: Очистка временных файлов
sudo rm -v client.csr server.csr extfile.cnf extfile-client.cnf
Шаг 7: Установка прав доступа
# Закрытые ключи — только для чтения владельцем
sudo chmod 0400 ca-key.pem key.pem server-key.pem
# Сертификаты — чтение для всех
sudo chmod 0444 ca.pem server-cert.pem cert.pem
Шаг 8: Настройка Docker демона
Отредактируем службу Docker:
sudo systemctl stop docker docker.socket
Останавливаем, чтобы изменения вступили в силу.
Откройте файл службы:
sudo mcedit /lib/systemd/system/docker.service
Найдите строку ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock и замените её на:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --tlsverify --tlscacert=/etc/docker/tls/ca.pem --tlscert=/etc/docker/tls/server-cert.pem --tlskey=/etc/docker/tls/server-key.pem -H=0.0.0.0:2376
Важно:
--tlsverifyвключает TLS с проверкой клиента.--tlscacert,--tlscert,--tlskey— пути к сертификатам.-H=fd://— для работы сsystemd-H=tcp://0.0.0.0:2376— TCP-порт с TLS (стандартный порт для безопасного Docker)
Шаг 9: Перезагрузка конфигурации и запуск Docker
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl status docker
Убедитесь, что статус
active (running)и нет ошибок.
Шаг 10: Проверка сертификатов (опционально)
sudo cat /etc/docker/tls/ca.pem
sudo cat /etc/docker/tls/cert.pem
sudo cat /etc/docker/tls/key.pem
Эти файлы нужно скопировать на клиентскую машину для подключения.
Шаг 11: Клиентская настройка (на другой машине)
Скопируйте на клиент:
ca.pem→~/.docker/ca.pemcert.pem→~/.docker/cert.pemkey.pem→~/.docker/key.pem
Установите права:
chmod 0400 ~/.docker/key.pem
chmod 0444 ~/.docker/cert.pem ~/.docker/ca.pem
Подключение:
docker -H tcp://dev01.tnt.local:2376 --tlsverify ps
Или установите переменные окружения:
export DOCKER_HOST=tcp://dev01.tnt.local:2376
export DOCKER_TLS_VERIFY=1
Теперь можно использовать docker ps и другие команды.
Безопасность: Рекомендации
- Не используйте
--tlsverifyбез клиентских сертификатов — иначе любой, у кого есть сертификат от CA, может подключиться. - Храните
ca-key.pemв секрете — он может подписывать новые сертификаты. - Используйте брандмауэр — открывайте порт
2376только для доверенных IP. - Обновляйте сертификаты раз в год.
Проверка подключения
На клиенте:
docker context create redos8-srv01 --description "redos8-srv01" --docker "host=tcp://dev01.tnt.local:2376,ca=ca.pem,cert=cert.pem,key=key.pem"
DOCKER_CONTEXT=redos8-srv01 docker info
Если видите информацию о хосте — mTLS настроен успешно.
Откат
Чтобы вернуть стандартную конфигурацию:
- Удалите параметры
--tls*и-H=tcp://...изExecStart. - Оставьте:
ExecStart=/usr/bin/dockerd -H fd:// ... - Выполните:
systemctl daemon-reload && systemctl restart docker