2015-10-17 143 views
4

我打算通过互联网公开一个基于Java的web服务远程调试的端口,但是我两次思考,我意识到它没有任何认证。将java远程调试器端口暴露给互联网是否安全?

从理论上讲,似乎可以编写一个附加到远程调试器端口的工具,并通过Java API执行任意系统命令。或修改/转储数据库,等等。 至少这个漏洞利用似乎是这种情况http://securityaffairs.co/wordpress/36394/hacking/paypal-remote-code-execution.html

我不记得被暴露远程调试器端口有史以来强烈警告。但是现在,当数百个僵尸网络扫描端口寻找漏洞时,应该更好地宣传它。

可以请任何人评论是否安全和/或如何以安全的方式在任意基于java的web服务上做到这一点?我的目标是能够在生产服务器上执行远程调试。

+0

为什么要调试生产?我建议只在你的开发环境中使用远程调试。你可以应用IP过滤并利用你公司的防火墙来实现安全 – Bon

+0

你真的需要调试这个服务器,考虑为本地主机设置一切,并打开一个SSH隧道,如果这是必要的。然后你可以在没有其他人能够进行调试的情况 – Marged

+0

我想到了ssh隧道。只是想知道这是否真的是一个问题,也许有一种常见的方式(如pubkey-auth)来实现这一点。 – Dmitriusan

回答

5

您可以将远程调试配置为使用SSL和身份验证,这适用于Windows和Linux,但有点麻烦。港口始终开放。

我相信你有很好的理由来调试你的实时/高效应用程序,并且知道当你真正调试它时,而不仅仅是使用连接访问JMX数据,例如当你连接调试器时你的应用程序将停止运行。

甲骨文documents一定的风险,一些更高或更低,这取决于你如何配置代理:

注意 - 潜在的安全问题已确定密码 身份验证的远程连接,当客户端获得 来自不安全的RMI注册表的远程连接器(默认)。如果 攻击者在 合法注册表启动之前在目标服务器上启动了伪造的RMI注册表,则攻击者可以窃取客户端的密码 。这种情况下,即使启用了SSL,也可以使用系统属性 com.sun.management.jmxremote.port = portNum启动启用了远程管理的Java VM 。尽管这样的攻击很可能会被发现,但它仍然是一个 漏洞。

注意 - 此配置不安全。知道 (或猜测)您的JMX端口号和主机名的任何远程用户将能够通过 监控和控制您的Java应用程序和平台。尽管开发可能接受 ,但不推荐用于生产 系统。

注意 - 此配置不安全:知道 (或猜测)您的端口号和主机名的任何远程用户将能够监控 并控制您的Java应用程序和平台。此外,可能的伤害不仅限于您在MBean中定义的操作。 A 远程客户端可以创建一个javax.management.loading.MLet MBean和 使用它来从任意URL创建新的MBean,至少如果没有安全管理器的话是 。换句话说,一个流氓远程客户端可以让您的Java应用程序执行任意代码。

因此,虽然禁用安全性对于 开发可能是可接受的,但强烈建议您不要禁用生产系统的安全性 。

即使是涉及最高安全性(端口移动,ssl启用,ssl客户端证书验证)的配置仍然存在风险。 如果您仍然需要调试连接,我建议您使用大概已经存在的ssh连接到服务器,并使用此连接创建一个到调试器端口的ssh隧道。您可以在这里阅读更多关于此:Cannot remotely debug JVM via SSH tunnel(因为它已经在所以我不复制细节)

打开端口没有加密和身份验证将使任何人都可以连接到您的jvm。这将允许读取和写入JMX值,停止执行代码,修改值,创建堆转储,覆盖代码和所有其他不好的内容。

+0

谢谢你的完整答案 – Dmitriusan