【问题标题】:Is there an easy and efficient way to delay a response from a Java Servlet是否有一种简单有效的方法来延迟来自 Java Servlet 的响应
【发布时间】:2013-01-06 21:44:33
【问题描述】:

当我得到明显的黑客攻击时,我该怎么办?我希望有一种简单的方法可以让他们浪费时间,而不涉及服务器资源。即使是几秒钟的延迟也可能使暴力攻击无效。

将它们发送到 AsyncContext 似乎过于占用处理器资源,并且超时会自动将相同的请求重新发送回它开始的位置。这实际上可能有助于 DOS 攻击。

我正在使用 Jetty 并且知道 DoSFilter,但是如果我可以在检测到犯规行为时延迟响应会更有效,这在我的情况下很容易感知。我认为每次失败的验证/身份验证尝试都应该以某种方式自动延迟响应。

我并没有真正在这里进行身份验证,因此身份验证协议/前端没有用。我只是在验证满足特定标准的模式的连接参数。我知道 TCP/IP 会通知,但如果我可以静默断开无效的访问尝试并让它们挂起,那将是理想的。

【问题讨论】:

    标签: java security servlets denial-of-service


    【解决方案1】:

    我认为,如果您检测到傻瓜游戏,最好在一段时间内阻止他们的 ip。在/etc/hosts.deny 中添加他们的 ip 会很容易(它适用于许多 unix 守护进程,但我不确定它是否也适用于 java 进程,我认为它应该有效,因为它被tcp 守护进程本身)。命令行中的man 5 hosts.deny 给出了一些提示(或查看this online link)。

    顺便说一句,我认为您可以使用 Thread.sleep() 来暂停 servlet,就像在任何普通的 java 代码中一样。但这可能会导致来自同一调用者的更多请求长时间保持打开状态,从而增加应用程序服务器必须分配和维护的活动资源。因此,如果攻击者可以在多线程中工作,这可能会帮助他阻止您的服务器,因为它将为他的攻击保留所有线程,从而阻止所有其他用户访问您的服务。

    【讨论】:

    • 谢谢,您的评论给了我一个想法。我会考虑将滥用 IP 添加到过滤层一段时间,例如 nginx(@Dims 提到)。我需要看看是否有办法从 servlet 本身即时执行此操作。
    • 如果您立即断开连接,这可能会起作用。但是攻击者仍然会消耗大量的应用服务器资源。虽然在防火墙(如 Dims 所建议的那样)或 /etc/hosts.deny 中使用它,但很可能会更有效。
    • 是 /etc/hosts 拒绝操作系统动态读取吗?还是需要某种重启/重置。
    • 是的,效果立竿见影。我以前使用它来阻止对 ssh 的未经授权的访问,使用从 ssh 错误日志中解析的 java 程序。更改文件会立即生效。
    • 在这种情况下,这听起来像解决方案更容易且 CPU 密集度更低。感谢您的帮助。
    【解决方案2】:

    如果您收到来自同一 IP 的可疑重复请求,您可以引入升级延迟:

    Thread.sleep(n);
    

    其中 n 将每个后续事件翻倍。

    【讨论】:

    • 我想知道,但它不会占用线程吗?我认为 HTTPServlet 是从由有限数量的线程组成的线程池提供的。因此,如果它确实占用了一个线程,那么多线程攻击是否会耗尽池并关闭 servlet?如果不扎根,那就简单到连问都不好意思了!
    • 绝对不要在服务器线程中sleep。你是对的,它会阻塞线程,最终耗尽池并导致成功的 DOS 攻击。
    • @MarkoTopolnik 完全不同意。取决于您要防止什么。如果它的密码破解,那么这将工作。对于 DOS 攻击,可以而且最好通过切换硬件来处理,忽略请求泛滥,甚至在它到达 servlet 之前。
    • Thread.sleep 方法与AsyncContext 进行比较,您会发现Thread.sleep 不可能有任何优势。
    【解决方案3】:

    我实际上认为 AsyncContext 可能是比在同步请求上休眠更好的解决方案。

    但是,我认为您必须尝试这两种情况,并实际测量每种情况对 cpu 使用率和总吞吐量的影响。

    【讨论】:

    • 没有惊喜等待:同步阻塞会占用一个线程,这是一个沉重的系统资源,无论线程是否占用任何CPU。 Thread.sleep 绝对是在 Web 服务器中应该求助的最后一件事。
    【解决方案4】:

    您应该在较低级别进行保护。任何涉及 Java 的行为都会比黑客对您造成更大的伤害,因为容器会在每个请求上创建环境。

    黑客很可能不会等待响应,因此您不会通过延迟响应来打击他们。

    使用nginx 或防火墙级别。

    【讨论】:

    • 前端听起来很有趣,但它必须能够检查请求并确定其是否有效。我会研究一下 nginx 看看它能做什么,谢谢。
    • 我现在想知道是否可以通过将其添加到此类过滤器的列表中来获取滥用 IP 并阻止它。我需要看看是否有任何方法可以使用该前端动态阻止 IP 换句话说,让后端在滥用时动态配置前端。
    • 这次我必须向@Luigi R. Viggiano 提供更简单的解决方案。但我仍然很高兴了解 nginx。我要再研究一下。听起来它可能是更大规模操作的理想选择。希望有一天我会到达那里。感谢您的帮助。
    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多