Nie można uwierzytelnić w mongo, „uwierzytelnianie nie powiodło się”

91

Utworzyłem administratora dla mongo, korzystając z tych wskazówek:

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

Z klienta mongo wygląda na to, że mogę się uwierzytelnić:

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

Ale nie mogę połączyć się w żaden inny sposób. Na przykład:

mongo -u admin -p SECRETPASSWORD

podaje błąd:

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

Mam auth = truew etc/mongod.conf.

czego mi brakuje?

justkevin
źródło
1
Może Mongo jest skonfigurowane tak, aby akceptować tylko połączenia z lokalnego hosta? Przynajmniej przydarzyło mi się to, gdy próbowałem uzyskać do niej dostęp z mojego komputera, używając naszej produkcyjnej instancji mongodb.
Akku
Nie sądzę, otrzymuję ten komunikat o błędzie podczas łączenia z tego samego komputera co mongod. Ponadto pozwala mi się połączyć bez podawania nazwy użytkownika / hasła, a następnie podać nazwę użytkownika / hasło za pomocą db.auth (mój pierwszy przykład).
justkevin
PS: db.changeUserPassword("admin", "password")aby zmienić hasło dla każdej bazy danych.
laggingreflex

Odpowiedzi:

105

Uwierzytelnianie jest zarządzane na poziomie bazy danych. Kiedy próbujesz połączyć się z systemem za pomocą bazy danych, mongo faktycznie sprawdza poświadczenia, które podajesz w kolekcji <database>.system.users. Tak więc, w zasadzie, gdy próbujesz połączyć się z „testem”, szuka poświadczeń w test.system.usersi zwraca błąd, ponieważ nie może ich znaleźć (ponieważ są one przechowywane admin.system.users). Posiadanie prawa do odczytu i zapisu ze wszystkich baz danych nie oznacza, że ​​możesz się z nimi bezpośrednio łączyć.

Musisz najpierw połączyć się z bazą danych przechowującą poświadczenia. Próbować:

mongo admin -u admin -p SECRETPASSWORD

Więcej informacji można znaleźć na http://docs.mongodb.org/manual/reference/privilege-documents/

gilo
źródło
4
jak wspomniano poniżej, w innej odpowiedzi (ale przegapiłem ją, ponieważ patrzyłem tylko na te z najwyższymi głosowaniami), musiałem dodać pojedyncze cudzysłowy wokół nazwy użytkownika i hasła, zanim mogłem się zalogować
gsaslis
Tak, jeśli użyjesz podwójnych cudzysłowów, idiotyczny bash prawdopodobnie zrobi różne nieprzyjemne rzeczy.
moodboom
73

Otrzymałem również ten błąd, potrzebowałem tylko wskazać bazę danych, w której przechowywane są dane uwierzytelniające użytkownika:

mongo -u admin -p SECRETPASSWORD --authentication Administrator bazy danych

Aktualizacja z 18 listopada 2017 r .:

mongo admin -u admin -p

to lepsze rozwiązanie. Mongo poprosi Cię o podanie hasła, w ten sposób nie umieścisz hasła w postaci zwykłego tekstu w historii powłoki, co jest po prostu okropną praktyką bezpieczeństwa.

Chad E.
źródło
2
Tak, ta odpowiedź działa! W połączeniu z odpowiedzią z @gilo, działa dla mnie następujące polecenie: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo
38

Może zajść potrzeba ulepszenia powłoki mongo. Miałem lokalnie wersję 2.4.9 powłoki mongo i otrzymałem ten błąd podczas próby połączenia się z bazą danych mongo 3. Aktualizacja wersji powłoki do 3 rozwiązała problem.

lmyers
źródło
7
Jak stwierdzono w dokumencie: wersje powłoki mongo wcześniejsze niż 3.0 nie są zgodne z wdrożeniami 3.0 MongoDB, które wymuszają kontrolę dostępu. Jeśli masz wdrożenie 3.0 MongoDB, które wymaga kontroli dostępu, musisz użyć wersji 3.0 powłoki Mongo.
Finch_Powers
33

Wiem, że może się to wydawać oczywiste, ale musiałem też użyć pojedynczego cytatu wokół U / N i P / W, zanim zadziałało

mongo admin -u 'użytkownik' -p 'hasło'

user3609666
źródło
2
Natknąłem się na twoją odpowiedź, ponieważ mongo -u <myuser> -p <mypasswdnie działała. Dlaczego ma adminto znaczenie?
blz
2
mówi mongo, aby używał administratora bazy danych. jeśli utworzysz kolejną bazę danych i przypiszesz użytkownika do tej bazy danych, będzie to mongo <
inna_
Dziękuję bardzo. To naprawdę dziwne, nie używałem cudzysłowów i podwójnych cudzysłowów, ale nie działało. To takie głupie.
zardzewiały
20

W MongoDB 3.0 obsługuje teraz wiele mechanizmów uwierzytelniania.

  1. MongoDB Challenge and Response (SCRAM-SHA-1) - domyślnie w 3.0
  2. MongoDB Challenge and Response (MONGODB-CR) - poprzedni domyślny (<3.0)

Jeśli zacząłeś od nowej bazy danych 3.0 z utworzonymi nowymi użytkownikami, zostaliby oni utworzeni za pomocą SCRAM-SHA-1.

Będziesz więc potrzebował sterownika zdolnego do tego uwierzytelnienia:

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

Gdybyś miał zaktualizowaną bazę danych z wersji 2.x z istniejącymi danymi użytkownika, nadal używałaby MONGODB-CR, a baza danych uwierzytelniania użytkowników musiałaby zostać zaktualizowana:

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

Teraz łączenie się z MongoDB 3.0 z użytkownikami utworzonymi za pomocą SCRAM-SHA-1 jest wymagane do określenia bazy danych uwierzytelniania (za pośrednictwem klienta mongo z wiersza poleceń) i użycia innych mechanizmów, jeśli używasz sterownika.

$> mongo -u UŻYTKOWNIK -p HASŁO --authentication Administrator bazy danych

W tym przypadku do uwierzytelnienia zostanie użyta baza danych „admin”, która jest również domyślną.

Lee Parayno
źródło
Ta zmiana w zachowaniu jest ważna, ponieważ zaskoczyła mnie podczas miksowania nowej wersji MongoDB i starej wersji pymongo. Musisz upewnić się, że instancja mongo i wszyscy klienci mongo są aktualne.
i_grok
Tak było w moim przypadku: 1. Zmieniono mongo-java-driver-2.12.3.jar na mongo-java-driver-3.2.2.jar 2. Zmieniono MongoCredential.createMongoCRCredential na MongoCredential.createCredential
nikolai.serdiuk
ugh. jak trudno byłoby programistom podać nam lepszy błąd, taki jak „nieprawidłowa metoda uwierzytelniania”
Byron Whitlock,
15

To rozwiązało mój problem:

Przejdź do powłoki terminala i wpisz mongo.

Następnie wpisz use db_name.

Następnie wpisz:

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

Spróbuj także: db.getUsers()

Szybka próbka:

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

// MongoDB Connection Info
const url = 'mongodb://mongodb:[email protected]: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);
  });
agm1984
źródło
2
Aby dodać: 1. Zaloguj się najpierw do bazy danych administratora za pomocą mongodb superadmin: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Następnie przejdź do docelowej bazy danych: > use targetDb 3. Następnie dodaj użytkownika> db.createUser(...)
daniel.widyanto
13

Wydaje się, że problem polega na tym, że użytkownik utworzony metodą opisaną w dokumentacji mongo nie ma uprawnień do łączenia się z domyślną bazą danych (test), nawet jeśli został utworzony z rolami „userAdminAnyDatabase” i „dbAdminAnyDatabase”.

justkevin
źródło
mają ten sam problem. Może to być sposób na użycie bazy danych administratora jako domyślnego zamiast testu
Idan Shechter
3

Inna możliwość: podczas tworzenia użytkownika mogłeś przypadkowo korzystać usez bazy danych innej adminlub innej niż ta, którą chciałeś. Musisz ustawić --authenticationDatabasebazę danych, w której użytkownik został faktycznie utworzony.

mongodbWydaje się, można umieścić w testbazie danych domyślnie po otwarciu powłoki, więc trzeba by napisać --authenticationDatabase testzamiast --authenticationDatabase adminjeśli przypadkowo zostały useing testpodczas uruchamiania db.createUser(...).

Zakładając, że masz dostęp do maszyny, na której działa instancja mongodb, możesz wyłączyć autoryzację /etc/mongod.conf( wykomentować, authorizationktóra jest zagnieżdżona w zabezpieczeniach), a następnie zrestartować serwer, a następnie uruchomić:

mongo
show users

Możesz otrzymać coś takiego:

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

Zwróć uwagę, że dbwartość jest równa test. Dzieje się tak, ponieważ kiedy utworzyłem użytkownika, nie uruchomiłem najpierw use adminani use desiredDatabaseName. Możesz więc usunąć użytkownika za pomocą, db.dropUser("myusername")a następnie utworzyć innego użytkownika w wybranej bazie danych, na przykład:

use desiredDatabaseName
db.createUser(...)

Mam nadzieję, że pomoże to komuś, kto był na moim stanowisku nooba w tych sprawach.


źródło
2

To jest specyficzny przypadek, ale na wypadek, gdyby ktoś znalazł się tutaj z moim problemem:

W MongoHQ wyświetli pole o nazwie „hasło”, ale w rzeczywistości jest to tylko skrót hasła. Będziesz musiał dodać nowego użytkownika i przechowywać hasło w innym miejscu (ponieważ MongoHQ ci go nie pokaże).

maxko87
źródło
2

Właściwy sposób logowania się do powłoki mongo to

mongo localhost: 27017 -u 'uuuuu' -p '> xxxxxx' --authentication Nazwa bazy danych bazy danych

Moh .S
źródło
1

Możesz także spróbować tego: -

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

Znalazłem to w tym poście

Tutaj oczywiście hostem lokalnym może być inny host, a / admin może być inną bazą danych, na której zastosowano uwierzytelnianie

Kelsnare
źródło
0

Sprawdź wersję klienta mongo, z którego łączymy się z serwerem mongo.

W moim przypadku serwer mongo miał wersję Mongo 4.0.0, ale mój klient miał wersję 2.4.9. Zaktualizuj wersję mongo, aby zaktualizować mongo cli.

Piaszczysty
źródło