Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB服务器仍然可以在没有凭据的情况下访问_Mongodb - Fatal编程技术网

MongoDB服务器仍然可以在没有凭据的情况下访问

MongoDB服务器仍然可以在没有凭据的情况下访问,mongodb,Mongodb,我的机器中有一个新的mongodb服务器(2.6.0),我使用以下配置文件启动了mongod实例: dbpath = c:\mongo\data\db port = 27017 logpath = c:\mongo\data\logs\mongo.log auth = true 稍后,我通过mongo shell连接到此mongod实例,并创建了一个管理员用户: use admin db.createUser( { user: "tugberk", pwd: "123456

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

dbpath = c:\mongo\data\db
port = 27017
logpath = c:\mongo\data\logs\mongo.log
auth = true
稍后,我通过mongo shell连接到此mongod实例,并创建了一个管理员用户:

use admin
db.createUser(
  {
    user: "tugberk",
    pwd: "12345678",
    roles:
    [
      {
        role: "userAdminAnyDatabase",
        db: "admin"
      }
    ]
  }
)
然后,我从shell注销并使用以下命令重新连接:

mongo --host localhost --port 27017 -u tugberk -p 12345678 --authenticationDatabase admin
然后,我创建了一个具有root访问权限的用户:

use admin
db.createUser(
    {
      user: "tugberkRoot",
      pwd: "12345678",
      roles: [ "root" ]
    }
)
这里不需要最后一步,但现在应该完全禁用匿名访问。但是,我仍然可以通过mongo shell匿名连接到它(即使我没有任何权限执行任何操作):


如何防止匿名连接?

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

这是一个问题,但就目前而言,这本质上就是服务器的行为方式

值得注意的是,在您尝试执行某些操作之前,这实际上与仅使用
telnet
连接到端口没有什么不同-在“连接到:”等开头显示的文本来自客户端,而不是服务器。一旦它尝试执行任何未经验证的操作,甚至列出服务器警告,就会抛出一个错误,因为它没有足够的权限

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


在MongoDB之外,您应该从防火墙的角度来看待锁定问题。在Linux上,这可能是或类似的。Windows防火墙不是我的专业领域,但我想您也可以在那里做类似的事情。

尽管您可以通过在mongo.conf文件的安全部分启用身份验证来保护您的数据库,如下所示:

security:
  authorization: enabled

bummer:所以,我可能无法隐藏匿名连接服务器的存在。至少在MonogDB级别。谢谢!在我对clarityMySQL的回答的原始响应中添加了相关的位,它确实允许在身份验证之前进行连接,除非您使用白名单/黑名单仅允许来自特定IP地址的连接。如果你不相信我的话,只要试着用telnet或类似的工具连接到一个MySQL数据库,它就会连接,然后在你没有按预期继续的时候引导你离开。如果不首先允许用户进行连接,就无法对其进行身份验证,任何认为存在连接的人根本不了解网络的实际功能。非常简单的滥用:在您尚未进行身份验证的Mongo控制台中输入“while(1);”。它会很高兴地消耗掉运行这一行的所有资源,而您甚至不需要登录就可以做到这一点。这基本上是一种DOS攻击,对于任何侦听TCP端口的应用程序都是可能的(TCP不进行身份验证,这不是MongoDB独有的)。如果没有mongo shell,您可以更高效地执行while循环,该死的,您可以省去完整连接,只需在运行时执行SYN flood即可。这就是为什么人们把负载平衡器、防火墙等东西放在这些应用程序前面,只允许受信任的客户端连接到它们——您的数据库(任何数据库)永远不应该向公众开放,因此这将是一个问题,但您始终可以在身份验证之前访问mongo shell。