Cargando



Seguridad y respaldo en MongoDB

En este tutorial vamos a repasar como hacer un set-up de seguridad inicial en nuestro servicio, además de cómo podemos garantizar nuestros respaldos en un nivel superior al utilizar los bloqueos del servicio para evitar corrupción de datos.


mar 10 2015 03:18
Profesional
mar 10 2015 10:11
Al momento de establecer nuestro servicio en un entorno de producción o tal vez en un entorno de desarrollo con varios usuarios, lo primero que debemos hacer es crear un esquema de seguridad, esto nos permite evitar que nuestras Bases de Datos sean accedidas por personas de forma incorrecta.

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.

Requisitos
Los requisitos que necesitamos en esta ocasión son muy sencillos, simplemente debemos tener una instancia de MongoDB instalada y corriendo en nuestro sistema, también necesitaremos acceso al servicio a través de la consola. Este tutorial fue desarrollado en Windows, por lo que es posible que algunos comandos cambien en otros sistemas operativos, pero todo tiene que ver con lo que se hace fuera de la consola de MongoDB, y la forma en la que expresamos las rutas.


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:


mongodb-seguridad-respaldo.jpg



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:

mongodb-seguridad-respaldo-2.jpg



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 admin
Con esa línea anterior podremos acceder a nuestro servicio de forma segura, esto lo podemos comprobar en la siguiente imagen:


mongodb-seguridad-respaldo-3.jpg



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:
read
Así de esta manera limitaremos al usuario a no poder escribir en las colecciones. Veamos la respuesta en nuestra consola:


mongodb-seguridad-respaldo-4.jpg



Ahora al intentar escribir un documento obtendremos un error:

mongodb-seguridad-respaldo-5.jpg



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.

fsync y lock
Esto no debe ser así, por supuesto hacer un respaldo a la hora en la que sabemos hay la menor cantidad de usuarios siempre es recomendable ya que evitamos problemas de aplicación, el garantizar los datos siempre es posible si utilizamos lo que en MongoDB conocemos como fsync y lock.

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:


mongodb-seguridad-respaldo-6.jpg



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:


mongodb-seguridad-respaldo-7.jpg



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.

¿Te ayudó este Tutorial?


1 Comentarios

Que buen tutorial Jon, te sigo!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X