Docker: Configurar o acesso remoto na porta 2376

Neste tutorial, vamos ver como configurar o acesso remoto ao daemonDockerutilizando a porta 2376, o que lhe permitirá gerir os seus contentores remotamente ou supervisioná-los.

Existem duas portas que permitem o acesso remoto:

  • a porta 2375, que não é segura, quer ao nível do tráfego, quer do acesso
  • 2376, que é seguro graças à utilização de TLS e que recorre a um conjunto de certificados para proteger o acesso

Em ambos os casos, não há autenticação através de uma conta e palavra-passe; apenas a utilização da porta 2376 permite proteger o acesso através de um conjunto de certificados.

Como há bastantes operações a realizar, escrevi dois scripts que permitirão executar as ações facilmente.

O primeiro passo será gerar os certificados para a ligação TLS entre o servidorDockere o cliente que pretende ligar.

Numa pasta, crie um ficheiroopenssl.cnfcom o seguinte conteúdo:

[ 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)

DockerAltere as linhas 15 e 16 para que correspondam ao seu servidor.

generate-certificate.shAgora, na mesma pasta onde criou o ficheiroopenssl.cnf, crie o ficheiro.

#!/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

Execute o script: sudo bash generate-certificate.sh

DockerOs certificados já estão gerados; vamos agora passar à configuração do daemon.

/etc/docker/Para tal, terá de editar ou criar o ficheirodaemon.jsonque deve estar na pasta.

sudo nano /etc/docker/daemon.json

No ficheiro, adicione o seguinte conteúdo:

{
    "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
  }

Aqui, configuramosDocker o para escutar na porta 2376 e indicamos-lhe a localização dos certificados.

DockerPor fim, temos de alterar os parâmetros de arranque do serviço; para tal, vamos utilizar umoverride.conf para modificar a configuração. Também aqui, para simplificar a configuração, eis o 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."

DockerExecute o script que irá criar o ficheirooverride.conf para o serviçoDocker e recarregue o daemon e reinicie o sistema.

sudo bash docker-tls-override.sh

A configuraçãoDockerestá concluída.

Dependendo dos clientes que vai utilizar, terá de obter os certificados dos clientes em /etc/docker/certs/client.

Pode encontrar os ficheiros aqui: https://forge.rdr-it.com/Scripts/Linux/src/branch/main/docker-tls-config

Romain Drouche
Romain Drouche
Arquiteto de Sistemas | MCSE: Infraestrutura Essencial
Especialista em infraestruturas de TI com mais de 15 anos de experiência na área. Atualmente, como Gestor de Projetos de Sistemas e Redes e especialista em Segurança de Sistemas de Informação (SSI), utilizo a minha expertise para garantir a fiabilidade e a segurança dos ambientes tecnológicos.

Deixe um comentário