一定要进行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. 在输入错误的用户密码时,会出现错误。

 

    在未进行用户认证时,是可以的。

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()
>