1

我必须在 MongoDB 服务器中创建一个新用户并授予它对单个数据库的只读权限。请注意,我不是这里的管理员。

我与我的用户连接并执行了以下代码:

db.createUser({user: "newuser", pwd: "mypassword", roles: [{role: "read", db: "mydatabase"}]})

然后我开始测试,我发现

  1. newuser我可以使用 Robo3T 和 Mongo Shell(mongo命令)来连接这个新创建的用户。
  2. 我可以读取mydatabase数据库
  3. 我仍然WRITE可以在这个数据库中自由地(插入、更新等)
  4. 我可以从服务器中的其他数据库中读取任何内容(我没有尝试写)。
  5. 我可以使用 Robo3t 和 Mongo Shell 连接此数据库而无需传递用户名和密码
  6. 我可以通过提供错误的用户名和密码来强制进行错误的身份验证(通过时)

当我执行db.runCommand({connectionStatus : 1})时,我得到这个输出:

{
    "authInfo" : {
        "authenticatedUsers" : [
            {
                "user" : "newuser",
                "db" : "mydatabase"
            }
        ],
        "authenticatedUserRoles" : [
            {
                "role" : "read",
                "db" : "mydatabase"
            }
        ]
    },
    "ok" : 1,
    ...
}

使用 Mongo Shell 我连接这个命令(但也传递--authenticationDatabase):

mongo --host mongodb://servers:ports/mydatabase?replicaSet=myreplicaset --username newuser --password mypassword

所以我的问题是非常基本的,我猜。

  • 为什么我可以在不进行身份验证的情况下连接?
  • 为什么我仍然可以用这个只读用户写?
  • 为什么我仍然可以使用该用户访问其他数据库?

提前致谢!

@编辑:

我想知道它是否与此有关:

https://docs.mongodb.com/manual/tutorial/enable-authentication/

我见过一些人(检查一下)说忘记启用访问控制。由于我不是这个数据库的管理员,所以我仍然很困惑(我不是一个很有经验的用户)

4

1 回答 1

0

为什么我可以在不进行身份验证的情况下连接?

你是正确的访问控制。您所描述的有点奇怪,但是根据Mongo的基本安全性,创建用户是DBA的工作;所以你不是管理员,你真的不应该创建用户吗?

尽管如此,mongod(mongo 守护进程)是负责运行 MongoDB 的进程。当它最初启动时,它可能没有在配置中启用身份验证,该过程需要在启用它的情况下重新启动。这是访问控制

这就是您可以以任何用户身份进行身份验证的原因,也许与您可以创建用户的原因相同,尽管您不是管理员?

为什么我仍然可以用这个只读用户写?

可能与上述相同的原因,如果为真,那么用户可以做任何他们喜欢的事情,因为没有用户操作的授权

另一个常见的原因是在不删除以前的用户的情况下向新用户进行身份验证。如果您以错误的方式与其他人重新进行身份验证,您最终可能会获得比预期更多的权限。

为什么我仍然可以使用该用户访问其他数据库?

同样,很可能与上述相同。没有进行身份验证。

注意: https ://docs.mongodb.com/manual/core/authentication/

当启用访问控制(即授权)时,MongoDB 要求所有客户端进行身份验证以确定其访问权限。

于 2020-05-19T19:41:51.447 回答