一定要进行MongoDB用户认证设置
简要概括
据该URL的文章报道,MongoDB在2019年5月8日的一篇文章中称,可以在没有密码的情况下访问,并且可以获取到2.75亿条数据。
另外,还有报道称在过去(2015年)的文章中发现了未受保护的40,000台MongoDB。
因此,在安装MongoDB后,一定要设置用户认证。此外,如果没有设置用户认证,并将IP绑定设置为除了本地主机以外的其他设置,那将是非常糟糕的。
在「如果我当初接触MongoDB时知道的14件事」的文章中,首先提到了用户认证的内容。
在以后的章节中,我们将进行用户认证设置和用户注册,但没有对用户管理进行解释。
用户认证设置参数
如果是命令行选项,请添加–auth
mongod --dbpath <directory> --auth
對於設定檔案,將授權設定為啟用。
security:
authorization: enabled
首次注册超级用户
首先,启用用户身份验证,然后启动 mongod。
超级用户就像Linux的root用户一样。MongoDB没有固定的用户ID,所以超级用户是根据角色来确定的。在这里,我们将使用内置的root角色作为超级用户。
以下例子中,用户ID被称为mongo,密码为18fuw63x。
$ mongo
> use admin
switched to db admin
> db.createUser({user:"mongo", pwd:"18fuw63x", roles:["root"]})
Successfully added user: { "user" : "mongo", "roles" : [ "root" ] }
> exit
指定用户ID/密码来连接MongoDB数据库
加上”u”。
$ mongo -u mongo
MongoDB shell version v4.0.9-31-g52532c50a4
Enter password:
在 MongoDB 的连接字符串中
$ mongo mongodb://mongo@localhost/
MongoDB shell version v4.0.9-31-g52532c50a4
Enter password:
当您指定密码时,请按以下方式,但请避免使用。原因是Linux的ps命令等可以使他人看到密码。
$ mongo -u mongo -p 18fuw63x
$ mongo mongodb://mongo:18fuw63x@localhost/
作为其他方法,可以先连接到MongoDB,然后进行身份验证。
$ mongo
> use admin
switched to db admin
> db.auth("mongo","18fuw63x")
1
另外,如果指定数据库如下,会出现错误。
$ mongo test -u mongo
$ mongo mongodb://mongo@localhost/test
理由是因为指定的数据库名称(test)被用作认证数据库。注册用户的是管理员(admin)。因此,我们将按照下述方式指定认证数据库。
$ mongo test -u mongo --authenticationDatabase admin
$ mongo mongodb://mongo@localhost/test?authSource=admin
想要省略从控制台输入用户ID和密码。
在用户主目录下创建一个名为.mongorc.js的文件,并在其中编写以下脚本。.mongorc.js是在启动mongo时加载的JavaScript文件。由于密码被写在其中,请注意设置.mongorc.js的访问权限。
db.getSiblingDB("admin").auth("mongo","18fuw63x")
即使注册用户,仍然不能完全放心
如果要使用–auth选项启动,请务必准备一个批处理文件来启动mongod,或者使用配置文件。
由于在重新启动mongod时没有使用–auth参数进行重新启动,即使没有用户认证,也可以使用这个。这也适用于在设置文件中没有添加authorization: enabled的情况,但我认为设置后再撤销是不可能的。然而,经常会忘记添加–auth参数。以下是在没有使用–auth参数时的情况划分:
-
- 在输入正确的用户密码时,是可以的。
-
- 在输入错误的用户密码时,会出现错误。
- 在未进行用户认证时,是可以的。
1. 我认为1和2是必须经历的,因此会认为它们需要带上–auth参数。然而,对于3我不会这样认为,因为很难察觉到它不需要–auth参数。特别是如果在.mongorc.js文件中编写了auth()命令的话,更加难以察觉。
除了检查ps命令和配置文件之外,要想确定正在运行的MongoDB是否启用了用户认证,可以尝试以下命令。对于配置文件也同样适用,只需查看parsed.security.authorization即可得知。如果未指定用户认证,则parsed.security.authorization可能是不存在的。
> db.adminCommand( { getCmdLineOpts: 1 } )
{
"argv" : [
"mongod",
"--dbpath",
"db",
"--auth"
],
"parsed" : {
"security" : {
"authorization" : "enabled"
},
"storage" : {
"dbPath" : "db"
}
},
"ok" : 1
}
>
经过尝试了许多不同的选项后,我们发现了根本不存在的 system.??? 这一事实通过 find()得以确认。无法确定它是哪个版本。
如果用户认证有效
> db.system.xx.find()
Error: error: {
"ok" : 0,
"errmsg" : "not authorized on test to execute command { find: \"system.xx\", filter: {}, lsid: { id: UUID(\"80d87cee-460f-4f97-b965-552a8417d604\") }, $db: \"test\" }",
"code" : 13,
"codeName" : "Unauthorized"
}
>
如果用户认证无效
> db.system.xx.find()
>