【问题标题】:How do I configure Tomcat (behind Apache) without using AJP?如何在不使用 AJP 的情况下配置 Tomcat(在 Apache 之后)?
【发布时间】:2021-10-24 17:13:56
【问题描述】:

出于安全原因,我正在尝试从现有安装中删除 AJP 的使用,但找不到有关如何执行此操作的任何信息。

具体来说,我的原始 Apache 配置中包含 JKMount 指令,我已将其替换为 ProxyPass 和 ProxyPassReverse 指令,但原始 Kerberos 身份验证似乎不再传递给 Tomcat。

(我现在启用了 mod_proxy_http 和 mod_proxy。)

在这种情况下,Google 绝对不是我的朋友。

【问题讨论】:

  • Christopher Schultz 去年给了this speech。基本上你需要使用mod_proxy_http(作为中间步骤你可以使用mod_proxy_ajp)。
  • 谢谢,我已经看到了,但这是我在这个过程中唯一能找到的东西,而且它的级别太高了。通常,既然我已经发布了这个问题,我似乎正在取得进展。

标签: apache tomcat


【解决方案1】:

使用mod_proxy_http 将经过身份验证的用户名从 Apache 转发到 Tomcat 并没有真正的标准方法,但您可以轻松创建一个:

  1. 配置 Apache 2 以发送 X-Forwarded-User 标头(如果我们有经过身份验证的用户):
RequestHeader unset X-Forwarded-User
RequestHeader set X-Forwarded-User "expr=%{REMOTE_USER}" "expr=-n %{REMOTE_USER}"
  1. 在 Tomcat 端编译(并将其放入 $CATALINA_BASE/libValve,它将从 “受信任” 主机检索 X-Forwarded-User
import java.io.IOException;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import org.apache.catalina.connector.CoyotePrincipal;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;

public class RemoteUserValve extends ValveBase {

    private static String remoteUserHeader = "X-Forwarded-User";
    // Same as in RemoteIpValve 
    private static Pattern internalProxies = Pattern
            .compile("10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|" + "192\\.168\\.\\d{1,3}\\.\\d{1,3}|"
                    + "169\\.254\\.\\d{1,3}\\.\\d{1,3}|" + "127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|"
                    + "172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|" + "172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|"
                    + "172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}|" + "0:0:0:0:0:0:0:1|::1");

    @Override
    public void invoke(Request request, Response response) throws IOException, ServletException {
        if (internalProxies.matcher(request.getRemoteAddr()).matches()) {
            final String user = request.getHeader(remoteUserHeader);
            if (user != null && !user.isEmpty()) {
                request.setUserPrincipal(new CoyotePrincipal(user));
            }
        }

        getNext().invoke(request, response);
    }
}
  1. 将阀门添加到servers.xml
<Engine name="Catalina">
    <Valve className="fully.qualified.name.RemoteUserValve" />
    ...
</Engine>

我认为这不是很安全,但它提供了与等效 AJP 功能相同级别的安全性。

【讨论】:

  • 在这个服务器上运行的 Java 的古老版本下编译它有点麻烦,但这确实让我向前迈进了一步。
  • 导入 org.apache.catalina.connector.CoyotePrincipal;导入 org.apache.catalina.connector.Request;导入 org.apache.catalina.connector.Response;导入 org.apache.catalina.valves.ValveBase;导入 java.io.IOException;导入 java.util.regex.Pattern;导入 javax.servlet.ServletException;
  • 是的,为简洁起见,我省略了导入。我将它们添加到答案中。
猜你喜欢
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2017-12-21
  • 2010-10-31
  • 2010-09-22
  • 2018-03-31
  • 2022-08-22
  • 2011-12-15
相关资源
最近更新 更多