export JAVA_OPTS_APPEND="-Djava.net.preferIPv4Stack=true"
Keycloak 生产环境为部署提供安全的身份验证和授权,这些部署范围从支持数千用户的本地部署到服务数百万用户的部署。
本指南介绍了生产就绪的 Keycloak 环境所需的通用配置领域。 此信息侧重于一般概念,而不是实际实现,实际实现取决于您的环境。 本指南中涵盖的关键方面适用于所有环境,无论是容器化、本地部署、GitOps 还是 Ansible。
Keycloak 不断交换敏感数据,这意味着所有往返 Keycloak 的通信都需要安全通信通道。 为了防止多种攻击媒介,您需要为该通道启用基于 TLS 的 HTTP 或 HTTPS。
要为 Keycloak 配置安全通信通道,请参阅 配置 TLS 和 配置出站 HTTP 请求。
要保护 Keycloak 的缓存通信,请参阅 配置分布式缓存。
在生产环境中,Keycloak 实例通常在私有网络中运行,但 Keycloak 需要公开某些面向公众的端点,以便与要保护的应用程序进行通信。
有关端点类别以及如何为其配置公共主机名的说明,请参阅 配置主机名 (v2)。
最佳实践是在与公共前端 URL(例如登录流程使用)不同的主机名或上下文路径上公开 Keycloak 管理 REST API 和控制台。 这种分离确保管理界面不会暴露于公共互联网,从而减少攻击面。
如果 REST API 不打算公开,则需要在反向代理级别阻止对 REST API 的访问。 |
有关详细信息,请参阅 配置主机名 (v2)。
除了 配置主机名 (v2) 之外,生产环境通常还包括反向代理/负载均衡器组件。 它分离和统一对您的公司或组织使用的网络的访问。 对于 Keycloak 生产环境,建议使用此组件。
有关在 Keycloak 中配置代理通信模式的详细信息,请参阅 使用反向代理。 该指南还建议应隐藏哪些路径以防止公共访问,以及应公开哪些路径,以便 Keycloak 可以保护您的应用程序。
生产环境应保护自身免受过载情况的影响,以便它可以响应尽可能多的有效请求,并在情况恢复正常后继续正常运行。 一种方法是在达到特定阈值后拒绝其他请求。
负载分流应在所有级别实施,包括您环境中的负载均衡器。 除此之外,Keycloak 中还有一个功能可以限制无法立即处理且需要排队的请求数量。 默认情况下,未设置限制。 设置选项 http-max-queued-requests
以将排队请求的数量限制为与您的环境匹配的给定阈值。 任何超过此限制的请求都将立即返回 503 Server not Available
响应。
Keycloak 使用的数据库对于 Keycloak 的整体性能、可用性、可靠性和完整性至关重要。 有关如何配置受支持数据库的详细信息,请参阅 配置数据库。
为了确保在 Keycloak 实例宕机时用户可以继续登录,典型的生产环境包含两个或多个 Keycloak 实例。
Keycloak 运行在 JGroups 和 Infinispan 之上,它们为集群场景提供可靠的高可用性堆栈。 部署到集群时,应保护嵌入式 Infinispan 服务器通信。 您可以通过启用身份验证和加密或隔离用于集群通信的网络来保护此通信。
要了解有关使用多个节点、不同缓存以及适合您环境的堆栈的更多信息,请参阅 配置分布式缓存。
JGroups 支持用于 TCP 通信的 Java SSL 套接字。 有关如何配置 TLS 以及 UDP 通信的可用替代方案的更多信息,请查看 配置分布式缓存。
必须打开一组网络端口,以允许 Keycloak 服务器之间进行正常的网络通信。 请参阅 配置分布式缓存。 它描述了需要打开哪些端口及其用途。
系统属性 java.net.preferIPv4Stack
和 java.net.preferIPv6Addresses
用于配置 JVM 以与 IPv4 或 IPv6 地址一起使用。
默认情况下,Keycloak 可以同时通过 IPv4 和 IPv6 地址访问。 为了仅使用 IPv4 地址运行,您需要指定属性 java.net.preferIPv4Stack=true
。 后者确保任何主机名到 IP 地址的转换始终返回 IPv4 地址变体。
这些系统属性可以通过 JAVA_OPTS_APPEND
环境变量方便地设置。 例如,要将 IP 堆栈首选项更改为 IPv4,请按如下方式设置环境变量
export JAVA_OPTS_APPEND="-Djava.net.preferIPv4Stack=true"
要仅为 IPv6 设置服务器,请按如下方式为分布式缓存设置环境变量以形成集群
export JAVA_OPTS_APPEND="-Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true"
有关更多详细信息,请参阅 配置分布式缓存。