Jak zabezpieczyć MongoDB za pomocą nazwy użytkownika i hasła


376

Chcę skonfigurować uwierzytelnianie nazwy użytkownika i hasła dla mojej instancji MongoDB, aby każdy zdalny dostęp poprosił o podanie nazwy użytkownika i hasła. Wypróbowałem samouczek ze strony MongoDB i wykonałem następujące czynności:

use admin
db.addUser('theadmin', '12345');
db.auth('theadmin','12345');

Potem wyszedłem i znów poprowadziłem mongo. I nie potrzebuję hasła, aby uzyskać do niego dostęp. Nawet jeśli zdalnie połączę się z bazą danych, nie pojawi się monit o podanie nazwy użytkownika i hasła.


AKTUALIZACJA Oto rozwiązanie, z którego ostatecznie skorzystałem

1) At the mongo command line, set the administrator:

    use admin;
    db.addUser('admin','123456');

2) Shutdown the server and exit

    db.shutdownServer();
    exit

3) Restart mongod with --auth

  $ sudo ./mongodb/bin/mongod --auth --dbpath /mnt/db/

4) Run mongo again in 2 ways:

   i) run mongo first then login:

        $ ./mongodb/bin/mongo localhost:27017
        use admin
        db.auth('admin','123456');

  ii) run & login to mongo in command line.

        $ ./mongodb/bin/mongo localhost:27017/admin -u admin -p 123456

Nazwa użytkownika i hasło będą działać w ten sam sposób dla mongodumpi mongoexport.


4
to dla MongDB w wersji 2.2.x
Tom Imrei

22
W Mongo 3.0.4 komendą do utworzenia użytkownika jest db.createUser () .
chronologos

4
Postępuj zgodnie z tym, aby utworzyć administratora w Mongodb 3.0 docs.mongodb.org/v3.0/tutorial/add-user-administrator
Sul Aga


1
Żeby było jasne, nie szyfruje to bajtów przechodzących przez drut. Służy wyłącznie do kontroli dostępu.
Daniel F

Odpowiedzi:


117

Musisz zacząć mongodod --authopcji po skonfigurowaniu użytkownika.

Ze strony MongoDB:

Uruchom bazę danych (proces mongod) z --authopcją włączenia zabezpieczeń. Musisz dodać użytkownika do bazy danych administratora przed uruchomieniem serwera --authlub dodać pierwszego użytkownika z interfejsu localhost.

Uwierzytelnianie MongoDB


1
Próbowałem tego i poszedłem za przykładem. teraz .. mogę to ustawić po ponownym uruchomieniu serwera za pomocą --auth. Jednak gdy próbuję się zalogować (./mongo -u theadmin -p 12345) nie udaje mi się. Nie mogę się zalogować
murvinlai

Jeśli po tym nie możesz się połączyć, to dlatego, że próbujesz połączyć się z adminbazą danych, użyj innej bazy danych i spróbuj ponownie. Tylko użytkownik UserAdmin (AnyDatabase) może się połączyć admin.
Vadorequest,

80

Wow, tutaj jest tyle skomplikowanych / mylących odpowiedzi.

To jest od wersji 3.4 .

Krótka odpowiedź.

1) Uruchom MongoDB bez kontroli dostępu.

mongod --dbpath /data/db

2) Połącz się z instancją.

mongo

3) Utwórz użytkownika.

use some_db
db.createUser(
  {
    user: "myNormalUser",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "some_db" },
             { role: "read", db: "some_other_db" } ]
  }
)

4) Zatrzymaj instancję MongoDB i uruchom ją ponownie z kontrolą dostępu.

mongod --auth --dbpath /data/db

5) Połącz się i uwierzytelnij jako użytkownik.

use some_db
db.auth("myNormalUser", "xyz123")
db.foo.insert({x:1})
use some_other_db
db.foo.find({})

Długa odpowiedź: przeczytaj to, jeśli chcesz poprawnie zrozumieć.

To jest naprawdę proste. Omówię poniższe https://docs.mongodb.com/manual/tutorial/enable-authentication/

Jeśli chcesz dowiedzieć się więcej o tym, czym właściwie są role, przeczytaj więcej tutaj: https://docs.mongodb.com/manual/reference/built-in-roles/

1) Uruchom MongoDB bez kontroli dostępu.

mongod --dbpath /data/db

2) Połącz się z instancją.

mongo

3) Utwórz administratora użytkownika. Poniżej utworzono administratora użytkownika w adminbazie danych uwierzytelniania. Użytkownik jest dbOwnerponad some_dbbazą danych, a NIE ponad adminbazą danych, o czym należy pamiętać.

use admin
db.createUser(
  {
    user: "myDbOwner",
    pwd: "abc123",
    roles: [ { role: "dbOwner", db: "some_db" } ]
  }
)

Lub jeśli chcesz utworzyć administratora, który jest administratorem w dowolnej bazie danych:

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

4) Zatrzymaj instancję MongoDB i uruchom ją ponownie z kontrolą dostępu.

mongod --auth --dbpath /data/db

5) Połącz się i uwierzytelnij jako administrator użytkownika względem adminbazy danych uwierzytelniania, a NIE względem some_dbbazy danych uwierzytelniania. Administrator użytkownika został utworzony w adminbazie danych uwierzytelniania, użytkownik nie istnieje w some_dbbazie danych uwierzytelniania.

use admin
db.auth("myDbOwner", "abc123")

Jesteś teraz uwierzytelnione jako dbOwnernad some_dbbazą danych. Więc teraz, jeśli chcesz czytać / pisać / robić rzeczy bezpośrednio w some_dbbazie danych, możesz na nią przejść.

use some_db
//...do stuff like db.foo.insert({x:1})
// remember that the user administrator had dbOwner rights so the user may write/read, if you create a user with userAdmin they will not be able to read/write for example.

Więcej na temat ról: https://docs.mongodb.com/manual/reference/built-in-roles/

Jeśli chcesz utworzyć dodatkowych użytkowników, którzy nie są administratorami użytkowników i którzy są zwykłymi użytkownikami, czytaj dalej.

6) Utwórz normalnego użytkownika. Ten użytkownik zostanie utworzony w some_dbbazie danych uwierzytelniania poniżej.

use some_db
db.createUser(
  {
    user: "myNormalUser",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "some_db" },
             { role: "read", db: "some_other_db" } ]
  }
)

7) Wyjdź z powłoki mongo, podłącz ponownie, uwierzytelnij się jako użytkownik.

use some_db
db.auth("myNormalUser", "xyz123")
db.foo.insert({x:1})
use some_other_db
db.foo.find({})

2
Wreszcie mam pomysł, co się naprawdę dzieje.
rozpoczęło się


3
Uważam, że chciałbym, aby zaakceptowane odpowiedzi mogły zostać odświeżone na SO. Jest to najistotniejsze rozwiązanie na lipiec 2017 r.
Azatar,

1
Zaktualizuj swoją odpowiedź! Nie wiem, skąd masz userAdminAnyDatabase, ale to nie działa. Rola jest korzeń dla administratora dostępem nad wszystkimi DBS.
Aakash Verma

@AakashVerma docs.mongodb.com/manual/reference/built-in-roles/… ;) NIGDY NIE UŻYWAJ ROOT, chyba że do celów programistycznych, w których wiesz, że nie możesz zostać narażony na szwank! (tbh po prostu nigdy nie używaj root lol)
K - Toksyczność w SO rośnie.

63

Najpierw usuń komentarz z linii zaczynającej się #auth=truew pliku konfiguracyjnym mongod (domyślna ścieżka /etc/mongo.conf). Umożliwi to uwierzytelnianie dla mongodb.

Następnie uruchom ponownie mongodb: sudo service mongod restart


10
domyślna ścieżka /etc/mongod.confnie/etc/mongo.conf
Mithril,

2
lub najpierw odkomentuj, a następnie uruchom ponownie :)))
GioMac

2
Aktualizacja: Teraz ponownie uruchom usługę za pomocą: sudo service mongodb restart
sharafjaffri

Lokalizacja i nazwa pliku konfiguracyjnego to: /etc/mongodb.conf
HGMamaci

46

Ta odpowiedź dotyczy podręcznika Mongo 3.2.1

Terminal 1:

$ mongod --auth

Terminal 2:

db.createUser({user:"admin_name", pwd:"1234",roles:["readWrite","dbAdmin"]})

jeśli chcesz dodać bez ról (opcjonalnie):

db.createUser({user:"admin_name", pwd:"1234", roles:[]})

aby sprawdzić, czy jest uwierzytelniony czy nie:

db.auth("admin_name", "1234")

powinno dać ci:

1

inaczej:

Error: Authentication failed.
0

2
starsze wersje, takie jak 2.4, używałyby db.addUser
arviman

Musiałem pisać use adminwcześniej, w createUserprzeciwnym razie wystąpił błąd.
Guillaume F.,

28

Oto kod javascript, aby dodać użytkowników.

  1. Zacznij mongodod--auth = true

  2. Uzyskaj dostęp do bazy danych administratora z powłoki mongo i przekaż plik javascript.

    mongo admin „Filename.js”

    „Nazwa pliku.js”

    // Adding admin user
    db.addUser("admin_username", " admin_password");
    // Authenticate admin user
    db.auth("admin_username ", " admin_password ");
    // use  database code from java script
    db = db.getSiblingDB("newDatabase");
    // Adding newDatabase database user  
    db.addUser("database_username ", " database_ password ");
  3. Po dodaniu użytkownika możemy zweryfikować dostęp do bazy danych z powłoki mongo


1
Ustawienie nazwy użytkownika i hasła w pliku nie wygląda na bardzo bezpieczne.
Odkrywanie

JavaScript. Nie „skrypt Java”.
Camilo Martin

jaki jest cel pliku javascript tutaj?
Ravi

@CamiloMartin JavaScript, a nie „JavaScript”.
Madbreaks


10

Najpierw uruchom mongoDB na terminalu, używając

mongod

teraz uruchom powłokę mongo, użyj następujących poleceń

    use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

Uruchom ponownie instancję MongoDB z kontrolą dostępu.

mongod --auth

Teraz uwierzytelnij się przy użyciu wiersza polecenia

mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

Przeczytałem to z

https://docs.mongodb.com/manual/tutorial/enable-authentication/


1
zdefiniowałem użytkownika z rootem, a następnie MongoDB Enterprise > db.system.users.find() { "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SC RAM-SHA-1" : { "iterationCount" : 10000, "salt" : "k96PCEflidMY5seVju+gAw==", "s toredKey" : "CabQTnJtny7cv0wT5X8oX9QOn3A=", "serverKey" : "RJyCdnlIhyIfj2+d44L61 bYK+MU=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" }, { "role" : "dbAdmin", "db" : "admin" }, { "role" : "userAdmin", "db" : "admin" }, { "role" : "root", "db" : "admin" } ] }
dodawałem

użyłem nawet db.changeUserPassword (), lub jakiejkolwiek innej rzeczy, nawet po tym, gdy wywołuję db.auth („admin”, „moja przepustka”) lub sposób, w jaki to zrobiłeś, oznacza to, że uwierzytelnienie nie powiodło się dla administratora użytkownika
deadManN

Użyj rootroli, aby zapewnić dostęp do operacji i wszystkich zasobów następujących ról łącznie ... rola root
Laode Muhammad Al Fatih

8

Oto, co zrobiłem na Ubuntu 18.04:

$ sudo apt install mongodb
$ mongo
> show dbs
> use admin
> db.createUser({  user: "root",  pwd: "rootpw",  roles: [ "root" ]  })  // root user can do anything
> use lefa
> db.lefa.save( {name:"test"} )
> db.lefa.find()
> show dbs
> db.createUser({  user: "lefa",  pwd: "lefapw",  roles: [ { role: "dbOwner", db: "lefa" } ]  }) // admin of a db
> exit
$ sudo vim /etc/mongodb.conf
auth = true
$ sudo systemctl restart mongodb
$ mongo -u "root" -p "rootpw" --authenticationDatabase  "admin"
> use admin
> exit
$ mongo -u "lefa" -p "lefapw" --authenticationDatabase  "lefa"
> use lefa
> exit

8

Mógłbyś się zmienić /etc/mongod.conf .

Przed

#security:

Po

security:
    authorization: "enabled"

Następnie sudo service mongod restart


5

Wykonaj kolejno poniższe kroki

  • Utwórz użytkownika za pomocą CLI
use admin
db.createUser(
  {
    user: "admin",
    pwd: "admin123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)
  • Włącz uwierzytelnianie, jak to zrobić różni się w zależności od systemu operacyjnego, jeśli używasz systemu Windows, możesz po prostu mongod --authw przypadku Linuksa możesz edytować /etc/mongod.confplik, aby dodaćsecurity.authorization : enabled a następnie ponownie uruchomić usługę mongd
  • Aby połączyć przez cli mongo -u "admin" -p "admin123" --authenticationDatabase "admin". Otóż ​​to

Możesz sprawdzić ten post, aby uzyskać więcej informacji i nauczyć się łączenia z nim za pomocą mangusty.


4

Tworzenie użytkownika z hasłem do określonej bazy danych w celu zabezpieczenia dostępu do bazy danych:

use dbName

db.createUser(
   {
     user: "dbUser",
     pwd: "dbPassword",
     roles: [ "readWrite", "dbAdmin" ]
   }
)


3

Te kroki działały na mnie:

  1. napisz mongod --port 27017 na cmd
  2. następnie połącz się z powłoką mongo: mongo --port 27017
  3. utwórz użytkownika admin: użyj admin db.createUser ({użytkownik: „myUserAdmin”, pwd: „abc123”, role: [{rola: „userAdminAnyDatabase”, db: „admin”}]})
  4. odłączyć skorupę mangową
  5. uruchom ponownie mongodb: mongod --auth --port 27017
  6. uruchom powłokę mongo: mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
  7. Aby uwierzytelnić się po połączeniu, Połącz powłokę mongo z mongod: mongo --port 27017
  8. przejdź do bazy danych uwierzytelniania: użyj admin db.auth („myUserAdmin”, „abc123”

3

Najlepsza praktyka łączenia się z mongoDB w następujący sposób:

  1. Po pierwszej instalacji

    use admin

  2. Następnie uruchom następujący skrypt, aby utworzyć użytkownika administratora

    db.createUser( { user: "YourUserName", pwd: "YourPassword", roles: [ { role: "userAdminAnyDatabase", db: "admin" }, { role: "readWriteAnyDatabase", db: "admin" }, { role: "dbAdminAnyDatabase", db: "admin" }, { role: "clusterAdmin", db: "admin" } ] })

poniższy skrypt utworzy użytkownika administratora dla bazy danych.

  1. zaloguj się do db.admin za pomocą

    mongo -u YourUserName -p YourPassword admin

  2. Po zalogowaniu możesz utworzyć numer N bazy danych z tym samym poświadczeniem administratora lub innym, powtarzając 1 do 3.

Dzięki temu możesz utworzyć innego użytkownika i hasło dla innej kolekcji, którą tworzysz w MongoDB


potem przejdź do sudo nano /etc/mongod.conf i wstaw tę linię security.authorization: włączone, możesz zobaczyć odnośnik tutaj: stackoverflow.com/a/57384027/3904109
DragonFire

2

po utworzeniu nowego użytkownika nie zapomnij o grant read/write/rootpozwoleniu dla użytkownika. możesz spróbować

cmd: db.grantRolesToUser('yourNewUsername',[{ role: "root", db: "admin" }])

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.