Docker: Configurar el acceso remoto en el puerto 2376

En este tutorial, veremos cómo configurar el acceso remoto al daemonDockerutilizando el puerto 2376, lo que te permitirá gestionar tus contenedores de forma remota o supervisarlos.

Hay dos puertos que permiten el acceso remoto:

  • el 2375, que no es seguro ni en cuanto al tráfico ni en cuanto al acceso,
  • el 2376, que está protegido mediante TLS y utiliza un conjunto de certificados para asegurar el acceso

En ambos casos, no hay autenticación mediante cuenta y contraseña; solo el uso del puerto 2376 permite proteger el acceso mediante un conjunto de certificados.

Como hay bastantes pasos que seguir, he escrito dos scripts que te permitirán realizar estas acciones fácilmente.

El primer paso consistirá en generar los certificados para la conexión TLS entre el servidorDockery el cliente al que quieras conectarte.

En una carpeta, crea un archivoopenssl.cnfcon el siguiente contenido:

[ req ]
distinguished_name  = req_distinguished_name
req_extensions = v3_req

[ req_distinguished_name ]
# Information to be displayed for the user
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = docker-server

[ v3_req ]
# Extensions to add to a certificate request
subjectAltName = @alt_names

[ alt_names ]
IP.1 = 192.168.X.X # Adresse IP de l'hôte
DNS.1 = docker-server.local  # Nom d'hôte (par exemple, l'hôte Docker)

DockerModifica las líneas 15 y 16 para que se ajusten a tu servidor.

generate-certificate.shAhora, en la misma carpeta en la que has creado el archivoopenssl.cnf, crea el archivo.

#!/bin/bash

# Définir le répertoire des certificats
CERT_DIR="/etc/docker/certs"
CA_DIR="$CERT_DIR/ca"
SERVER_DIR="$CERT_DIR/server"
CLIENT_DIR="$CERT_DIR/client"

# Créer les répertoires s'ils n'existent pas
mkdir -p $CA_DIR $SERVER_DIR $CLIENT_DIR

# Vérifier si les certificats existent déjà
if [ ! -f "$CA_DIR/ca.pem" ]; then
    echo "Génération des certificats TLS..."

    # Générer la clé privée de l'autorité de certification (CA)
    openssl genrsa -aes256 -out $CA_DIR/ca-key.pem -passout pass:password 4096

    # Générer le certificat de l'autorité de certification (CA)
    openssl req -new -x509 -days 365 -key $CA_DIR/ca-key.pem -sha256 -passin pass:password \
        -subj "/CN=Docker-CA" -out $CA_DIR/ca.pem

    # Générer la clé privée du serveur
    openssl genrsa -out $SERVER_DIR/server-key.pem 4096

    # Créer une demande de signature de certificat (CSR) pour le serveur en utilisant le fichier de config avec SAN
    openssl req -new -key $SERVER_DIR/server-key.pem -out $SERVER_DIR/server.csr -config openssl.cnf

    # Signer le certificat du serveur avec l'autorité de certification
    openssl x509 -req -days 365 -sha256 -in $SERVER_DIR/server.csr -CA $CA_DIR/ca.pem \
        -CAkey $CA_DIR/ca-key.pem -passin pass:password -CAcreateserial -out $SERVER_DIR/cert.pem -extensions v3_req -extfile openssl.cnf

    # Générer la clé privée du client
    openssl genrsa -out $CLIENT_DIR/client-key.pem 4096

    # Créer une demande de signature de certificat (CSR) pour le client
    openssl req -new -key $CLIENT_DIR/client-key.pem -out $CLIENT_DIR/client.csr \
        -subj "/CN=docker-client"

    # Signer le certificat du client avec l'autorité de certification
    openssl x509 -req -days 365 -sha256 -in $CLIENT_DIR/client.csr -CA $CA_DIR/ca.pem \
        -CAkey $CA_DIR/ca-key.pem -passin pass:password -CAcreateserial -out $CLIENT_DIR/cert.pem

    # Pour uptime kuma
    cp $CLIENT_DIR/client-key.pem $CLIENT_DIR/key.pem
    cp $CA_DIR/ca.pem $CLIENT_DIR/ca.pem

    echo "Certificats générés avec succès."
else
    echo "Les certificats existent déjà. Aucune génération nécessaire."
fi

Ejecuta el script: sudo bash generate-certificate.sh

DockerLos certificados ya están generados; vamos a pasar a la configuración del daemon.

Para ello, tendrás que editar o crear el archivodaemon.json que debe encontrarse en la carpeta /etc/docker/.

sudo nano /etc/docker/daemon.json

En el archivo, añade el siguiente contenido:

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

Aquí configuramosDocker para que escuche en el puerto 2376 y le indicamos la ubicación de los certificados.

DockerPara terminar, debemos modificar los parámetros de inicio del servicio; para ello, utilizaremos unoverride.conf con el fin de modificar la configuración. También en este caso, para simplificar la configuración, aquí tienes el script:

#!/bin/bash

# Variables
DOCKER_SERVICE_OVERRIDE_DIR="/etc/systemd/system/docker.service.d"
OVERRIDE_CONF_FILE="$DOCKER_SERVICE_OVERRIDE_DIR/override.conf"

# Création du répertoire d'override si nécessaire
if [ ! -d "$DOCKER_SERVICE_OVERRIDE_DIR" ]; then
  echo "Création du répertoire d'override systemd pour Docker..."
  sudo mkdir -p "$DOCKER_SERVICE_OVERRIDE_DIR"
fi

# Création du fichier override.conf
echo "Création du fichier d'override Docker pour exposer Docker sur le port 2376 avec TLS..."
sudo tee "$OVERRIDE_CONF_FILE" > /dev/null <<EOL
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
EOL

# Recharger la configuration systemd
echo "Rechargement de la configuration systemd..."
sudo systemctl daemon-reload

# Redémarrage du service Docker
echo "Redémarrage du service Docker..."
sudo systemctl restart docker

# Vérification du statut du service Docker
echo "Vérification du statut du service Docker..."
sudo systemctl status docker

# Fin
echo "La configuration de Docker pour utiliser TLS sur le port 2376 a été appliquée avec succès."

DockerEjecuta el script, que creará el archivooverride.conf para el servicioDocker y recargará el daemon y reiniciará el sistema.

sudo bash docker-tls-override.sh

La configuraciónDockerha finalizado.

Dependiendo de los clientes que vayas a utilizar, tendrás que obtener los certificados de cliente en /etc/docker/certs/client.

Puede encontrar los archivos aquí: https://forge.rdr-it.com/Scripts/Linux/src/branch/main/docker-tls-config

Romain Drouche
Romain Drouche
Arquitecto de sistemas | MCSE: Infraestructura básica
Experto en infraestructura de TI con más de 15 años de experiencia en el sector. Actualmente, como Gerente de Proyectos de Sistemas y Redes y experto en Seguridad de Sistemas de Información (ISS), utilizo mi experiencia para garantizar la fiabilidad y seguridad de los entornos tecnológicos.

Deja un comentario