MongoDB - utilisateur administrateur non autorisé


200

J'essaie d'ajouter une autorisation à mon MongoDB.
Je fais tout cela sous Linux avec MongoDB 2.6.1.
Mon fichier mongod.conf est dans l'ancien format de compatibilité
(c'est ainsi qu'il est venu avec l'installation).

1) J'ai créé un utilisateur administrateur comme décrit ici dans (3)

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

2) J'ai ensuite édité mongod.conf en décommentant cette ligne

auth = true

3) Enfin, j'ai redémarré le service mongod et j'ai essayé de me connecter avec:

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

4) Je peux me connecter mais cela est dit lors de la connexion.

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) Il semble maintenant que cet sautilisateur que j'ai créé ne dispose d'aucune autorisation.

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 >>>

Quel est le problème? J'ai répété toute cette procédure 3 fois et
je pense que j'ai tout fait comme spécifié dans les documents MongoDB. Mais ça ne marche pas.
Je m'attendais à ce que cet sautilisateur soit autorisé à faire quoi que ce soit afin
qu'il puisse ensuite créer d'autres utilisateurs et leur donner des autorisations plus spécifiques.


20
C'est très ennuyeux ou mal documenté. Je me battais là-bas. En fin de compte, j'ai un utilisateur avec un rôle global "root" et je ne peux toujours pas faire des choses comme exécuter des commandes ...
ToBe

Réponses:


471

Je me grattais également la tête autour du même problème, et tout a fonctionné après avoir défini le rôle comme root lors de l'ajout du premier utilisateur administrateur.

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

Si vous avez déjà créé l' adminutilisateur, vous pouvez changer le rôle comme ceci:

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

Pour une référence complète des paramètres d'authentification, consultez les étapes que j'ai compilées après des heures de recherche sur Internet.


154
WTF?! perdu une heure pour une chose stupide comme ça. Pourquoi mettent-ils de la documentation à la userAdminAnyDatabaseplace root?
akostadinov

15
l'idée est que vous créez d'abord un utilisateur qui est uniquement utilisé pour administrer d'autres utilisateurs (donc le rôle commençant par "userAdmin") et que vous créez ensuite vos utilisateurs normaux. cela a du sens, mais je n'ai pas compris la première fois aussi ... @akostadinov
TomTasche

10
Cela n'a pas fonctionné pour moi sur MongoDB v3.4.7:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384

2
@Cerin Ce code SAVIEZ travail pour moi: db.grantRolesToUser('admin',[{ role: "root", db: "admin" }]), et cela me rend confus. Je ne suis pas autorisé à exécuter une commande, et pourtant je peux exécuter une commande pour me rendre root, puis exécuter cette commande. Très étrange: S

2
pour ceux qui db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])n'ont pas fonctionné, assurez-vous de revenir à use admin... eu le même problème, une fois que je suis revenu, cela a fonctionné comme un charme
esko22

37

C'est un peu déroutant - je pense que vous devrez vous accorder readWrite pour interroger une base de données. Un utilisateur avec dbadmin ou useradmin peut administrer la base de données (y compris en vous accordant des droits supplémentaires) mais ne peut pas effectuer de requêtes ni écrire de données.

alors accordez-vous readWrite et ça devrait aller -

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


Je ne suis pas sûr que cette réponse soit pertinente pour la question, mais dans tous les cas, elle fournit des informations incorrectes. Le rôle dbOwner inclut le rôle readWrite: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Andy Triggs

10
la réponse est correcte - les rôles dbadmin et useradmin (c'est ce que l'affiche originale demandait) n'incluent pas readWrite. Le dbOwner le fait mais ce n'est pas ce que l'affiche originale utilisait et demandait.
John Petrone

3
Vous avez absolument raison. Mes excuses. J'avais passé trop de temps à me disputer des rôles et j'étais confus.
Andy Triggs

Vous pouvez donc avoir un utilisateur administrateur pour accéder au serveur mongodb réel, puis en avoir d'autres pour des bases de données spécifiques?
K - La toxicité du SO augmente.

32

Peut-être qu'un exemple rapide de la façon de changer un utilisateur actuel sera utile à quelqu'un. C'est ce que je cherchais.

En suivant les conseils de @JohnPetrone, j'ai ajouté le rôle readWrite à mon utilisateur administrateur avec grantRolesToUser

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

26

Vous pouvez essayer: l'aide de l'indicateur --authenticationDatabase aide.

mongo --port 27017 -u "admin" -p "password" --authenticationDatabase "admin"

8

Je sais que cette réponse arrive très tard dans ce fil, mais j'espère que vous la vérifierez.

La raison pour laquelle vous obtenez cette erreur est basée sur le rôle spécifique que vous avez accordé à l'utilisateur, que vous avez rassemblé maintenant, et oui, donner à cet utilisateur le rôle rootrésoudra votre problème, mais vous devez d'abord comprendre ce que ces rôles font exactement avant de les accorder. aux utilisateurs.

Dans le didacticiel, vous avez accordé à l'utilisateur le userAdminAnyDatabaserôle qui lui donne essentiellement la possibilité de gérer les utilisateurs de toutes vos bases de données. Ce que vous essayez de faire avec votre utilisateur ne correspond pas à sa définition de rôle.

Le rootrôle a ce rôle inclus dans la définition elle ainsi que la readWriteAnyDatabase, dbAdminAnyDatabaseet d' autres rôles qui en fait un super - utilisateur (essentiellement parce que vous pouvez faire quelque chose avec elle).

Vous pouvez consulter les définitions de rôle pour voir quels rôles vous devrez attribuer aux utilisateurs pour effectuer certaines tâches. https://docs.mongodb.com/manual/reference/built-in-roles/ Ce n'est pas conseillé de faire de tous vos utilisateurs de superbes :)


Si ce n'est pas root, alors quel rôle proposez-vous pour résoudre le problème?
Hendy Irawan

Bonjour @HendyIrawan, je vous suggère de décider exactement ce que vous voulez que chacun de vos utilisateurs puisse faire et de leur donner le rôle qui leur permet de ne faire que cela. Par exemple, si vous voulez seulement qu'un utilisateur lise (ce que la question essaie de faire avec show collections), vous devez lui donner cette capacité et rien d'autre roles: [ { role: "read", db: "admin" } ]. Notez que le rôle ici est lu, ceci est spécifique à la base de données et vous ne pouvez rien faire d'autre que cela. Consultez ce lien pour d'autres rôles docs.mongodb.com/manual/reference/built-in-roles
el Punch

Donc la réponse à la question ici (pas "par exemple") est "lu"?
Hendy Irawan

Oui. Notez que l'utilisateur aura uniquement la possibilité de lire la base de données spécifiée.
el Punch

2

C'est une question simple.

  1. Il est important que vous devez changer la base de données cible PAS admin.

utilisez votre DB

  1. vérifiez votre authentification db par

montrer aux utilisateurs

  1. Si vous obtenez un {} objet vide, c'est la question. Vous avez juste besoin de taper

db.createUser ({utilisateur: "votreUtilisateur", pwd: "mot de passe", rôles: ["readWrite", "dbAdmin"]}))

ou

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


0

J'ai eu un problème similaire ici sur un environnement Windows: j'ai installé Bitnami DreamFactory et il installe également un autre MongoDb qui est démarré au démarrage du système. J'exécutais mon MongoDbService (qui a été démarré sans erreur) mais j'ai remarqué après avoir perdu beaucoup de temps que je me connectais en fait sur le service MongoDb de Bitnami. Veuillez vérifier s'il n'y a pas d'autre instance de mongoDB en cours d'exécution sur votre serveur.

Bonne chance!


2
Je ne sais pas pourquoi cette réponse a été rejetée; c'est une suggestion légitime. Par exemple, j'ai rencontré une console de gestion qui exécutait Tomcat sous le capot. Si vous démarrez un serveur local (de tout type), vous vérifierez probablement s'il fonctionne en essayant de vous y connecter. Cette première connexion réussira. Vous devrez ensuite lutter avec le serveur "caché" avant de vérifier les journaux de votre serveur et de remarquer que votre serveur ne peut pas se lier au port souhaité.
Paul

0

En outre, notez que si votre client shell mongo ne parvient pas à se connecter correctement à l' mongodinstance, vous pouvez recevoir de telles erreurs «Autorisation refusée».

Assurez-vous que votre client ouvre une connexion en vérifiant le port de connexion, mais également que le port que vous utilisez mongodn'est pas utilisé. Vous pouvez définir un port différent en utilisant le --port <port>paramètre à la fois dans le shell et dans le processus.


0

J'ai eu ce problème à cause du nom d'hôte dans mon MongoDB Compass qui pointait vers admin à la place pour mon projet. Corrigé en ajoutant le / projectname après le hostname :) Essayez ceci:

  1. Choisissez votre projet sur le site de l'atlas MongoDB
  2. Se connecter / se connecter avec MongoDB Compass
  3. Télécharger Compass / Choisissez votre OS
  4. J'ai utilisé Compass 1.12 ou une version ultérieure
  5. Copiez la chaîne de connexion sous Compass 1.12 ou version ultérieure.
  6. Ouvrez MongoDB Compass / Connect (en haut à gauche) / Connect To
  7. Chaîne de connexion détectée / Oui /
  8. Ajoutez le nom de votre projet après le nom d'hôte: cluster9-foodie.mongodb.net/ projectname
  9. Connectez et testez l'API avec POSTMAN.
  10. Réussir.

Utilisez également la même chaîne de connexion dans votre code:

  1. Avant:
    • mongodb + srv: // projectname: password @ cluster9-foodie.mongodb.net / admin
  2. Après:
    • mongodb + srv: // projectname: password @ cluster9-foodie.mongodb.net / projectname

Bonne chance.


0

utilisez mydb
db.createUser ({user: "test", pwd: "secret", rôles: ["readWrite", "dbAdmin"], passwordDigestor: "server"})


0

Il est convenu que vous devez vous authentifier auprès de l'administrateur de la base de données et avoir besoin d'au moins un rôle avec des privilèges corrects qui éviterait une `` exception d'hôte local '' de la base de données (c'est pour mongoDB hébergé sur site), bien que vous ayez tout en place et toujours obtenir des exceptions non autorisées sur presque toutes les commandes, tout en accédant à mongoDB qui a été créé à l'aide de Mongo Atlas , alors voici l'endroit où vous pourriez en connaître la raison, pourquoi:

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

et vérifiez également si vous avez hébergé mongoDB sur mongo Atlas :

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


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" 
    ]
    }
    )

Merci pour cet extrait de code, qui pourrait fournir une aide limitée à court terme. Une explication appropriée améliorerait considérablement sa valeur à long terme en montrant pourquoi c'est une bonne solution au problème, et la rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez faites.
Toby Speight du

0

J'ai suivi ces étapes sur Centos 7 pour MongoDB 4.2. (Utilisateur distant)

Mettre à jour le fichier mongod.conf

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

Démarrez le démon du service MongoDB

systemctl start mongod

Ouvrir le shell MongoDB

mongo

Exécutez cette commande sur le shell

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

L'utilisateur root distant a été créé. Vous pouvez maintenant tester cette connexion à la base de données en utilisant n'importe quel outil GUI MongoDB à partir de votre machine de développement. Comme Robo 3T


-10

Cela peut être dû au fait que vous n'avez pas défini noAuth = true dans mongodb.conf

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

Après avoir défini ce redémarrage, le service à l'aide

service mongod restart


1
L'utilisateur dit explicitement qu'il veut commencer à utiliser l'autorisation, il a donc commenté auth = true. Pourquoi proposez-vous de désactiver l'autorisation!?
Alex 75,

Je suppose que vous n'avez pas lu le problème ... OP veut auth, une combinaison de la réponse de s-hunter pour définir l'utilisateur et de jremi pour se connecter à une configuration personnalisée
ChrisN
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.