La característica principal de MongoDB es que al instalar una instancia esta queda corriendo sin haber creado ningún tipo de medida de autenticación, es así para facilitar el inicio del desarrollo, pero llega un punto en que debemos asegurar nuestra infraestructura.
Otro punto importante que tiene relación con el tema de la seguridad y respaldo de nuestros datos, es cuando necesitamos hacer un respaldo de un momento determinado, pero no queremos que haya movimiento de datos, ya que así garantizamos la integridad de nuestra Base de Datos y colecciones de documentos. En este aspecto también existe una herramienta dentro de MongoDB que nos permite bloquear temporalmente la misma para garantizar así que lo que copiamos sea lo adecuado.
Seguridad y autenticación
Establecer parámetros de autenticación de usuarios no es algo que sea vital para la operación de MongoDB en producción, ya que podemos instalar el servicio de manera que el equipo donde esté corriendo tenga un filtro de conexiones, así si intentamos acceder a dicho equipo fuera de la red no se tenga acceso.
Este acercamiento simplista de la seguridad es muy efectivo, pero solo para proyectos donde el servicio no es compartido con otros equipos, ya que si tenemos diferentes equipos de desarrollo trabajando contra el mismo servidor necesitamos algo más. Es aquí donde entra la autenticación, con ella nos encargamos de solicitar un usuario y una contraseña por colección si lo deseamos, así tenemos la posibilidad de separar de forma adecuada las diferentes instancias por cada equipo.
Ambas medidas de seguridad no son excluyentes y si las deseamos utilizar de forma simultanea lo que estamos haciendo es creando un servicio mucho más seguro para nuestro entorno ya sea de producción, pre-producción o de desarrollo multi-equipos.
Autenticación básica
La autenticación en su forma más básica se logra con el comando createUser este debe ejecutarse cuando hayamos seleccionado la Base de Datos admin que es donde deben estar nuestros usuarios.
Es importante notar que desde la versión 2.6 de MongoDB es que se empezó a utilizar el método createUser, en el pasado todo era resuelto por el método addUser, sin embargo se hizo el cambio para permitir una mayor versatilidad al momento de hacer los cambios.
Veamos cómo podemos establecer un usuario administrador y luego un usuario que solo pueda leer la Base de Datos test.
La estructura del documento que recibe el método createUser es la siguiente:
{ “user”: “nombre de usuario”, “pwd”: “contraseña”, “roles”: [ {“role”:””, “db”:””}, ]}Como notamos debemos establecer el nombre y la contraseña para el usuario que estemos creando, pero adicional a esto debemos también crear los roles, que es una estructura de permisos que nos va a permitir definir los poderes que le damos al usuario.
En el siguiente ejemplo vamos a crear un usuario administrador que tenga acceso a todas las Bases de Datos y que pueda controlar el servicio, para ello utilizaremos los roles:
- clusterAdmin
- readAnyDatabase
- readWrite
Con estos tres parámetros ya podremos tener nuestro primer usuario para administrar. Veamos como luce esto en consola:
Con esto ya hemos creado nuestro usuario administrador de forma exitosa, ahora debemos recordar el usuario y la contraseña de forma adecuada porque el siguiente paso que haremos es habilitar la seguridad, para ello debemos iniciar el servicio con el parámetro –auth.
Al reiniciar el servicio podremos entonces colocar nuestro recién creado usuario administrador y para probarlo crearemos un usuario que solo pueda leer la Base de Datos. Veamos como reiniciamos el servicio en los siguientes pasos.
Simplemente debemos en primer lugar detenerlo, por ejemplo en Windows nos posicionamos sobre la consola en la que está corriendo y presionamos las teclas CTRL + C. Luego volvemos a iniciar nuestro servicio normalmente pero al final pasamos el parámetro auth, como podemos ver en la siguiente consola:
Una vez hecho lo anterior vamos entonces a volver a la consola de control de MongoDB, pero en este caso si vamos a utilizar nuestro usuario recién creado:
mongo.exe --username=root --password=123456 adminCon esa línea anterior podremos acceder a nuestro servicio de forma segura, esto lo podemos comprobar en la siguiente imagen:
Es importante recordar que debemos utilizar una contraseña más segura que “123456” en este ejemplo solo se coloca a forma demostrativa, sin embargo para un entorno de producción no es adecuada.
Ya que hemos comprobado cómo acceder con autenticación vamos a crear un usuario que solo pueda leer en la Base de Datos test, para ello vamos a repetir la creación de un usuario, pero vamos a especificar el rol:
readAsí de esta manera limitaremos al usuario a no poder escribir en las colecciones. Veamos la respuesta en nuestra consola:
Ahora al intentar escribir un documento obtendremos un error:
Hemos visto entonces como ya hemos asegurado nuestros usuarios de forma adecuada, es claro que este trabajo de administración de usuarios es un poco complejo, pero una vez que lo hemos hecho podemos tener una gran certeza que no tendremos accesos no autorizados a las Bases de Datos que estamos protegiendo.
Respaldo con bloqueo de datos
Una de las actividades más complejas de asegurar cuando hacemos un respaldo es que debemos garantizar la integridad de los datos, esto nos lleva a una disyuntiva, ubicar la hora en la que menos usuarios trabajan y hacer el respaldo, o hacerlo sin importar los datos.
Con estos dos parámetros podemos hacer que nuestra Base de Datos rechace las escrituras, y en ese justo momento podemos realizar los respaldos de forma adecuada.
Para crear este bloqueo debemos en nuestra Base de Datos correr el siguiente comando:
db.runCommand({“fsync”:”1”, “lock”:”1”});Con ello tendremos nuestra Base de Datos bloqueada efectivamente contra la escritura:
Como vemos es bastante sencillo y efectivo, ahora si queremos romper el bloqueo basta con volver a correr el comando:
db.fsyncUnlock();Con esto último volveremos a tener nuestra Base de Datos con capacidad de recibir escritura:
Respaldos desde maquina esclava
A pesar que lo anterior representa mayor flexibilidad y nos da mucha más seguridad contra la corrupción de datos y favorece la integridad, realmente no es una práctica que debemos llevar en entornos de producción reales.
Lo ideal es crear un entorno con replicación, donde podamos acceder a una copia de los datos y así poder manipular con cualquiera de las opciones que tenemos los respaldos necesarios. Al estar en una réplica de la Base de Datos de producción podremos bloquear la misma, o apagarla y hacer el respaldo de forma tal que el usuario nunca se va a encontrar con un error en la aplicación porque no puede escribir un registro.
En cuanto a los respaldos, la cosa se complica más ya que es recomendable utilizar réplicas del servidor, sin embargo debido a la forma en la que se concibió MongoDB, este tipo de estructuras de maestro – esclavo son muy fáciles de implementar por lo que entender el concepto es lo más difícil pero su aplicación es sumamente amigable para el DBA.
Con esto finalizamos este tutorial, como vemos la administración de MongoDB es bastante avanzada, si tenemos una estructura de un tamaño mediano, es posible que ya hayamos pensado en el tema de la seguridad de usuarios, a pesar que crear los usuarios no es complejo, si es bueno sentarse a definir una buena estructura para crear este tipo de permisos.
Que buen tutorial Jon, te sigo!