jueves, 13 de septiembre de 2018

Configurando el acceso a la API de Docker

El demonio dockerd que se ejecuta en nuestros hosts implementa una API RESTful a la que podemos acceder mediante un cliente HTTP. De esta manera podemos integrar los servicios proporcionados por Docker con otros servicios de nuestra infraestructura.

La configuración por defecto de Docker utiliza un socket Unix, con lo que no hay acceso desde la red a la API del motor de Docker. Como para determinados casos es necesario poder comunicarnos con el servicio Docker desde la red, vamos a ver como configurarlo para que sea accesible mediante conexiones TCP de forma segura. 

En principio, todo lo que tenemos que hacer es configurar el servicio Docker para que escuche en el puerto y direcciones IP del host que queramos y especificar las opciones de configuración tlsverify y tlscacert. De este modo, cuando el demonio dockerd actúa en modo servidor, solo aceptará conexiones de clientes autenticados con un certificado firmado por la CA en la que se confía y, en modo cliente, solo se conectará a servidores con un certificado firmado por la misma CA.

Por tanto, como es necesario disponer de una CA, crearemos una entidad certificadora de pruebas generando un certificado autofirmado usando openssl. Una vez creada nuestra CA, crearemos y firmaremos el resto de certificados que necesitemos. Como es lógico en sistemas en producción, deberíamos tener implementada una CA para todas estas tareas.

Con nuestros certificados ya listos, solo tenemos que configurar el servicio Docker de nuestra máquina usando el comando systemctl del siguiente modo:

Modificación del servicio docker. Añadimos socket de escucha y opciones TLS.
De este modo el servicio docker escuchará en el puerto TCP y dirección IP especificadas verificando las conexiones TLS de cualquier cliente y, adicionalmente creará el socket local que nos permitirá seguir usando los comandos localmente en el host. 

Si intentamos conectar ahora a nuestro host docker por el puerto especificado usando https, recibiremos un mensaje de error que nos indica que ha intentado validar nuestro certificado. Esto viene dado por la opción tlsverify y al no tener un certificado firmado por la CA configurada mediante la opción tlscacert, genera la denegación de nuestro acceso. Creando un certificado para nuestra máquina cliente con nuestra CA de pruebas podremos acceder sin problemas:

Acceso al servicio Docker remoto mediante HTTPS y verificación de certificado cliente.
Con esta configuración ya establecida, veremos más adelante como usarla para crear arquitecturas y servicios más complejos.