使用反向代理后IdP相关配置调整

介绍

IdP 的服务发布,大致可以分为 Tomcat 直接发布,AJP 代理发布和 HTTP 反向代理发布三种。

什么是 AJP 代理?

AJP  Apache 提供的一种反向代理服务器的二进制协议。在 Apache 中通过 mod_proxy_ajp 模块发送 AJP 数据,另一端服务器——比如 Tomcat 则需要能够接受 mod_proxy_ajp 模块发送的 AJP 协议数据,进行交互。

由于 AJP 协议使用二进制传输方式,因此它比 HTTP 的文本传输方式更有效率。并且它能够直接向服务器端提供原始的 HTTP 头部信息,例如客户端 IP 地址等。

什么是 HTTP 反向代理?

更多时候,我们会通过更通用的 HTTP 协议来实现反向代理。此时,由于代理服务器向后端的真实服务器也是通过 HTTP 协议发送请求。因此默认情况下,后端服务器所获取到的客户端地址,均是代理服务器的地址;后端服务器获取到的请求协议,则是后端服务器所发布的协议。

例如我们通过反向代理服务器发布了一个 https://idp.example.org 这样一个网站,并做了 SSL 卸载,与后端服务器采用 http 协议通讯。那么默认情况下,后端服务器所获取的请求 url 均是 http://idp.example.org。这在 Shibboleth-IdP 的场景中会存在问题。

当客户端请求代理服务器的 https 服务时,他所产生的 cookie 中所记录的 url 信息也都是 https 的请求。而此时如果服务器端获取到的是 http 请求,则服务器会认为这个请求非法,从而报错。

因此,我们需要将真实的请求协议,和真实的客户端地址,通过插入 header 的方式,提供给后端服务器。

根据ova镜像或者手动安装的idp,前面添加反向代理后如何修改idp上的配置,以便idp能正常使用。

1.反向代理配置

反向代理服务器上,增加 X-Forwarded-For  X-Forwarded-Proto 两个 header 信息,传递真实的请求 IP 和真实的请求协议。

 nginx 为例,其他反向代理的配置请咨询相关供应商获取技术支持。请将xxx.xxx.xxx.xxx替换成实际idp的服务器地址。

      location /idp {
        proxy_pass      http://xxx.xxx.xxx.xxx:8080/idp;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
      }

2.tomcat 配置

在 tomcat 的 server.xml  Engine tag 中,增加下述配置。从而将传递给应用的客户端 ip 和请求协议替换为 X-Forwarded-For  X-Forwarded-Proto 中的值。

注意将 internalProxies 配置为您反向代理的内网地址。

[root@www ~]# vi /etc/tomcat/server.xml
#找到如下内容,取消掉注释
<Connector port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" />

#在最后</Engine>标签前面加上,请将xxx.xxx.xxx.xxx修改成代理服务器的ip地址,如果有多个请采用xxx.xxx.xxx.xxx|xxx.xxx.xxx.xxx的格式,如果支持ipv6,需要把ipv6和ipv4地址同时加上
    <Valve className="org.apache.catalina.valves.RemoteIpValve"
           internalProxies="xxx.xxx.xxx.xxx"
           remoteIpHeader="x-forwarded-for"
           protocolHeader="x-forwarded-proto"
    />

然后开放服务器的 8080 端口,以便于反向代理服务器访问 tomcat

[root@www ~]# firewall-cmd -add-port=8080/tcp --permanent
[root@www ~]# firewall-cmd --reload

为了安全考虑,也可以只对代理服务器开放8080端口,请将xxx.xxx.xxx.xxx替换成代理服务器ip地址,如果有ipv6地址,请也针对防火墙放开

#针对ipv4地址
[root@www ~]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xxx.xxx.xxx.xxx" port protocol="tcp" port="8080" accept"
#针对ipv6地址
[root@www ~]# firewall-cmd --permanent --add-rich-rule="rule family="ipv6" source address="xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" port protocol="tcp" port="8080" accept"
[root@www ~]# firewall-cmd --reload

3. auditlog 配置(使用 tomcat 发布日志和反向代理上增加代理配置二选一配置即可)

使用 tomcat 发布日志

由于采用反向代理模式,不再需要 apache 服务。那么此时CARSI会员自服务系统中日志分析所需要的 auditlog 部分就需要通过 tomcat 来发布。

在部署 apache 或采用 ova 模板的情况下, auditlog 默认存放在 /var/www/html/auditlog/ 目录。如果您采用手动安装的话,也可以将他部署在其他目录上,并替换下面配置中的 docBase 路径。

修改 tomcat 的配置,并限制 127.0.0.1 和 115.27.243.6 访问

[root@www ~]# vi /etc/tomcat/server.xml
#在<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true"> 后面增加
        <Context path="/auditlog" debug="0" docBase="/var/www/html/auditlog" reloadable="true">
                <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1|115.27.243.6" deny="" denyStatus="403"/>
        </Context>

反向代理上增加代理配置

 nginx 为例,其他反向代理的配置请咨询相关供应商获取技术支持

      location /auditlog {
        proxy_pass      http://192.168.1.9:8080/auditlog;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
      }

由于通常反向代理的性能更好,也可以将 ip 地址限制放在反向代理上来做,修改反向代理的配置。以 nginx 为例,其他反向代理的配置请咨询相关供应商获取技术支持

      location /auditlog {
        proxy_pass      http://192.168.1.9:8080/auditlog;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        allow 115.27.243.6;
        deny all;
      }

4. 关闭防火墙上相应的443端口

[root@www ~]# firewall-cmd -remove-service=https --permanent
[root@www ~]# firewall-cmd --reload

如果撤掉反向代理的话,只需要再将443端口开启,即可使用本机的apache提供服务

[root@www ~]# firewall-cmd -add-service=https --permanent
[root@www ~]# firewall-cmd --reload

版权所有©北京大学计算中心