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

Posted

技术标签:

【中文标题】如何使用用户名和密码保护 MongoDB【英文标题】:How to secure MongoDB with username and password 【发布时间】:2011-06-20 08:29:29 【问题描述】:

我想为我的 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 的用户名和密码的使用方式相同。

【问题讨论】:

这适用于 MongDB 版本 2.2.x 在 Mongo 3.0.4 中创建用户的命令是db.createUser()。 请按照此在 Mongodb 3.0 docs.mongodb.org/v3.0/tutorial/add-user-administrator987654322@上创建管理员用户 MongoDB 3.0+ 的更新:How to set up authentication in MongoDB 3.0. 明确一点,这不会加密通过网络传输的字节。它仅用于访问控制。 【参考方案1】:

您需要切换到您希望用户使用的数据库(不是管理员数据库)...

use mydatabase

查看这篇文章以获得更多帮助...https://web.archive.org/web/20140316031938/http://learnmongo.com/posts/quick-tip-mongodb-users/

【讨论】:

不需要,因为设置 db = db.getSiblingDB("newDatabase");【参考方案2】:

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

来自 MongoDB 站点:

使用--auth 选项运行数据库(mongod 进程)以启用 安全。您必须先将用户添加到管理数据库 使用--auth 启动服务器,或者从 本地主机接口。

MongoDB Authentication

【讨论】:

我已经尝试过并按照示例进行操作。现在..我可以在使用--auth重新启动服务器后进行设置。但是,当我尝试登录时(./mongo -u theadmin -p 12345)我失败了。我无法登录。 如果之后你无法连接,那是因为你试图在admin db上连接,使用另一个db再试一次。只有 userAdmin(AnyDatabase) 可以连接admin【参考方案3】:

这是添加用户的 javascript 代码。

    --auth = true 开头mongod

    从 mongo shell 访问 admin 数据库并传递 javascript 文件。

    mongo 管理员“文件名.js”

    “文件名.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访问数据库

【讨论】:

在文件中设置用户名和密码看起来不太安全。 Javascript。不是“java脚本”。 这里的javascript文件的目的是什么? @CamiloMartin JavaScript,而不是“Javascript”。【参考方案4】:

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

然后,重启 mongodb:sudo service mongod restart

【讨论】:

默认路径是/etc/mongod.conf 不是/etc/mongo.conf 或者,首先取消注释,然后重新启动:))) 更新:现在重启服务:sudo service mongodb restart 配置文件位置和名称为:/etc/mongodb.conf 在配置文件中 authorization: enabled 用于 4.4 版本。请参阅Mongodb authentication 段落 4 使用访问控制重新启动 MongoDB 实例 还要确保取消注释 #security:示例security: authorization: enabled【参考方案5】:

此答案适用于 Mongo 3.2.1 Reference

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.4 将使用 db.addUser 我必须在 createUser 之前输入 use admin 否则会出错。【参考方案6】:

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

编辑mongo设置文件;

sudo nano /etc/mongod.conf

添加行:

security.authorization : enabled

重启服务

sudo service mongod restart

问候

【讨论】:

我不明白为什么每个人都不提这个。这很重要 可能是最重要的答案。我们的服务器被黑了,因为其他答案没有提到这一点。【参考方案7】:

首先在终端上使用 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/

【讨论】:

我用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" ] 仍然验证失败 当我调用 db.auth('admin', 'my pass') 或你做的方式时,我什至使用了 db.changeUserPassword() 或任何东西,即使在那之后,它说用户管理员的身份验证失败 使用root角色提供对以下角色组合的操作和所有资源的访问...role root【参考方案8】:

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

这是从 v3.4 开始的。

简短回答。

    在没有访问控制的情况下启动 MongoDB。

    mongod --dbpath /data/db

    连接到实例。

    蒙哥

    创建用户。

    使用 some_db db.createUser( 用户:“我的普通用户”, 密码:“xyz123”, 角色:[角色:“readWrite”,db:“some_db”, 角色:“读取”,数据库:“some_other_db”] )

    停止 MongoDB 实例并使用访问控制重新启动它。

    mongod --auth --dbpath /data/db

    以用户身份连接和验证。

    使用 some_db db.auth("myNormalUser", "xyz123") db.foo.insert(x:1) 使用 some_other_db db.foo.find()

长答案:如果您想正确理解,请阅读此内容。

这真的很简单。我会把下面的事情搞砸https://docs.mongodb.com/manual/tutorial/enable-authentication/

如果您想了解更多关于这些角色的实际作用,请在此处阅读更多内容:https://docs.mongodb.com/manual/reference/built-in-roles/

    在没有访问控制的情况下启动 MongoDB。

    mongod --dbpath /data/db

    连接到实例。

    蒙哥

    创建用户管理员。 下面将在admin 身份验证数据库中创建一个用户管理员。用户是some_db 数据库上的dbOwner,而不是admin 数据库上的dbOwner,记住这一点很重要。

    使用管理员 db.createUser( 用户:“myDbOwner”, 密码:“abc123”, 角色:[角色:“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认证数据库中不存在。

    使用管理员 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/

如果您希望添加不是用户管理员且只是普通用户的其他用户,请继续阅读下文。

    创建普通用户。 此用户将在下方的some_db 身份验证数据库中创建。

    使用 some_db db.createUser( 用户:“我的普通用户”, 密码:“xyz123”, 角色:[角色:“readWrite”,db:“some_db”, 角色:“读取”,数据库:“some_other_db”] )

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

    使用 some_db db.auth("myNormalUser", "xyz123") db.foo.insert(x:1) 使用 some_other_db db.foo.find()

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

【讨论】:

我终于知道到底发生了什么。 ***.com/questions/41615574/… 我发现自己希望接受的答案可以在 SO 上得到更新。这是截至 2017 年 7 月最相关的解决方案。 请更新您的答案!我不知道您从哪里获得 userAdminAnyDatabase,但它不起作用。该角色是 root,用于对所有 dbs 进行管理员访问。 @AakashVerma docs.mongodb.com/manual/reference/built-in-roles/… ;) 除非出于开发目的,您知道自己不会受到损害,否则切勿使用 ROOT! (tbh 只是从不使用 root 哈哈)【参考方案9】:

创建新用户后,请不要忘记给用户grantread/write/root权限。你可以试试

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

【讨论】:

【参考方案10】:

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

use dbName

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

【讨论】:

【参考方案11】:

这些步骤对我有用:

    在 cmd 上写入 mongod --port 27017 然后连接到 mongo shell:mongo --port 27017 创建用户 admin : 使用管理员 db.createUser( 用户:“myUserAdmin”, 密码:“abc123”, 角色:[角色:“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"

【讨论】:

【参考方案12】:

连接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

    mongo -u YourUserName -p YourPassword admin

    登录后,重复1到3,可以创建N个相同或不同的数据库。

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

【讨论】:

在这之后去 sudo nano /etc/mongod.conf 并把这一行 security.authorization: enabled ,你可以在这里看到参考链接:***.com/a/57384027/3904109【参考方案13】:

按照以下步骤依次进行

使用 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" 连接。就是这样

您可以查看this post 了解更多详细信息并学习使用猫鼬连接它。

【讨论】:

【参考方案14】:

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

【讨论】:

【参考方案15】:

您可以更改/etc/mongod.conf

之前

#security:

之后

security:
    authorization: "enabled"

然后sudo service mongod restart

【讨论】:

【参考方案16】:

这就是我为 ubuntu 20.04 和 mongodb enterprise 4.4.2 所做的:

    在终端输入mongo 启动mongo shell。

    使用管理数据库:

use admin
    创建一个新用户并分配您的预期角色:
use admin
db.createUser(
  
    user: "myUserAdmin",
    pwd: passwordPrompt(), // or cleartext password
    roles: [  role: "userAdminAnyDatabase", db: "admin" , "readWriteAnyDatabase" ]
  
)
    退出 mongo 并将以下行添加到 etc/mongod.conf:
security:
    authorization: enabled
    重启MongoDB服务器

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

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

或者您可以使用以下方法更改用户角色:

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

【讨论】:

【参考方案17】:

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

security:
  authorization: enabled

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

    没有自定义配置文件:这是以前的auth 标志适用的情况。开始mongod 喜欢:usr/bin/mongod --auth 使用自定义配置文件:这是后一个配置必须存在于自定义配置文件中的情况。开始 mongod 就像:usr/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/。

【讨论】:

【参考方案18】:

许多重复的答案,但我认为他们错过了一个重要的注意事项:

即使正确启用了身份验证,您也可以在没有用户名/密码的情况下连接到 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")
                
        

【讨论】:

以上是关于如何使用用户名和密码保护 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

javascript 如何使用Server实例指定mongodb用户名和密码?

如何使用用户名和密码连接到Java中的MongoDB 3.2?

MongoDB如何设置权限(类似关系型数据库的用户名和密码)

如何建立一个含有用户名和密码的mongodb的数据库

yii2 如何mongodb没有密码怎么用

如何使用Spring框架加密文档中的所有MongoDB字段