lunes, 29 de septiembre de 2014

Configuración de seguridad en MongoDB

Después de aceptar MongoDB como animal de compañía y ver como configurarlo a nivel Newbie, quedó pendiente algo tan básico y necesario como establecer unos ciertos mínimos de seguridad para que nuestra instancia de Mongo no sea un “pasen y vean”.

En mi opinión (y después de ver las distintas opciones de configuración disponibles) he agregado los siguientes parámetros al fichero de configuración.
Básicamente activamos la autenticación de usuarios, sólo permitimos conexiones desde la ip local (ya que en nuestro caso tanto IIS como Mongo están en el mismo servidor), cambiamos el puerto por defecto (para no dar pistas) y deshabilitamos cualquier acceso vía http tanto a la parte de administración como a la API Rest. De este modo el fichero .config final quedaría de la siguiente forma (basado en formato YAML).
storage: dbPath: C:\mongodb\data\db systemLog: destination: file path: C:\mongodb\log\mongodb.log logAppend: true security: authorization: "enabled" net: bindIp: "127.0.0.1" port: XXXXX #27017 http: enabled: false RESTInterfaceEnabled: false
Algunas de estas opciones tienen valores predeterminados que ya coinciden con lo aquí expuesto, pero prefiero ser explícito y así olvidarme de ello.

Después de esto y para una bd de ejemplo llamada aspnet, sólo restar comentar como agregar usuarios y activar la autenticación.

Los pasos a seguir serían:
  • Crear usuario admin con el role “root” en la bd admin
  • Crear usuario aspnet con el role “dwOwner” en la bd aspnet
  • Modificar el fichero .config con la configuración propuesta
  • Reiniciar el servicio de Mongo
> use admin switched to db admin > db.createUser({user: "admin", pwd: "1234", roles: ["root"]}) Successfully added user: { "user" : "admin", "roles" : [ "root" ] } > use aspnet switched to db aspnet > db.createUser({user: "aspnet", pwd: "1234", roles: ["dbOwner"]}) Successfully added user: { "user" : "aspnet", "roles" : [ "dbOwner" ] } >
Lógicamente el nombre de usuario podría ser cualquiera (yo he utilizado admin y aspnet que coinciden con los nombres de las bases de datos sólo por sencillez).

Finalmente, para conectar vía C# tenemos que utilizar una cadena de conexión que incluye la autenticación y base de datos por defecto.

Asumiendo que la cadena de conexión debería cumplir mongodb://usuario:contraseña@host:puerto/bd, en nuestro ejemplo quedaría como mongodb://aspnet:1234@localhost:XXXXX/aspnet
Y recuerda (porque me ha pasado), que si incluyes el caracter @ en el nombre de usuario o contraseña, tendrás que escaparlo con %40.

Un saludo!