Habilitar la autenticación y crear un superusuario en MongoDB

MongoDB proporciona controles de acceso a nivel de la base de datos, por lo que esta pequeña guía les puede servir para entender un poco sobre los mecanismos de autenticación de usuarios y crear un superusuario encargado de la administración.

Actualización (27/04/2014): La nueva versión 2.6.0 incluye un nuevo rol llamado "root" que provee acceso a todas las operaciones de todos los recursos en toda la instancia de MongoDB iniciada, así como también sustituyen el antiguo método de administración de usuarios db.addUser() por el nuevo método db.createUser() es por ello que este pequeño tutorial es solamente para versiones 2.4 y anteriores.

Habilitar la autenticación:

En muchas distribuciones GNU/Linux al efectuar la instalación inicial de MongoDB el soporte de autenticación viene desactivado, para habilitarlo tendremos que hacer el siguiente cambio, luego de que el daemon de MongoDB este corriendo, editaremos el archivo /etc/mongod.conf (CentOS 6 / Fedora 20) , ubicaremos y modificaremos la siguiente línea:

# Turn on/off security. Off is currently the default
auth = true

el parámetro auth = true habilitara los mecanismo de autenticación, almacenando los usuarios de la base de datos en la colección de documentos "system.users".

Crear un superusuario administrativo (superuser):

Antes de reiniciar el servicio de MongoDB y habilitar los métodos de autenticación tendremos que crear un superusuario con roles necesarios para administrar las base de datos, para ello seguiremos estos pasos:

1. Conectaremos a MongoDB a la base de datos "admin" (se creará automáticamente), esta base de datos se encargara de almacenar el usuario para todas las base de datos:

mongo localhost:27017/admin

2. Agregamos el superusuario encargado de la base de datos (se recomienda que sea distinto a los usuarios del sistema operativo) con los roles "userAdminAnyDatabase" que permitirá administra los usuarios de todas las base de datos, "dbAdminAnyDatabase" que permite funcionalidades administrativas a todas las base de datos, "clusterAdmin", que permite entre otras cosas listar todas las base de datos y "readAnyDatabase" que permite entre otras operaciones listar todas las colecciones de todas las base de datos:

db.addUser( { user: "tu_superusuario", pwd: "tu_superpassword", roles: [ "userAdminAnyDatabase", "dbAdminAnyDatabase", "clusterAdmin", "readAnyDatabase"] } )

3. El anterior comando deberá generar una salida parecida a la siguiente:

Inserted 1 record(s) in 363ms
{
  "user": "tu_superusuario",
  "pwd": "cf7rf3rleuejd27caa648r75de9t5dnxes2a58",
  "roles": [
    "userAdminAnyDatabase",
    "dbAdminAnyDatabase",
    "clusterAdmin",
    "readAnyDatabase"
  ],
  "_id": ObjectId("533834a79495b9bfeecdeb4a")
}

4. También podemos verificar el usuario creado haciendo una consulta a la colección de documentos "system.users":

db.system.users.find().pretty()

5. Por ultimo, procederemos a reiniciar MongoDB:

En CentOS: /etc/init.d/mongod restart

Fedora 20: systemctl restart mongod.service

Accediendo con el superusuario administrador (superuser):

Al momento de autenticar con el superusuario creado, tendremos que conectarnos a la base de datos "admin", de la siguiente forma:

mongo localhost:27017/admin

y  validares escribiendo lo siguiente:

> db.auth('tu_superusuario','tu_superpassword')
1
>

Si el superusuario es correcto, así como la clave introducida, la salida mostrará el valor "1" si no arrojará un mensaje de error acompañado del valor "0".

Con los anteriores hemos podido crear un usuario administrador para todas las base de datos que entre otras funcionalidades, nos permite agregar a otros usuarios nuevos y modificar sus permisos por lo se recomienda crear para cada base de datos un usuario los roles necesarios para operarla.