使用反向代理后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
版权所有©北京大学计算中心