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

442

我想为我的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

对于 mongodumpmongoexport,用户名和密码的使用方式是相同的。


4
这是针对MongoDB版本2.2.x的内容。 - Tom Imrei
31
在 MongoDB 3.0.4 中创建用户的命令是 db.createUser() - chronologos
4
请按照以下步骤在Mongodb 3.0上创建管理员用户:https://docs.mongodb.org/v3.0/tutorial/add-user-administrator/ - Sul Aga
3
MongoDB 3.0之后的更新:如何在MongoDB 3.0中设置身份验证 - Dan Dascalescu
2
只是为了明确起见,这并不加密通过网络传输的字节。它仅用于访问控制。 - Daniel F
我不得不使用 service mongod restart 而不是 ./mongodb/bin/mongod - user124384
20个回答

140

在设置用户之后,您需要带有--auth选项启动mongod

来自MongoDB网站:

  

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

MongoDB身份验证


1
我已经尝试过并按照示例操作了。现在,我可以在使用--auth重启服务器后进行设置。然而,当我尝试登录(./mongo -u theadmin -p 12345)时,我失败了。我无法登录。 - murvinlai
如果您尝试连接admin数据库后仍然无法连接,那是因为只有一个userAdmin(AnyDatabase)才能在admin上连接。请使用另一个数据库并重试。 - Vadorequest

137

哇,这里有很多复杂/令人困惑的答案。

这是截至v3.4的情况。

简短回答。

  1. 在没有访问控制的情况下启动MongoDB(/data/db或您的数据库所在位置)。

mongod --dbpath /data/db
  • 连接到实例。

  • mongo
    
  • 创建用户。

  • use some_db
    db.createUser(
      {
        user: "myNormalUser",
        pwd: "xyz123",
        roles: [ { role: "readWrite", db: "some_db" },
                 { role: "read", db: "some_other_db" } ]
      }
    )
    
  • 停止 MongoDB 实例并使用访问控制重新启动它。

  • mongod --auth --dbpath /data/db
    
  • 连接并以用户身份进行认证。

  • 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
    
  • 连接到实例。

  • mongo
    
  • 创建用户管理员。 以下操作在admin认证数据库中创建用户管理员。用户是some_db数据库的dbOwner,但不是admin数据库的dbOwner,这一点很重要。

  • 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" } ]
         }
       )
    
  • 停止MongoDB实例并使用访问控制重新启动它。

  • mongod --auth --dbpath /data/db
    
  • 连接并身份验证为用户管理员,面向admin认证数据库,而不是some_db认证数据库。用户管理员是在admin认证数据库中创建的,该用户不存在于some_db认证数据库中。

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

    你现在已经通过数据库 some_db 成为了一个 dbOwner 用户。如果你想直接读写操作 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/

    如果您希望创建额外的用户,这些用户不是用户管理员,只是普通用户,请继续阅读以下内容。

    1. 创建一个普通用户。该用户将在下面的some_db身份验证数据库中创建。

    use some_db
    db.createUser(
      {
        user: "myNormalUser",
        pwd: "xyz123",
        roles: [ { role: "readWrite", db: "some_db" },
                 { role: "read", db: "some_other_db" } ]
      }
    )
    
  • 退出Mongo shell,重新连接并以用户身份进行验证。

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

    最后但并非不重要的是,由于用户未正确阅读我发布的有关 --auth 标志的命令,如果您不想将它设置为标志,则可以在mongoDB的配置文件中设置此值。


    2
    最终我明白了发生了什么。 - mestarted
    3
    我希望在 Stack Overflow 上采纳的答案可以得到更新。这是截至 2017 年 7 月最相关的解决方案。 - 4Z4T4R
    1
    请更新您的答案!我不知道您从哪里得到了userAdminAnyDatabase,但它不起作用。该角色是root,可用于管理所有数据库的访问权限。 - Aakash Verma
    1
    @AakashVerma https://docs.mongodb.com/manual/reference/built-in-roles/#userAdminAnyDatabase ;) 另外,除非在开发过程中您知道自己不会受到威胁,否则永远不要使用ROOT!(说实话,永远不要使用ROOT lol) - basickarl
    @John,你说得对,dbpath可以随意设置,只要它指向你的数据库即可!(在这个例子中,我的数据库位于/data/db) - basickarl
    显示剩余5条评论

    72
    首先,请在mongod配置文件中取消注释以#auth=true开头的行(默认路径/etc/mongod.conf)。 这将为mongodb启用身份验证。 然后,重新启动mongodb:sudo service mongod restart

    14
    默认路径为 /etc/mongod.conf 而非 /etc/mongo.conf - Mithril
    2
    首先,请取消注释,然后重新启动 :))) - GioMac
    2
    更新:现在使用以下命令重启服务:sudo service mongodb restart - sharafjaffri
    配置文件的位置和名称为:/etc/mongodb.conf - HGMamaci
    1
    在配置文件中,版本4.4的authorization: enabled。请参阅Mongodb身份验证第4段“重新启动带访问控制的MongoDB实例”。还要确保取消注释#security:示例security: authorization: enabled - Jan

    56
    此答案适用于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
    1
    我必须在 createUser 之前键入 use admin ,否则会出现错误。 - Guillaume F.

    28

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

    1. 使用 --auth = true 启动 mongod

    2. 从Mongo shell访问admin数据库并传递JavaScript文件。

      mongo admin "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 ");
    
  • 现在用户添加已经完成,我们可以通过mongo shell验证对数据库的访问


  • 2
    在文件中设置用户名和密码看起来并不是很安全。 - Exploring
    1
    Javascript。不是“java script”。 - Camilo Martin
    1
    这里 JavaScript 文件的目的是什么? - Ravi
    2
    @CamiloMartin JavaScript,不是“Javascript”。 - Madbreaks

    27

    7
    我不明白为什么没有人提到这个。这非常重要。 - John
    可能是最重要的答案。我们的服务器被黑客攻击了,因为其他答案没有提到这一点。 - Oliver Dixon

    14

    您可以更改/etc/mongod.conf

    之前

    #security:

    之后

    security:
        authorization: "enabled"
    

    然后执行sudo service mongod restart


    12

    首先在终端上运行以下命令来启动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" } ] } 仍然无法通过身份验证。 - Hassan Faghihi
    我甚至使用了db.changeUserPassword(),或者其他什么方法,即使在那之后,当我调用db.auth('admin','my pass')或者你所做的方式时,它仍然显示用户admin的身份验证失败。 - Hassan Faghihi
    使用 root 角色提供对以下角色的所有操作和资源的访问权限... 角色 root - Laode Muhammad Al Fatih

    11

    这是我在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
    

    5

    创建带密码的用户以保障特定数据库的访问安全:

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

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接