通过 IP 限制对 Tomcat 管理员的访问
Restrict access to Tomcat manager by IP
我正在尝试限制对我的 Tomcat 经理的所有请求,这些请求不是来自我的 IP。
到目前为止,我发现向 server.xml 添加一个 Valve 是这样的:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="IP"/>
将阻止所有请求,除了来自 "IP" 的请求到整个 Tomcat(包括 webapps)。有谁知道如何做同样的事情,但只适用于 Tomcat 经理?
顺便说一下,我正在使用 Tomcat7.
在[tomcat]/conf/Catalina/[hostname]
中创建文件manager.xml
.
因此,如果您的主机名是 www.yourdomainname.com
并且 tomcat 在 opt/tomcat7/
中,那将是:
/opt/tomcat7/conf/Catalina/www.yourdomainname.com/manager.xml
在这个新创建的 manager.xml
中,您将 RemoteAddrValve
放入上下文中:
<Context antiResourceLocking="false" privileged="true" docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1|11\.22\.33\.44" denyStatus="404" />
</Context>
用竖线分隔多个ip地址。
我选择 denyStatus=404
这样可能的入侵者就不会知道甚至存在管理员。
重启Tomcat.
2020 年 3 月更新
如果 Tomcat 位于代理服务器后面,请求将全部来自该代理服务器,因此您需要告诉代理服务器将远程地址转发到 Tomcat(在 Nginx 中您会包括一行 proxy_set_header x-forwarded-for $remote_addr;
).
此外,您需要通过在引擎或主机块中包含 RemoteIpValve
来告诉 Tomcat 监视转发的 header:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
requestAttributesEnabled="true" />
在 Tomcat8 中,我发现 RemoteAddrValve 已经在 C:\Program Files\Apache Software Foundation\Tomcat 8.0\webapps\manager\META-INF\context.xml
中,我只需要取消注释...
<Context antiResourceLocking="false" privileged="true" >
<!--
Remove the comment markers from around the Valve below to limit access to
the manager application to clients connecting from localhost
-->
<!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
</Context>
我将@acdhirr 的建议添加到阀门以拒绝状态 denyStatus="404"
,这也奏效了。
我正在尝试限制对我的 Tomcat 经理的所有请求,这些请求不是来自我的 IP。
到目前为止,我发现向 server.xml 添加一个 Valve 是这样的:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="IP"/>
将阻止所有请求,除了来自 "IP" 的请求到整个 Tomcat(包括 webapps)。有谁知道如何做同样的事情,但只适用于 Tomcat 经理?
顺便说一下,我正在使用 Tomcat7.
在[tomcat]/conf/Catalina/[hostname]
中创建文件manager.xml
.
因此,如果您的主机名是 www.yourdomainname.com
并且 tomcat 在 opt/tomcat7/
中,那将是:
/opt/tomcat7/conf/Catalina/www.yourdomainname.com/manager.xml
在这个新创建的 manager.xml
中,您将 RemoteAddrValve
放入上下文中:
<Context antiResourceLocking="false" privileged="true" docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1|11\.22\.33\.44" denyStatus="404" />
</Context>
用竖线分隔多个ip地址。
我选择 denyStatus=404
这样可能的入侵者就不会知道甚至存在管理员。
重启Tomcat.
2020 年 3 月更新
如果 Tomcat 位于代理服务器后面,请求将全部来自该代理服务器,因此您需要告诉代理服务器将远程地址转发到 Tomcat(在 Nginx 中您会包括一行 proxy_set_header x-forwarded-for $remote_addr;
).
此外,您需要通过在引擎或主机块中包含 RemoteIpValve
来告诉 Tomcat 监视转发的 header:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
requestAttributesEnabled="true" />
在 Tomcat8 中,我发现 RemoteAddrValve 已经在 C:\Program Files\Apache Software Foundation\Tomcat 8.0\webapps\manager\META-INF\context.xml
中,我只需要取消注释...
<Context antiResourceLocking="false" privileged="true" >
<!--
Remove the comment markers from around the Valve below to limit access to
the manager application to clients connecting from localhost
-->
<!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
</Context>
我将@acdhirr 的建议添加到阀门以拒绝状态 denyStatus="404"
,这也奏效了。