配置 Keycloak 用于生产

了解如何使 Keycloak 准备好用于生产。

Keycloak 生产环境为部署提供安全的身份验证和授权,这些部署的范围从支持数千用户的本地部署到服务数百万用户的部署。

本指南介绍了生产就绪型 Keycloak 环境所需的通用配置领域。此信息侧重于一般概念,而不是实际实现,实际实现取决于您的环境。本指南中介绍的关键方面适用于所有环境,无论它是容器化、本地、GitOps 还是 Ansible。

用于安全通信的 TLS

Keycloak 不断交换敏感数据,这意味着与 Keycloak 之间的所有通信都需要安全的通信通道。为了防止多种攻击媒介,您需要为此通道启用 HTTP over TLS 或 HTTPS。

要为 Keycloak 配置安全通信通道,请参阅 配置 TLS配置传出 HTTP 请求

要保护 Keycloak 的缓存通信,请参阅 配置分布式缓存

Keycloak 的主机名

在生产环境中,Keycloak 实例通常运行在私有网络中,但 Keycloak 需要公开某些面向公众的端点,以便与要保护的应用程序进行通信。

有关端点类别和如何为它们配置公共主机名的说明的详细信息,请参阅 配置主机名 (v2)

在不同主机名上公开 Keycloak 管理 API 和 UI

最佳实践是将 Keycloak 管理 REST API 和控制台公开到与用于公共前端 URL 的主机名或上下文路径不同的主机名或上下文路径上,例如登录流。这种分离确保管理界面不会暴露给公共互联网,从而减少攻击面。

如果 REST API 不打算公开,则需要在反向代理级别阻止对它们的访问。

有关详细信息,请参阅 配置主机名 (v2)

分布式环境中的反向代理

除了 配置主机名 (v2) 之外,生产环境通常还包括反向代理/负载均衡器组件。它分离和统一对公司或组织使用的网络的访问。对于 Keycloak 生产环境,建议使用此组件。

有关在 Keycloak 中配置代理通信模式的详细信息,请参阅 使用反向代理。该指南还建议哪些路径应从公共访问中隐藏,以及哪些路径应公开,以便 Keycloak 可以保护您的应用程序。

限制排队请求的数量

生产环境应保护自己免受过载情况,以便它响应尽可能多的有效请求,并在情况恢复正常后继续正常运行。这样做的一种方法是在达到某个阈值后拒绝其他请求。

应在所有级别实施负载卸载,包括您环境中的负载均衡器。除此之外,Keycloak 中还有一个功能可以限制无法立即处理并需要排队的请求数量。默认情况下,没有设置限制。设置选项 http-max-queued-requests 以将排队请求的数量限制在与您的环境匹配的给定阈值。任何超过此限制的请求都会立即返回 503 Server not Available 响应。

生产级数据库

Keycloak 使用的数据库对于 Keycloak 的整体性能、可用性、可靠性和完整性至关重要。有关如何配置支持的数据库的详细信息,请参阅 配置数据库

对 Keycloak 集群的支持

为了确保用户可以在 Keycloak 实例出现故障时继续登录,典型的生产环境包含两个或多个 Keycloak 实例。

Keycloak 运行在 JGroups 和 Infinispan 之上,它们为集群场景提供了可靠的高可用性堆栈。当部署到集群时,应保护嵌入式 Infinispan 服务器通信。您可以通过启用身份验证和加密或隔离用于集群通信的网络来保护此通信。

要了解有关使用多个节点、不同的缓存以及适合您环境的堆栈的更多信息,请参阅 配置分布式缓存

使用 IPv4 或 IPv6 配置 Keycloak 服务器

系统属性 java.net.preferIPv4Stackjava.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"
在本页