9.3. 设置负载均衡器或代理
本节讨论在集群的 Red Hat Single Sign-On 部署前面放置反向代理或负载均衡器前需要配置的多个内容。它还涵盖配置群集 域示例 的内置负载均衡器。
下图演示了负载平衡器的使用。在本例中,负载均衡器充当三个红帽单点登录服务器集群之间的反向代理。
Load Balancer 图表示例
9.3.1. 识别客户端 IP 地址 复制链接链接已复制到粘贴板!
Red Hat Single Sign-On 中的一些功能取决于连接身份验证服务器的 HTTP 客户端的远程地址是客户端计算机的实际 IP 地址。示例包括:
- 事件日志 - 失败的登录尝试会记录错误的源 IP 地址
- 需要 SSL - 如果需要 SSL (默认),它应该为所有外部请求使用 SSL
- 身份验证流 - 使用 IP 地址进行自定义身份验证流,例如,只显示 OTP 用于外部请求
- 动态客户端注册
如果您在 Red Hat Single Sign-On 身份验证服务器前有反向代理或负载均衡器,这可能会出现问题。常见的设置是,您有一个前端代理位于公共网络上,它会对请求进行负载平衡并将请求转发给位于专用网络中的 Red Hat Single Sign-On 服务器实例。在这种情况下,您需要执行一些额外的配置,以便实际的客户端 IP 地址被转发到红帽单点登录服务器实例并处理。具体来说:
-
配置反向代理或负载均衡器,以正确设置
X-Forwarded-For
和X-Forwarded-Proto
HTTP 标头。 - 配置反向代理或负载均衡器,以保留原始 'Host' HTTP 标头。
-
配置身份验证服务器以从
X-Forwarded-For
标头读取客户端的 IP 地址。
配置代理来生成 X-Forwarded-For
和 X-Forwarded-Proto
HTTP 标头并保留原始主机 HTTP 标头已超出本指南的范围。采取额外的预防措施,以确保代理设置了
X-Forwarded-For
标头。如果您的代理没有正确配置,则 恶意 客户端可以自己设置此标头,并提示红帽单点登录考虑客户端正在从不同 IP 地址进行连接,而不是实际情况。如果您正在执行任何黑色或白色 IP 地址列表,这非常重要。
除了代理本身外,您还需要在 Red Hat Single Sign-On of things 配置一些。如果您的代理通过 HTTP 协议转发请求,您需要配置 Red Hat Single Sign-On,以便从 X-Forwarded-For
标头(而不是从网络数据包)拉取客户端的 IP 地址。为此,请打开配置文件配置文件(standalone.xml、standalone-ha.xml 或 domain.xml,具体取决于您的 操作模式),并查找 urn:jboss:domain:undertow:12.0
XML 块。
x-Forwarded-For
HTTP 配置
将 proxy-address-forwarding
属性添加到 http-listener
元素。将值设为 true
。
如果您的代理正在使用 AJP 协议而不是 HTTP 来转发请求(例如,Apache HTTPD + mod-cluster),那么您必须配置不同的方法。您需要添加一个过滤器从 AJP 数据包拉取此信息,而不是修改 http-listener
。
x-Forwarded-For
AJP 配置
9.3.2. 使用反向代理启用 HTTPS/SSL 复制链接链接已复制到粘贴板!
假设您的反向代理不会将端口 8443 用于 SSL,那么您还需要将端口配置为重定向 HTTPS 流量的端口。
流程
-
将
redirect-socket
属性添加到http-listener
元素。该值应该是proxy-https
,它指向您也需要定义的套接字绑定。 在
socket-binding
-group 元素中添加新的 socket-binding
元素:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.3.3. 验证配置 复制链接链接已复制到粘贴板!
您可以验证反向代理或负载均衡器配置
流程
通过反向代理打开路径
/auth/realms/master/.well-known/openid-configuration
。例如,如果反向代理地址为
https://acme.com/
,则打开 URLhttps://acme.com/auth/realms/master/.well-known/openid-configuration
。这将显示一个 JSON 文档,列出 Red Hat Single Sign-On 的多个端点。- 确保端点以您的反向代理或负载均衡器的地址(提取、域和端口)开头。通过执行此操作,您要确保 Red Hat Single Sign-On 使用正确的端点。
验证 Red Hat Single Sign-On 是否看到请求的正确源 IP 地址。
要进行检查,您可以尝试使用无效的用户名和/或密码登录 Admin Console。这应该会在服务器日志中显示类似如下的警告:
08:14:21,287 WARN XNIO-1 task-45 [org.keycloak.events] type=LOGIN_ERROR, realmId=master, clientId=security-admin-console, userId=8f20d7ba-4974-4811-a695-242c8fbd1bf8, ipAddress=X.X.X.X, error=invalid_user_credentials, auth_method=openid-connect, auth_type=code, redirect_uri=http://localhost:8080/auth/admin/master/console/?redirect_fragment=%2Frealms%2Fmaster%2Fevents-settings, code_id=a3d48b67-a439-4546-b992-e93311d6493e, username=admin
08:14:21,287 WARN XNIO-1 task-45 [org.keycloak.events] type=LOGIN_ERROR, realmId=master, clientId=security-admin-console, userId=8f20d7ba-4974-4811-a695-242c8fbd1bf8, ipAddress=X.X.X.X, error=invalid_user_credentials, auth_method=openid-connect, auth_type=code, redirect_uri=http://localhost:8080/auth/admin/master/console/?redirect_fragment=%2Frealms%2Fmaster%2Fevents-settings, code_id=a3d48b67-a439-4546-b992-e93311d6493e, username=admin
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
检查
ipAddress
的值是您尝试登录的机器的 IP 地址,而不是反向代理或负载均衡器的 IP 地址。
9.3.4. 使用内置负载均衡器 复制链接链接已复制到粘贴板!
本节介绍配置群集 域示例 中讨论的内置负载均衡器。
集群域示例 仅设计为在一台计算机上运行。要在另一个主机上启动从设备,您需要执行以下操作:
- 编辑 domain.xml 文件以指向您的新主机从设备
- 复制服务器分发。您不需要 domain.xml、host.xml 或 host-master.xml 文件。您不需要 独立/ 目录。
- 编辑 host-slave.xml 文件,以更改所用的绑定地址或在命令行中覆盖它们
流程
- 打开 domain.xml,以便您可以使用负载均衡器配置注册新主机从设备。
转到
load-balancer
配置集中的 undertow 配置。在reverse-proxy
XML 块中添加名为remote-
的新主机定义。host
3domain.xml reverse-proxy config
Copy to Clipboard Copied! Toggle word wrap Toggle overflow output-socket-binding
是指向稍后在 domain.xml 文件中配置的socket-binding
的逻辑名称。instance-id
属性还必须对新主机是唯一的,因为这个值供 Cookie 用于在负载平衡时启用粘性会话。向下到
load-balancer-sockets
socket-binding-group
,再为remote-host3
添加outbound-socket-binding
。这个新绑定需要指向新主机的主机和端口。
domain.xml outbound-socket-binding
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.3.4.1. Master 绑定地址 复制链接链接已复制到粘贴板!
接下来,您需要做的是更改 master 主机的公共
和管理
绑定地址。按照 Bind Addresses 章节中所述编辑 domain.xml 文件,或者在命令行中指定这些绑定地址,如下所示:
domain.sh --host-config=host-master.xml -Djboss.bind.address=192.168.0.2 -Djboss.bind.address.management=192.168.0.2
$ domain.sh --host-config=host-master.xml -Djboss.bind.address=192.168.0.2 -Djboss.bind.address.management=192.168.0.2
9.3.4.2. 主机从属绑定地址 复制链接链接已复制到粘贴板!
接下来,您必须更改 公共
、管理
、域控制器绑定地址(jboss.domain.master-address
)。编辑 host-slave.xml 文件或在命令行中指定它们,如下所示:
domain.sh --host-config=host-slave.xml
$ domain.sh --host-config=host-slave.xml
-Djboss.bind.address=192.168.0.5
-Djboss.bind.address.management=192.168.0.5
-Djboss.domain.master.address=192.168.0.2
与主机从设备 IP 地址相关的 jboss.bind.address
和 jboss.bind.address.management
的值。jboss.domain.master.address
的值需要是域控制器的 IP 地址,这是 master 主机的管理地址。