MongoDB - utente amministratore non autorizzato


200

Sto cercando di aggiungere l'autorizzazione al mio MongoDB.
Sto facendo tutto questo su Linux con MongoDB 2.6.1.
Il mio file mongod.conf è nel vecchio formato di compatibilità
(ecco come è arrivato con l'installazione).

1) Ho creato un utente amministratore come descritto qui in (3)

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

2) Ho quindi modificato mongod.conf decommentando questa riga

auth = true

3) Alla fine ho riavviato il servizio mongod e ho provato ad accedere con:

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

4) Sono in grado di connettermi ma lo dice su Connetti.

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) Ora sembra che questo sautente che ho creato non abbia alcuna autorizzazione.

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

Qual è il problema? Ho ripetuto l'intera procedura 3 volte e
penso di aver fatto tutto come specificato nei documenti MongoDB. Ma non funziona
Mi aspettavo che questo sautente fosse autorizzato a fare qualsiasi cosa in modo che
potesse quindi creare altri utenti e dare loro autorizzazioni più specifiche.


20
Questo è molto fastidioso o mal documentato. Stavo lottando lì. Alla fine, ho un utente con ruolo "root" globale e non riesco ancora a fare alcune cose come eseguire comandi ...
ToBe

Risposte:


471

Stavo anche grattando la testa per lo stesso problema e tutto ha funzionato dopo aver impostato il ruolo come root quando ho aggiunto il primo utente amministratore.

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

Se hai già creato l' adminutente, puoi modificare il ruolo in questo modo:

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

Per un riferimento completo alle impostazioni di autenticazione, vedere i passaggi che ho compilato dopo ore di ricerche su Internet.


154
WTF ?! ho perso un'ora per una cosa stupida come questa. Perché inseriscono la documentazione userAdminAnyDatabaseanziché root?
Akostadinov,

15
l'idea è di creare prima un utente che viene utilizzato solo per amministrare altri utenti (quindi il ruolo che inizia con "userAdmin") e solo successivamente creare i tuoi utenti normali. ha un certo senso, ma non l'ho capito anche io la prima volta ... @akostadinov
TomTasche

10
Questo non ha funzionato per me su MongoDB v3.4.7:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384

2
@Cerin Questo codice DID lavoro per me: db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])e che mi rende confuso. Non sono autorizzato ad eseguire un comando, eppure posso eseguire un comando per farmi root, quindi eseguire quel comando. Molto strano: S

2
per quelli in cui db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])non ha funzionato, assicurati di tornare a use admin... ha avuto lo stesso problema, una volta che sono tornato ha funzionato come un incantesimo
esko22

37

È un po 'confuso - credo che dovrai concederti readWrite per interrogare un database. Un utente con dbadmin o useradmin può amministrare il database (inclusa la concessione di diritti aggiuntivi) ma non può eseguire query o scrivere dati.

quindi concedi a te stesso di leggere e scrivere e dovresti stare bene -

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


Non sono sicuro che questa risposta sia pertinente alla domanda, ma in entrambi i casi fornisce informazioni errate. Il ruolo dbOwner include il ruolo readWrite: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Andy Triggs,

10
la risposta è corretta: i ruoli dbadmin e useradmin (che è ciò di cui ha chiesto il poster originale) non includono readWrite. Il dbOwner fa ma non è quello che il poster originale stava usando e chiedeva.
John Petrone,

3
Hai assolutamente ragione. Scuse. Avevo trascorso troppo tempo a contorcermi i ruoli ed ero confuso.
Andy Triggs,

Quindi puoi avere un utente amministratore per accedere al server mongodb effettivo e quindi avere altri per database specifici?
K - La tossicità in SO sta crescendo.

32

Forse un rapido esempio di come cambiare un utente corrente sarà utile a qualcuno. Questo è quello che stavo effettivamente cercando.

Seguendo i consigli di @JohnPetrone ho aggiunto il ruolo readWrite al mio utente amministratore con grantRolesToUser

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

26

Puoi provare: L'utilizzo del flag --authenticationDatabase aiuta.

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

8

So che questa risposta arriverà molto tardi in questa discussione, ma spero che tu la controlli.

Il motivo per cui si ottiene quell'errore si basa sul ruolo specifico che hai concesso all'utente, che ora hai raccolto, e sì dando a quell'utente il ruolo root risolverà il tuo problema, ma devi prima capire cosa fanno esattamente questi ruoli prima di concederli agli utenti.

Nel tutorial hai assegnato all'utente il userAdminAnyDatabaseruolo che in pratica dà all'utente la possibilità di gestire gli utenti di tutti i tuoi database. Quello che stavi cercando di fare con il tuo utente era al di fuori della sua definizione di ruolo.

Il rootruolo ha questo ruolo in esso contenute definizione così come il readWriteAnyDatabase,dbAdminAnyDatabase e altri ruoli che lo rende un superutente (fondamentalmente perché si può fare qualsiasi cosa con esso).

Puoi consultare le definizioni dei ruoli per vedere quali ruoli dovrai assegnare agli utenti per completare determinate attività. https://docs.mongodb.com/manual/reference/built-in-roles/ Non è consigliabile rendere super tutti i tuoi utenti :)


Quindi, se non root, quale ruolo suggerisci di risolvere il problema?
Hendy Irawan,

Ciao a tutti @HendyIrawan, ti suggerirei di decidere esattamente cosa vuoi che ciascuno dei tuoi utenti sia in grado di fare e di assegnare loro il ruolo che consente loro di fare solo quello. Ad esempio, se vuoi solo che un utente legga (che è quello con cui la domanda cerca di fare show collections) dovresti dargli quell'abilità e nient'altro roles: [ { role: "read", db: "admin" } ]. Si noti che il ruolo qui viene letto, questo è specifico del database e non si può fare altro che quello. Dai
el Punch

Quindi la risposta alla domanda qui (non "per esempio") è "leggi"?
Hendy Irawan,

Sì. Si noti che l'utente avrà solo la possibilità di leggere il db specificato.
el Punch,

2

È una domanda semplice

  1. È importante cambiare il db di destinazione NON admin.

usa il tuo DB

  1. controlla la tua autenticazione db entro

mostra agli utenti

  1. Se ottieni un {} oggetto vuoto, questa è la domanda. Devi solo digitare

db.createUser ({user: "yourUser", pwd: "password", ruoli: ["readWrite", "dbAdmin"]})

o

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


0

Ho avuto un problema simile qui in un ambiente Windows: ho installato Bitnami DreamFactory e installa anche un altro MongoDb che viene avviato all'avvio del sistema. Stavo eseguendo il mio MongoDbService (che è stato avviato senza errori) ma dopo aver perso molto tempo mi sono accorto che mi connettevo al servizio MongoDb di Bitnami. Per favore, dai un'occhiata se non c'è un'altra istanza di mongoDB in esecuzione sul tuo server.

In bocca al lupo!


2
Non so perché questa risposta sia stata declassata; questo è un suggerimento legittimo. Ad esempio, mi sono imbattuto in una console di gestione che eseguiva Tomcat sotto il cofano. Se avvii un server locale (di qualsiasi tipo) probabilmente controllerai se è in esecuzione provando a connetterti ad esso. Quella prima connessione avrà successo. Dovrai quindi lottare con il server "nascosto" prima di controllare i registri del tuo server e notare che il tuo server non è in grado di collegarsi alla porta desiderata.
Paul,

0

Inoltre, nota che se il tuo client shell mongo non riesce a connettersi correttamente a mongod all'istanza, puoi ricevere tali errori "Autorizzazione negata".

Assicurarsi che il client apra una connessione controllando la porta di connessione, ma anche che la porta mongodin uso non sia in uso. È possibile impostare una porta diversa utilizzando il --port <port>parametro sia nella shell che nel processo.


0

Ho avuto questo problema a causa del nome host nella mia bussola MongoDB che puntava invece ad admin per il mio progetto. Risolto aggiungendo il / projectname dopo il nome host :) Prova questo:

  1. Scegli il tuo progetto nel sito web dell'atlante MongoDB
  2. Connetti / Connetti con MongoDB Compass
  3. Scarica Compass / Scegli il tuo sistema operativo
  4. Ho usato Compass 1.12 o successivo
  5. Copia la stringa di connessione in Compass 1.12 o successive.
  6. Apri MongoDB Compass / Connetti (in alto a sinistra) / Connetti a
  7. Stringa di connessione rilevata / Sì /
  8. Aggiunge il nome del progetto, dopo l'hostname: cluster9-foodie.mongodb.net/ projectname
  9. Connetti e testato l'API con POSTMAN.
  10. Successo.

Usa la stessa stringa di connessione anche nel tuo codice:

  1. Prima:
    • mongodb + srv: // nome progetto : password @ cluster9-foodie.mongodb.net / admin
  2. Dopo:
    • MongoDB + SRV: // projectname: Password @ cluster9-foodie.mongodb.net / projectname

In bocca al lupo.


0

usa mydb
db.createUser ({user: "test", pwd: "secret", ruoli: ["readWrite", "dbAdmin"], passwordDigestor: "server"})


0

Concordato sul fatto che devi essere autenticato su admin db e hai bisogno almeno di un ruolo con i privilegi corretti che eviterebbero l'eccezione dell'host locale da DB (questo è per l'hosting locale di mongoDB), sebbene tu abbia tutto a posto e ancora ottenere eccezioni non autorizzate su quasi tutti i comandi, mentre si accede a mongoDB creato usando Mongo Atlas , quindi qui è il posto dove potresti conoscere il motivo, perché:

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

e controlla anche questo se hai ospitato mongoDB su 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" 
    ]
    }
    )

Grazie per questo frammento di codice, che potrebbe fornire un aiuto limitato a breve termine. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Si prega di modificare la risposta di aggiungere qualche spiegazione, tra le ipotesi che hai fatto.
Toby Speight,

0

Ho seguito questi passaggi su Centos 7 per MongoDB 4.2. (Utente remoto)

Aggiorna il file mongod.conf

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

Avvia il demone del servizio MongoDB

systemctl start mongod

Apri la shell MongoDB

mongo

Eseguire questo comando sulla shell

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

Utente root remoto è stato creato. Ora puoi testare questa connessione al database usando qualsiasi strumento della GUI MongoDB dalla tua macchina di sviluppo. Come Robo 3T


-10

Ciò può essere dovuto al fatto che non hai impostato noAuth = true in mongodb.conf

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

Dopo aver impostato questo riavvia il servizio utilizzando

riavvio del servizio mongod


1
L'utente afferma esplicitamente che desidera iniziare a utilizzare l'autorizzazione, quindi ha decommentato auth = true. Perché suggerisci di disabilitare l'autorizzazione!?
Alex 75

Suppongo che tu non abbia letto il problema ... OP vuole auth, una combinazione di risposta di s-hunter per l'impostazione dell'utente e jremi per la connessione a una configurazione personalizzata
ChrisN,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.