如何通过 apache mod_proxy_ajp 防止非 https 访问 tomcat 应用程序?

如何通过 apache mod_proxy_ajp 防止非 https 访问 tomcat 应用程序?

我正在配置 Apache 2.2 前端,以通过 mod_proxy_ajp 将特定应用程序传递到 Tomcat。其中一些应用程序(如登录/身份验证服务)我希望强制仅接受 HTTPS 访问。

我的 httpd-proxyajp.conf 文件中针对每个应用程序包含如下节:

  ProxyPass /auth-1.0 ajp://localhost:8009/auth-1.0
  ProxyPassReverse /auth-1.0 ajp://localhost:8009/auth-1.0

  <Proxy /auth-1.0>
    Order Deny,Allow
    Allow from All
  </Proxy>

  <Proxy /auth-1.0/WEB-INF>
    Order Deny,Allow
    Deny from All
  </Proxy>

我不想将 http 请求重定向给他们——如果有人编写一个客户端,盲目地将他们的登录凭据以明文形式传递给我,而我只是让他们通过重定向再次加密传递,那么这有点违背了目的。所以我不想使用常见的解决方案,

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^/auth-1.0 https://%{HTTP_HOST}%{REQUEST_URI}

我实际上想抛出一个错误。

并发症:在 Amazon EC2 上执行此操作,因此无法使用基于 IP 的虚拟主机,也无法使用基于名称的虚拟主机,因为我使用的是 SSL。无论如何,我更愿意在没有虚拟主机的情况下执行此操作;我需要使用相同的 DNS 名称来提供应用程序。

答案1

我想我想到了一个可以满足我要求的方法,但我想听听大家的意见。我已经测试过了,它似乎适用于大多数明显的用例,但对于一些特殊情况,可能会比较棘手。无论如何,对于任何我希望“仅使用 https”的应用程序,如果您通过 http 访问它们,它会抛出 403 Forbidden,但通过 https 可以正常工作。

在 httpd-proxyajp.conf 中:

RewriteEngine On
#
# Auth Service
#
  RewriteCond %{HTTPS} off
  RewriteRule ^/auth-1.0 - [F]
  ProxyPass /auth-1.0 ajp://localhost:8009/auth-1.0
...
#
# An Insecure Service, foo
#
  ProxyPass /foo-1.0 ajp://localhost:8009/foo-1.0
...
#
# Another Secure-only Service, bar
#
  RewriteCond %{HTTPS} off
  RewriteRule ^/bar-1.0 - [F]
  ProxyPass /bar-1.0 ajp://localhost:8009/bar-1.0
...

相关内容