出于安全原因,我试图从现有安装中删除AJP的使用,但找不到有关如何做到这一点的任何信息。
具体来说,我最初的Apache配置中有JKMount指令,我已经用ProxyPass和ProxyPassReverse指令替换了它们,但是最初的Kerberos身份验证似乎不再传递给Tomcat了。
(我现在已启用mod_proxy_http和mod_proxy。)
在这种情况下,谷歌绝对不是我的朋友。
使用mod_proxy_http
没有标准的方法将经过身份验证的用户名从Apache转发到Tomcat,但您可以轻松创建一个:
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功能相同级别的安全性。