如何使用用户名和密码保护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个回答

5

Mongodb 4.4.13社区版

1. 创建数据库用户

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

1.2 验证工作

> db.auth('myUserAdmin','abc123')

< { ok: 1 }

如果失败了,你会得到:
> db.auth('myUserAdmin','amongus')

MongoServerError: Authentication failed.

2. 修改 /etc/mongod.conf 文件

nano /etc/mongod.conf

更改:

#security:

致:

security:
  authorization: enabled

3. 重启mongod服务

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 服务。
  • 要通过命令行连接,键入 mongo -u "admin" -p "admin123" --authenticationDatabase "admin" 即可。

您可以查看此文以了解更多详细信息,并学习如何使用 Mongoose 进行连接。


4

一些答案在使用 --auth 命令行标志或设置配置文件属性之间发送了混合信号。

security:
  authorization: enabled

我想澄清一下这个方面。首先,两种情况下的身份验证凭据(即用户名/密码)都必须通过在默认的admin数据库上执行db.createUser查询来创建。一旦获得凭据,有两种方法可以启用身份验证:

  1. 没有自定义配置文件:这是以前的auth标志适用的情况。像这样启动mongodusr/bin/mongod --auth
  2. 使用自定义配置文件:这是后面的配置必须出现在自定义配置文件中的情况。像这样启动mongodusr/bin/mongod --config <config file path>

要使用身份验证连接到mongo shell:mongo -u <user> -p <password> --authenticationDatabase admin

这里的--authenticationDatabase是创建用户的数据库名称。所有其他mongo命令,如mongorestoremongodump接受附加选项,即-u <user> -p <password> --authenticationDatabase admin

请参阅https://docs.mongodb.com/manual/tutorial/enable-authentication/获取详细信息。


4
以下是连接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" }
                ]
     })

以下脚本将创建数据库的管理员用户。
3. 使用以下命令登录到 db.admin

mongo -u YourUserName -p YourPassword admin

4. 登录后,您可以使用相同的管理员凭据或不同的凭据创建 N 个数据库,方法是重复步骤 1 到 3。 这样可以为在 MongoDB 中创建的不同集合创建不同的用户和密码。

在此之后,进入sudo nano /etc/mongod.conf并添加以下行:security.authorization: enabled。你可以在这里查看参考链接:https://dev59.com/8LXna4cB1Zd3GeqPM40V#57384027。 - DragonFire

4
这是我为Ubuntu 20.04和MongoDB Enterprise 4.4.2所做的操作:
1.在终端中输入“mongo”命令启动Mongo shell。 2.使用“admin”数据库:
use admin
  1. 创建新用户并分配角色:
use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: passwordPrompt(), // or cleartext password
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

退出Mongo并将以下行添加到etc/mongod.conf文件中:
security:
    authorization: enabled
  1. 重新启动MongoDB服务器

(可选) 6.如果您希望用户具有根访问权限,可以在创建用户时指定:

db.createUser(
  {
    user: "myUserAdmin",
    pwd: passwordPrompt(), // or cleartext password
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

您可以使用以下方式更改用户角色:

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

3

不需要因为设置db = db.getSiblingDB("newDatabase"); - Ozan BAYRAM
我无法想象任何理由,为什么用户应该在除了“admin”之外的其他数据库中创建。 - Wernfried Domscheit

3
这些步骤在我身上奏效:
  1. 在命令提示符下输入mongod --port 27017
  2. 连接Mongo shell:mongo --port 27017
  3. 创建用户admin: use admin db.createUser( { user: "myUserAdmin", pwd: "abc123", roles: [ { role: "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. 切换到认证数据库: use admin db.auth("myUserAdmin", "abc123"

2
创建新用户后,请不要忘记向该用户授予读/写/根权限,请使用以下命令:db.grantRolesToUser('yourNewUsername',[{ role: "root", db: "admin" }])

1

我已在版本6.0中完成以下操作:如何为数据库设置用户名和密码;

安装MongoDB 6.0或更高版本,在MongoDB中使用Compass创建数据库(无论其名称如何)

enter image description here 安装MongoDB Shell https://www.mongodb.com/try/download/shell

打开cmd

cd C:\Program Files\mongosh

mongosh "mongodb://localhost:27017"

use #your database name#

db.createUser( { user: "xxx", pwd: "xxx", roles: [ { role: "readWrite", db: "xxx" } ] } )

enter image description here


1
许多重复的答案,但我认为它们忽略了一个重要的提示:
即使正确启用了身份验证,您仍然可以连接到Mongo数据库而不需要用户名/密码!
但是,您只能执行无害的命令,如db.help()db.getMongo()db.listCommands()等。
$ mongo 
MongoDB shell version v4.4.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f662858b-8658-4e33-a735-120e3639c131") }
MongoDB server version: 4.4.3
mongos> db.getMongo()
connection to 127.0.0.1:27017
mongos> db
test
mongos> db.version()
4.4.3
mongos> db.runCommand({connectionStatus : 1})
{
        "authInfo" : {
                "authenticatedUsers" : [ ],
                "authenticatedUserRoles" : [ ]
        },
        "ok" : 1,
        "operationTime" : Timestamp(1618996970, 2),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1618996970, 2),
                "signature" : {
                        "hash" : BinData(0,"Kre9jvnJvsW+OVCl1QC+eKSBbbY="),
                        "keyId" : NumberLong("6944343118355365892")
                }
        }
}

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