我想为我的 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
的工作方式相同。
设置用户后,您需要使用 --auth
选项启动 mongod
。
从 MongoDB 站点:
使用 --auth 选项运行数据库(mongod 进程)以启用安全性。您必须在使用 --auth 启动服务器之前将用户添加到 admin db,或者从 localhost 界面添加第一个用户。
哇,这里有这么多复杂/令人困惑的答案。
这是从 v3.4 开始的。
简短的回答。
在没有访问控制的情况下启动 MongoDB。 mongod --dbpath /data/db 连接实例。 mongo 创建用户。使用 some_db db.createUser({ 用户:“myNormalUser”,密码:“xyz123”,角色:[{角色:“readWrite”,db:“some_db”},{角色:“read”,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 连接实例。 mongo 创建用户管理员。以下在 admin 身份验证数据库中创建用户管理员。用户是 some_db 数据库的 dbOwner,而不是 admin 数据库的 dbOwner,记住这一点很重要。使用管理员 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 认证数据库中不存在。使用管理员 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({ 用户:“myNormalUser”,密码:“xyz123”,角色:[{角色:“readWrite”,db:“some_db”},{角色:“read”,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 的配置文件中设置此值。
首先,取消注释 mongod 配置文件中以 #auth=true
开头的行(默认路径 /etc/mongod.conf
)。这将为 mongodb 启用身份验证。
然后,重新启动 mongodb:sudo service mongod restart
/etc/mongod.conf
而不是 /etc/mongo.conf
authorization: enabled
是 4.4 版。请参阅 Mongodb authentication 段落 4 使用访问控制重新启动 MongoDB 实例 还要确保取消注释 #security:
。 示例:security: authorization: enabled
此答案适用于 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
createUser
之前输入 use admin
,否则会出错。
这是添加用户的javascript代码。
使用 --auth = true 启动 mongod 从 mongo shell 访问管理数据库并传递 javascript 文件。 mongo admin "Filename.js" "Filename.js" // 添加管理员用户 db.addUser("admin_username", "admin_password"); // 验证管理员用户 db.auth("admin_username", "admin_password"); // 使用来自 java 脚本的数据库代码 db = db.getSiblingDB("newDatabase"); // 添加新数据库数据库用户 db.addUser("database_username", "database_password");现在用户添加完成,我们可以验证从 mongo shell 访问数据库
https://docs.mongodb.com/manual/reference/configuration-options/#security.authorization
编辑mongo设置文件;
sudo nano /etc/mongod.conf
添加行:
security.authorization : enabled
重启服务
sudo service mongod restart
问候
您可以更改 /etc/mongod.conf
。
前
#security:
后
security:
authorization: "enabled"
然后sudo service mongod restart
首先使用在终端上运行 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/
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" } ] }
仍然身份验证失败
root
角色提供对以下角色组合的操作和所有资源的访问... role root
这是我在 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
使用特定数据库的密码创建用户以保护数据库访问:
use dbName
db.createUser(
{
user: "dbUser",
pwd: "dbPassword",
roles: [ "readWrite", "dbAdmin" ]
}
)
请按以下步骤操作
使用 CLI 创建用户
use admin
db.createUser(
{
user: "admin",
pwd: "admin123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
启用身份验证,您的操作方式因您的操作系统而异,如果您使用的是 Windows,您可以简单地 mongod --auth 在 linux 的情况下您可以编辑 /etc/mongod.conf 文件以添加 security.authorization :启用然后重新启动蒙古服务
通过 cli mongo -u "admin" -p "admin123" --authenticationDatabase "admin" 连接。而已
您可以查看 this post 以了解更多详细信息并学习使用 mongoose 连接到它。
这就是我为 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' }])
一些答案是在使用 --auth
命令行标志或设置配置文件属性之间发送混合信号。
security:
authorization: enabled
我想澄清这方面。首先,两种情况下的身份验证凭据(即用户/密码)都必须通过在默认的 admin
数据库上执行 db.createUser
查询来创建。获取凭据后,有两种启用身份验证的方法:
没有自定义配置文件:这是以前的身份验证标志适用的情况。像这样启动 mongod: usr/bin/mongod --auth 使用自定义配置文件:这是后一个配置必须存在于自定义配置文件中的时候。像这样启动 mongod: usr/bin/mongod --config
要通过身份验证连接到 mongo shell:mongo -u <user> -p <password> --authenticationDatabase admin
--authenticationDatabase
这里是创建用户的数据库名称。 mongorestore
、mongodump
等所有其他 mongo 命令都接受附加选项,即 -u <user> -p <password> --authenticationDatabase admin
详情请参阅https://docs.mongodb.com/manual/tutorial/enable-authentication/。
连接 mongoDB 的最佳实践如下:
初始安装后,使用 admin 然后运行以下脚本创建 admin 用户
db.createUser(
{
user: "YourUserName",
pwd: "YourPassword",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" },
{ role: "clusterAdmin", db: "admin" }
]
})
以下脚本将为数据库创建管理员用户。
使用 mongo -u YourUserName -p YourPassword admin 登录 db.admin 登录后,您可以通过重复 1 到 3 创建 N 个具有相同或不同管理员凭据的数据库。
这允许您为在 MongoDB 中创建的不同集合创建不同的用户和密码
这些步骤对我有用:
在 cmd 上写入 mongod --port 27017 然后连接到 mongo shell: mongo --port 27017 创建用户 admin :使用 admin db.createUser( { user: "myUserAdmin", pwd: "abc123", roles: [ { 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 切换到身份验证数据库:使用 admin db.auth("myUserAdmin", "abc123"
您需要切换到您希望用户使用的数据库(不是管理员数据库)...
use mydatabase
有关更多帮助,请参阅此帖子... https://web.archive.org/web/20140316031938/http://learnmongo.com/posts/quick-tip-mongodb-users/
admin
以外的其他数据库中创建用户
创建新用户后,请不要忘记授予用户grant
read/write/root
权限。你可以试试
cmd: db.grantRolesToUser('yourNewUsername',[{ role: "root", db: "admin" }])
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
这对我有用。
许多重复的答案,但我认为他们错过了一个重要的注意事项:
即使正确启用了身份验证,您也可以在没有用户名/密码的情况下连接到 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")
}
}
}
不定期副业成功案例分享
admin
数据库上连接,请使用另一个数据库并重试。只有 userAdmin(AnyDatabase) 可以在admin
上连接。