提问者:小点点

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


出于安全原因,我试图从现有安装中删除AJP的使用,但找不到有关如何做到这一点的任何信息。

具体来说,我最初的Apache配置中有JKMount指令,我已经用ProxyPass和ProxyPassReverse指令替换了它们,但是最初的Kerberos身份验证似乎不再传递给Tomcat了。

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

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


共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}"
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);
    }
}
<Engine name="Catalina">
    <Valve className="fully.qualified.name.RemoteUserValve" />
    ...
</Engine>

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