miércoles, 5 de octubre de 2016

MongoDB y el Soporte de Conexiones Seguras mediante SSL

 


Continuando con la tónica expuesta en las entradas anteriores, ahora toca el turno de configurar conexiones cifradas mediante TLS/SSL en las instancias de mongod y mongos. Para esto seguiremos utilizando las bibliotecas de OpenSSL.

Para habilitar esta nueva característica en el clúster de base de datos, asumiremos que tenemos instalado una versión de MongoDB que incluya un soporte para conexiones SSL como la realizada en la entrada de Instalación Básica del Servidor MongoDB usando el Código Fuente, además el controlador del cliente también debe ser compatible con SSL.

MongoDB puede utilizar cualquiera de los dos tipos de certificado SSL válidos, el emitido por una autoridad de certificación (CA) o el autofirmado. Si utilizamos el segundo, aunque se cifre el canal de comunicaciones, no habrá ninguna validación de la identidad del servidor. Sin embargo, y a pesar de esto, nuestros esfuerzos se centrarán en impedir la escucha del canal de conexión, que nos dejaría vulnerable a un ataque del tipo man-in-the-middle. El uso de un certificado firmado por una CA de confianza permitirá que los drivers de la base de datos verifiquen la identidad del servidor.


Creación de un archivo con extensión .pem

Para su uso en producción, se recomienda que la implementación de un clúster de MongoDB deba utilizar certificados válidos generados y firmados por una autoridad de certificación pero, para propósitos de prueba, se puede generar un certificado autofirmado y una clave privada con los siguientes comandos bajo un entorno unix/linux:
# cd /etc/ssl/
# openssl  req  -newkey  rsa:2048  -new  -x509  -days  365  -nodes  -out  mongodb-cert.crt  -keyout  mongodb-cert.key

Generating a 2048 bit RSA private key
..................................................................................................................+++
..........................................+++
writing new private key to 'mongodb-cert.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:VE
State or Province Name (full name) [Some-State]:Miranda
Locality Name (eg, city) []:Caracas
Organization Name (eg, company) [Internet Widgits Pty Ltd]:BitacoraTL
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:mongoserver
Email Address []:admin@mongoserver.com.ve
Con las instrucciones anteriores generamos un certificado firmado automáticamente sin contraseña y con una validez de un (1) año. Ahora vamos a unir el certificado y la clave privada en un archivo con extensión .pem como se detalla a continuación:
# cat  mongodb-cert.key  mongodb-cert.crt  >  mongodb.pem


Configuración

Ahora es necesario indicarle al servidor que habilite la opción SSL. Para realizar esta configuración debemos bajar el servicio y configurar el argumento net.ssl.mode con uno de los siguientes valores:
  • disable: se utiliza para que el servidor no utilice el protocolo TLS/SSL.
  • allowSSL: permite que la comunicación entre servidores no utilice TLS/SSL. Para las conexiones entrantes (conexión entre servidor y clientes) se aceptan conexiones con el protocolo TLS/SSL y sin el protocolo.
  • preferSSL: las conexiones entre los servidores utiliza el protocolo TLS/SSL. Para las conexiones entrantes el servidor aceptará tanto conexiones TLS/SSL como no-TLS/no-SSL.
  • requireSSL: el servidor usa y acepta únicamente conexiones cifradas bajo TLS/SSL.

También debemos indicar la ruta y el nombre del archivo .pem que contiene el certificado y la clave usando el argumento net.ssl.PEMKeyfile como se indica a continuación:
PEMKeyFile:  /etc/ssl/mongodb.pem
La acción de configurar ambos argumentos la podemos realizar de dos formas distintas. La primera y más recomendable, es modificando el archivo de configuración /etc/mongod.conf. Para ello ubicaremos la etiqueta “net:” dentro del archivo y agregaremos las líneas necesarias hasta que luzca de la siguiente manera:
net:
    ssl:
      mode: preferSSL
      PEMKeyFile: /etc/ssl/mongodb.pem
La segunda forma es pasando los argumentos y sus respectivos valores al momento de levantar el servidor mediante la línea de comandos:
# mongod  --sslMode  preferSSL  --sslPEMKeyFile  /etc/ssl/mongodb.pem
Para verificar que todo haya salido correctamente, procedemos a levantar el servicio con la instrucción:
# systemctl  start  mongodb
Luego realizamos una conexión a la base de datos desde otra máquina, sin utilizar el protocolo TLS/SSL mediante el siguiente comando:
$ mongo  --host  mongoserver
MongoDB shell version: 3.0.12
connecting to: mongoserver:27017/test
>
Con la instrucción anterior acabamos de validar que podemos entrar sin usar TLS/SSL. Ahora veamos qué sucede si intentamos conectarnos especificando el uso del protocolo de cifrado tal como se muestra a continuación:
$ mongo  --host  mongoserver  --ssl
Failed global initialization: BadValue need to either provide sslCAFile or specify sslAllowInvalidCertificates
$
La ejecución anterior arroja un error que nos indica, que para establecer una conexión cifrada con el servidor, debemos colocar en la línea de comandos la ruta del archivo emitido por una autoridad de certificación o indicarle que permita la conexión a aquellos clientes que tengan un certificado inválido. Veamos el resultado de ambos escenarios:
$ mongo  --host  mongoserver  --ssl  --sslCAFile  ~/certificates/ca.pem
MongoDB shell version: 3.0.12
connecting to: mongoserver:27017/test
>

$ mongo  --host  mongoserver  --ssl  --sslAllowInvalidCertificates
MongoDB shell version: 3.0.12
connecting to: mongoserver:27017/test
>
Como se puede observar, las pruebas en los dos escenarios previos fueron exitosas, permitiendo establecer una conexión TSL/SSL con un servidor/clúster MongoDB.

No hay comentarios.:

Publicar un comentario