关于身份验证:如何使用用户名和密码保护MongoDB

How to secure MongoDB with username and password

我想为我的MongoDB实例设置用户名和密码验证,以便任何远程访问都会要求输入用户名和密码。 我尝试了MongoDB网站上的教程并做了以下事情:

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

用户名和密码对mongodumpmongoexport的工作方式相同。


设置用户后,需要使用--auth选项启动mongod

来自MongoDB网站:

Run the database (mongod process) with the --auth option to enable
security. You must either have added a user to the admin db before
starting the server with --auth, or add the first user from the
localhost interface.

MongoDB身份验证


哇这里有很多复杂/混乱的答案。

这是v3.4的一部分。

简短的回答。

1)启动没有访问控制的MongoDB。

1
mongod --dbpath /data/db

2)连接到实例。

1
mongo

3)创建用户。

1
2
3
4
5
6
7
8
9
use some_db
db.createUser(
  {
    user:"myNormalUser",
    pwd:"xyz123",
    roles: [ { role:"readWrite", db:"some_db" },
             { role:"read", db:"some_other_db" } ]
  }
)

4)停止MongoDB实例并使用访问控制再次启动它。

1
mongod --auth --dbpath /data/db

5)以用户身份连接并进行身份验证。

1
2
3
4
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。

1
mongod --dbpath /data/db

2)连接到实例。

1
mongo

3)创建用户管理员。以下内容在admin身份验证数据库中创建用户管理员。用户是dbOwner数据库上的dbOwner而不是admin数据库,这一点很重要。

1
2
3
4
5
6
7
8
use admin
db.createUser(
  {
    user:"myDbOwner",
    pwd:"abc123",
    roles: [ { role:"dbOwner", db:"some_db" } ]
  }
)

或者,如果您要创建一个管理员管理任何数据库:

1
2
3
4
5
6
7
8
use admin
db.createUser(
  {
    user:"myUserAdmin",
    pwd:"abc123",
    roles: [ { role:"userAdminAnyDatabase", db:"admin" } ]
  }
)

4)停止MongoDB实例并使用访问控制再次启动它。

1
mongod --auth --dbpath /data/db

5)以admin认证数据库的用户管理员身份进行连接和身份验证,而不是some_db身份验证数据库。用户管理员是在admin身份验证数据库中创建的,该用户不存在于some_db身份验证数据库中。

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

您现在通过some_db数据库身份验证为dbOwner。所以现在如果您希望直接读取/写入/执行some_db数据库的内容,您可以更改它。

1
2
3
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身份验证数据库中创建。

1
2
3
4
5
6
7
8
9
use some_db
db.createUser(
  {
    user:"myNormalUser",
    pwd:"xyz123",
    roles: [ { role:"readWrite", db:"some_db" },
             { role:"read", db:"some_other_db" } ]
  }
)

7)退出mongo shell,重新连接,以用户身份进行身份验证。

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


首先,取消注释mongod配置文件中以#auth=true开头的行(默认路径/etc/mongo.conf)。这将启用mongodb的身份验证。

然后,重启mongodb:sudo service mongod restart


这个答案适用于Mongo 3.2.1
参考

1号航站楼:

1
$ mongod --auth

2号航站楼:

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

如果你想添加没有角色(可选):

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

检查是否经过身份验证:

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

它应该给你:

1
1

否则:

1
2
Error: Authentication failed.
0


这是一个添加用户的JavaScript代码。

  • --auth = true开始mongod

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

    mongo admin"Filename.js"

    "Filename.js"

    1
    2
    3
    4
    5
    6
    7
    8
    // 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");
  • 现在用户添加完成,我们可以验证从mongo shell访问数据库


  • https://docs.mongodb.com/manual/reference/configuration-options/#security.authorization

    编辑mongo设置文件;

    1
    sudo nano /etc/mongod.conf

    添加行:

    1
    security.authorization : enabled

    重启服务

    1
    sudo service mongod restart

    问候


    首先使用终端在终端上运行mongoDB

    1
    mongod

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

    1
    2
    3
    4
    5
    6
    7
    8
        use admin
    db.createUser(
      {
        user:"myUserAdmin",
        pwd:"abc123",
        roles: [ { role:"userAdminAnyDatabase", db:"admin" } ]
      }
    )

    使用访问控制重新启动MongoDB实例。

    1
    mongod --auth

    现在使用命令行验证自己

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

    我是从中读到的

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


    按顺序执行以下步骤

    • 使用CLI创建用户
    1
    2
    3
    4
    5
    6
    7
    8
    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连接它。


    使用特定数据库的密码创建用户以保护数据库访问:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    use dbName

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

    您需要切换到您希望用户使用的数据库(而不是admin db)...

    use mydatabase

    有关更多帮助,请参阅此帖子... https://web.archive.org/web/20140316031938/http://learnmongo.com/posts/quick-tip-mongodb-users/


    这些步骤对我有用:

  • 在cmd上写mongod --port 27017
  • 然后连接到mongo shell:mongo --port 27017
  • 创建用户admin:
    使用管理员
    db.createUser(
    {
    user:"myUserAdmin",
    pwd:"abc123",
    角色:[{role:"userAdminAnyDatabase",db:"admin"}]
    }
    )
  • 断开mongo shell
  • 重启mongodb:mongod --auth --port 27017
  • 启动mongo shell:
    mongo --port 27017 -u"myUserAdmin"-p"abc123"--authenticationDatabase"admin"
  • 要在连接后进行身份验证,请将mongo shell连接到mongod:
    mongo --port 27017
  • 切换到身份验证数据库:
    使用管理员
    db.auth("myUserAdmin","abc123"

  • 这就是我在Ubuntu 18.04上所做的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $ 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

    连接到mongoDB的最佳实践如下:

  • 初次安装后,

    use admin

  • 然后运行以下脚本以创建管理员用户

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

  • 以下脚本将为DB创建admin用户。

  • 使用登录到db.admin

    mongo -u YourUserName -p YourPassword admin

  • 登录后,您可以通过重复1到3来创建具有相同管理员凭证或不同的N个数据库。

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


    创建新用户后,请不要忘记对用户的grant read/write/root权限。你可以尝试一下

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