MongoDB: usuario administrador no autorizado

200

Estoy tratando de agregar autorización a mi MongoDB.
Estoy haciendo todo esto en Linux con MongoDB 2.6.1.
Mi archivo mongod.conf tiene el formato de compatibilidad anterior
(así es como vino con la instalación).

1) Creé un usuario administrador como se describe aquí en (3)

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

2) Luego edité mongod.conf al descomentar esta línea

auth = true

3) Finalmente reinicié el servicio mongod e intenté iniciar sesión con:

/usr/bin/mongo localhost:27017/admin -u sa -p pwd

4) Puedo conectarme pero dice esto al conectar.

MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:47:16 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command { getLog: "startupWarnings" }

5) Ahora parece que este sausuario que creé no tiene permisos en absoluto.

root@test02:~# mc
MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:57:03 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command { getLog: "startupWarnings" }
[admin] 2014-05-29 17:57:03.011 >>> use admin
switched to db admin
[admin] 2014-05-29 17:57:07.889 >>> show collections
2014-05-29T17:57:10.377-0400 error: {
        "$err" : "not authorized for query on admin.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
[admin] 2014-05-29 17:57:10.378 >>> use test
switched to db test
[test] 2014-05-29 17:57:13.466 >>> show collections
2014-05-29T17:57:15.930-0400 error: {
        "$err" : "not authorized for query on test.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
[test] 2014-05-29 17:57:15.931 >>>

¿Cuál es el problema? Repetí todo este procedimiento 3 veces y
creo que lo hice todo como se especifica en los documentos de MongoDB. Pero no funciona.
Esperaba que este sausuario estuviera autorizado a hacer cualquier cosa para
poder crear otros usuarios y otorgarles permisos más específicos.

peter.petrov
fuente
20
Esto es muy molesto o está mal documentado. Estaba luchando allí mismo. Al final, tengo un usuario con el rol global "root" y todavía no puedo hacer algunas cosas como ejecutar comandos ...
ToBe

Respuestas:

471

También me estaba rascando la cabeza sobre el mismo problema, y ​​todo funcionó después de establecer el rol como root cuando agregué el primer usuario administrador.

use admin
db.createUser(
  {
    user: 'admin',
    pwd: 'password',
    roles: [ { role: 'root', db: 'admin' } ]
  }
);
exit;

Si ya ha creado el adminusuario, puede cambiar la función de esta manera:

use admin;
db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])

Para obtener una referencia de configuración de autenticación completa, consulte los pasos que he compilado después de horas de investigación en Internet.

guardagujas
fuente
154
WTF ?! Perdí una hora por una estupidez como esta. ¿Por qué ponen documentación en userAdminAnyDatabaselugar de root?
akostadinov
15
la idea es que primero cree un usuario que solo se use para administrar a otros usuarios (por lo tanto, el rol que comienza con "userAdmin") y solo luego cree sus usuarios normales. tiene sentido, pero tampoco lo entendí la primera vez ... @akostadinov
TomTasche
10
Esto no funcionó para mí en MongoDB v3.4.7:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384
2
Este código @Cerin DID trabajo para mí: db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])y que me hace confuso. No estoy autorizado para ejecutar un comando y, sin embargo, puedo ejecutar un comando para hacerme root y luego ejecutar ese comando. Muy extraño: S
2
para aquellos en los que db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])no funcionó, asegúrese de volver a use admin... tenía el mismo problema, una vez que volví a funcionar funcionó de
maravilla
37

Es un poco confuso: creo que tendrá que concederse readWrite para consultar una base de datos. Un usuario con dbadmin o useradmin puede administrar la base de datos (incluida la concesión de derechos adicionales) pero no puede realizar consultas ni escribir datos.

así que concédete readWrite y deberías estar bien -

http://docs.mongodb.org/manual/reference/built-in-roles/#readWrite

John Petrone
fuente
No estoy seguro de que esta respuesta sea relevante para la pregunta, pero de cualquier manera proporciona información incorrecta. El rol dbOwner incluye el rol readWrite: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Andy Triggs
10
la respuesta es correcta: los roles dbadmin y useradmin (que es sobre lo que preguntó el póster original) no incluyen readWrite. El dbOwner lo hace, pero eso no es lo que el póster original estaba usando y sobre lo que preguntaba.
John Petrone
3
Estás absolutamente en lo correcto. Disculpas Había pasado demasiado tiempo discutiendo papeles y estaba confundido.
Andy Triggs
¿Entonces puede tener un usuario administrador para acceder al servidor mongodb real y luego tener otros para bases de datos específicas?
K - La toxicidad en SO está creciendo.
32

Quizás un ejemplo rápido de cómo cambiar un usuario actual sea útil para alguien. Esto es lo que realmente estaba buscando.

Siguiendo los consejos de @JohnPetrone, agregué el rol readWrite a mi usuario administrador con grantRolesToUser

> use admin
> db.grantRolesToUser("admin",["readWrite"])
> show collections
system.users
system.version
Bart C
fuente
26

Puede intentar: Usar el indicador --authenticationDatabase ayuda.

mongo --port 27017 -u "admin" -p "password" --authenticationDatabase "admin"
jremi
fuente
8

Sé que esta respuesta llega muy tarde en este hilo, pero espero que la revisen.

La razón por la que obtiene ese error se basa en el rol específico que otorgó al usuario, que ya ha reunido hasta ahora, y sí, darle al usuario el rol rootresolverá su problema, pero primero debe comprender qué hacen estos roles exactamente antes de otorgarles a los usuarios

En el tutorial, le otorgó al usuario el userAdminAnyDatabaserol que básicamente le da al usuario la capacidad de administrar usuarios de todas sus bases de datos. Lo que intentaba hacer con su usuario estaba fuera de su definición de rol.

El rootpapel tiene esta función se incluye en ella definición, así como el readWriteAnyDatabase, dbAdminAnyDatabasey otros papeles por lo que es un superusuario (básicamente porque se puede hacer nada con ella).

Puede consultar las definiciones de roles para ver qué roles necesitará darle a los usuarios para completar ciertas tareas. https://docs.mongodb.com/manual/reference/built-in-roles/ No es recomendable hacer que todos tus usuarios sean super :)

el Punch
fuente
Entonces, si no es root, ¿qué papel sugiere para resolver el problema?
Hendy Irawan
Hola, @HendyIrawan, te sugiero que decidas qué es exactamente lo que quieres que cada uno de tus usuarios puedan hacer y les des el rol que les permite hacer solo eso. Por ejemplo, si solo desea que un usuario lea (que es con lo que intenta hacer la pregunta show collections), debe darle esa habilidad y nada más roles: [ { role: "read", db: "admin" } ]. Observe que el rol aquí es leído, esto es específico de la base de datos y no puede hacer nada más que eso. Consulte este enlace para ver otros roles docs.mongodb.com/manual/reference/built-in-roles
el Punch
Entonces, ¿la respuesta a la pregunta aquí (no "por ejemplo") es "leer"?
Hendy Irawan
Si. Tenga en cuenta que el usuario solo tendrá la capacidad de leer la base de datos especificada.
el Punch
2

Es una pregunta simple.

  1. Es importante que debe cambiar el objetivo db NO admin.

usa tuDB

  1. compruebe su autenticación de db por

mostrar usuarios

  1. Si obtiene un {} objeto vacío, esa es la pregunta. Solo necesitas escribir

db.createUser ({usuario: "yourUser", pwd: "contraseña", roles: ["readWrite", "dbAdmin"]})

o

db.grantRolesToUser ('yourUser', [{role: "dbAdmin", db: "yourDB"}])

cocoTW
fuente
0

Tuve un problema similar aquí en un entorno Windows: instalé Bitnami DreamFactory y también instala otro MongoDb que se inicia en el arranque del sistema. Estaba ejecutando mi MongoDbService (que se inició sin ningún error) pero después de perder mucho tiempo noté que, de hecho, me estaba conectando al servicio MongoDb de Bitnami. Por favor, eche un vistazo si no hay otra instancia de mongoDB ejecutándose en su servidor.

¡Buena suerte!

ibirita
fuente
2
No sé por qué esta respuesta fue rechazada; Esta es una sugerencia legítima. Por ejemplo, me he encontrado con una consola de administración que ejecutaba Tomcat bajo el capó. Si inicia un servidor local (de cualquier tipo), probablemente comprobará si se está ejecutando al intentar conectarse a él. Esa primera conexión tendrá éxito. Luego lucharás con el servidor "oculto" antes de verificar los registros de tu servidor y notar que tu servidor no puede vincularse al puerto deseado.
Paul
0

Además, tenga en cuenta que si su cliente shell mongo no se conecta correctamente a la mongodinstancia, puede recibir dichos errores de "Permiso denegado".

Asegúrese de que su cliente abra una conexión comprobando el puerto de conexión, pero también de que el puerto que está utilizando mongodno está en uso. Puede establecer un puerto diferente utilizando el --port <port>parámetro tanto en el shell como en el proceso.

Nick L.
fuente
0

Tuve este problema debido a que el nombre de host en mi MongoDB Compass apuntaba a admin para mi proyecto. Se solucionó agregando / projectname después del nombre de host :) Intente esto:

  1. Elija su proyecto en el sitio web del atlas MongoDB
  2. Conectar / Conectar con MongoDB Compass
  3. Descarga Compass / Elige tu sistema operativo
  4. Usé Compass 1.12 o posterior
  5. Copie la cadena de conexión en Compass 1.12 o posterior.
  6. Abra MongoDB Compass / Connect (arriba a la izquierda) / Connect To
  7. Cadena de conexión detectada / Sí /
  8. Agregue el nombre de su proyecto después del nombre de host: cluster9-foodie.mongodb.net/ projectname
  9. Conecte y probó la API con POSTMAN.
  10. Tener éxito.

Use la misma cadena de conexión en su código también:

  1. Antes de:
    • mongodb + srv: // nombre del proyecto: contraseña @ cluster9-foodie.mongodb.net / admin
  2. Después:
    • mongodb + srv: // nombre del proyecto: contraseña @ cluster9-foodie.mongodb.net / nombre del proyecto

Buena suerte.

Señor Dang
fuente
0

use mydb
db.createUser ({usuario: "prueba", pwd: "secreto", roles: ["readWrite", "dbAdmin"], contraseñaDigestor: "servidor"})

usuario1797498
fuente
0

Convino en que debe autenticarse en admin db y necesita al menos un rol con los privilegios correctos que evitaría la 'excepción de host local' de DB (esto es para las instalaciones alojadas de mongoDB), aunque tiene todo en su lugar y aún obteniendo excepciones no autorizadas en casi todos los comandos, al acceder a mongoDB que se creó usando Mongo Atlas , entonces aquí está el lugar donde puede saber la razón, por qué:

/dba/219003/not-authorized-on-admin-to-execute-command-mongodb-atlas-m0-free-tier-cluster?newreg=471a9a26108243d78d4ca74a87e7a115

y también verifique esto si ha alojado mongoDB en mongo Atlas :

https://docs.atlas.mongodb.com/unsupported-commands/

quién soy
fuente
0
Use Admin :
    use admin

Create a super user : 

    db.createUser(
    {
    user: "master",
    pwd: "test@123",
    roles: [ 
    { 
    role: "readWriteAnyDatabase", 
    db: "admin" 
    }, 
    {
    "role" : "dbAdminAnyDatabase",
    "db" : "admin"
    },
    {
    "role" : "clusterAdmin",
    "db" : "admin"
    },
    "userAdminAnyDatabase" 
    ]
    }
    )
Prathmesh Bijjargi
fuente
Gracias por este fragmento de código, que podría proporcionar una ayuda limitada a corto plazo. Una explicación adecuada mejoraría en gran medida su valor a largo plazo al mostrar por qué esta es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Por favor, editar su respuesta a añadir un poco de explicación, incluyendo los supuestos realizados.
Toby Speight
0

Seguí estos pasos en Centos 7 para MongoDB 4.2. (Usuario remoto)

Actualizar el archivo mongod.conf

vi /etc/mongod.conf
   net:
     port: 27017
     bindIp: 0.0.0.0 
   security:
     authorization: enabled

Iniciar servicio demonio MongoDB

systemctl start mongod

Abrir shell MongoDB

mongo

Ejecute este comando en el shell

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

Se ha creado un usuario root remoto. Ahora puede probar esta conexión de base de datos utilizando cualquier herramienta de GUI MongoDB de su máquina de desarrollo. Me gusta Robo 3T

M. Hamza Rajput
fuente
-10

Esto puede deberse a que no ha establecido noAuth = true en mongodb.conf

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

Después de configurar esto, reinicie el servicio usando

servicio mongod reiniciar

Buminda
fuente
1
El usuario dice explícitamente que quiere comenzar a usar la autorización, por lo tanto, descomentó auth = true. ¿Por qué sugiere desactivar la autorización?
Alex 75
Supongo que no leíste el problema ... OP quiere autenticación, una combinación de la respuesta de s-hunter para configurar el usuario y jremi para conectarse a una configuración personalizada
ChrisN