MongoDB - Administrator nicht autorisiert

200

Ich versuche, meiner MongoDB eine Autorisierung hinzuzufügen.
Ich mache das alles unter Linux mit MongoDB 2.6.1.
Meine mongod.conf-Datei hat das alte Kompatibilitätsformat
(so kam es mit der Installation).

1) Ich habe einen Administrator erstellt, wie hier in (3) beschrieben.

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

2) Ich habe dann mongod.conf bearbeitet, indem ich diese Zeile auskommentiert habe

auth = true

3) Schließlich habe ich den Mongod-Dienst neu gestartet und versucht, mich anzumelden mit:

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

4) Ich kann eine Verbindung herstellen, aber dies wird beim Verbinden angezeigt.

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) Nun scheint es, dass dieser saBenutzer, den ich erstellt habe, überhaupt keine Berechtigungen hat.

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

Was ist das Problem? Ich habe diesen ganzen Vorgang dreimal wiederholt und
ich glaube, ich habe alles wie in den MongoDB-Dokumenten angegeben gemacht. Aber es funktioniert nicht.
Ich hatte erwartet, dass dieser saBenutzer zu allem berechtigt ist, damit
er andere Benutzer erstellen und ihnen spezifischere Berechtigungen erteilen kann.

peter.petrov
quelle
20
Das ist sehr nervig oder schlecht dokumentiert. Ich kämpfte mich dort. Am Ende habe ich einen Benutzer mit globaler "Root"
-Rolle und kann

Antworten:

471

Ich kratzte mich auch am Kopf wegen des gleichen Problems, und alles funktionierte, nachdem ich die Rolle als Root festgelegt hatte, als ich den ersten Administrator hinzufügte.

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

Wenn Sie den adminBenutzer bereits erstellt haben , können Sie die Rolle folgendermaßen ändern:

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

Eine vollständige Referenz zu den Authentifizierungseinstellungen finden Sie in den Schritten, die ich nach stundenlanger Recherche über das Internet zusammengestellt habe.

Rangierer
quelle
153
WTF?! verlor eine Stunde für eine dumme Sache wie diese. Warum dokumentieren sie userAdminAnyDatabasestatt root?
Akostadinov
15
Die Idee ist, dass Sie zuerst einen Benutzer erstellen, der nur zum Verwalten anderer Benutzer verwendet wird (daher beginnt die Rolle mit "userAdmin"), und erst dann Ihre normalen Benutzer erstellen. es macht irgendwie Sinn, aber ich habe es nicht gleich beim ersten Mal richtig verstanden ... @akostadinov
TomTasche
10
Dies funktionierte nicht für mich auf MongoDB v3.4.7:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384
2
@Cerin Dieser Code DID Arbeit für mich: db.grantRolesToUser('admin',[{ role: "root", db: "admin" }]), und das macht mich verwirrt. Ich bin nicht berechtigt, einen Befehl auszuführen, und dennoch kann ich einen Befehl ausführen, um mich selbst zu rooten, und diesen Befehl dann ausführen. Sehr seltsam: S
2
für diejenigen, in denen db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])nicht funktioniert hat, stellen Sie sicher, dass Sie zurück zu use admin... hatten das gleiche Problem, nachdem ich zurückgeschaltet hatte, funktionierte es wie ein Zauber
esko22
37

Es ist ein bisschen verwirrend - ich glaube, Sie müssen sich readWrite gewähren, um eine Datenbank abzufragen. Ein Benutzer mit dbadmin oder useradmin kann die Datenbank verwalten (einschließlich der Gewährung zusätzlicher Rechte), jedoch keine Abfragen ausführen oder Daten schreiben.

Also gib dir readWrite und es sollte dir gut gehen -

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

John Petrone
quelle
Ich bin nicht sicher, ob diese Antwort für die Frage relevant ist, aber so oder so liefert sie falsche Informationen. Die dbOwner-Rolle enthält die readWrite-Rolle: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Andy Triggs
10
Die Antwort ist richtig - die Rollen dbadmin und useradmin (nach denen im Originalposter gefragt wurde) enthalten readWrite nicht. Der dbOwner tut dies, aber das war nicht das, was das Originalplakat verwendete und nach dem er fragte.
John Petrone
3
Du hast absolut recht. Entschuldigung. Ich hatte zu lange mit Rollen gerungen und war verwirrt.
Andy Triggs
Sie können also einen Administrator haben, der auf den eigentlichen Mongodb-Server zugreift, und dann andere für bestimmte Datenbanken?
K - Die Toxizität in SO nimmt zu.
32

Vielleicht ist ein kurzes Beispiel für das Ändern eines aktuellen Benutzers für jemanden hilfreich. Das habe ich eigentlich gesucht.

Nach dem Rat von @JohnPetrone habe ich hinzugefügt readwrite Rolle meines Admin - Benutzer mit grantRolesToUser

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

Sie können Folgendes versuchen: Die Verwendung des Flags --authenticationDatabase hilft.

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

Ich weiß, dass diese Antwort in diesem Thread sehr spät kommt, aber ich hoffe, Sie überprüfen sie.

Der Grund, warum Sie diesen Fehler erhalten, basiert auf der spezifischen Rolle, die Sie dem Benutzer zugewiesen haben, die Sie inzwischen gesammelt haben, und darauf, diesem Benutzer die Rolle zu geben root zuweisen, wird Ihr Problem gelöst. Sie müssen jedoch zunächst verstehen, was diese Rollen genau tun, bevor Sie sie gewähren an Benutzer.

Im Lernprogramm haben Sie dem Benutzer die userAdminAnyDatabaseRolle zugewiesen, mit der er die Benutzer aller Ihrer Datenbanken verwalten kann. Was Sie mit Ihrem Benutzer tun wollten, lag außerhalb seiner Rollendefinition.

Die rootRolle hat diese Rolle in ihrer Definition enthalten, sowie die readWriteAnyDatabase,dbAdminAnyDatabase und andere Rollen es einen Super - User zu machen (im Grunde , weil man alles damit machen kann).

Sie können die Rollendefinitionen überprüfen, um festzustellen, welche Rollen Sie Ihren Benutzern zum Ausführen bestimmter Aufgaben geben müssen. https://docs.mongodb.com/manual/reference/built-in-roles/ Es ist nicht ratsam, alle Benutzer zu Super-Benutzern zu machen :)

el Punch
quelle
Also, wenn nicht root, welche Rolle schlagen Sie dann vor, um das Problem zu lösen?
Hendy Irawan
Hallo @HendyIrawan, ich würde vorschlagen, dass Sie entscheiden, was genau jeder Ihrer Benutzer tun soll, und ihnen die Rolle geben, die es ihnen ermöglicht, nur das zu tun. Wenn Sie beispielsweise nur möchten, dass ein Benutzer liest (was mit der Frage versucht wird show collections), sollten Sie ihm diese Fähigkeit und sonst nichts geben roles: [ { role: "read", db: "admin" } ]. Beachten Sie, dass die Rolle hier gelesen wird, datenbankspezifisch ist und Sie nichts anderes tun können. Überprüfen Sie heraus diesen Link für andere Rollen docs.mongodb.com/manual/reference/built-in-roles
el Punch
Die Antwort auf die Frage hier (nicht "zum Beispiel") lautet also "gelesen"?
Hendy Irawan
Ja. Beachten Sie, dass der Benutzer nur die angegebene Datenbank lesen kann.
El Punch
2

Es ist eine einfache Frage.

  1. Es ist wichtig, dass Sie die Ziel-Datenbank NICHT admin wechseln müssen .

benutze deineDB

  1. Überprüfen Sie Ihre Datenbankauthentifizierung durch

Benutzer anzeigen

  1. Wenn Sie ein {} leeres Objekt erhalten, ist dies die Frage. Sie müssen nur tippen

db.createUser ({Benutzer: "yourUser", pwd: "Passwort", Rollen: ["readWrite", "dbAdmin"]})

oder

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

cocoTW
quelle
0

Ich hatte hier in einer Windows-Umgebung ein ähnliches Problem: Ich habe Bitnami DreamFactory installiert und es installiert auch eine andere MongoDb, die beim Systemstart gestartet wird. Ich habe meinen MongoDbService ausgeführt (der fehlerfrei gestartet wurde), aber nachdem ich viel Zeit verloren hatte, bemerkte ich, dass ich tatsächlich eine Verbindung zum MongoDb-Service von Bitnami herstellte. Bitte überprüfen Sie, ob auf Ihrem Server keine weitere Instanz von mongoDB ausgeführt wird.

Viel Glück!

Ibirit
quelle
2
Ich weiß nicht, warum diese Antwort abgelehnt wurde. Dies ist ein legitimer Vorschlag. Ich bin beispielsweise auf eine Verwaltungskonsole gestoßen, auf der Tomcat unter der Haube ausgeführt wurde. Wenn Sie einen lokalen Server (eines beliebigen Typs) starten, überprüfen Sie wahrscheinlich, ob er ausgeführt wird, indem Sie versuchen, eine Verbindung zu ihm herzustellen. Diese erste Verbindung wird erfolgreich sein. Sie werden dann mit dem "versteckten" Server ringen, bevor Sie die Protokolle Ihres Servers überprüfen und feststellen, dass Ihr Server nicht an den gewünschten Port gebunden werden konnte.
Paul
0

Beachten Sie außerdem, dass mongodSie solche Fehler "Berechtigung verweigert" erhalten können , wenn Ihr Mongo-Shell-Client keine ordnungsgemäße Verbindung zur Instanz herstellt.

Stellen Sie sicher, dass Ihr Client eine Verbindung öffnet, indem Sie den Verbindungsport überprüfen, aber auch, dass der Port, in dem Sie verwenden, mongodnicht verwendet wird. Sie können einen anderen Port festlegen, indem Sie den --port <port>Parameter sowohl in der Shell als auch im Prozess verwenden.

Nick L.
quelle
0

Ich hatte dieses Problem, weil der Hostname in meinem MongoDB-Kompass stattdessen für mein Projekt auf admin zeigte. Behoben durch Hinzufügen des / Projektnamens nach dem Hostnamen :) Versuchen Sie Folgendes:

  1. Wählen Sie Ihr Projekt auf der MongoDB-Atlas-Website aus
  2. Verbinden / Verbinden mit MongoDB Compass
  3. Laden Sie Compass herunter / Wählen Sie Ihr Betriebssystem
  4. Ich habe Compass 1.12 oder höher verwendet
  5. Kopieren Sie die Verbindungszeichenfolge unter Compass 1.12 oder höher.
  6. Öffnen Sie MongoDB Compass / Connect (oben links) / Connect To
  7. Verbindungszeichenfolge erkannt / Ja /
  8. Fügen Sie Ihren Projektnamen nach dem Hostnamen hinzu: cluster9-foodie.mongodb.net/ projectname
  9. Verbinden und testen Sie die API mit POSTMAN.
  10. Gelingen.

Verwenden Sie dieselbe Verbindungszeichenfolge auch in Ihrem Code:

  1. Vor:
    • mongodb + srv: // Projektname: Passwort @ cluster9-foodie.mongodb.net / admin
  2. Nach dem:
    • mongodb + srv: // projektname: passwort @ cluster9-foodie.mongodb.net / projektname

Viel Glück.

Herr Dang
quelle
0

benutze mydb
db.createUser ({Benutzer: "test", pwd: "secret", Rollen: ["readWrite", "dbAdmin"], passwordDigestor: "server"})

user1797498
quelle
0

Einverstanden, dass Sie sich bei admin db authentifizieren müssen und mindestens eine Rolle mit korrekten Berechtigungen benötigen, die eine "lokale Host-Ausnahme" von DB vermeiden würde (dies gilt für lokal gehostete MongoDBs), obwohl Sie alles an Ort und Stelle haben Wenn Sie bei fast jedem Befehl nicht autorisierte Ausnahmen erhalten, während Sie auf mongoDB zugreifen, das mit Mongo Atlas erstellt wurde , können Sie hier den Grund kennen, warum:

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

und überprüfen Sie dies auch, wenn Sie mongoDB auf mongo Atlas gehostet haben :

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

Wer bin ich
quelle
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
quelle
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte kurzfristige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Toby Speight
-10

Dies kann daran liegen, dass Sie noAuth = true in mongodb.conf nicht festgelegt haben

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

Nachdem Sie dies eingestellt haben, starten Sie den Dienst mit neu

Service Mongod Neustart

Buminda
quelle
1
Der Benutzer sagt ausdrücklich, dass er mit der Verwendung der Autorisierung beginnen möchte, daher kommentierte er auth = true. Warum schlagen Sie vor, die Autorisierung zu deaktivieren?
Alex 75
Ich denke, Sie haben das Problem nicht gelesen ... OP möchte auth, eine Kombination aus der Antwort von s-hunter zum Einstellen des Benutzers und jremi zum Herstellen einer Verbindung zu einer benutzerdefinierten Konfiguration
ChrisN