No se puede autenticar en mongo, "la autenticación falla"


90

Creé un usuario administrador para mongo usando estas instrucciones:

http://docs.mongodb.org/manual/tutorial/add-user-administrator/

Desde el cliente mongo, parece que puedo autenticarme:

> use admin
switched to db admin
> db.auth('admin','SECRETPASSWORD');
1
>

Pero no puedo conectarme de otra manera. Por ejemplo:

mongo -u admin -p CONTRASEÑA SECRETA

da el error:

JavaScript execution failed: Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:L228

yo tengo auth = true en etc/mongod.conf.

¿Qué me estoy perdiendo?


1
¿Quizás Mongo está configurado para aceptar solo conexiones de localhost? Eso al menos me sucedió usando nuestra instancia de producción mongodb cuando intentaba acceder a ella desde mi computadora.
Akku

No lo creo, recibo ese mensaje de error cuando me conecto desde la misma máquina que mongod. Además, me permite conectarme sin proporcionar un nombre de usuario / contraseña y luego proporcionar un nombre de usuario / contraseña con db.auth (mi primer ejemplo).
justkevin

PD: db.changeUserPassword("admin", "password")para cambiar la contraseña de cada base de datos.
laggingreflex

Respuestas:


100

La autenticación se gestiona a nivel de base de datos. Cuando intenta conectarse al sistema utilizando una base de datos, mongo realmente verifica las credenciales que proporciona en la colección <database>.system.users. Entonces, básicamente, cuando intenta conectarse a "prueba", busca las credenciales test.system.usersy devuelve un error porque no puede encontrarlas (ya que están almacenadas admin.system.users). Tener derecho a leer y escribir desde todas las bases de datos no significa que pueda conectarse directamente a ellas.

Primero debe conectarse a la base de datos que contiene las credenciales. Tratar:

mongo admin -u admin -p SECRETPASSWORD

Para obtener más información, consulte este http://docs.mongodb.org/manual/reference/privilege-documents/


4
como también se menciona a continuación, en otra respuesta (pero me lo perdí, ya que solo miré los más votados) necesitaba agregar comillas simples alrededor del nombre de usuario y la contraseña, antes de poder iniciar sesión
gsaslis

Sí, si usas comillas dobles, bash idiota posiblemente hará todo tipo de cosas desagradables.
moodboom

73

También recibí este error, lo que necesitaba era especificar la base de datos donde se almacenaban los datos de autenticación del usuario:

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

Actualización 18 de noviembre de 2017:

mongo admin -u admin -p

es una mejor solución. Mongo le pedirá su contraseña, de esta manera no pondrá su contraseña en texto sin cifrar en el historial de shell, que es una práctica de seguridad terrible.


2
¡Sí, esta respuesta funciona! Combinando esto con la respuesta de @gilo, el siguiente comando me funciona: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo

38

Es posible que deba actualizar su caparazón mongo. Tenía la versión 2.4.9 del shell mongo localmente y recibí este error al intentar conectarme a una base de datos mongo 3. Actualizar la versión de shell a 3 resolvió el problema.


7
Como se indica en el documento: Las versiones del shell mongo anteriores a la 3.0 no son compatibles con las implementaciones 3.0 de MongoDB que imponen el control de acceso. Si tiene una implementación 3.0 de MongoDB que requiere control de acceso, debe usar versiones 3.0 del shell mongo.
Finch_Powers

32

Sé que esto puede parecer obvio, pero también tuve que usar una sola comilla alrededor de u / ny p / w antes de que funcionara

mongo admin -u 'usuario' -p 'contraseña'


2
Tropecé con tu respuesta porque mongo -u <myuser> -p <mypasswdno estaba funcionando. ¿Por qué hace la admindiferencia aquí?
blz

2
le dice a Mongo que use el administrador de la base de datos. si crea otra base de datos y asigna un usuario a esa base de datos, entonces será mongo <otra base de datos> -u usuario -p contraseña
Afriyandi Setiawan

Muchas gracias. Esto es realmente extraño. No estaba usando comillas y comillas dobles, no funcionaba. Eso es tan tonto.
oxidado

20

En MongoDB 3.0, ahora admite múltiples mecanismos de autenticación.

  1. Desafío y respuesta de MongoDB (SCRAM-SHA-1): predeterminado en 3.0
  2. Desafío y respuesta de MongoDB (MONGODB-CR): valor predeterminado anterior (<3.0)

Si comenzó con una nueva base de datos 3.0 con nuevos usuarios creados, se habrían creado utilizando SCRAM-SHA-1.

Por tanto, necesitará un controlador capaz de realizar esa autenticación:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers

Si tuviera una base de datos actualizada de 2.x con datos de usuario existentes, todavía estarían usando MONGODB-CR, y la base de datos de autenticación de usuarios tendría que actualizarse:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram

Ahora, se requiere conectarse a MongoDB 3.0 con usuarios creados con SCRAM-SHA-1 para especificar la base de datos de autenticación (a través del cliente de línea de comandos mongo) y usar otros mecanismos si se usa un controlador.

$> mongo -u USUARIO -p PASSWORD --authenticationDatabase admin

En este caso, la base de datos "admin", que también es la predeterminada, se utilizará para autenticarse.


Este cambio de comportamiento es importante, ya que me hizo tropezar al mezclar una nueva versión de MongoDB y una versión antigua de pymongo. Debe asegurarse de que su instancia de mongo y todos los clientes de mongo estén actualizados.
i_grok

Este fue mi caso: 1. Se cambió mongo-java-driver-2.12.3.jar a mongo-java-driver-3.2.2.jar 2. Se cambió MongoCredential.createMongoCRCredential a MongoCredential.createCredential
nikolai.serdiuk

ugh. qué tan difícil sería para los desarrolladores darnos un error mejor como "método de autenticación no válido"
Byron Whitlock

13

Se aparece el problema es que un usuario creado mediante el método descrito en los documentos mongo no tiene permiso para conectarse a la base de datos por defecto (de prueba), aunque el usuario fue creado con la "userAdminAnyDatabase" y "papeles dbAdminAnyDatabase".


tiene el mismo problema. Su podría ser una forma de usar la base de datos de administración como predeterminada en lugar de la prueba
Idan Shechter

13

Esto solucionó mi problema:

Vaya a terminal shell y escriba mongo.

Luego escribe use db_name.

Luego escriba:

 db.createUser(
   {
     user: "mongodb",
     pwd: "dogmeatsubparflavour1337",
     roles: [ { role: "dbOwner", db: "db_name" } ]
   }
 )

Intenta también: db.getUsers()

Muestra rápida:

const MongoClient = require('mongodb').MongoClient;

// MongoDB Connection Info
const url = 'mongodb://mongodb:dogmeatsubparflavour1337@stackoverflow.com:27017/?authMechanism=DEFAULT&authSource=db_name';
// Additional options: https://docs.mongodb.com/manual/reference/connection-string/#connection-string-options

// Use Connect Method to connect to the Server
MongoClient.connect(url)
  .then((db) => {
    console.log(db);
    console.log('Casually connected correctly to server.');
    // Be careful with db.close() when working asynchronously
    db.close();
  })
  .catch((error) => {
    console.log(error);
  });

2
Para agregar: 1. Inicie sesión en la base de datos de administración con mongodb superadmin primero: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Luego cambie a la base de datos de destino: > use targetDb 3. Luego agregue el usuario> db.createUser(...)
daniel.widyanto

3

Otra posibilidad: cuando creó el usuario, es posible que haya estado useingresando accidentalmente en una base de datos admindiferente a la que deseaba. Debe establecer --authenticationDatabasela base de datos con la que se creó el usuario.

mongodbparece colocarte en la testbase de datos de forma predeterminada cuando abres el shell, por lo que deberías escribir en --authenticationDatabase testlugar de hacerlo --authenticationDatabase adminsi accidentalmente estuvieras useing testcuando ejecutaras db.createUser(...).

Suponiendo que tenga acceso a la máquina que está ejecutando la instancia de mongodb, podría deshabilitar la autorización de entrada /etc/mongod.conf(comentar authorizationque está anidado bajo seguridad), y luego reiniciar su servidor, y luego ejecutar:

mongo
show users

Y puede obtener algo como esto:

{
    "_id" : "test.myusername",
    "user" : "myusername",
    "db" : "test",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "mydatabasename"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

Observe que el dbvalor es igual test. Eso es porque cuando creé el usuario, primero no ejecuté use admino use desiredDatabaseName. Entonces puede eliminar el usuario con db.dropUser("myusername")y luego crear otro usuario en la base de datos deseada así:

use desiredDatabaseName
db.createUser(...)

Con suerte, eso ayudará a alguien que estaba en mi posición como novato con estas cosas.


3

A diferencia de MYSQl y la mayoría de RDBMS, MongoDB tiene una configuración diferente.

No viene con el usuario de autenticación básico incorporado ya configurado. Necesita configurarlo manualmente. Debe ir a Mongo.conf y habilitar la Autorización. Habilítelo con precaución. Si no lo hace, se producirá un error al iniciar su instancia de mongo. Luego verifica si su servidor mongo se inició o no.

El siguiente paso es habilitar la autorización en Mongo como usuario: -

Necesitamos crear un usuario que tenga acceso de root y cambiar la configuración de autenticación de mongo.

Cambiar a Admin DB: -

use admin

Crear usuario con privilegios de root: -

 db.createUser({user:"admin",
                     pwd:"admin",
                    roles:[{role:"root",
                             db:"admin"
                            }] });

Cambie su mongo.conf para habilitar la autorización: -

security:
    authorization: "enabled"

Consulte esta guía paso a paso para configurar la autenticación en MongoDB.


2

Este es un caso específico, pero en caso de que alguien llegue con mi problema:

En MongoHQ, le mostrará un campo llamado "contraseña", pero en realidad es solo el hash de la contraseña. Tendrá que agregar un nuevo usuario y almacenar la contraseña en otro lugar (porque MongoHQ no se la mostrará).


2

La forma correcta de iniciar sesión en mongo shell es

mongo localhost: 27017 -u 'uuuuu' -p '> xxxxxx' --authenticationDatabase dbname


1

También puedes probar esto :-

mongo localhost:27017/admin -u admin -p SECRETPASSWORD

Lo encontré en esta publicación

Aquí, obviamente, el localhost puede ser otro host y el / admin puede ser alguna otra base de datos en la que se haya aplicado la autenticación


0

Verifique la versión mongo del cliente desde donde nos estamos conectando al servidor mongo.

En mi caso, el servidor mongo era de la versión Mongo4.0.0 pero mi cliente era de la versión 2.4.9. Actualice la versión de mongo para actualizar mongo cli.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.