如何使用用户名和密码保护MongoDB


376

我想为我的MongoDB实例设置用户名和密码身份验证,以便任何远程访问都将要求输入用户名和密码。我从MongoDB网站尝试了该教程,并做了以下工作:

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

之后,我退出并再次运行mongo。而且我不需要密码即可访问它。即使我远程连接到数据库,也不会提示我输入用户名和密码。


更新这是我最终使用的解决方案

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的
汤姆Imrei

22
在Mongo 3.0.4中,用于创建用户的命令是db.createUser()
chronologos

4
请遵循此步骤在Mongodb 3.0上创建管理员用户docs.mongodb.org/v3.0/tutorial/add-user-administrator
Sul Aga


1
只是要清楚一点,这不会加密通过网络的字节。仅用于访问控制。
Daniel F

Answers:


117

设置用户后,您需要从mongod--auth选项开始。

从MongoDB网站:

运行带有--auth启用安全性选项的数据库(mongod进程)。您必须使用来启动服务器之前将用户添加到admin数据库中--auth,或者必须从localhost接口添加第一个用户。

MongoDB身份验证


1
我已经尝试过并遵循示例。现在..我可以使用--auth重新启动服务器后进行设置。但是,当我尝试登录(./mongo -u theadmin -p 12345)时,我失败了。我无法登录。
murvinlai 2011年

如果这样做之后您无法连接,那是因为您尝试连接admin数据库,请使用另一个数据库,然后重试。只有userAdmin(AnyDatabase)可以连接admin
Vadorequest 2014年

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身份验证数据库中创建一个用户管理员。用户是数据库管理员dbOwnersome_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)退出mongo shell,重新连接,以用户身份验证。

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

2
最终我知道了到底发生了什么。


3
我发现自己希望被接受的答案能够在SO上得到更新。截至2017
。–阿扎尔(Azatar)

1
请更新您的答案!我不知道您从哪里获得userAdminAnyDatabase,但是它不起作用。该角色是根目录,用于所有数据库的管理员访问。
Aakash Verma

@ AakashVermadocs.mongodb.com / manual/ reference / built-in- roles/… ;)也不要使用ROOT,除非出于开发目的,您知道自己不会受到损害!(tbh永远不要使用root大声笑)
K-SO的毒性在增加。

63

首先,取消注释#auth=truemongod配置文件(默认路径/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

该答案适用于Mongo 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 admincreateUser否则会出现错误。
Guillaume F.

28

这是添加用户的JavaScript代码。

  1. 开始mongod使用--auth = true

  2. 从mongo shell访问管理数据库并传递javascript文件。

    mongo管理员“ 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. 现在用户添加完成,我们可以验证从mongo shell访问数据库


1
在文件中设置用户名和密码看起来不太安全。
2014年

Javascript。不是“ java脚本”。
卡米洛·马丁

javascript文件在这里的目的是什么?
拉维

@CamiloMartin JavaScript,而不是“ Javascript”。
疯狂


10

首先在终端上使用运行mongoDB

mongod

现在运行mongo shell使用以下命令

    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
我用root定义了一个用户,然后添加越来越多,直到找到您为止,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','my pass')或您执行的方式时,它说用户admin的身份验证失败
deadManN

使用root角色提供对以下角色的操作和所有资源的组合访问... 角色根
Laode Muhammad Al Fatih

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" ]
  }
)
  • 启用身份验证,mongod --auth具体操作因操作系统而异,如果您使用的是Windows,则可以简单地在Linux下编辑/etc/mongod.conf文件以添加security.authorization : enabled并重新启动Mongd服务
  • 通过cli连接mongo -u "admin" -p "admin123" --authenticationDatabase "admin"。而已

您可以查看这篇文章以了解更多详细信息,并学习使用mongoose连接到它的方法。




3

这些步骤对我有效:

  1. 在cmd上写mongod --port 27017
  2. 然后连接到mongo shell:mongo --port 27017
  3. 创建用户admin:使用admin db.createUser({user:“ myUserAdmin”,pwd:“ abc123”,角色:[{角色:“ userAdminAnyDatabase”,db:“ admin”}]})
  4. 断开mongo shell
  5. 重新启动mongodb:mongod --auth --port 27017
  6. 启动mongo shell:mongo --port 27017 -u“ myUserAdmin” -p“ abc123” --authenticationDatabase“ admin”
  7. 要在连接后进行身份验证,请将mongo shell连接到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. 登录后,通过重复1到3,可以创建N个具有相同管理员凭据或不同管理员凭据的数据库。

这允许您为在MongoDB中创建的不同集合创建不同的用户和密码。


之后,转到sudo nano /etc/mongod.conf并将此行设置为security.authorization:已启用,您可以在此处查看参考链接:stackoverflow.com/a/57384027/3904109
DragonFire

2

创建新用户后,请不要忘记grant read/write/root授予用户权限。你可以试试

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.