Get it on Google Play

Configurando Docker para acceso remoto con certificados TLS

19-06-2016
 
TLS

TLS

Podemos habilitar el acceso remoto a Docker de cualquier host simplemente añadiendo el parámetro ‘-H tcp://0.0.0.0:2376’ cuando arrancamos el demonio de docker. Por ejemplo:

docker daemon -H tcp://0.0.0.0:2376  -H unix:///var/run/docker.sock

El problema aquí es que abre una API Rest accesible desde cualquier sitio y por cualquiera. Si queremos montar un cluster de servidores Docker seguro deberemos hacer lo siguiente:

Generando los certificados de seguridad

Primero deberemos crear una autoridad certificadora para después generar los certificados de clientes y servidores. En mi caso, generaré un certificado para el servidor ‘midocker.com’. Aquí dejo todo el script para generar los certificados(Irá pidiendo passwords y configuraciones):

# Creamos las distintas carpetas
mkdir certsdb
mkdir certreqs
mkdir crl
mkdir private

echo "01" > ca.srl

# Generamos claves para nuestra RSA
openssl genrsa -des3 -out "private/ca-private-key.pem" 2048
openssl req -new -x509 -days 365 -key "private/ca-private-key.pem" -out "private/ca-public-key.pem"

# Generamos claves para nuestro servidor Docker(midocker.com)
openssl genrsa -des3 -out "private/server-private-key.pem" 2048

# Solicitud de firma y firma del certificado del servidor
openssl req -subj '/CN=midocker.com' -new -key "private/server-private-key.pem" -out "certreqs/server.csr"
openssl x509 -req -days 365 -in "certreqs/server.csr" -CA "private/ca-public-key.pem" -CAkey "private/ca-private-key.pem" -CAserial "ca.srl" -out "certsdb/server-cert.pem"

# Generamos las claves del cliente
openssl genrsa -des3 -out "private/client-private-key.pem" 2048

# Solicitud de firma y firma del certificado del cliente
openssl req -subj '/CN=client' -new -key "private/client-private-key.pem" -out "certreqs/client.csr"

echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 365 -in "certreqs/client.csr" -CA "private/ca-public-key.pem" -CAkey "private/ca-private-key.pem" -CAserial "ca.srl" -out "certsdb/client-cert.pem" -extfile extfile.cnf

# Eliminamos clave de paso en el cliente y el servidor
openssl rsa -in "private/server-private-key.pem" -out "private/server-private-key.pem"
openssl rsa -in "private/client-private-key.pem" -out "private/client-private-key.pem"

Configuración del servidor Docker

Ahora que ya tenemos todos los certificados, vamos a arrancar nuestro servidor Docker para que haga uso de los certificados(Atención!! Acordaros de parar el servicio Docker si lo tenéis ya encendido):

sudo docker daemon --tlsverify –tlscacert="<path-to>/ca-public-key.pem" --tlscert="<path-to>/server-cert.pem" --tlskey="<path-to>/server-private-key.pem" -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock

De esta manera, la API Rest de Docker aceptará cualquier certificado que esté firmado por la autoridad certificadora.

Accediendo al Docker remoto

Si queréis acceder al docker remoto tendréis que ponerle a Docker los siguientes parámetros para indicarle el host, certificado, etc. (El siguiente ejemplo debería devolver los contenedores que se están ejecutando en el terminal):

docker --tlsverify –tlscacert="<path-to>/ca-public-key.pem" –tlscert="<path-to>/client-cert.pem" –tlskey="<path-to>/client-private-key.pem" -H=midocker.com:2376 ps

Bonus track 1: Configurando el servicio en Ubuntu

Si queremos que al iniciar el servidor arranque ya con esta configuración deberéis añadirle los parámetros en el fichero ‘/etc/init/docker.conf’:

# ...
script
	# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
	DOCKER=/usr/bin/$UPSTART_JOB
	DOCKER_OPTS=
	if [ -f /etc/default/$UPSTART_JOB ]; then
		. /etc/default/$UPSTART_JOB
	fi

	DOCKER_OPTS='--tlsverify –tlscacert="<path-to>/ca-public-key.pem" --tlscert="<path-to>/server-cert.pem" --tlskey="<path-to>/server-private-key.pem" -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock'

	exec "$DOCKER" -d $DOCKER_OPTS
end script

# ...

Una vez hecho esto podéis reiniciar el servicio(A mi me gusta siempre para y arrancar…):


# Paramos
sudo service docker stop

# Arrancamos
sudo service docker start

Bonus track 2: Usando docker-machine

Si queréis usar docker-machine para la gestión de máquinas podéis crear la máquina con el siguiente comando:

docker-machine create -d none --url=tcp://midocker.com:2376 midocker.com

Una vez hecho esto deberéis editar la configuración del fichero ‘/.docker/machine/machines/midocker.com/config.json’.

Interesado en formación Docker?

 

Leave a Reply

© Albert Coronado Calzada