Kann sich nicht bei Mongo authentifizieren, "Auth schlägt fehl"


90

Ich habe einen Administrator für Mongo mithilfe der folgenden Anweisungen erstellt:

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

Vom Mongo-Client aus kann ich mich anscheinend authentifizieren:

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

Aber ich kann mich nicht anders verbinden. Beispielsweise:

mongo -u admin -p SECRETPASSWORD

gibt den Fehler:

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

Ich habe auth = truein etc/mongod.conf.

Was vermisse ich?


1
Vielleicht ist Mongo so konfiguriert, dass nur Verbindungen von localhost akzeptiert werden? Das ist mir zumindest passiert, als ich versucht habe, von meinem Computer aus auf unsere Produktions-Mongodb-Instanz zuzugreifen.
Akku

Ich glaube nicht, ich erhalte diese Fehlermeldung, wenn ich von demselben Computer wie Mongod aus eine Verbindung herstelle. Außerdem kann ich eine Verbindung herstellen, ohne einen Benutzernamen / ein Kennwort und dann einen Benutzernamen / ein Kennwort mit db.auth (mein erstes Beispiel) anzugeben.
Justkevin

PS: db.changeUserPassword("admin", "password")Passwort für jede Datenbank ändern.
Laggingreflex

Antworten:


99

Die Authentifizierung wird auf Datenbankebene verwaltet. Wenn Sie versuchen, über eine Datenbank eine Verbindung zum System herzustellen, sucht Mongo tatsächlich nach den Anmeldeinformationen, die Sie in der Sammlung angeben <database>.system.users. Wenn Sie also versuchen, eine Verbindung zu "test" herzustellen, sucht es nach den Anmeldeinformationen in test.system.usersund gibt einen Fehler zurück, da es sie nicht finden kann (da sie in gespeichert sind admin.system.users). Das Recht, von allen Datenbanken zu lesen und zu schreiben, bedeutet nicht, dass Sie sich direkt mit ihnen verbinden können.

Sie müssen zuerst eine Verbindung zur Datenbank herstellen, in der sich die Anmeldeinformationen befinden. Versuchen:

mongo admin -u admin -p SECRETPASSWORD

Weitere Informationen finden Sie unter http://docs.mongodb.org/manual/reference/privilege-documents/.


4
Wie auch unten erwähnt, musste ich in einer anderen Antwort (aber ich habe es verpasst, da ich mir nur die am besten bewerteten angesehen habe) einfache Anführungszeichen um Benutzername und Passwort hinzufügen , bevor ich
mich

Ja, wenn Sie doppelte Anführungszeichen verwenden, wird idiotische Bash möglicherweise alle möglichen bösen Dinge tun.
Moodboom

73

Ich erhielt auch diesen Fehler. Ich musste lediglich die Datenbank angeben, in der die Benutzerauthentifizierungsdaten gespeichert waren:

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

Update 18. November 2017:

mongo admin -u admin -p

ist eine bessere Lösung. Mongo fordert Sie zur Eingabe Ihres Passworts auf. Auf diese Weise werden Sie Ihr Klartext-Passwort nicht in den Shell-Verlauf aufnehmen, was nur eine schreckliche Sicherheitspraxis ist.


2
Ja, diese Antwort funktioniert! In Kombination mit der Antwort von @gilo funktioniert der folgende Befehl für mich: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo

38

Möglicherweise müssen Sie Ihre Mongo-Shell aktualisieren. Ich hatte lokal Version 2.4.9 der Mongo-Shell und beim Versuch, eine Verbindung zu einer Mongo 3-Datenbank herzustellen, ist dieser Fehler aufgetreten. Ein Upgrade der Shell-Version auf 3 löste das Problem.


7
Wie im Dokument angegeben: Versionen der Mongo-Shell vor 3.0 sind nicht mit 3.0-Bereitstellungen von MongoDB kompatibel, die die Zugriffskontrolle erzwingen. Wenn Sie eine 3.0 MongoDB-Bereitstellung haben, für die Zugriffssteuerung erforderlich ist, müssen Sie 3.0-Versionen der Mongo-Shell verwenden.
Finch_Powers

32

Ich weiß, dass dies offensichtlich erscheint, aber ich musste auch ein einfaches Anführungszeichen um das U / N und das P / W verwenden, bevor es funktionierte

mongo admin -u 'Benutzer' -p 'Passwort'


2
Ich bin über Ihre Antwort gestolpert, weil sie mongo -u <myuser> -p <mypasswdnicht funktioniert hat. Warum macht admines hier einen Unterschied?
Blz

2
es weist mongo an, den Datenbankadministrator zu verwenden. Wenn Sie eine andere Datenbank erstellen und dieser Datenbank einen Benutzer zuweisen, ist dies mongo <another_database> -u Benutzer -p Passwort
Afriyandi Setiawan

Ich danke dir sehr. Das ist wirklich komisch. Ich habe keine Anführungszeichen und doppelte Anführungszeichen verwendet, es hat nicht funktioniert. Das ist so dumm.
rostig

19

In MongoDB 3.0 werden jetzt mehrere Authentifizierungsmechanismen unterstützt.

  1. MongoDB Challenge and Response (SCRAM-SHA-1) - Standard in 3.0
  2. MongoDB Challenge and Response (MONGODB-CR) - vorheriger Standard (<3.0)

Wenn Sie mit einer neuen 3.0-Datenbank begonnen hätten, in der neue Benutzer erstellt wurden, wurden diese mit SCRAM-SHA-1 erstellt.

Sie benötigen also einen Treiber, der diese Authentifizierung unterstützt:

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

Wenn Sie eine Datenbank mit vorhandenen Benutzerdaten von 2.x aktualisieren würden, würde diese weiterhin MONGODB-CR verwenden, und die Benutzerauthentifizierungsdatenbank müsste aktualisiert werden:

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

Jetzt müssen Sie eine Verbindung zu MongoDB 3.0 mit Benutzern herstellen, die mit SCRAM-SHA-1 erstellt wurden, um die Authentifizierungsdatenbank (über den Befehlszeilen-Mongo-Client) anzugeben und andere Mechanismen zu verwenden, wenn Sie einen Treiber verwenden.

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

In diesem Fall wird zur Authentifizierung die Datenbank "admin" verwendet, die auch die Standardeinstellung ist.


Diese Verhaltensänderung ist wichtig, da sie mich beim Mischen einer neuen Version von MongoDB und einer alten Version von Pymongo auslöste. Sie müssen sicherstellen, dass Ihre Mongo-Instanz und alle Mongo-Clients auf dem neuesten Stand sind.
i_grok

Dies war mein Fall: 1. mongo-java-driver-2.12.3.jar in mongo-java-driver-3.2.2.jar geändert 2. MongoCredential.createMongoCRCredential in MongoCredential.createCredential geändert
nikolai.serdiuk

Pfui. Wie schwer wäre es für die Entwickler, uns einen besseren Fehler wie "ungültige Authentifizierungsmethode" zu geben
Byron Whitlock

13

Es scheint, dass das Problem darin besteht, dass ein Benutzer, der mit der in den Mongo-Dokumenten beschriebenen Methode erstellt wurde, keine Berechtigung zum Herstellen einer Verbindung mit der Standarddatenbank (Test) hat, selbst wenn dieser Benutzer mit den Rollen "userAdminAnyDatabase" und "dbAdminAnyDatabase" erstellt wurde.


habe das gleiche Problem. Sie könnten eine Möglichkeit sein, die Admin-Datenbank als Standard anstelle von Test zu verwenden
Idan Shechter

13

Dies hat mein Problem behoben:

Gehen Sie zur Terminal-Shell und geben Sie ein mongo.

Geben Sie dann ein use db_name.

Geben Sie dann Folgendes ein:

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

Probiere auch: db.getUsers()

Schnelle Probe:

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
So fügen Sie hinzu: 1. Melden Sie sich zuerst mit mongodb superadmin bei der Admin-Datenbank an: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Wechseln Sie dann zur Zieldatenbank: > use targetDb 3. > db.createUser(...)
Fügen Sie

3

Eine andere Möglichkeit: Als Sie den Benutzer erstellt haben, haben Sie möglicherweise versehentlich useeine adminandere als die gewünschte Datenbank erstellt . Sie müssen --authenticationDatabasedie Datenbank festlegen , unter der der Benutzer tatsächlich erstellt wurde.

mongodbscheint Sie testbeim Öffnen der Shell standardmäßig in die Datenbank aufzunehmen, sodass Sie schreiben müssen, --authenticationDatabase testanstatt --authenticationDatabase adminversehentlich zu uselaufen, testals Sie ausgeführt wurden db.createUser(...).

Angenommen, Sie haben Zugriff auf den Computer, auf dem die Mongodb-Instanz ausgeführt wird, können Sie die Autorisierung deaktivieren /etc/mongod.conf(aus authorizationSicherheitsgründen verschachtelt auskommentieren ), den Server neu starten und dann Folgendes ausführen:

mongo
show users

Und Sie könnten so etwas bekommen:

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

Beachten Sie, dass der dbWert gleich ist test. Das liegt daran, dass ich beim Erstellen des Benutzers nicht zuerst use adminoder ausgeführt habe use desiredDatabaseName. So können Sie den Benutzer mit löschen db.dropUser("myusername")und dann einen anderen Benutzer unter Ihrer gewünschten Datenbank erstellen, wie folgt:

use desiredDatabaseName
db.createUser(...)

Hoffentlich hilft das jemandem, der in meiner Position als Noob war, mit diesem Zeug.


3

Im Gegensatz zu MYSQl und den meisten RDBMS hat MongoDB ein anderes Setup.

Der eingebaute Basisauthentifizierungsbenutzer ist nicht bereits eingerichtet. Sie müssen ihn manuell einrichten. Sie müssen zur Mongo.conf gehen und die Autorisierung aktivieren. Wenn Sie dies vorsichtig tun, wird beim Starten Ihrer Mongo-Instanz ein Fehler ausgegeben. Sie überprüfen dann, ob Ihr Mongo-Server gestartet wurde oder nicht.

Der nächste Schritt ist das Aktivieren der Autorisierung in Mongo als Benutzer: -

Wir müssen einen Benutzer erstellen, der Root-Zugriff hat, und die Mongo Auth-Konfiguration ändern.

Wechseln Sie zur Admin-Datenbank: -

use admin

Benutzer mit Root-Berechtigung erstellen: -

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

Ändern Sie Ihre mongo.conf in Autorisierung aktivieren: -

security:
    authorization: "enabled"

Bitte gehen Sie diese Schritt-für-Schritt-Anleitung durch, um die Authentifizierung in MongoDB einzurichten.


2

Dies ist eine Art spezifischer Fall, aber für den Fall, dass jemand mit meinem Problem hierher kommt:

In MongoHQ wird ein Feld mit dem Namen "Passwort" angezeigt, aber es ist eigentlich nur der Hash des Passworts. Sie müssen einen neuen Benutzer hinzufügen und das Kennwort an einer anderen Stelle speichern (da MongoHQ es Ihnen nicht anzeigt).


2

Der richtige Weg, um sich bei Mongo Shell anzumelden, ist

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


1

Sie können auch Folgendes versuchen: -

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

Fand es in diesem Beitrag

Hier kann der localhost offensichtlich ein anderer Host sein und der / admin kann eine andere Datenbank sein, auf die die Authentifizierung angewendet wurde


0

Suchen Sie nach der Mongo-Version des Clients, von dem aus wir eine Verbindung zum Mongo-Server herstellen.

Mein Fall, Mongo Server war von Version Mongo4.0.0, aber mein Client war von Version 2.4.9. Aktualisieren Sie die Mongo-Version, um Mongo Cli zu aktualisieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.