无需凭据即可访问MongoDB服务器

tug*_*erk 17 mongodb

我的机器中有一个新的mongodb服务器(2.6.0),我使用以下配置文件启动了mongod实例:

dbpath = c:\mongo\data\db
port = 27017
logpath = c:\mongo\data\logs\mongo.log
auth = true
Run Code Online (Sandbox Code Playgroud)

后来,我通过mongo shell连接到这个mongod实例并创建了一个admin用户:

use admin
db.createUser(
  {
    user: "tugberk",
    pwd: "12345678",
    roles:
    [
      {
        role: "userAdminAnyDatabase",
        db: "admin"
      }
    ]
  }
)
Run Code Online (Sandbox Code Playgroud)

然后,我从shell注销并使用以下命令重新连接:

mongo --host localhost --port 27017 -u tugberk -p 12345678 --authenticationDatabase admin
Run Code Online (Sandbox Code Playgroud)

然后,我创建了一个具有root访问权限的用户:

use admin
db.createUser(
    {
      user: "tugberkRoot",
      pwd: "12345678",
      roles: [ "root" ]
    }
)
Run Code Online (Sandbox Code Playgroud)

这里不需要最后一步,但现在应该完全禁用匿名访问.但是,我仍然可以通过mongo shell匿名连接它(即使我没有任何访问权限):

在此输入图像描述

我该怎么做才能阻止任何匿名连接?

Ada*_*ord 21

身份验证阻止您对数据库执行操作(如屏幕截图所示 - 您甚至无法列出数据库),它不会阻止连接 - 毕竟,您必须能够连接才能进行身份验证.

有一个添加超时功能请求,但是现在这实际上是服务器的行为方式.

值得注意的是,直到你尝试做某事,这与仅仅连接到端口没有区别telnet- 开头显示的文本"连接到:"等来自客户端,而不是服务器.只要它尝试执行任何未经身份验证的操作,甚至列出服务器警告,就会抛出错误,因为它没有足够的权限.

如果要从连接角度锁定内容,MongoDB透视图中唯一的选项是使用该bindIp选项限制它侦听的IP地址(默认为all).例如,使用127.0.0.1会将其锁定为本地使用(但是您将无法从远程主机连接),这会使复制成为问题,因此在选择绑定地址时要小心.

在MongoDB之外,你应该从防火墙的角度来看待锁定.在Linux上,这将是IPTables,ufw,hosts.allow/deny或类似的.Windows防火墙不是我的专业领域,但我想你也可以在那里做类似的事情.

  • MySQL确实允许在身份验证之前进行连接,除非您使用白名单/黑名单仅允许来自某些IP地址的连接.如果您不相信我,只需尝试连接到使用telnet或类似的MySQL数据库,它将连接,然后在您不按预期继续时启动.没有首先允许用户连接就无法对用户进行身份验证,任何认为从根本上无法理解网络实际功能的用户. (3认同)
  • 糟糕:所以,我可能无法隐藏匿名连接的服务器存在.至少在MonogDB级别.谢谢! (2认同)
  • 非常简单的滥用:输入“while(1);” 进入您尚未进行身份验证的 Mongo 控制台。它会很高兴地耗尽运行该单行的所有自己的资源,您甚至不需要登录即可执行此操作。 (2认同)
  • 这基本上是一种DOS攻击,对于任何侦听TCP端口的应用程序都是可能的(TCP不进行身份验证,这不是MongoDB独有的).你可以在没有mongo shell的情况下更有效地完成你的while循环,你可以省去完整的连接,只是在你的时候做一个SYN洪水.这就是为什么人们在这些应用程序前放置负载平衡器,防火墙等东西,只允许可信任的客户端连接到它们 - 你的数据库(任何数据库)都不应该向公众开放,这样才会引起关注 (2认同)