8.3. 设置负载均衡器或代理
本节讨论在集群 Red Hat Single Sign-On 部署前放置反向代理或负载均衡器前需要配置的一些内容。它还涵盖了配置集群域 示例 中的内置负载均衡器。
8.3.1. 识别客户端 IP 地址 复制链接链接已复制到粘贴板!
Red Hat Single Sign-On 中的一些功能依赖于连接到身份验证服务器的 HTTP 客户端的远程地址是客户端机器的实际 IP 地址。示例包括:
- 事件日志 - 使用错误的源 IP 地址记录失败的登录尝试
- SSL 必需 - 如果需要 SSL 设置为 external (默认值),则所有外部请求都需要 SSL
- 身份验证流 - 使用 IP 地址的自定义身份验证流,如 show OTP 仅适用于外部请求
- 动态客户端注册
当您在 Red Hat Single Sign-On 身份验证服务器前面有一个反向代理或 loadbalancer 时,这可能会造成问题。常见的设置是,您有一个 frontend 代理位于公共网络上,该代理负载平衡并将请求转发到专用网络中的后端 Red Hat Single Sign-On 服务器实例。在这种情况下,您必须执行一些额外的配置,以便实际的客户端 IP 地址被 Red Hat Single Sign-On 服务器实例转发到和处理。具体来说:
-
将您的反向代理或负载均衡器配置为正确设置
X-Forwarded-For
和X-Forwarded-Proto
HTTP 标头。 - 将您的反向代理或负载均衡器配置为保留原始的 'Host' HTTP 标头。
-
配置身份验证服务器,以从
X-Forwarded-For
标头读取客户端的 IP 地址。
配置代理以生成 X-Forwarded-For
和 X-Forwarded-Proto
HTTP 标头,并保留原始主机 HTTP 标头超出了本指南的范围。采取额外的措施来确保代理设置了
X-Forwared-For
标头。如果您的代理没有正确配置,则 恶意 客户端可以自行设置此标头,并欺骗 Red Hat Single Sign-On 认为客户端正在从不同的 IP 地址连接。如果您正在执行 IP 地址的黑色或白名单,这非常重要。
除了代理本身外,您需要在 Red Hat Single Sign-On 端配置一些操作。如果您的代理通过 HTTP 协议转发请求,则需要配置 Red Hat Single Sign-On,以从 X-Forwarded-For
标头而不是从网络数据包中提取客户端的 IP 地址。为此,请打开配置文件配置文件(standalone.xml、standalone-ha.xml 或 domain.xml,具体取决于您的 操作模式),并查找 urn:jboss:domain:undertow:6.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 配置
8.3.2. 使用 Reverse 代理启用 HTTPS/SSL 复制链接链接已复制到粘贴板!
假设您的反向代理没有为 SSL 使用端口 8443,您还需要配置将哪些端口 HTTPS 流量重定向到其中。
将 redirect-socket
属性添加到 http-listener
元素。该值应该是 proxy-https
,它指向您还需要定义的套接字绑定。
然后,在 socket-binding
- group 元素中添加一个新的 socket-binding
元素:
8.3.3. 验证配置 复制链接链接已复制到粘贴板!
您可以通过反向代理打开路径 /auth/realms/master/.well-known/openid-configuration
来验证反向代理或负载均衡器配置。例如,如果反向代理地址是 https://acme.com/
,则打开 URL https://acme.com/auth/realms/master/.well-known/openid-configuration。
这将显示一个 JSON 文档,其中列出了 Red Hat Single Sign-On 的多个端点。确保端点以反向代理或负载均衡器的地址(scheme、domain 和 port)开头。通过这样做,您可以确保 Red Hat Single Sign-On 使用正确的端点。
您还应验证 Red Hat Single Sign-On 是否看到请求的正确源 IP 地址。检查您可以尝试使用无效的用户名和/或密码登录管理控制台。这应该会在服务器日志中显示警告信息,如下所示:
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
检查 ipAddress
的值是您尝试使用登录的机器的 IP 地址,而不是反向代理或负载均衡器的 IP 地址。
8.3.4. 使用 Built-In Load Balancer 复制链接链接已复制到粘贴板!
本节介绍配置在群集 域示例 中讨论的内置负载均衡器。
集群域示例 仅设计为在一台计算机上运行。要在另一主机上启动从设备,您需要:
- 编辑 domain.xml 文件以指向您的新主机从设备
- 复制服务器分发。您不需要 domain.xml、host.xml 或 host-master.xml 文件。不需要 standalone/ 目录。
- 编辑 host-slave.xml 文件,以在命令行中更改使用或覆盖它们的绑定地址
8.3.4.1. 使用 Load Balancer 注册新主机 复制链接链接已复制到粘贴板!
我们首先在 domain.xml 中使用负载均衡器配置注册新主机 slave。打开此文件,再前往 load-balancer
配置文件中的 undertow 配置。在 reverse-proxy
XML 块中添加名为 remote-
的新主机定义。
host
3
domain.xml reverse-proxy config
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
8.3.4.2. 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
8.3.4.3. 主机 Slave Bind Addresses 复制链接链接已复制到粘贴板!
接下来,您必须更改 公共
、管理
和域控制器绑定地址(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.addres.management
的值。jboss.domain.master.address
的值必须是域控制器的 IP 地址,这是 master 主机的管理地址。
8.3.5. 配置其他 Load Balancer 复制链接链接已复制到粘贴板!
有关如何使用其他基于软件的 负载平衡器的信息,请参阅 JBoss EAP 配置指南中的 负载平衡 部分。