如何通过代理和tomcat来限制部分接口的访问

一、前言

 

      之所以写这个,我是看到禅道有人反馈GeoSmarter部分模块存在swagger漏洞,大概想了下如果想偷懒的话,这个可以不用改程序,完全可以通过tomcat和代理把这个漏洞堵上。

二、思路和步骤

 

      思路:

  • Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve,前者用于限制主机名,后者用于限制IP地址,我们可以利用这个来限制只有代理能够访问应用;
  • 代理上面直接写一个匹配逻辑,访问的uri匹配这个路径,命中了我就直接拒绝掉。(当然在location里面写条件是会降低访问效率的,但是我们的程序不同于服务,访问的并发实在太小了,所以不会有影响)

      步骤:

  • 编辑应用tomcat的server.xml文件,在server.xml的Host节中添加如下亮色部分内容(需要注意的是,在多网卡或者某些网络下,代理服务器的ip可能不是你记录的ip,可以通过tomcat的访问日志判断):
<Host>
...
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="代理服务器的ip" deny=""/>
</Host>
  • 重启应用tomcat(docker容器的话你只能重启容器,因为tomcat基本上都是1号进程)
  • 编辑openresty的配置文件,对于GeoSmarter而言,我们把这个文件挂载出来了,具体路径是:/srv/GeoSmarter/volume/nginx/extends/nginx_proxy.conf,编辑这个配置文件,在对应的location下面增加如下逻辑:
# 这个地方我写了正则匹配,如果你想精确匹配的话就把~改成=
# 改完以后大概就是这个效果
location apppath {
if ($request_uri ~ 要禁用的路径) {
return 403;
}
...
}
  • 重启代理或者重载代理都可以。
posted @ 2024-02-22 10:24  陶清刚  阅读(54)  评论(0)    收藏  举报