【问题标题】:Restricting web service access to internal IP addresses限制对内部 IP 地址的 Web 服务访问
【发布时间】:2013-12-03 19:40:16
【问题描述】:

与question 类似,我想限制一些 Jersey Web 服务供内部办公室使用。使用 HttpServletRequest 检查 IP 地址是否足够安全?具体来说,是否存在 request.getRemoteAddress() 返回的值不可信的情况?我的代码是这样的:

    @POST
    @Path("update")
    public Response updateCityInfo(@Context HttpServletRequest request) {
        String remoteAddress = request.getRemoteAddr();
        if (!remoteAddress.startsWith("10.10")) {
            return Response.status(Status.FORBIDDEN).build();
        }
        ...

我不太关心安全性,我只是希望某个网络中的任何人都能够访问此端点。

【问题讨论】:

  • 这个检查似乎没有问题。可能更好的地方是负载均衡器级别,它将过滤掉所有外部 IP 地址。
  • 没有负载均衡器,它只是用于开发和质量检查服务器,将从某人的框中调用以进行一些配置重新加载。我只是想确保它不会被我们本地网络之外的任何人调用。
  • 即使没有负载平衡器,您的所有服务器后面也必须有一些防火墙,可以限制对外部 IP 的访问。您也可以配置 apache 来阻止 IP,我主要关心的是您的应用程序应该只执行所需的东西(身份验证/自动化/角色/权限等)和其他与业务相关的东西),阻塞和解除阻塞是基于 Infra 的服务,您的应用程序应该不照顾。
  • 是的,同意,但另一件事是我只想限制其中一些服务,而不是其他服务。
  • 我猜你的每个服务都会有一些唯一/不同的 URL,所以只允许基于服务 URL 的访问。

标签: java web-services security


【解决方案1】:

在网络级别过滤来自外部地址的传入请求可以轻松防止您的应用程序被欺骗。但这并不意味着您的应用程序在安全方面没有做任何事情。您的应用程序应具有适当的身份验证和授权机制。

【讨论】:

  • 我明白你的意思,并同意 99% 的情况,但这是一项无状态服务,我想通过 URL 访问它,并让它重新加载一些配置数据。我们通过 JMX 公开了它,但它需要足够频繁,我只想从 curl 或浏览器中点击它。
  • 无论你想使用什么 ips(External),你都需要确保这些 IP 被列入白名单
【解决方案2】:

这可能行得通。但是有一些警告。对于初学者,如果您在负载均衡器/代理后面,那么 remoteAddress 很可能是代理的地址,而不是发起请求的客户端的地址。由于负载均衡器通常位于防火墙内部,因此它们可能具有 10.* 地址。

这似乎应该在防火墙级别而不是在应用程序级别处理。

【讨论】:

    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多