如何使用用户名和密码保护 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
mongodump
和 mongoexport
的用户名和密码的使用方式相同。
【问题讨论】:
这适用于 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】:创建新用户后,请不要忘记给用户grant
read/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 命令,如 mongorestore
、mongodump
都接受附加选项,即 -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?