Как обезопасить MongoDB с помощью имени пользователя и пароля


377

Я хочу настроить аутентификацию имени пользователя и пароля для моего экземпляра MongoDB, чтобы при любом удаленном доступе запрашивались имя пользователя и пароль. Я попробовал учебник с сайта MongoDB и сделал следующее:

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

После этого я вышел и снова побежал монго. И мне не нужен пароль для доступа к нему. Даже если я подключаюсь к базе данных удаленно, у меня не запрашивается имя пользователя и пароль.


ОБНОВЛЕНИЕ Вот решение, которое я в конечном итоге использовал

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

Имя пользователя и пароль будут работать одинаково для mongodumpи mongoexport.


4
это для MongDB версии 2.2.x
Том Имрей

23
В Mongo 3.0.4 команда для создания пользователя - db.createUser () .
хронолог

4
Пожалуйста, следуйте этому при создании пользователя-администратора на Mongodb 3.0 docs.mongodb.org/v3.0/tutorial/add-user-administrator
Сул Ага


1
Просто чтобы быть ясно, это не шифрует байты, которые проходят по проводам. Это только для контроля доступа.
Даниэль Ф

Ответы:


118

Вам нужно начать mongodс этой --authопции после настройки пользователя.

С сайта MongoDB:

Запустите базу данных (процесс mongod) с --authопцией включения безопасности. Вы должны либо добавить пользователя в базу данных администратора перед запуском сервера --auth, либо добавить первого пользователя из интерфейса localhost.

MongoDB аутентификация


1
Я попробовал это и последовал примеру. сейчас .. я могу установить его после перезапуска сервера с параметром --auth. Однако, когда я пытаюсь войти в систему (./mongo -u theadmin -p 12345), у меня не получается. Я не могу войти
Мурвинлай

Если после этого вы не можете подключиться, это потому, что вы пытаетесь подключиться к adminБД, используйте другой БД и попробуйте снова. Только userAdmin (AnyDatabase) может подключиться к admin.
Vadorequest

80

Ух ты так много сложных / запутанных ответов здесь.

Это по состоянию на v3.4 .

Короткий ответ.

1) Запустите MongoDB без контроля доступа.

mongod --dbpath /data/db

2) Подключиться к экземпляру.

mongo

3) Создать пользователя.

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

4) Остановите экземпляр MongoDB и запустите его снова с контролем доступа.

mongod --auth --dbpath /data/db

5) Подключитесь и авторизуйтесь как пользователь.

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

Длинный ответ: прочитайте это, если хотите правильно понять.

Это действительно просто. Я буду тупить следующее вниз https://docs.mongodb.com/manual/tutorial/enable-authentication/

Если вы хотите узнать больше о ролях, читайте здесь: https://docs.mongodb.com/manual/reference/built-in-roles/

1) Запустите MongoDB без контроля доступа.

mongod --dbpath /data/db

2) Подключиться к экземпляру.

mongo

3) Создать пользователя-администратора. Далее создается администратор пользователя в adminбазе данных аутентификации. Пользователь находится dbOwnerнад some_dbбазой данных, а НЕ над adminбазой данных, это важно помнить.

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

Или, если вы хотите создать администратора, который является администратором для любой базы данных:

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

4) Остановите экземпляр MongoDB и запустите его снова с контролем доступа.

mongod --auth --dbpath /data/db

5) Подключитесь и аутентифицируйтесь как администратор пользователя к adminбазе данных аутентификации, а НЕ к some_dbбазе данных аутентификации. Администратор пользователя был создан в adminбазе данных аутентификации, пользователь не существует в some_dbбазе данных аутентификации.

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

Вы теперь аутентифицированы как dbOwnerнад some_dbбазой данных. Так что теперь, если вы хотите читать / писать / делать что-то прямо в some_dbбазе данных, вы можете перейти на нее.

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.

Подробнее о ролях: https://docs.mongodb.com/manual/reference/built-in-roles/

Если вы хотите создать дополнительных пользователей, которые не являются администраторами пользователей и являются обычными пользователями, продолжайте чтение ниже.

6) Создать нормального пользователя. Этот пользователь будет создан в some_dbбазе данных аутентификации внизу.

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

7) Выйдите из оболочки Монго, заново подключитесь, авторизуйтесь как пользователь.

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

2
Наконец я понял, что на самом деле происходит.
mestarted


3
Я чувствую, что хочу, чтобы принятые ответы могли обновляться на SO. Это наиболее актуальное решение по состоянию на июль 2017 года.
азатар

1
Пожалуйста, обновите свой ответ! Я не знаю, откуда вы взяли userAdminAnyDatabase, но он не работает. Роль root для доступа администратора через все базы данных.
Аакаш Верма

@AakashVerma docs.mongodb.com/manual/reference/built-in-roles/… ;) Также НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ROOT, кроме случаев, когда вы знаете, что не можете быть скомпрометированы! (просто никогда не используйте root lol)
K - Токсичность в SO растет.

63

Во-первых, откомментируйте строку, которая начинается #auth=trueв вашем файле конфигурации mongod (путь по умолчанию /etc/mongo.conf). Это включит аутентификацию для mongodb.

Затем перезапустите mongodb: sudo service mongod restart


10
путь по умолчанию /etc/mongod.confне/etc/mongo.conf
Mithril

2
или, сначала раскомментируйте, затем перезапустите :)))
GioMac

2
Обновление: теперь перезапустите сервис с помощью: sudo service mongodb restart
sharafjaffri

Расположение файла конфигурации и имя: /etc/mongodb.conf
HGMamaci

46

Этот ответ для Монго 3.2.1 Ссылка

Терминал 1:

$ mongod --auth

Терминал 2:

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

если вы хотите добавить без ролей (необязательно):

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

проверить подлинность или нет:

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

это должно дать вам:

1

еще:

Error: Authentication failed.
0

2
более старые версии, такие как 2.4, будут использовать db.addUser
arviman

Я должен был печатать use adminраньше, createUserиначе это дало ошибку.
Гийом Ф.

28

Вот код JavaScript для добавления пользователей.

  1. Начать mongodс--auth = true

  2. Получите доступ к базе данных администратора из оболочки mongo и передайте файл javascript.

    Монго админ "Filename.js"

    "Filename.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. Теперь добавление пользователя завершено, мы можем проверить доступ к базе данных из оболочки Монго


1
Установка имени пользователя и пароля в файле выглядит не очень безопасно.
Изучение

Javascript. Не "сценарий Java".
Камило Мартин

Какова цель файла JavaScript здесь?
Рави

@CamiloMartin JavaScript, а не «Javascript».
Madbreaks


10

Сначала запустите mongoDB на терминале, используя

mongod

Теперь запустите оболочку Монго, используя следующие команды

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

Перезапустите экземпляр MongoDB с контролем доступа.

mongod --auth

Теперь аутентифицируйтесь из командной строки, используя

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

Я прочитал это от

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


1
я определил пользователя с правами суперпользователя, затем добавляю еще и еще, пока не найду вас, 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" } ] }аутентификация все еще не проходит
deadManN

я даже использовал db.changeUserPassword (), или что-то еще, даже после этого, когда я вызываю db.auth («admin», «мой проход») или как вы это сделали, он говорит, что аутентификация не выполнена для пользователя admin
DeadManN

Используйте rootроль, чтобы обеспечить доступ к операциям и всем ресурсам следующих ролей вместе ... роли корня
Лаод Мухаммед Аль Фатих

8

Вот что я сделал на 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

Вы можете изменить /etc/mongod.conf.

Перед

#security:

После

security:
    authorization: "enabled"

затем sudo service mongod restart


5

Выполните следующие шаги в порядке

  • Создайте пользователя с помощью CLI
use admin
db.createUser(
  {
    user: "admin",
    pwd: "admin123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)
  • Включите аутентификацию, чем она отличается, в зависимости от вашей ОС, если вы используете Windows, вы можете просто, mongod --authв случае Linux, вы можете отредактировать /etc/mongod.confфайл, чтобы добавить, security.authorization : enabledа затем перезапустить службу Mongd.
  • Для подключения через Cli mongo -u "admin" -p "admin123" --authenticationDatabase "admin". это оно

Вы можете проверить этот пост, чтобы углубиться в детали и научиться подключаться к нему с помощью mongoose.


4

Создание пользователя с паролем для конкретной базы данных для безопасного доступа к базе данных:

use dbName

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

4

Вам нужно будет переключиться на базу данных, к которой вы хотите подключить пользователя (не на базу данных администратора) ...

use mydatabase

См. Этот пост для получения дополнительной помощи ... https://web.archive.org/web/20140316031938/http://learnmongo.com/posts/quick-tip-mongodb-users/


не нужно, потому что настройка db = db.getSiblingDB ("newDatabase");
Озан БАЙРАМ

3

Эти шаги работали на меня:

  1. напишите mongod --port 27017 на cmd
  2. затем подключитесь к оболочке mongo: mongo --port 27017
  3. создать пользователя admin: использовать admin db.createUser ({пользователь: "myUserAdmin", pwd: "abc123", роли: [{role: "userAdminAnyDatabase", db: "admin"}]})
  4. отключить оболочку монго
  5. перезапустите mongodb: mongod --auth --port 27017
  6. запустить оболочку монго: mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
  7. Для аутентификации после подключения, подключите оболочку mongo к mongod: mongo --port 27017
  8. переключитесь на базу данных аутентификации: используйте admin db.auth ("myUserAdmin", "abc123"

3

Лучшая практика для подключения к mongoDB:

  1. После первоначальной установки,

    use admin

  2. Затем запустите следующий скрипт, чтобы создать администратора

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

следующий скрипт создаст администратора для БД.

  1. войти в db.admin используя

    mongo -u YourUserName -p YourPassword admin

  2. После входа в систему, вы можете создать N номер базы данных с одинаковыми учетными данными администратора или другой, повторив от 1 до 3.

Это позволяет вам создать другого пользователя и пароль для другой коллекции, которую вы создаете в MongoDB


после этого перейдите в sudo nano /etc/mongod.conf и включите эту строку security.authorization: enabled, вы можете увидеть ссылку здесь: stackoverflow.com/a/57384027/3904109
DragonFire

2

после того, как вы создадите нового пользователя, пожалуйста, не забудьте grant read/write/rootразрешить пользователю. Вы можете попробовать

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.