MongoDB - użytkownik administracyjny nieupoważniony


200

Próbuję dodać autoryzację do mojego MongoDB.
Robię to wszystko na Linuksie z MongoDB 2.6.1.
Mój plik mongod.conf jest w starym formacie zgodności
(tak właśnie przyszedł z instalacją).

1) Utworzyłem użytkownika administratora zgodnie z opisem w (3)

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

2) Następnie edytowałem mongod.conf, odkomentowując tę ​​linię

auth = true

3) W końcu ponownie uruchomiłem usługę mongod i próbowałem zalogować się za pomocą:

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

4) Mogę się połączyć, ale mówi to po podłączeniu.

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) Teraz wygląda na to, saże utworzony przeze mnie użytkownik nie ma żadnych uprawnień.

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

Jaki jest problem? Powtórzyłem całą procedurę 3 razy i
myślę, że zrobiłem to wszystko zgodnie z dokumentacją MongoDB. Ale to nie działa.
Oczekiwałem, że ten saużytkownik zostanie upoważniony do robienia czegokolwiek, aby
mógł następnie tworzyć innych użytkowników i udzielać im bardziej szczegółowych uprawnień.


20
Jest to bardzo denerwujące lub źle udokumentowane. Walczyłem się tam. W końcu mam użytkownika z globalną rolą „root” i nadal nie mogę wykonywać niektórych czynności, takich jak wykonywanie poleceń ...
ToBe

Odpowiedzi:


471

Drapałem się też nad tym samym problemem i wszystko działało po tym, jak ustawiłem rolę roota podczas dodawania pierwszego użytkownika administratora.

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

Jeśli już utworzyłeś adminużytkownika, możesz zmienić rolę w następujący sposób:

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

Aby uzyskać pełne odniesienie do ustawień uwierzytelniania, zobacz kroki , które skompilowałem po wielu godzinach badań w Internecie.


154
WTF ?! straciłem godzinę na takie głupie rzeczy. Dlaczego userAdminAnyDatabasezamiast tego wprowadzają dokumentację root?
akostadinov,

15
Chodzi o to, że najpierw tworzysz użytkownika, który służy tylko do administrowania innymi użytkownikami (dlatego rola zaczyna się od „userAdmin”), a dopiero potem tworzysz zwykłych użytkowników. to ma sens, ale też nie zrozumiałem go po raz pierwszy ... @akostadinov
TomTasche

10
Nie działało to dla mnie w MongoDB v3.4.7:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384,

2
@Cerin Ten kod DID działał dla mnie: db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])i to mnie dezorientuje. Nie mam uprawnień do uruchomienia polecenia, a jednak mogę uruchomić polecenie, aby się zrootować, a następnie uruchomić to polecenie. Bardzo dziwne: S

2
dla tych, w których db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])nie działało, upewnij się, że przełączyłeś się z powrotem na use admin... miał ten sam problem, po przełączeniu działał jak urok
esko22,

37

To trochę mylące - wierzę, że będziesz musiał udzielić sobie readWrite w celu przeszukiwania bazy danych. Użytkownik z dbadmin lub useradmin może administrować bazą danych (w tym przyznając sobie dodatkowe prawa), ale nie może wykonywać zapytań ani zapisywać danych.

więc przyznaj sobie readWrite i powinieneś być w porządku -

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


Nie jestem pewien, czy ta odpowiedź jest istotna dla pytania, ale tak czy inaczej zawiera nieprawidłowe informacje. Rola dbOwner obejmuje rolę readWrite: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Andy Triggs

10
odpowiedź jest prawidłowa - role dbadmin i useradmin (o co pytał oryginalny plakat) nie obejmują readWrite. DbOwner robi, ale nie o to chodziło w oryginalnym plakacie i o co pytał.
John Petrone,

3
Masz całkowitą rację. Przeprosiny. Spędziłem zbyt wiele ról i byłem zamroczony.
Andy Triggs,

Więc możesz mieć administratora, aby uzyskać dostęp do rzeczywistego serwera mongodb, a następnie mieć inne dla określonych baz danych?
K - Toksyczność w SO rośnie.

32

Być może szybki przykład zmiany obecnego użytkownika będzie dla kogoś pomocny. Tego właśnie szukałem.

Zgodnie z radą @JohnPetrone dodałem rolę readWrite do mojego administratora z grantRolesToUser

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

26

Możesz spróbować: Użycie flagi --authenticationDatabase pomaga.

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

8

Wiem, że ta odpowiedź nadchodzi bardzo późno w tym wątku, ale mam nadzieję, że ją sprawdzicie.

Powód, dla którego pojawia się ten błąd, zależy od konkretnej roli, którą nadałeś użytkownikowi, którą już zgromadziłeś, i tak, przyznanie temu użytkownikowi roli rootrozwiąże Twój problem, ale musisz najpierw zrozumieć, co dokładnie te role pełnią przed przyznaniem mu roli dla użytkowników.

W samouczku przyznałeś użytkownikowi userAdminAnyDatabaserolę, która zasadniczo umożliwia mu zarządzanie użytkownikami wszystkich twoich baz danych. To, co próbujesz zrobić z użytkownikiem, wykraczało poza jego definicję roli.

rootRola ma tę rolę definicji zawartej w nim, jak również readWriteAnyDatabase, dbAdminAnyDatabasei innych ról czyniąc mu superużytkownika (głównie dlatego, że można zrobić coś z niego).

Możesz sprawdzić definicje ról, aby zobaczyć, które role będą potrzebne, aby umożliwić użytkownikom wykonywanie określonych zadań. https://docs.mongodb.com/manual/reference/built-in-roles/ Nie zaleca się, aby wszyscy użytkownicy byli super :)


Więc jeśli nie root, to jaką rolę sugerujesz, aby rozwiązać problem?
Hendy Irawan

Cześć @HendyIrawan, sugeruję, abyś zdecydował, co dokładnie chcesz, aby każdy z twoich użytkowników mógł robić i nadał im rolę, która pozwoli im to zrobić. Na przykład, jeśli chcesz tylko, aby użytkownik czytał (z tym pytanie próbuje to zrobić show collections), powinieneś dać mu tę możliwość i nic więcej roles: [ { role: "read", db: "admin" } ]. Zauważ, że rola tutaj jest czytana, jest to specyficzne dla bazy danych i nie możesz zrobić nic poza tym. Sprawdź ten link, aby zobaczyć inne role docs.mongodb.com/manual/reference/built-in-roles
el Punch

Więc odpowiedź na pytanie tutaj (nie „na przykład”) brzmi „czytać”?
Hendy Irawan

Tak. Zauważ, że użytkownik będzie mógł jedynie odczytać określony db.
el Punch

2

To proste pytanie.

  1. Ważne jest, aby zmienić docelową bazę danych db NIE admin.

użyj swojego DB

  1. sprawdź uwierzytelnianie db przez

pokaż użytkowników

  1. Jeśli otrzymasz {} pusty obiekt, to jest pytanie. Musisz tylko wpisać

db.createUser ({użytkownik: „twójUżytkownik”, pwd: „hasło”, role: [„readWrite”, „dbAdmin”]})

lub

db.grantRolesToUser („yourUser”, [{rola: „dbAdmin”, db: „yourDB”}])


0

Miałem podobny problem tutaj w środowisku Windows: Zainstalowałem Bitnami DreamFactory, a także instaluje inny MongoDb, który jest uruchamiany podczas uruchamiania systemu. Uruchomiłem moją usługę MongoDbService (która została uruchomiona bez żadnego błędu), ale zauważyłem po stracie dużo czasu, że w rzeczywistości łączyłem się z usługą MongoDb Bitnami. Sprawdź, czy na Twoim serwerze nie ma innej instancji mongoDB.

Powodzenia!


2
Nie wiem, dlaczego ta odpowiedź została odrzucona; to uzasadniona sugestia. Na przykład natrafiłem na konsolę zarządzania, w której Tomcat działał pod maską. Jeśli uruchomisz serwer lokalny (dowolnego typu), prawdopodobnie sprawdzisz, czy jest uruchomiony, próbując się z nim połączyć. Pierwsze połączenie się powiedzie. Będziesz wtedy zmagał się z „ukrytym” serwerem przed sprawdzeniem logów serwera i zauważeniem, że twój serwer nie może powiązać się z pożądanym portem.
Paul,

0

Ponadto zauważ, że jeśli klient powłoki mongo nie połączy się poprawnie z mongodinstancją, możesz otrzymać takie błędy „Odmowa dostępu”.

Upewnij się, że klient otwiera połączenie, sprawdzając port połączenia, ale także, że port, którego używasz, mongodnie jest używany. Możesz ustawić inny port, używając --port <port>parametru zarówno w powłoce, jak i procesie.


0

Miałem ten problem, ponieważ nazwa hosta w moim kompasie MongoDB wskazywała zamiast tego administratora dla mojego projektu. Naprawiono, dodając / projectname po nazwie hosta :) Wypróbuj to:

  1. Wybierz swój projekt na stronie atlasu MongoDB
  2. Połącz / Połącz za pomocą kompasu MongoDB
  3. Pobierz Kompas / Wybierz swój system operacyjny
  4. Użyłem kompasu 1.12 lub nowszego
  5. Skopiuj parametry połączenia pod Kompas 1.12 lub nowszy.
  6. Otwórz kompas MongoDB / Połącz (lewy górny róg) / Połącz z
  7. Wykryto ciąg połączenia / Tak /
  8. Dołącz nazwę projektu po nazwie hosta: klaster9-foodie.mongodb.net/ nazwa projektu
  9. Połącz i przetestuj API za pomocą POSTMAN.
  10. Osiągnąć sukces.

Użyj również tego samego ciągu połączenia w kodzie:

  1. Przed:
    • mongodb + srv: // nazwa projektu: hasło @ klaster9-foodie.mongodb.net / admin
  2. Po:
    • mongodb + srv: // nazwa projektu: hasło @ klaster9-foodie.mongodb.net / nazwa projektu

Powodzenia.


0

użyj mydb
db.createUser ({użytkownik: „test”, pwd: „sekret”, role: [„readWrite”, „dbAdmin”], hasłoDigestor: „serwer”})


0

Zgodził się na uwierzytelnienie w bazie danych administratora i potrzebuje co najmniej roli z odpowiednimi uprawnieniami, która pozwoliłaby uniknąć „wyjątku hosta lokalnego” z bazy danych DB (dotyczy to hostowanej lokalnie bazy danych mongoDB), chociaż masz wszystko na swoim miejscu i nadal uzyskiwanie nieautoryzowanych wyjątków dla prawie każdej komendy, podczas uzyskiwania dostępu do mongoDB, które zostały utworzone za pomocą Mongo Atlas , oto miejsce, w którym możesz znać powód, dlaczego:

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

a także sprawdź to, jeśli hostowałeś mongoDB w 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" 
    ]
    }
    )

Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną krótkotrwałą pomoc. Właściwe wyjaśnienie znacznie poprawiłoby jego długoterminową wartość, pokazując, dlaczego jest to dobre rozwiązanie problemu i uczyniłoby to bardziej użytecznym dla przyszłych czytelników z innymi podobnymi pytaniami. Proszę edytować swoją odpowiedź dodać kilka wyjaśnień, w tym założeń już wykonanych.
Toby Speight

-10

Może to być spowodowane tym, że nie ustawiłeś noAuth = true w mongodb.conf

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

Po ustawieniu tego zrestartuj usługę za pomocą

usługa Mongod restart


1
Użytkownik wyraźnie mówi, że chce zacząć korzystać z autoryzacji, dlatego nie skomentował auth = true. Dlaczego sugerujesz wyłączenie autoryzacji!
Alex 75

Chyba nie przeczytałeś problemu ... OP chce autoryzacji, kombinacji odpowiedzi s-huntera na ustawienie użytkownika i Jremi na połączenie z niestandardową konfiguracją
ChrisN
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.