如何在不使用 AJP 的情况下配置 Tomcat(在 Apache 之后)?

How do I configure Tomcat (behind Apache) without using AJP?

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

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

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

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

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

  1. 配置 Apache 2 以发送 X-Forwarded-User header(如果我们有经过身份验证的用户):
RequestHeader unset X-Forwarded-User
RequestHeader set X-Forwarded-User "expr=%{REMOTE_USER}" "expr=-n %{REMOTE_USER}"
  1. 编译(并将其放入 $CATALINA_BASE/lib)Tomcat 端的 Valve,它将从 "trusted" 中检索 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 功能相同级别的安全性。