指南概述

本指南的目的是在启动 Keycloak服务器第一次。 如果您只想测试驱动器Keycloak,它几乎可以用它的盒子 拥有嵌入式且仅本地的数据库。 对于 将要在生产中运行的实际部署,您需要决定如何管理服务器配置 在运行时 (独立或域模式),为Keycloak存储配置共享数据库,设置加密和HTTPS, 最后设置Keycloak在集群中运行。 本指南浏览任何预引导的每个方面 部署服务器之前必须执行的决策和设置。

特别要注意的一点是,Keycloak是从WildFly应用程序服务器派生的。 配置Keycloak的许多方面都围绕着WildFly配置元素。 经常 如果您想深入了解更多细节,本指南将指导您查看手册之外的文档。

Keycloak构建在WildFly应用服务器及其子项目 (如Infinispan (用于缓存) 和Hibernate (用于持久性)) 之上。 本指南仅涵盖基础架构级别配置的基础知识。 强烈建议您仔细阅读文档 适用于WildFly及其子项目。 这是文档的链接:

安装

安装Keycloak就像下载并解压缩一样简单。 本章审查系统要求 以及发行版的目录结构。

系统要求

这些是运行Keycloak身份验证服务器的要求:

  • 可以在任何运行Java的操作系统上运行

  • Java 8 JDK

  • 拉链或gzip和焦油

  • 至少512M的RAM

  • 至少1g的diskspace

  • 一个共享的外部数据库,如PostgreSQL、MySQL、Oracle等。 Keycloak需要外部共享 数据库,如果要在集群中运行。 请看数据库配置有关更多信息,本指南的部分。

  • 如果要在集群中运行,请在计算机上支持网络多播。 Keycloak罐 在没有多播的情况下进行群集,但这需要一堆配置更改。 请看 的聚类有关更多信息,本指南的部分。

  • 在Linux上,建议使用/开发/乌兰多姆作为随机数据的来源,以防止由于缺乏可用而导致的Keycloak挂起 熵,除非/开发/随机使用是由您的安全策略规定的。 要在Oracle JDK 8和OpenJDK 8上实现,请设置java.security.egd 启动时的系统属性文件:/dev/urandom

安装分发文件

Keycloak服务器有两个可下载的发行版:

  • 'keycloak-15.0.2。[zip | tar.gz]'

  • 'keycloak-overlay-15.0.2。[zip | tar.gz]'

“keycloak-15.0.2。[zip | tar.gz]” 文件是仅服务器发行版。 它只包含脚本和二进制文件 运行Keycloak服务器。 要解压缩此文件,只需运行您的操作系统的解压缩或者gunzip焦油公用事业。

“keycloak-overlay-15.0.2。[zip | tar.gz]” 文件是一个WildFly附加组件,允许您在现有的基础上安装Keycloak服务器 野蝇分布。 我们不支持想要在同一服务器实例上运行其应用程序和Keycloak的用户。 要安装Keycloak Service Pack,只需将其解压缩到根目录中即可 在您的WildFly发行版中,在shell中打开bin目录并运行。/jboss-cli.[sh | bat] -文件 = keycloak-install.cli

要解压缩这些文件,请运行解压缩或者gunzip焦油公用事业。

分发目录结构

本章将引导您了解服务器发行版的目录结构。

让我们检查一些目录的目的:

bin/

其中包含各种脚本,用于引导服务器或在服务器上执行其他管理操作。

域/

这包含在运行Keycloak时的配置文件和工作目录域模式

模块/

这些都是服务器使用的Java库。

独立/

这包含在运行Keycloak时的配置文件和工作目录独立模式

独立/部署/

如果你正在编写Keycloak的扩展,你可以把你的扩展放在这里。 请参阅服务器开发指南有关此的更多信息。

主题/

该目录包含用于显示服务器显示的任何UI屏幕的所有html、样式表、JavaScript文件和图像。 在这里,您可以修改现有主题或创建自己的主题。 请参阅服务器开发指南有关此的更多信息。

选择操作模式

在生产环境中部署Keycloak之前,您需要确定哪种类型的操作模式 你要用。 你会在集群中运行Keycloak吗? 你想要一种集中的方式来管理吗 您的服务器配置? 您对操作模式的选择会影响您配置数据库、配置缓存的方式,甚至影响您引导服务器的方式。

Keycloak构建在WildFly应用程序服务器的顶部。 本指南只会 在特定模式下进行部署的基础知识。 如果你想要这方面的具体信息,一个更好的地方 去的将是野蝇23文档

独立模式

独立操作模式仅在您要运行一个且仅运行一个Keycloak服务器实例时才有用。 它不适用于群集部署,并且所有缓存都是非分布式且仅本地的。 不建议 您在生产中使用独立模式,因为您将有一个单点故障。 如果您的独立模式服务器关闭, 用户将无法登录。 这种模式真的只对试驾和玩Keycloak的功能有用

独立启动脚本

在独立模式下运行服务器时,您需要运行一个特定的脚本来引导服务器,具体取决于您的 操作系统。 这些脚本生活在bin/服务器分发的目录。

独立引导脚本

独立引导文件

要启动服务器:

Linux/Unix
$。../bin/独立.sh
窗户
>。.. \ bin \ 独立.bat

独立配置

本指南的大部分内容将引导您如何配置Keycloak的基础架构级别方面。 这些 方面在特定于应用程序服务器的配置文件中配置,Keycloak是 的导数。 在独立操作模式下,此文件位于…/独立/配置/独立.xml。 这个文件 还用于配置特定于Keycloak组件的非基础架构级别的东西。

独立配置文件

独立配置文件

服务器运行时对此文件所做的任何更改都不会生效,甚至可能被覆盖 由服务器。 而是使用命令行脚本或WildFly的web控制台。 见 的野蝇23文档有关更多信息。

独立集群模式

独立群集操作模式适用于您要在群集内运行Keycloak时。 此模式 要求您在要运行服务器实例的每台计算机上都具有Keycloak发行版的副本。 这种模式最初很容易部署,但会变得相当麻烦。 进行配置更改 你必须修改每台机器上的每个发行版。 对于大型群集,这可能会变得耗时且容易出错。

独立集群配置

该发行版具有用于在群集内运行的大部分预配置的app server配置文件。 它有所有具体的 网络、数据库、缓存和发现的基础设施设置。 此文件位于 在…/独立/配置/standalone-ha.xml。 这种配置缺少一些东西。 如果不配置共享数据库连接,就无法在集群中运行Keycloak。 你还需要 在集群前面部署某种类型的负载平衡器。 的聚类数据库本指南的各个部分将引导您完成这些事情。

独立HA配置

独立ha配置文件

服务器运行时对此文件所做的任何更改都不会生效,甚至可能被覆盖 由服务器。 而是使用命令行脚本或WildFly的web控制台。 见 的野蝇23文档有关更多信息。

独立群集引导脚本

与在独立模式下一样,您使用相同的启动脚本来启动Keycloak。 不同的是 您传入一个额外的标志以指向HA配置文件。

独立集群引导脚本

独立引导文件

要启动服务器:

Linux/Unix
$。../bin/standalone.sh -- server-config = standalone-ha.xml
窗户
>。.. \ bin \ standalone.bat -- server-config = standalone-ha.xml

域群集模式

域模式是一种集中管理和发布服务器配置的方法。

随着群集大小的增加,以标准模式运行群集可能会迅速加剧。 每次你需要的时候 要进行配置更改,您必须在集群中的每个节点上执行它。 域模式通过提供 存储和发布配置的中心位置。 设置可能非常复杂,但最终还是值得的。 此功能内置在Keycloak源自的WildFly应用程序服务器中。

该指南将介绍域模式的基础知识。 有关如何在集群中设置域模式的详细步骤,应从 野蝇23文档

以下是在域模式下运行的一些基本概念。

域控制器

域控制器是一个负责存储、管理和发布通用配置的过程 对于集群中的每个节点。 此过程是群集中的节点从其获取其配置的中心点。

主机控制器

主机控制器负责管理特定机器上的服务器实例。 您将其配置为运行 一个或多个服务器实例。 域控制器还可以与每台机器上的主机控制器进行交互,以 管理集群。 为了减少正在运行的进程的数量,域控制器还充当 它运行的机器。

域配置文件

域配置文件是一组命名的配置,服务器可以使用该配置进行启动。 域控制器 可以定义由不同服务器消耗的多个域配置文件。

服务器组

服务器组是服务器的集合。 它们被管理和配置为一体。 您可以将域配置文件分配给服务器组和其中的每个服务 组将使用该域配置文件作为其配置。

在域模式下,在主节点上启动域控制器。 群集的配置位于域控制器中。 接下来,在群集中的每台计算机上启动主机控制器。 每个主机控制器部署配置指定如何 许多Keycloak服务器实例将在该计算机上启动。 当主机控制器启动时,它启动 与配置的Keycloak服务器实例一样多。 这些服务器实例拉他们的配置 从域控制器。

在某些环境中,例如Microsoft Azure,域模式不适用。 请查阅野蝇文档。

域配置

本指南中的其他各章将引导您配置数据库等各个方面, HTTP网络连接、缓存和其他基础设施相关的东西。 而独立模式使用独立。xml文件来配置这些东西, 域模式使用…/域/配置/域.xml配置文件。 这是 其中定义了Keycloak服务器的域配置文件和服务器组。

域。xml

域文件

在域控制器运行时对该文件所做的任何更改都不会生效,甚至可能被覆盖 由服务器。 而是使用命令行脚本或WildFly的web控制台。 见 的野蝇23文档有关更多信息。

让我们看看这个的一些方面域。xml文件。 的身份验证-服务器-独立身份验证-服务器-群集 简介XML块是您要做出大部分配置决策的地方。 您将在这里配置诸如网络连接,缓存和数据库连接之类的东西。

身份验证-服务器配置文件
    <个人资料>
        <配置文件 名称=身份验证-服务器-独立>
            ...
        </个人资料>
        <配置文件 名称=身份验证-服务器-群集>
            ...
        </个人资料>

身份验证-服务器-独立profile是一个非群集设置。 的身份验证-服务器-群集配置文件是群集设置。

如果你进一步向下滚动,你会看到各种各样的套接字-绑定-组定义。

套接字-绑定-组
    <套接字-绑定-组>
        <套接字-绑定-组 名称=标准插座 默认接口=公众>
           ...
        </套接字-绑定-组>
        <套接字-绑定-组 名称=ha-插座 默认接口=公众>
           ...
        </套接字-绑定-组>
        <!-负载平衡器-插座应在生产系统中删除,并替换为基于更好的软件或硬件的插座->
        <套接字-绑定-组 名称=负载平衡器插座 默认接口=公众>
           ...
        </套接字-绑定-组>
    </套接字-绑定-组>

此配置定义了与每个连接器一起打开的各种连接器的默认端口映射 Keycloak服务器实例。 任何包含${&hellip; }是可以在命令行上覆盖的值 与-D开关,即

$ domain.sh -Djboss.http.port = 80

Keycloak的服务器组的定义位于服务器组XML块。 它指定域配置文件 使用 (默认) 以及主机控制器引导实例时Java VM的一些默认引导参数。 它也 绑定a套接字-绑定-组到服务器组。

服务器组
    <服务器组>
        <!-负载平衡器组应在生产系统中删除,并替换为基于更好的软件或硬件的->
        <服务器组 名称=负载平衡器组 简介=负载平衡器>
            <jvm 名称=默认>
                <堆 尺寸=64米 最大尺寸=512m/>
            </jvm>
            <套接字-绑定-组 参考=负载平衡器插座/>
        </服务器组>
        <服务器组 名称=身份验证-服务器-组 简介=身份验证-服务器-群集>
            <jvm 名称=默认>
                <堆 尺寸=64米 最大尺寸=512m/>
            </jvm>
            <套接字-绑定-组 参考=ha-插座/>
        </服务器组>
    </服务器组>

主机控制器配置

Keycloak带有两个主机控制器配置文件,它们驻留在&hellip;/域/配置/目录: host-master.xmlhost-slave.xmlhost-master.xml配置为启动域控制器、负载均衡器和 一个Keycloak服务器实例。host-slave.xml配置为与域控制器对话并启动 一个Keycloak服务器实例。

负载平衡器不是必需的服务。 它的存在使您可以轻松地在开发中测试驱动器群集 机。 虽然可以在生产中使用,但如果您有不同的硬件或软件,您可以选择更换它 您要使用的基于负载平衡器。
主机控制器配置

主机文件

要禁用负载均衡服务器实例,请编辑host-master.xml并注释掉或删除“负载平衡器”入。

    <服务器>
        <!-删除或注释掉下一行->
        <服务器 名称=负载平衡器 =负载平衡器-组/>
        ...
    </服务器>

关于这个文件要注意的另一个有趣的事情是身份验证服务器实例的声明。 它有 a端口偏移设置。 中定义的任何网络端口域。xml 套接字-绑定-组或者服务器组 将具有端口偏移添加到其中。 对于此示例域设置,我们这样做,以便由 负载平衡器服务器不会与启动的身份验证服务器实例冲突。

    <服务器>
        ...
        <服务器 名称=服务器-一 =身份验证-服务器-组 自动启动=>
             <套接字绑定 端口偏移=150/>
        </服务器>
    </服务器>

服务器实例工作目录

在您的主机文件中定义的每个Keycloak服务器实例在下面创建一个工作目录&hellip;/域/服务器/{服务器名称}。 可以将其他配置放在那里,服务器实例需要或创建的任何临时,日志或数据文件也可以放在那里。 这些每个服务器目录的结构最终看起来像任何其他WildFly引导的服务器。

工作目录

域服务器目录

域引导脚本

在域模式下运行服务器时,您需要运行一个特定的脚本来引导服务器,具体取决于您的 操作系统。 这些脚本生活在bin/服务器分发的目录。

域引导脚本

域引导文件

要启动服务器:

Linux/Unix
$。../bin/domain.sh -- host-config = host-master.xml
窗户
>。.. \ bin \ domain.bat -- host-config = host-master.xml

运行引导脚本时,您需要通过 -- 主机配置开关。

群集域示例

您可以使用开箱即用的测试驱动器群集域。xml配置。 这个例子 域旨在在一台计算机上运行并启动:

  • 域控制器

  • HTTP负载均衡器

  • 2个Keycloak服务器实例

要模拟在两台机器上运行集群,您需要运行域。sh脚本两次启动两个单独的 主机控制器。 第一个将是主主机控制器,它将启动一个域控制器、一个HTTP负载均衡器和一个 Keycloak身份验证服务器实例。 第二个将是仅启动的从主机控制器 启动身份验证服务器实例。

设置与域控制器的从属连接

不过,在启动之前,您必须配置从属主机控制器,以便它可以安全地与域通信 控制器。 如果不这样做,那么从主机将无法从域控制器获得集中配置。 要设置安全连接,您必须创建一个服务器管理员用户和一个秘密 将在主从之间共享。 你通过运行&hellip; /bin/add-user.sh脚本。

运行脚本时,选择管理用户和答案是的当它询问您是否要使用新用户时 一个AS进程连接到另一个进程。 这将生成一个秘密,您需要将其剪切并粘贴到 &hellip;/域/配置/host-slave.xml文件。

添加应用服务器管理员
add-user.sh美元
 您希望添加什么类型的用户?
  a) 管理用户 (mgmt-users.properties)
  b) 应用程序用户 (application-users.properties)
 (a): a
 输入要添加的新用户的详细信息。
 使用从现有属性文件中发现的领域 “管理领域”。
 用户名: 管理员
 下面列出了密码建议。 要修改这些限制,请编辑add-user.properties配置文件。
  -密码不应是以下限制值之一 {root,admin,administrator}
  -密码应至少包含8个字符,1个字母字符,1个数字,1个非字母数字符号
  -密码应与用户名不同
 密码:
 重新输入密码:
 你希望这个用户属于什么组? (请输入以逗号分隔的列表,或将其保留为空)[ ]:
 即将为领域 “管理领域” 添加用户 “管理员”
 这是正确的是/否吗? 是的
 将用户 “管理员” 添加到文件 “/.../独立/配置/mgmt-users.properties”
 将用户 “管理员” 添加到文件 “/.../域/配置/mgmt-users.properties”
 将带有组的用户 “管理员” 添加到文件 “/.../standalone/configuration/mgmt-groups.properties”
 将带有组的用户 “管理员” 添加到文件 “/.../域/配置/mgmt-groups.properties”
 这个新用户是否将用于一个AS进程以连接到另一个AS进程?
 例如。对于连接到主机的从属主机控制器或用于服务器到服务器EJB调用的远程连接。
 是/不是? 是的
 要表示用户,请在服务器标识定义中添加以下内容 <secret value = "bWdtdDEyMyE =" />
该add-user.sh不会将用户添加到Keycloak服务器,而是添加到底层的JBoss企业应用程序平台。 上述脚本中使用和生成的凭据仅用于示例目的。 请使用系统上生成的。

接下来,将秘密值剪切并粘贴到&hellip;/域/配置/host-slave.xml文件如下:

     <管理>
         <安全领域>
             <安全领域 名称=管理领域>
                 <服务器身份>
                     <秘密 =bWdtdDEyMyE =/>
                 </服务器身份>

您还需要添加用户名中的创建用户的&hellip;/域/配置/host-slave.xml文件:

     <远程 安全领域=管理领域 用户名=管理员>
运行引导脚本

由于我们正在模拟一台开发机器上的两个节点群集,因此您将运行两次引导脚本:

启动主机
$ domain.sh -- host-config = host-master.xml
启动从机
$ domain.sh -- host-config = host-slave.xml

要尝试一下,请打开浏览器并转到http:// localhost:8080/auth

跨数据中心复制模式

跨数据中心复制模式为技术预览并且没有得到完全支持。

跨数据中心复制模式允许您跨多个数据中心在集群中运行Keycloak,最典型的是使用位于不同地理区域的数据中心站点。 使用此模式时,每个数据中心将拥有自己的Keycloak服务器集群。

本文档将参考下面的示例架构图来说明和描述一个简单的跨数据中心复制用例。

示例架构图

跨dc架构

先决条件

由于这是一个高级主题,我们建议您首先阅读以下内容,这些内容提供了宝贵的背景知识:

  • 用Keycloak聚类 在设置跨数据中心复制时,您将使用更独立的Keycloak集群,因此您必须了解集群的工作原理以及负载平衡、共享数据库和多播等基本概念和要求。

  • Infinispan跨站点复制在不同的地理位置跨集群复制数据。

技术细节

本节介绍了如何完成Keycloak跨数据中心复制的概念和详细信息。

数据

Keycloak是有状态的应用程序。 它使用以下内容作为数据源:

  • 数据库用于保存永久数据,例如用户信息。

  • Infinispan缓存用于从数据库中缓存持久数据,并保存一些短暂且经常更改的元数据,例如用于用户会话。 Infinispan通常比数据库快得多,但是使用Infinispan保存的数据不是永久性的,并且预计不会在群集重新启动期间持续存在。

在我们的示例架构中,有两个数据中心称为站点1站点2。 对于跨数据中心复制,我们必须确保两个数据源都可靠地工作,并且密钥斗篷 服务器来自站点1最终能够读取由Keycloak服务器保存的数据站点2

根据环境,您可以选择决定是否愿意:

  • 可靠性-通常用于主动/主动模式。 写入的数据站点1必须立即在站点2

  • 性能-通常用于主动/被动模式。 写入的数据站点1不需要立即在站点2。 在某些情况下,数据可能在站点2完全没有。

有关更多详细信息,请参见模式

请求处理

最终用户的浏览器向前端负载平衡器。 此负载平衡器通常是HTTPD或WildFly,带有mod_cluster,NGINX,HA代理或其他类型的软件或硬件负载平衡器。

然后,负载平衡器将接收到的HTTP请求转发到基础Keycloak实例,这些实例可以在多个数据中心之间传播。 负载平衡器通常提供支持粘性会话,这意味着负载平衡器始终能够将来自同一用户的所有HTTP请求转发到同一数据中心中的同一Keycloak实例。

从客户端应用程序发送到负载均衡器的HTTP请求被调用反向通道请求。 最终用户的浏览器看不到这些内容,因此不能成为用户和负载平衡器之间的粘性会话的一部分。 对于反向通道请求,loadbalancer可以将HTTP请求转发到任何数据中心中的任何Keycloak实例。 这具有挑战性,因为某些OpenID Connect和某些SAML流需要来自用户和应用程序的多个HTTP请求。 因为我们不能可靠地依赖粘性会话来强制将所有相关请求发送到同一数据中心中的同一Keycloak实例,所以我们必须跨数据中心复制一些数据,因此这些数据在特定流期间被后续的HTTP请求看到。

模式

根据您的要求,跨数据中心复制有两种基本操作模式:

  • 主动/被动-在这里,用户和客户端应用程序仅将请求发送到单个数据中心中的Keycloak节点。 第二个数据中心仅用作备份用于保存数据。 在主数据中心发生故障的情况下,通常可以从第二个数据中心恢复数据。

  • Active/Active-在这里,用户和客户端应用程序将请求发送到两个数据中心的Keycloak节点。 这意味着数据需要在两个站点上立即可见,并且可以从两个站点上的Keycloak服务器立即使用。 如果Keycloak服务器在站点1,并且要求数据立即可供Keycloak服务器读取站点2写完后立即站点1完成了。

主动/被动模式对性能更好。 有关如何为任一模式配置缓存的更多信息,请参阅:同步或异步备份

数据库

Keycloak使用关系数据库管理系统 (RDBMS) 来保存有关领域,客户端,用户等的一些元数据。 见本章有关更多详细信息,请参阅服务器安装指南。 在跨数据中心复制设置中,我们假设两个数据中心都与同一个数据库对话,或者每个数据中心都有自己的数据库节点,并且两个数据库节点在数据中心之间同步复制。 在这两种情况下,都要求当Keycloak服务器在站点1保留一些数据并提交事务,这些数据在随后的数据库事务上立即可见站点2

数据库设置的详细信息超出了Keycloak的范围,但是许多RDBMS供应商 (如MariaDB和Oracle) 提供了复制数据库和同步复制。 我们与这些供应商一起测试Keycloak:

  • 甲骨文数据库19c RAC

  • MariaDB服务器版本10.1.19的Galera 3.12集群-MariaDB

Infinispan缓存

本节从Infinispan缓存的高级描述开始。 缓存设置的更多详细信息如下。

身份验证会话

在Keycloak中,我们有身份验证会话的概念。 有一个单独的Infinispan缓存,称为身份验证会话用于在特定用户身份验证期间保存数据。 来自此缓存的请求通常仅涉及浏览器和Keycloak服务器,而不涉及应用程序。 在这里,我们可以依靠粘性会话和身份验证会话即使您处于活动/活动模式,也不需要跨数据中心复制缓存内容。

动作令牌

我们也有这样的概念动作令牌,通常用于用户需要通过电子邮件异步确认操作的情况。 例如,在忘记密码流动动作令牌Infinispan缓存用于跟踪有关相关动作令牌的元数据,例如已经使用了哪个动作令牌,因此无法第二次重用。 这通常需要跨数据中心复制。

持久数据的缓存和失效

Keycloak使用Infinispan缓存持久数据,以避免对数据库的许多不必要请求。 缓存提高了性能,但是它增加了一个额外的挑战。 当某些Keycloak服务器更新任何数据时,所有数据中心中的所有其他Keycloak服务器都需要意识到这一点,因此它们使缓存中的特定数据无效。 Keycloak使用本地Infinispan缓存,称为领域,用户,以及授权缓存持久数据。

我们使用单独的缓存,工作,它在所有数据中心中复制。 工作缓存本身不缓存 任何真实的数据。 它仅用于在集群节点和数据中心之间发送无效消息。 换句话说,当数据更新时,例如用户约翰,Keycloak节点将无效消息发送给同一数据中心中的所有其他群集节点,也发送给所有其他数据中心。 收到无效通知后,每个节点都会从其本地缓存中使适当的数据无效。

用户会话

有Infinispan缓存称为会议,客户会议,离线消息,以及离线eclientsessions, 所有这些通常都需要跨数据中心复制。 这些缓存用于保存有关用户的数据 会话,对于用户的浏览器会话的长度有效。 缓存必须处理来自最终用户和应用程序的HTTP请求。 如上所述,粘性会话不能在此实例中可靠地使用,但是我们仍然希望确保后续的HTTP请求可以看到最新的数据。 因此,数据通常跨数据中心复制。

暴力保护

最后登录失败缓存用于跟踪有关登录失败的数据,例如用户的次数约翰 输入了一个错误的密码。 详细描述了这里。 是否应跨数据中心复制此缓存由管理员决定。 为了准确地计算登录失败,需要复制。 另一方面,不复制这些数据可以节省一些性能。 因此,如果性能比登录失败的准确计数更重要,则可以避免复制。

有关如何配置缓存的更多详细信息,请参见调整Infinispan缓存配置

沟通细节

Keycloak使用多个独立的Infinispan缓存集群。 每个Keycloak节点都与同一数据中心中的其他Keycloak节点在集群中,但与不同数据中心中的Keycloak节点不在集群中。 Keycloak节点不直接与来自不同数据中心的Keycloak节点通信。 Keycloak节点使用外部Infinispan服务器进行跨数据中心的通信。 这是使用Infinispan热棒协议

Keycloak侧的Infinispan缓存使用远程存储将数据卸载到远程Infinispan群集的配置。 然后,在单独的数据中心中的Infinispan群集复制该数据以确保对其进行备份。

接收Infinispan服务器通过客户端侦听器通知其集群中的Keycloak服务器,这是Hot Rod协议的一项功能。 上的Keycloak节点站点2然后更新他们的Infinispan缓存,并且特定的用户会话也在Keycloak节点上可见站点2

请参阅示例架构图有关更多详细信息。

使用Infinispan 11.0.9设置交叉DC

对Infinispan 11.0.9使用以下过程执行跨数据中心复制的基本设置。

此Infinispan 11.0.9的示例涉及两个数据中心,站点1站点2。 每个数据中心由1台Infinispan服务器和2台Keycloak服务器组成。 我们最终将拥有2台Infinispan服务器和4台Keycloak服务器。

  • 站点1由Infinispan服务器组成,服务器1,和2个Keycloak服务器,节点11节点12

  • 站点2由Infinispan服务器组成,服务器2,和2个Keycloak服务器,节点21节点22

  • Infinispan服务器服务器1服务器2通过RELAY2协议相互连接,并且备份基于Infinispan 以类似的方式缓存,如Infinispan文档

  • Keycloak服务器节点11节点12彼此形成集群,但它们不直接与中的任何服务器通信站点2。 它们与Infinispan服务器通信服务器1使用热棒协议 (远程缓存)。 见沟通细节有关更多信息。

  • 同样的细节适用于节点21节点22。 它们彼此聚集在一起,只与服务器2使用热棒协议的服务器。

我们的示例设置假定四个Keycloak服务器与同一数据库通信。 在生产中,我们建议您在数据中心之间使用单独的同步复制数据库,如数据库

设置Infinispan服务器

对于跨数据中心复制,首先创建可以备份Keycloak数据的远程Infinispan集群。

先决条件
  • 下载并安装Infinispan服务器11.0.9。

Infinispan服务器11.0.9需要Java 11。

程序
  1. 创建用户以验证来自Infinispan的客户端连接,例如:

    $ bin/cli.sh用户创建我的用户-p “qwer1234!”

    在Keycloak上创建远程缓存时,您可以在Hot Rod客户端配置中指定这些凭据。

  2. 创建一个SSL密钥库和信任库来保护Infinispan和Keycloak之间的连接,例如:

    1. 创建一个密钥库,为您的Infinispan集群提供SSL标识

      keytool -genkey-别名服务器-keyalg RSA -keystore server.jks -keysize 2048
    2. 从密钥库导出SSL证书。

      密钥工具-导出证书-密钥库服务器。jks-别名服务器-文件服务器。crt
    3. 将SSL证书导入到一个信任库中,Keycloak可以使用该信任库来验证Infinispan的SSL身份。

      keytool -importcert -keystore truststore.jks-别名服务器-文件服务器.crt
    4. 移除服务器。阴极射线管

      rm服务器。阴极射线管
配置Infinispan集群

配置Infinispan集群,跨数据中心复制Keycloak数据。

先决条件
  • 安装并设置Infinispan服务器。

程序
  1. 打开infinispan.xml用于编辑。

    默认情况下,Infinispan服务器使用服务器/conf/infinispan.xml用于静态配置,如集群传输和安全机制。

  2. 创建一个使用tcping作为群集发现协议的堆栈。

    <堆栈 名称=全球集群 延伸=tcp>
        <!-- 从堆栈中删除MPING协议并添加tcping -->
        <tcping 初始 _ 主机=server1[7800],server2[7800] (1)
                 stack.com·宾=更换 堆栈。位置=MPING/>
    </堆栈>
    1 列出的主机名服务器1服务器2
  3. 配置Infinispan集群传输执行跨数据中心复制。

    1. 将RELAY2协议添加到JGroups堆栈中。

      <jgroups>
         <堆栈 名称=xsite 延伸=udp> (1)
            <中继.RELAY2 现场=站点1 (2)
                          max_site_masters=1000/> (3)
            <远程站点 默认堆栈=全球集群> (4)
               <远程站点 名称=站点1/>
               <远程站点 名称=站点2/>
            </远程站点>
         </堆栈>
      </jgroups>
      1 创建一个名为xsite扩展了默认的UDP群集传输。
      2 添加RELAY2协议,并将您正在配置的群集命名为站点1。 站点名称必须对每个Infinispan群集唯一。
      3 将1000设置为群集的中继节点数。 您应该设置一个等于或大于Infinispan群集中最大节点数的值。
      4 命名使用Infinispan数据备份缓存的所有Infinispan群集,并使用默认的TCP堆栈进行群集间传输。
    2. 配置Infinispan群集传输以使用堆栈。

      <缓存容器 名称=默认 统计=>
            <运输 集群=${infinispan.cluster.name:cluster}
                       堆栈=xsite/> (1)
      </缓存容器>
      1 使用xsite集群的堆栈。
  4. 将密钥库配置为服务器安全领域中的SSL标识。

    <服务器身份>
      <ssl>
        <密钥库 路径=服务器。jks (1)
                  相对于=infinispan.server.config.path
                  密钥库-密码=密码 (2)
                  别名=服务器 /> (3)
      </ssl>
    </服务器身份>
    1 指定包含SSL标识的密钥库的路径。
    2 指定访问密钥库的密码。
    3 命名密钥库中证书的别名。
  5. 配置热棒端点的身份验证机制。

    <端点 套接字-绑定=默认>
       <hotrod-连接器 名称=hotrod>
          <身份验证>
             <sasl 机制=SCRAM-SHA-512 (1)
                   服务器名称=infinispan /> (2)
          </身份验证>
       </hotrod-连接器>
       <休息-连接器 名称=休息/>
    </端点>
    1 为热棒端点配置SASL身份验证机制。 SCRAM-SHA-512是热棒的默认SASL机制。 但是,您可以使用适合您的环境的任何东西,例如DIGEST-MD5或GSSAPI。
    2 定义Infinispan服务器呈现给客户端的名称。 设置Keycloak时,您可以在Hot Rod客户端配置中指定此名称。
  6. 创建缓存模板。

    将缓存模板添加到infinispan.xml在Infinispan集群中的每个节点上。
    <缓存容器 ... >
      <复制缓存配置 名称=会议-cfg (1)
                                      模式=同步> (2)
        <锁定 获取-超时=0 /> (3)
        <备份>
          <备份 现场=站点2 战略=同步 /> (4)
        </备份>
      </复制缓存配置>
    </缓存容器>
    1 创建一个名为的缓存模板会议-cfg
    2 定义跨集群同步复制数据的缓存。
    3 禁用锁获取的超时。
    4 命名您正在配置的Infinispan群集的备份站点。
  7. 启动Infinispan服务器1。

    。/服务器。sh -c infinispan.xml -b PUBLIC_IP_ADDRESS -k PUBLIC_IP_ADDRESS -Djgroups.mcast_addr = 228.6.7.10
  8. 启动Infinispan服务器2。

    。/服务器。sh -c infinispan.xml -b PUBLIC_IP_ADDRESS -k PUBLIC_IP_ADDRESS -Djgroups.mcast_addr = 228.6.7.11
  9. 检查Infinispan服务器日志以验证群集形成跨站点视图。

    信息 [组织。infinispan.XSITE] (jgroups-5,$ {服务器。主机名}) ISPN000439: 收到新的网站视图: [网站1]
    信息 [组织。infinispan.XSITE] (jgroups-7,$ {服务器。主机名}) ISPN000439: 收到新的网站视图: [网站1,网站2]
创建Infinispan缓存

创建Keycloak所需的Infinispan缓存。

我们建议您在运行时在Infinispan群集上创建缓存,而不是将缓存添加到infinispan.xml。 此策略可确保您的缓存在集群中自动同步并永久存储。

以下过程使用Infinispan命令行接口 (CLI) 在单个批处理命令中创建所有必需的缓存。

先决条件
  • 配置您的Infinispan集群。

程序
  1. 创建包含缓存的批处理文件,例如:

    cat > /tmp/缓存。批次 <<EOF
    回声 “创建缓存...”
    创建缓存工作 -- 模板 = 会话-cfg
    创建缓存会话 -- 模板 = 会话-cfg
    创建缓存客户端会话-模板 = 会话-cfg
    创建缓存离线会话-模板 = 会话-cfg
    创建离线缓存会话-模板 = 会话-cfg
    创建缓存动作令牌 -- 模板 = 会话-cfg
    创建缓存登录失败 -- 模板 = 会话-cfg
    echo “验证缓存”
    ls缓存
    EOF
  2. 使用CLI创建缓存。

    $ bin/cli.sh -c https:// server1:11222 -- trustall -f /tmp/caches.batch
    而不是-- 信任全部参数您可以使用-t参数和带有-s争论。
  3. 在另一个站点上创建缓存。

在Keycloak上配置远程缓存存储

设置远程Infinispan集群后,您可以在Keycloak上配置Infinispan子系统,以通过远程存储将数据外部化到这些集群。

先决条件
  • 设置远程Infinispan集群进行跨站点配置。

  • 创建一个包含具有Infinispan服务器标识的SSL证书的信任存储。

程序
  1. 将信任存储添加到Keycloak部署中。

  2. 创建一个指向您的Infinispan集群的套接字绑定。

    <出站套接字绑定 名称=远程缓存> (1)
      <远程目标 主机=$ {远程。缓存。主机: 服务器 _ 主机名} (2)
                          港口=${remote.cache.port:11222}/> (3)
    </出站套接字绑定>
    1 将套接字绑定命名为远程缓存
    2 为Infinispan群集指定一个或多个主机名。
    3 定义的端口11222热棒端点监听的地方。
  3. 添加组织。Keycloak-模型-infinispan模块到KeycloakInfinispan子系统中的缓存容器

    <子系统 xmlns=urn:jboss: 域: infinispan:12.0>
        <缓存容器 名称=Keycloak
                         模块=组织。Keycloak-模型-infinispan/>
  4. 更新工作在Infinispan子系统中缓存,因此它具有以下配置:

    <复制缓存 名称=工作> (1)
        <远程存储 缓存=工作 (2)
                      远程服务器=远程缓存 (3)
                      钝化=
                      获取状态=
                      清除=
                      预加载=
                      共享=>
            <属性 名称=原始值></属性>
            <属性 名称=马歇尔>组织。Keycloak。集群。无限。Keycloak</属性>
            <属性 名称=infinispan.client.hotrod.auth_username>我的用户</属性>
            <属性 名称=infinispan.client.hotrod.auth_password>qwer1234!</属性>
            <属性 名称=infinispan.client.hotrod.auth_realm>默认</属性>
            <属性 名称=infinispan.client.hotrod.auth_server_name>infinispan</属性>
            <属性 名称=infinispan.client.hotrod.Sasl _ 机制>SCRAM-SHA-512</属性>
            <属性 名称=infinispan.client.hotrod.信任 _ 存储 _ 文件 _ 名称>/路径/到/信任商店.jks</属性>
            <属性 名称=infinispan.client.hotrod.trust_store_type>JKS</属性>
            <属性 名称=infinispan.client.hotrod.信任 _ 存储 _ 密码>密码</属性>
        </远程存储>
    </复制缓存>
    1 在Infinispan配置中命名缓存。
    2 命名远程Infinispan集群上相应的缓存。
    3 指定远程缓存套接字绑定。

    前面的缓存配置包括Infinispan缓存的推荐设置。 Hot Rod客户端配置属性指定Infinispan用户凭据以及SSL密钥库和truststore详细信息。

    请参阅 Infinispan文档 对于每个属性的描述。

  5. 为以下每个缓存添加分布式缓存到Infinispan子系统:

    • 会议

    • 客户会议

    • 离线消息

    • 离线eclientsessions

    • 动作令牌

    • 登录失败

      例如,添加一个名为会议使用以下配置:

      <分布式缓存 名称=会议 (1)
                         业主=1> (2)
          <远程存储 缓存=会议 (3)
                        远程服务器=远程缓存 (4)
                        钝化=
                        获取状态=
                        清除=
                        预加载=
                        共享=>
              <属性 名称=原始值></属性>
              <属性 名称=马歇尔>组织。Keycloak。集群。无限。Keycloak</属性>
              <属性 名称=infinispan.client.hotrod.auth_username>我的用户</属性>
              <属性 名称=infinispan.client.hotrod.auth_password>qwer1234!</属性>
              <属性 名称=infinispan.client.hotrod.auth_realm>默认</属性>
              <属性 名称=infinispan.client.hotrod.auth_server_name>infinispan</属性>
              <属性 名称=infinispan.client.hotrod.Sasl _ 机制>SCRAM-SHA-512</属性>
              <属性 名称=infinispan.client.hotrod.信任 _ 存储 _ 文件 _ 名称>/路径/到/信任商店.jks</属性>
              <属性 名称=infinispan.client.hotrod.trust_store_type>JKS</属性>
              <属性 名称=infinispan.client.hotrod.信任 _ 存储 _ 密码>密码</属性>
          </远程存储>
      </分布式缓存>
      1 在Infinispan配置中命名缓存。
      2 跨Infinispan群集配置每个缓存项的一个副本。
      3 命名远程Infinispan集群上相应的缓存。
      4 指定远程缓存套接字绑定。
  6. 复制节点11到后面称为3个其他目录节点12,节点21节点22

  7. 开始节点11:

    cd节点11/bin
    。/独立。sh -c standalone-ha.xml -Djboss。节点。名称 = 节点11 -Djboss。站点。名称 = 站点1 \
      -Djboss.de故障。多播。地址 = 234.56.78.1-远程。缓存。主机 = 服务器1 \
      -Djava.net.preferIPv4Stack = 真-b公共地址

    如果您在日志中注意到以下警告消息,则可以安全地忽略它们:

    警告 [org.infinispan.CONFIG] (MSC服务线程1-5) ISPN000292: 无法识别的属性 “infinispan.client.hotrod.auth_password”。 请检查您的配置。 无视!
    警告 [org.infinispan.CONFIG] (MSC服务线程1-5) ISPN000292: 无法识别的属性 “infinispan.client.hotrod.auth_username”。 请检查您的配置。 无视!
  8. 开始节点12:

    光盘节点12/箱
    。/独立。sh -c standalone-ha.xml -Djboss。节点。名称 = 节点12 -Djboss。站点。名称 = 站点1 \
      -Djboss.de故障。多播。地址 = 234.56.78.1-远程。缓存。主机 = 服务器1 \
      -Djava.net.preferIPv4Stack = 真-b公共地址

    集群节点应该连接。 类似的东西应该在NODE11和NODE12的日志中:

    收到频道keycloak的新群集视图: [节点11 | 1] (2) [节点11,节点12]
    日志中的频道名称可能不同。
  9. 开始节点21:

    cd节点21/bin
    。/独立。sh -c standalone-ha.xml -Djboss。节点。名称 = 节点21 -Djboss。站点。名称 = 站点2 \
      -Djboss.de故障。多播。地址 = 234.56.78.2-远程。缓存。主机 = 服务器2 \
      -Djava.net.preferIPv4Stack = 真-b公共地址

    它不应该连接到集群节点11节点12,但要单独使用:

    收到频道keycloak的新群集视图: [节点21 | 0] (1) [节点21]
  10. 开始节点22:

    cd节点22/bin
    。/独立。sh -c standalone-ha.xml -Djboss。节点。名称 = 节点22 -Djboss。站点。名称 = 站点2 \
      -Djboss.de故障。多播。地址 = 234.56.78.2-远程。缓存。主机 = 服务器2 \
      -Djava.net.preferIPv4Stack = 真-b公共地址

    它应该与节点21:

    收到频道keycloak的新群集视图: [节点21 | 1] (2) [节点21,节点22]
    日志中的频道名称可能不同。
  11. 测试:

    1. http:// node11:8080/auth/并创建初始管理员用户。

    2. http:// node11:8080/auth/admin并以管理员身份登录到管理控制台。

    3. 打开第二个浏览器,然后转到任何一个节点http:// node12:8080/auth/admin或者http:// node21:8080/auth/admin或者http:// node22:8080/auth/admin。 登录后,您应该可以看到 选项卡中的相同会话会议所有4台服务器上的特定用户、客户端或领域。

    4. 在Keycloak管理控制台中进行更改 (例如修改用户或relam) 后,该更改 应该在四个节点中的任何一个上立即可见。 缓存应该在任何地方都正确失效。

    5. 检查服务器。如果需要的话,日志。 登录或注销后,类似这样的消息应该在所有节点上节点/独立/日志/服务器。日志:

      2017-08-25 17:35:17,737调试 [org.keycloak.mo dels.sessions.infinispan.remotestore.RemoteCacheSessionListener] (Client-Listener-sessions-30012a77422542f5) 从远程存储接收到事件。
      事件 “CLIENT_CACHE_ENTRY_REMOVED”,键 “193489e7-e2bc-4069-afe8-f1dfa73084ea”,跳过 “false”

使用Infinispan 9.4.19设置交叉DC

此Infinispan 9.4.19的示例涉及两个数据中心,站点1站点2。 每个数据中心由1台Infinispan服务器和2台Keycloak服务器组成。 我们最终将拥有2台Infinispan服务器和4台Keycloak服务器。

  • 站点1由Infinispan服务器组成,服务器1,和2个Keycloak服务器,节点11节点12

  • 站点2由Infinispan服务器组成,服务器2,和2个Keycloak服务器,节点21节点22

  • Infinispan服务器服务器1服务器2通过RELAY2协议相互连接,并且备份基于Infinispan 以类似的方式缓存,如Infinispan文档

  • Keycloak服务器节点11节点12彼此形成集群,但它们不直接与中的任何服务器通信站点2。 它们与Infinispan服务器通信服务器1使用热棒协议 (远程缓存)。 见沟通细节详细信息。

  • 同样的细节适用于节点21节点22。 它们彼此聚集在一起,只与服务器2使用热棒协议的服务器。

我们的示例设置假定所有4个Keycloak服务器都与同一数据库通信。 在生产中,建议在数据中心之间使用单独的同步复制数据库,如数据库

设置Infinispan服务器

按照以下步骤设置Infinispan服务器:

  1. 下载Infinispan 9.4.19服务器并解压缩到您选择的目录。 此位置将在以后的步骤中称为服务器1 _ 主页

  2. 改变那些东西服务器1 _ 主页/服务器/conf/infinispan-xsite.xml在JGroups子系统的配置中:

    1. 添加xsite通道,它将使用tcp堆栈,下频道元素:

      <频道 默认=集群>
          <频道 名称=集群/>
          <频道 名称=xsite 堆栈=tcp/>
      </频道>
    2. 添加一个继电器元素的末尾udp叠。 我们将以我们网站的方式配置它站点1我们将备份的另一个站点是站点2:

      <堆栈 名称=udp>
          ...
          <继电器 现场=站点1>
              <远程站点 名称=站点2 频道=xsite/>
              <属性 名称=中继 _ 多播></属性>
          </中继>
      </堆栈>
    3. 配置tcp要使用的堆栈Tcping协议而不是MPING。 移除MPING元素,并将其替换为Tcping。 的初始 _ 主机元素指向主机服务器1服务器2:

      <堆栈 名称=tcp>
          <运输 类型=TCP 套接字-绑定=jgroups-tcp/>
          <协议 类型=Tcping>
              <属性 名称=初始 _ 主机>server1[7600],server2[7600]</属性>
              <属性 名称=人体工程学></属性>
          </协议>
          <协议 类型=MERGE3/>
          ...
      </堆栈>
      这只是一个快速运行的示例设置。 在生产中,您不需要使用tcpJGroups的堆栈RELAY2,但您可以配置任何其他堆栈。 例如,如果数据中心之间的网络能够支持多播,则可以使用默认的udp堆栈。 只要确保Infinispan和Keycloak集群是相互无法发现的。 同样,您不需要使用Tcping作为发现协议。 在生产中,你可能不会使用Tcping因为这是静态的。 最后,网站名称也是可配置的。 此更详细的设置的详细信息超出了Keycloak文档的范围。 有关更多详细信息,请参见Infinispan文档和JGroups文档。
  3. 将此添加到服务器1 _ 主页/独立/配置/群集。xml在名为cache的容器下集群:

    <缓存容器 名称=集群 默认缓存=默认 统计=>
            ...
            <复制缓存配置 名称=会议-cfg 模式=同步 开始=渴望 配料=>
                <锁定 获取-超时=0 />
                <备份>
                    <备份 现场=站点2 失败-策略=失败 战略=同步 已启用=>
                        <离线 最小等待=60000 故障后=3 />
                    </备份>
                </备份>
            </复制缓存配置>
    
            <复制缓存 名称=工作 配置=会议-cfg/>
            <复制缓存 名称=会议 配置=会议-cfg/>
            <复制缓存 名称=客户会议 配置=会议-cfg/>
            <复制缓存 名称=离线消息 配置=会议-cfg/>
            <复制缓存 名称=离线eclientsessions 配置=会议-cfg/>
            <复制缓存 名称=动作令牌 配置=会议-cfg/>
            <复制缓存 名称=登录失败 配置=会议-cfg/>
    
    </缓存容器>
    关于内部配置选项的详细信息复制缓存配置调整Infinispan缓存配置,其中包括有关调整其中一些选项的信息。
    与以前的版本不同,Infinispan服务器复制缓存配置需要配置不需要交易 元素。 见故障排除有关更多详细信息。
  4. 某些Infinispan服务器版本在通过网络访问受保护的缓存之前需要授权。

    如果您使用推荐的Infinispan 9.4.19服务器,则不应看到任何问题,并且可以 (并且应该) 忽略此步骤。 与授权相关的问题可能仅适用于某些其他版本的Infinispan服务器。

    Keycloak需要更新 ___ 脚本 _ 缓存包含脚本的缓存。 如果在访问此缓存时遇到错误,则需要在 群集。xml配置如下:

    1. <管理>节,添加安全领域:

      <管理>
          <安全领域>
              ...
              <安全领域 名称=允许脚本管理器>
                  <身份验证>
                      <用户>
                          <用户 用户名=___ 脚本 _ 管理器>
                              <密码>不太秘密的密码</密码>
                          </用户>
                      </用户>
                  </身份验证>
              </安全领域>
          </安全领域>
    2. 在服务器核心子系统中,添加<安全>如下所示:

      <子系统 xmlns=urn:infinispan: 服务器: 核心: 8.4>
          <缓存容器 名称=集群 默认缓存=默认 统计=>
              <安全>
                  <授权>
                      <身份-角色-映射器/>
                      <角色 名称=___ 脚本 _ 管理器 权限=全部/>
                  </授权>
              </安全>
              ...
    3. 在端点子系统中,将身份验证配置添加到热棒连接器:

      <子系统 xmlns=urn:infinispan: 服务器: 端点: 8.1>
          <hotrod-连接器 缓存-容器=集群 套接字-绑定=hotrod>
              ...
              <身份验证 安全领域=允许脚本管理器>
                  <sasl 机制=DIGEST-MD5 qop=auth 服务器名称=密钥斗篷-jdg-服务器>
                      <政策>
                          <否-匿名 = />
                      </policy>
                  </sasl>
              </身份验证>
  5. 将服务器复制到第二个位置,稍后将其称为服务器2 _ 主页

  6. 服务器2 _ 主页/独立/配置/群集。xml交换站点1站点2反之亦然,两者都在配置继电器在JGroups子系统中以及在备份在缓存子系统中。 例如:

    1. 继电器元素应该是这样的:

      <继电器 现场=站点2>
          <远程站点 名称=站点1 频道=xsite/>
          <属性 名称=中继 _ 多播></属性>
      </中继>
    2. 备份像这样的元素:

      <备份>
        <备份 现场=站点1 ....
        ...
      公共地址下面是指ip地址或主机名,可用于您的服务器绑定到。 请注意, 每个Infinispan服务器和Keycloak服务器都需要使用不同的地址。 在所有服务器运行在同一主机上的示例设置期间, 您可能需要添加选项-Djboss.bind.address.management =公共地址因为每个服务器都需要使用不同的管理接口。 但是在生产环境中通常应省略此选项,以避免远程访问服务器的能力。 有关更多信息, 请参阅野蝇23文档
  7. 启动服务器服务器1:

    光盘服务器1 _ 主页/bin
    。/独立。sh -c群集。xml-djava.net。preferIPv4Stack = true \
      -Djboss.de故障。多播。地址 = 234.56.78.99 \
      -Djboss.node.name = 服务器1 -b公共地址
  8. 启动服务器服务器2。 有不同的组播地址,所以服务器1服务器2服务器之间不直接群集; 相反,它们只是通过RELAY2协议连接,并且TCP JGroups堆栈用于它们之间的通信。 启动命令看起来像这样:

    cd服务器2 _ 主页/bin
    。/独立。sh -c群集。xml-djava.net。preferIPv4Stack = true \
      -Djboss.de故障。多播。地址 = 234.56.78.100 \
      -Djboss.node.name = 服务器2 -b公共地址
  9. 要验证通道在这一点上是否正常工作,您可能需要使用JConsole并连接到正在运行的服务器1或者服务器2服务器。 当您使用MBean时jgroups:type = protocol,cluster = "cluster",protocol = RELAY2和操作打印头,你应该看到这样的输出:

    站点1-> _ 服务器1: 站点1
    站点2-> _ 服务器2: 站点2

    当您使用MBean时jgroups:type = protocol,cluster = "cluster",protocol = GMS,您应该看到属性成员仅包含单个成员:

    1. 服务器1应该是这样的:

      (1) 服务器1
    2. 在服务器2上像这样:

      (1) 服务器2
      在生产中,您可以在每个数据中心拥有更多的Infinispan服务器。 您只需要确保同一数据中心中的Infinispan服务器使用相同的多播地址 (换句话说,相同的jboss.de fault.多播.地址在启动期间)。 然后在jconsole中GMS协议视图,您将看到当前集群的所有成员。
设置密钥斗篷服务器
  1. 将Keycloak服务器分发解压缩到您选择的位置。 稍后将称为节点11

  2. 为KeycloakDS数据源配置共享数据库。 建议使用MySQL或MariaDB进行测试。 见数据库有关更多详细信息。

    在生产中,您可能需要在每个数据中心都有一个单独的数据库服务器,并且两个数据库服务器都应相互同步复制。 在示例设置中,我们仅使用单个数据库并将所有4个Keycloak服务器连接到该数据库。

  3. 编辑NODE11/独立/配置/standalone-ha.xml:

    1. 添加属性现场到JGroups UDP协议:

      <堆栈 名称=udp>
        <运输 类型=UDP 套接字-绑定=jgroups-udp 现场=${jboss.site.name}/>
    2. 添加远程商店工作缓存:

      <复制缓存 名称=工作>
          <远程存储 缓存=工作 远程服务器=远程缓存 钝化= 获取状态= 清除= 预加载= 共享=>
              <属性 名称=原始值></属性>
              <属性 名称=马歇尔>组织。Keycloak。集群。无限。Keycloak</属性>
              <属性 名称=协议版本>2.9</属性>
          </远程存储>
      </复制缓存>
    3. 添加远程商店像下面这样会议缓存:

      <分布式缓存 名称=会议 业主=1>
          <远程存储 缓存=会议 远程服务器=远程缓存 钝化= 获取状态= 清除= 预加载= 共享=>
              <属性 名称=原始值></属性>
              <属性 名称=马歇尔>组织。Keycloak。集群。无限。Keycloak</属性>
              <属性 名称=协议版本>2.9</属性>
          </远程存储>
      </分布式缓存>
    4. 离线消息,客户会议,离线eclientsessions,登录失败,以及动作令牌缓存 (与会议缓存是缓存属性值不同):

      <分布式缓存 名称=离线消息 业主=1>
          <远程存储 缓存=离线消息 远程服务器=远程缓存 钝化= 获取状态= 清除= 预加载= 共享=>
              <属性 名称=原始值></属性>
              <属性 名称=马歇尔>组织。Keycloak。集群。无限。Keycloak</属性>
              <属性 名称=协议版本>2.9</属性>
          </远程存储>
      </分布式缓存>
      
      <分布式缓存 名称=客户会议 业主=1>
          <远程存储 缓存=客户会议 远程服务器=远程缓存 钝化= 获取状态= 清除= 预加载= 共享=>
              <属性 名称=原始值></属性>
              <属性 名称=马歇尔>组织。Keycloak。集群。无限。Keycloak</属性>
              <属性 名称=协议版本>2.9</属性>
          </远程存储>
      </分布式缓存>
      
      <分布式缓存 名称=离线eclientsessions 业主=1>
          <远程存储 缓存=离线eclientsessions 远程服务器=远程缓存 钝化= 获取状态= 清除= 预加载= 共享=>
              <属性 名称=原始值></属性>
              <属性 名称=马歇尔>组织。Keycloak。集群。无限。Keycloak</属性>
              <属性 名称=协议版本>2.9</属性>
          </远程存储>
      </分布式缓存>
      
      <分布式缓存 名称=登录失败 业主=1>
          <远程存储 缓存=登录失败 远程服务器=远程缓存 钝化= 获取状态= 清除= 预加载= 共享=>
              <属性 名称=原始值></属性>
              <属性 名称=马歇尔>组织。Keycloak。集群。无限。Keycloak</属性>
              <属性 名称=协议版本>2.9</属性>
          </远程存储>
      </分布式缓存>
      
      <分布式缓存 名称=动作令牌 业主=2>
          <对象-内存 尺寸=-1/>
          <过期 最大空闲=-1 间隔=300000/>
          <远程存储 缓存=动作令牌 远程服务器=远程缓存 钝化= 获取状态= 清除= 预加载= 共享=>
              <属性 名称=原始值></属性>
              <属性 名称=马歇尔>组织。Keycloak。集群。无限。Keycloak</属性>
              <属性 名称=协议版本>2.9</属性>
          </远程存储>
      </分布式缓存>
    5. 将远程存储的出站套接字绑定添加到套接字-绑定-组元素配置:

      <出站套接字绑定 名称=远程缓存>
          <远程目标 主机=$ {远程。缓存。主机: 本地主机} 港口=${remote.cache.port:11222}/>
      </出站套接字绑定>
    6. 分布式缓存的配置身份验证会话其他缓存保持不变。

    7. 建议添加远程存储启用具有以下价值的财产(或者最终如果您启用了安全性 对于如上所述的Infinispan服务器)连接SPI在Keycloak-服务器子系统:

      <spi 名称=连接>
          ...
          <提供者 ...>
              <属性>
                  ...
                  <属性 名称=远程存储启用 =/>
              </属性>
          ...
    8. 可选地在日志记录子系统:

      <记录器 类别=组织。Keycloak。集群。infinispan>
          <级别 名称=调试/>
      </记录器>
      <记录器 类别=组织。Keycloak。连接。infinispan>
          <级别 名称=调试/>
      </记录器>
      <记录器 类别=组织。密钥锁。模型。缓存。无限>
          <级别 名称=调试/>
      </记录器>
      <记录器 类别=组织。密钥锁。游戏。会话。无限>
          <级别 名称=调试/>
      </记录器>
  4. 复制节点11到后面称为3个其他目录节点12,节点21节点22

  5. 开始节点11:

    cd节点11/bin
    。/独立。sh -c standalone-ha.xml -Djboss。节点。名称 = 节点11 -Djboss。站点。名称 = 站点1 \
      -Djboss.de故障。多播。地址 = 234.56.78.1-远程。缓存。主机 = 服务器1 \
      -Djava.net.preferIPv4Stack = 真-b公共地址
  6. 开始节点12:

    光盘节点12/箱
    。/独立。sh -c standalone-ha.xml -Djboss。节点。名称 = 节点12 -Djboss。站点。名称 = 站点1 \
      -Djboss.de故障。多播。地址 = 234.56.78.1-远程。缓存。主机 = 服务器1 \
      -Djava.net.preferIPv4Stack = 真-b公共地址

    集群节点应该连接。 类似的东西应该在NODE11和NODE12的日志中:

    收到频道keycloak的新群集视图: [节点11 | 1] (2) [节点11,节点12]
    日志中的频道名称可能不同。
  7. 开始节点21:

    cd节点21/bin
    。/独立。sh -c standalone-ha.xml -Djboss。节点。名称 = 节点21 -Djboss。站点。名称 = 站点2 \
      -Djboss.de故障。多播。地址 = 234.56.78.2-远程。缓存。主机 = 服务器2 \
      -Djava.net.preferIPv4Stack = 真-b公共地址

    它不应该连接到集群节点11节点12,但要分开一个:

    收到频道keycloak的新群集视图: [节点21 | 0] (1) [节点21]
  8. 开始节点22:

    cd节点22/bin
    。/独立。sh -c standalone-ha.xml -Djboss。节点。名称 = 节点22 -Djboss。站点。名称 = 站点2 \
      -Djboss.de故障。多播。地址 = 234.56.78.2-远程。缓存。主机 = 服务器2 \
      -Djava.net.preferIPv4Stack = 真-b公共地址

    它应该与节点21:

    收到频道keycloak的新群集视图: [节点21 | 1] (2) [节点21,节点22]
    日志中的频道名称可能不同。
  9. 测试:

    1. http:// node11:8080/auth/并创建初始管理员用户。

    2. http:// node11:8080/auth/admin并以管理员身份登录到管理控制台。

    3. 打开第二个浏览器,然后转到任何一个节点http:// node12:8080/auth/admin或者http:// node21:8080/auth/admin或者http:// node22:8080/auth/admin。 登录后,您应该可以看到 选项卡中的相同会话会议所有4台服务器上的特定用户、客户端或领域。

    4. 在Keycloak管理控制台中进行任何更改后 (例如,更新某个用户或某个领域),更新 应该在4个节点中的任何一个上立即可见,因为缓存应该在任何地方都正确失效。

    5. 检查服务器。如果需要的话,日志。 登录或注销后,类似这样的消息应该在所有节点上节点/独立/日志/服务器。日志:

      2017-08-25 17:35:17,737调试 [org.keycloak.mo dels.sessions.infinispan.remotestore.RemoteCacheSessionListener] (Client-Listener-sessions-30012a77422542f5) 从远程存储接收到事件。
      事件 “CLIENT_CACHE_ENTRY_REMOVED”,键 “193489e7-e2bc-4069-afe8-f1dfa73084ea”,跳过 “false”

跨DC部署管理

本节包含一些与跨数据中心复制相关的提示和选项。

  • 当您在数据中心内运行Keycloak服务器时,要求在钥匙衣帽datasource已经在该数据中心运行并可用。 还必须由出站套接字绑定,它是从Infinispan缓存中引用的远程商店元素,已经在运行。 否则Keycloak服务器将无法启动。

  • 如果您想支持数据库故障转移和更好的可靠性,每个数据中心都可以拥有更多的数据库节点。 请参阅数据库和JDBC驱动程序的文档,了解如何在数据库端进行设置以及如何钥匙衣帽需要配置Keycloak端的数据源。

  • 每个数据中心都可以在集群中运行更多的Infinispan服务器。 如果您想要一些故障转移和更好的容错能力,这很有用。 用于Infinispan服务器和Keycloak服务器之间通信的Hot Rod协议具有一个功能,即Infinispan服务器会自动向Keycloak服务器发送有关Infinispan群集更改的新拓扑,因此Keycloak端的远程存储将知道它可以连接到哪些Infinispan服务器。 有关更多详细信息,请阅读Infinispan和WildFly文档。

  • 强烈建议在Keycloak服务器之前的每个站点中都运行一个主Infinispan服务器任何网站已启动。 就像我们的例子一样,我们都开始了服务器1服务器2首先,在所有Keycloak服务器之前。 如果您仍然需要运行Keycloak服务器,并且备份站点处于脱机状态,建议在您站点的Infinispan服务器上手动将备份站点切换为脱机状态,如使网站离线和在线。 如果您没有手动将不可用的站点切换为脱机状态,则第一次启动可能会失败,或者在启动期间可能会出现一些异常,直到备份站点由于配置的失败操作计数而自动脱机。

使网站离线和在线

例如,假设这种情况:

  1. 现场站点2完全从站点1透视。 这意味着所有的Infinispan服务器站点2都关了或者之间的网络站点1站点2坏了。

  2. 您运行Keycloak服务器和Infinispan服务器服务器1在现场站点1

  3. 有人登录Keycloak服务器站点1

  4. Keycloak服务器来自站点1将尝试将会话写入远程缓存服务器1服务器,该服务器应该将数据备份到服务器2服务器中的站点2。 见沟通细节有关更多信息。

  5. 服务器服务器2从离线或无法访问服务器1。 所以备份来自服务器1服务器2会失败的。

  6. 异常被抛出服务器1日志和故障将从服务器1服务器到Keycloak服务器也是如此,因为默认失败已配置备份失败策略。 见备份失败策略有关备份策略的详细信息。

  7. 该错误也将在Keycloak端发生,用户可能无法完成登录。

根据您的环境,站点之间的网络不可用或暂时中断 (裂脑) 的可能性可能或多或少。 万一发生这种情况,最好将Infinispan服务器放在站点1意识到Infinispan服务器在站点2不可用,因此它们将停止尝试访问服务器服务器2站点和备份失败不会发生。 这叫做让网站离线

让网站离线

有两种方法可以使网站离线。

由管理员手动-管理员可以使用jconsole或其他工具,并运行一些JMX操作以手动使特定站点脱机。 这很有用,尤其是在计划中断的情况下。 与jconsole或者CLI,您可以连接到服务器1服务器并获取站点2线下。 有关此的更多详细信息,请参见 Infinispan文档

这些步骤通常需要为中提到的所有Keycloak缓存完成同步或异步备份

自动-在一些失败的备份后,站点2通常会自动离线。 这是由于配置了离线中配置的缓存配置中的元素设置Infinispan服务器

<离线 最小等待=60000 故障后=3 />

此示例显示,如果至少有3个后续失败的备份并且在60秒内没有任何成功的备份,则该站点将自动脱机用于特定的单个缓存。

自动使站点脱机非常有用,尤其是在站点之间的网络中断是计划外的情况下。 缺点是,在检测到网络中断之前,会有一些失败的备份,这也可能意味着应用程序端出现故障。 例如,某些用户的登录失败或登录超时。 尤其是如果失败-策略有价值失败被使用。

对于每个缓存,分别跟踪站点是否离线的跟踪。
在线获取网站

一旦你的网络恢复,站点1站点2可以互相交谈,您可能需要将网站放在网上。 这需要通过JMX或CLI手动完成,方式类似于使站点脱机。 同样,您可能需要检查所有缓存并将其联机。

一旦网站上线,通常最好:

国家转移

状态转移是必需的手动步骤。 Infinispan服务器不会自动执行此操作,例如在裂脑过程中,只有管理员可以决定哪个站点具有首选项,因此,如果需要在两个站点之间双向进行状态传输,或者只是单向进行,例如仅从站点1站点2,但不是来自站点2站点1

双向状态转移将确保创建的实体之后裂脑开启站点1将被转移到站点2。 这不是问题,因为它们还不存在于站点2。 同样,创建的实体之后裂脑开启站点2将被转移到站点1。 可能有问题的部分是那些存在的实体以前在两个站点上都有裂脑,并且在两个站点的裂脑期间都进行了更新。 当这种情况发生时,其中一个网站将并将覆盖第二个站点在裂脑期间完成的更新。

不幸的是,对此没有任何普遍的解决办法。 大脑分裂和网络中断只是状态,通常无法100% 正确处理站点之间100% 一致的数据。 在Keycloak的情况下,它通常不是一个关键问题。 在最坏的情况下,用户将需要再次登录到其客户端,或者跟踪不正确的登录失败计数以进行暴力保护。 有关如何处理裂脑的更多提示,请参阅Infinispan/JGroups文档。

状态转移也可以通过JMX在Infinispan服务器端完成。 操作名称为推送状态。 监视状态,取消推送状态等其他操作很少。 有关状态转移的更多信息,请参见Infinispan文档

清除缓存

分裂大脑后,可以安全地在Keycloak管理控制台中手动清除缓存。 这是因为在站点1并且由于该事件,应该使缓存无效并没有在裂脑过程中转移到站点2。 因此,Keycloak节点在站点2可能在他们的缓存中仍然有一些陈旧的数据。

要清除缓存,请参见清除服务器缓存

当网络返回时,仅在任何随机站点上的一个Keycloak节点上清除缓存就足够了。 缓存失效事件将发送到所有站点中的所有其他Keycloak节点。 但是,需要对所有缓存 (领域,用户,密钥) 进行操作。 见清除服务器缓存有关更多信息。

调整Infinispan缓存配置

本节包含用于配置JDG缓存的提示和选项。

备份失败策略

默认情况下,备份的配置失败-策略在Infinispan中的Infinispan缓存配置中群集。xml文件配置为失败。 你可以把它改成警告或者忽略,如你所愿。

之间的区别失败警告那是什么时候失败使用,并且Infinispan服务器尝试将数据备份到其他站点,并且备份失败,然后故障将传播回调用者 (Keycloak服务器)。 备份可能会失败,因为第二个站点暂时无法访问,或者存在试图更新同一实体的并发事务。 在这种情况下,Keycloak服务器将重试该操作几次。 但是,如果重试失败,则用户可能会在更长的超时后看到错误。

使用时警告,则失败的备份不会从Infinispan服务器传播到Keycloak服务器。 用户不会看到错误,失败的备份将被忽略。 会有更短的超时时间,通常是10秒,因为这是备份的默认超时时间。 它可以通过属性进行更改超时备份元素。 不会有重试。 Infinispan服务器日志中只会有一条警告消息。

潜在的问题是,在某些情况下,站点之间可能只是短暂的网络中断,其中重试 (使用失败政策) 可能会有所帮助,因此警告(无需重试),跨站点会出现一些数据不一致。 如果试图在两个站点上同时更新同一实体,也会发生这种情况。

这些不一致有多严重? 通常仅意味着用户需要重新进行身份验证。

当使用警告策略中,可能会发生由动作令牌缓存和处理该特定密钥的方法实际上是一次性使用的,但是可能会 “成功” 写入相同的密钥两次。 但是,例如,OAuth2规范提及该代码必须是一次性的。 与警告策略,这可能无法严格保证,并且如果试图在两个站点中同时编写相同的代码,则可以两次编写相同的代码。

如果有更长时间的网络中断或大脑分裂,那么两者失败警告,则经过一段时间和故障后,其他站点将脱机,如使网站离线和在线。 默认的1分钟超时,通常是1-3分钟,直到所有涉及的缓存都脱机。 之后,从最终用户的角度来看,所有操作都将正常工作。 您只需要在网站恢复在线时手动恢复网站,如中所述使网站离线和在线

总之,如果您期望站点之间的频繁、更长的中断,并且您可以接受一些数据不一致和不100% 准确的一次性缓存,但是您永远不希望最终用户看到错误和长时间超时,那么切换到警告

之间的区别警告忽略是,那就是忽略Infinispan日志中未写入警告。 在Infinispan文档中查看更多详细信息。

锁定获取超时

默认配置是在获取超时为0的NON_DURABLE_XA模式下使用事务。 这意味着如果同一密钥有另一个正在进行的事务,则事务将快速失败。

将其切换到0而不是默认10秒的原因是为了避免可能的死锁问题。 使用Keycloak,可能会同时从两个站点更新同一实体 (通常是会话实体或loginFailure)。 这在某些情况下会导致死锁,这将导致事务被阻止10秒。 见这份JIRA报告有关详细信息。

超时为0时,事务将立即失败,然后如果备份,将从Keycloak重试失败-策略失败配置。 只要第二个并发事务完成,重试通常就会成功,并且实体将从两个并发事务中应用更新。

使用此配置,我们看到并发事务的一致性和结果非常好,建议保留它。

唯一的 (非功能性) 问题是Infinispan服务器日志中的异常,每次在锁无法立即使用时都会发生这种情况。

同步或异步备份

的重要组成部分备份元素是战略属性。 你必须决定是否需要同步或者异步。 我们有7个缓存可能是跨数据中心复制感知的,这些缓存可以在3种不同的模式下配置关于跨dc:

  1. 同步备份

  2. 异步备份

  3. 完全没有备份

如果同步使用备份,然后在第二个站点上处理备份后,备份是同步的,并且在调用方 (Keycloak服务器) 端操作被视为已完成。 这比异步,但另一方面,您可以确定对特定实体 (例如用户会话) 的后续读取站点2将看到来自站点1。 另外,如果您想要数据一致性,则需要它。 就像异步如果备份到其他站点失败,则根本不会通知呼叫者。

对于某些缓存,甚至可以完全不备份,完全跳过将数据写入Infinispan服务器。 要设置此设置,请不要使用远程商店Keycloak端特定缓存的元素 (文件KEYCLOAK_HOME/独立/配置/standalone-ha.xml) 然后是特定的复制缓存Infinispan服务器端也不需要元素。

默认情况下,所有7个缓存都配置有同步备份,这是最安全的选择。 以下是一些需要考虑的事项:

  • 如果您使用的是主动/被动模式 (所有Keycloak服务器都在单个站点中站点1以及中的Infinispan服务器站点2纯粹用作备份。 见模式有关更多详细信息),那么通常可以使用异步所有缓存的策略以节省性能。

  • 工作缓存主要用于向其他站点发送一些消息,例如缓存无效事件。 它还用于确保某些特殊事件 (例如userStorage同步) 仅在单个站点上发生。 建议将此设置保持为同步

  • 动作令牌缓存用作一次性缓存,以跟踪某些令牌/票证仅使用了一次。 例如操作令牌或OAuth2代码。 可以将此设置为异步性能略有提高,但不能保证特定的票证确实是一次性使用的。 例如,如果两个站点都存在对同一票证的并发请求,则两个请求都可能通过异步战略。 所以你在这里设置的将取决于你是否更喜欢更好的安全性 (同步战略) 或更好的业绩 (异步战略)。

  • 登录失败可以在3种模式中的任何一种下使用高速缓存。 如果根本没有备份,则意味着每个站点将分别计算用户的登录失败数 (请参阅Infinispan缓存详情)。 这具有一些安全隐患,但是它具有一些性能优势。 它还减轻了拒绝服务 (DoS) 攻击的可能风险。 例如,如果攻击者在两个站点上使用用户的用户名和密码模拟1000并发请求,这将意味着在站点之间传递大量消息,这可能导致网络拥塞。 的异步策略可能会更糟,因为攻击者的请求不会因等待备份到其他站点而被阻止,从而可能导致网络流量更加拥挤。 登录失败的计数也不会与异步战略。

对于数据中心之间网络较慢且DoS概率较高的环境,建议不要备份登录失败完全缓存。

  • 建议保留会议客户会议缓存在同步。 将它们切换到异步只有当您确定用户请求和反向通道请求 (从客户端应用程序到Keycloak的请求,如请求处理) 将始终在同一站点上处理。 这是真的,例如,如果:

    • 如所述,您使用主动/被动模式模式

    • 您所有的客户端应用程序都在使用KeycloakJavaScript适配器。 JavaScript适配器在浏览器中发送反向通道请求,因此它们参与浏览器粘性会话,并将与该用户的其他浏览器请求在同一群集节点 (因此在同一站点) 上结束。

    • 您的负载平衡器能够根据客户端ip地址 (位置) 为请求提供服务,并且客户端应用程序部署在两个站点上。

      例如,你有两个网站LON和NYC。 只要您的应用程序也部署在LON和NYC站点中,您就可以确保来自伦敦用户的所有用户请求都将重定向到LON站点中的应用程序以及LON站点中的Keycloak服务器。 来自LON站点客户端部署的反向通道请求也将在LON站点的Keycloak服务器上结束。 另一方面,对于美国用户,所有Keycloak请求,应用程序请求和反向通道请求都将在NYC站点上处理。

  • 对于离线消息离线eclientsessions这是相似的,不同之处在于,如果您从未打算对任何客户端应用程序使用脱机令牌,则甚至根本不需要备份它们。

通常,如果您有疑问并且性能对您来说不是障碍,那么将缓存保留在同步战略。

关于切换到同步/异步备份,请确保您编辑了战略的属性备份元素。 例如,像这样:
<备份 现场=站点2 失败-策略=失败 战略=异步 已启用=>

注意模式缓存配置元素的属性。

故障排除

以下提示旨在帮助您在需要进行故障排除时:

  • 建议通过使用Infinispan 9.4.19设置交叉DC首先让这个工作,这样你就能对事情的工作原理有所了解。 阅读整个文档以对事物有所了解也是明智的。

  • 检查Infinispan的jconsole集群状态 (GMS) 和JGroups状态 (中继),如设置Infinispan服务器。 如果事情看起来不像预期的那样,那么问题可能出在Infinispan服务器的设置中。

  • 对于Keycloak服务器,您应该在服务器启动期间看到这样的消息:

    18:09:30,156信息 [组织
    节点名称: node11,站点名称: site1

    在启动Keycloak server期间,请检查站点名称和节点名称是否符合预期。

  • 检查Keycloak服务器是否按预期在集群中,包括只有来自同一数据中心的Keycloak服务器彼此在集群中。 这也可以通过GMS视图在JConsole中检查。 见集群故障排除有关更多详细信息。

  • 如果在启动Keycloak服务器时出现异常,如下:

    17:33:58,605错误 [org.infinispan.client.hotrod.impl.operations.RetryOnFailureOperation] (服务器服务线程池-59) ISPN004007: 遇到异常。 重试10个中的10个: org.infinispan.client.hotrod.异常.TransportException:: 无法获取传输
    ...
    由以下原因引起: org.infinispan.client.hotrod.异常.TransportException:: 无法连接到服务器: 127.0.0.1:12232
    	在org.infinispan.client.hotrod.impl.transport.tcp.TcpTransport.<init>(TcpTransport.java:82)

    这通常意味着Keycloak服务器无法在自己的数据中心中访问Infinispan服务器。 确保防火墙按预期设置,并且可以连接Infinispan服务器。

  • 如果在启动Keycloak服务器时出现异常,如下:

    16:44:18,321警告 [org.infinispan.client.hotrod.impl.protocol.Codec21] (服务器服务线程池-57) ISPN004005: 从服务器收到错误: javax.transaction.RollbackException: ARJUNA016053: 无法提交事务。
     ...

    然后检查您站点的相应Infinispan服务器的日志,并检查是否无法备份到其他站点。 如果备份站点不可用,建议将其脱机,以便Infinispan服务器不会尝试备份到脱机站点,从而导致操作也在Keycloak服务器端成功传递。 见跨DC部署管理有关更多信息。

  • 检查Infinispan统计信息,这些信息可通过JMX获得。 例如,尝试登录,然后查看新会话是否已成功写入两个Infinispan服务器,并且在会议缓存在那里。 这可以通过检查中的元素计数来间接完成会议MBean的缓存jboss.datagrid-infinispan: 类型 = 缓存,名称 = “会话 (repl_sync)”,管理器 = “群集”,组件 = 统计和属性条目编号。 登录后,应该还有一个条目条目编号在两个站点上的两个Infinispan服务器上。

  • 如所述启用调试日志记录设置密钥斗篷服务器。 例如,如果您登录,并且您认为新会话在第二个站点上不可用,最好检查Keycloak服务器日志,并检查监听是否按照设置密钥斗篷服务器。 如果您不知道并想询问keycloak-user邮件列表,从电子邮件中两个数据中心的Keycloak服务器发送日志文件会很有帮助。 要么将日志片段添加到邮件中,要么将日志放在某处并在电子邮件中引用它们。

  • 如果您更新了实体,例如用户,在Keycloak服务器上站点1并且您看不到该实体在Keycloak服务器上更新站点2,则问题可能出在同步数据库本身的复制中,或者Keycloak缓存未正确失效。 您可以尝试如上所述暂时禁用Keycloak缓存这里确定问题是否在数据库复制级别。 此外,手动连接到数据库并检查数据是否按预期更新可能会有所帮助。 这是特定于每个数据库的,因此您需要查阅数据库的文档。

  • 有时您可能会在Infinispan服务器日志中看到与这样的锁相关的异常:

    (HotRodServerHandler-6-35) ISPN000136: 执行命令替换命令时出错,
    编写密钥 [[B0x033E243034396234 ..[39]]: org.infinispan.util.concurrent.TimeoutException: ISPN000299后无法获取锁
    密钥为0毫秒 [B0x033E243034396234 ..[39] 和请求者GlobalTx:server1:4353。 锁由GlobalTx:server1:4352

    这些例外不一定是问题。 当在两个dc上触发同一实体的并发编辑时,它们可能随时发生。 这在部署中很常见。 通常会通知Keycloak服务器有关失败的操作,并会重试,因此从用户的角度来看,通常不会出现任何问题。

  • 如果在启动Keycloak服务器期间出现异常,如下:

    16:44:18,321警告 [org.infinispan.client.hotrod.impl.protocol.Codec21] (服务器服务线程池-55) ISPN004005: 从服务器收到错误: java.lang.SecurityException: ISPN000287: 未经授权的访问: 主题 “主体主体: []” 缺少 “读取” 权限
     ...

    这些日志条目是Keycloak自动检测Infinispan上是否需要身份验证的结果,并且 意味着身份验证是必要的。 此时,您会注意到,要么服务器成功启动,您就可以安全地 忽略这些或服务器无法启动。 如果服务器无法启动,请确保已配置Infinispan 正确进行身份验证,如中所述设置Infinispan服务器。 为了防止包含此日志条目,您可以强制进行身份验证 通过设置远程存储启用财产spi = 连接finispan/提供程序 = 默认值配置:

    <子系统 xmlns=urn:jboss: 域: keycloak-服务器: 1.1>
        ...
        <spi 名称=连接>
            ...
            <提供者 名称=默认 已启用=>
                <属性>
                    ...
                    <属性 名称=远程存储启用 =/>
                </属性>
            </提供者>
        </spi>
  • 如果您尝试使用Keycloak对您的应用程序进行身份验证,但身份验证失败,并带有无限多个 在您的浏览器中重定向,您会在Keycloak服务器日志中看到这样的错误:

    2017-11-27 14:50:31,587警告 [org.keycloak.events] (默认任务-17) 类型 = LOGIN_ERROR,realmId = master,clientId = null,userId = null,ipAddress = aa.bb.cc.dd,error = expired_code,restart_after_timeout = true

    这可能意味着您的负载平衡器需要设置为支持粘性会话。 确保在启动Keycloak服务器时使用的提供的路由名称 (属性jboss.node.name) 包含负载平衡器服务器用于标识当前服务器的正确名称。

  • 如果Infinispan工作缓存无限期增长,您可能会遇到这个无限问题, 这是由于缓存项未正确过期引起的。 在这种情况下,用空更新缓存声明<到期/>像这样的标签:

        <复制缓存 名称=工作 配置=会议-cfg>
            <过期 />
        </复制缓存>
  • 如果您在Infinispan服务器日志中看到警告,例如:

    18:06:19,687警告 [org.infinispan.server.hotrod.Decoder2x] (HotRod-ServerWorker-7-12) ISPN006011: 操作 'put_if _ 缺席 '强制执行
      返回以前的值应用于事务缓存,否则在故障情况下可能会出现数据不一致的问题
    18:06:19,700警告 [org.infinispan.server.hotrod.Deder2x] (HotRod-ServerWorker-7-10) ISPN006010: 条件操作 “替换 _ 如果 _ 未修改” 应该
      与事务缓存一起使用,否则在故障情况下可能会出现数据不一致问题

    您可以忽略它们。 为了避免警告,可以将Infinispan服务器端的缓存更改为事务性缓存,但不建议这样做,因为它可能会导致某些 bug引起的其他问题https://issues.redhat.com/browse/ ISPN-9323。 因此,就目前而言,警告只需要忽略即可。

  • 如果您在Infinispan服务器日志中看到错误,例如:

    12:08:32,921错误 [org.infinispan.server.hotrod.CacheDecodeContext] (HotRod-ServerWorker-7-11) ISPN005003: 报告异常: org.infinispan.server.hotrod.Invalidmagidexception: 读取魔术字节或消息id时出错: 7
    	在org.infinispan.server.hotrod.HotRodDecoder.readHeader(HotRodDecoder.java:184)
    	at org.infinispan.server.hotrod.HotRodDecoder.de codeHeader(HotRodDecoder.java:133)
    	at org.infinispan.server.hotrod.HotRodDecoder.de code(HotRodDecoder.java:92)
    	在io.net ty.handler.codec.字节消息解码器.callDecode (字节消息解码器.java:411)
    	在io.net ty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:248)

    并且您在Keycloak日志中看到一些类似的错误,它可以指示正在使用的Hot Rod协议存在不兼容的版本。 当您尝试将Keycloak与旧版本的Infinispan服务器一起使用时,可能会发生这种情况。 它 如果您添加协议版本作为附加财产的财产远程商店Keycloak中的元素 配置文件。 例如:

    <属性 名称=协议版本>2.6</属性>

管理子系统配置

Keycloak的低级配置是通过编辑 独立。xml,standalone-ha.xml,或者域。xml文件 在你的分销中。 此文件的位置 取决于你的操作模式

虽然您可以在这里配置无穷无尽的设置,但本节将重点介绍 的配置Keycloak-服务器子系统。 不管哪个配置文件 您正在使用,配置Keycloak-服务器子系统是一样的。

keycloak-server子系统通常在文件末尾声明,如下:

<子系统 xmlns=urn:jboss: 域: keycloak-服务器: 1.1>
   <网络上下文>auth</web-context>
   ...
</子系统>

请注意,在重新启动服务器之前,此子系统中的任何更改都不会生效。

配置SPI提供程序

每个配置设置的细节将在 背景。 但是,了解使用的格式很有用 在SPI提供程序上声明设置。

Keycloak是一个高度模块化的系统,允许 灵活性。 有50多个服务提供商接口 (spi),并且 您可以换出每个SPI的实现。 的一种实现 SPI被称为提供者

SPI声明中的所有元素都是可选的,但是完整的SPI声明 看起来像这样:

<spi 名称=myspi>
    <默认提供程序>我的提供者</默认提供程序>
    <提供者 名称=我的提供者 已启用=>
        <属性>
            <属性 名称=foo =酒吧/>
        </属性>
    </提供者>
    <提供者 名称=我的第二提供者 已启用=>
        <属性>
            <属性 名称=foo =foo/>
        </属性>
    </提供者>
</spi>

在这里,我们为SPI定义了两个提供者myspi。 的默认提供程序 被列为我的提供者。 但是,由SPI决定如何治疗 此设置。 有些SPIs允许多个提供商,有些则不允许。 所以 默认提供程序可以帮助SPI选择。

还要注意,每个提供程序都定义了自己的一组配置属性。 事实上,上述两个提供商都有一个名为foo只是一个 巧合。

每个属性值的类型由提供者解释。 然而,在那里 是一个例外。 考虑一下jpa的提供商事件存储SPI:

<spi 名称=事件存储>
    <提供者 名称=jpa 已启用=>
        <属性>
            <属性 名称=排除-事件 =[& quot;事件1& quot;,
                                                    & quot;事件2& quot;]/>
        </属性>
    </提供者>
</spi>

我们看到该值以方括号开头和结尾。 这意味着 该值将作为列表传递给提供程序。 在此示例中,系统将通过 提供具有两个元素值的列表事件1事件2。 添加更多值 到列表,只需用逗号分隔每个列表元素。 不幸的是, 您确实需要用转义每个列表元素周围的引号& quot;

按照中的步骤操作服务器开发指南有关自定义提供程序和提供程序配置的更多详细信息。

启动野蝇CLI

除了手动编辑配置外,您还可以选择更改 通过通过jboss-cli工具。 CLI允许 您可以在本地或远程配置服务器。 当 结合脚本。

要启动WildFly CLI,您需要运行jboss-cli

Linux/Unix
$。../bin/jboss-cli.sh
窗户
>。.. \ bin \ jboss-cli.bat

这将带给你这样的提示:

提示
[断开连接/]

如果您希望在正在运行的服务器上执行命令,您将首先 执行连接指挥。

连接
[断开/] 连接
连接
[独立 @ localhost:9990 /]

你可能会想,“我没有输入任何用户名或密码!”。 如果你跑jboss-cli在同一台机器上 由于您正在运行的独立服务器或域控制器以及您的帐户具有适当的文件权限,因此您没有 设置或输入管理员用户名和密码。 请参阅野蝇23文档 有关如何使事情更安全的更多详细信息,如果您不满意该设置。

CLI嵌入式模式

如果您碰巧与独立服务器在同一台计算机上,并且想要 在服务器未处于活动状态时发出命令,您可以将服务器嵌入CLI并使 在不允许传入请求的特殊模式下的更改。 要做到这一点,首先 执行嵌入服务器带有您希望更改的配置文件的命令。

嵌入服务器
[断开连接/] 嵌入服务器-配置 = 独立.xml
[独立 @ 嵌入式/]

CLI图形用户界面模式

CLI也可以在GUI模式下运行。 GUI模式启动一个Swing应用程序 允许您以图形方式查看和编辑运行服务器。 当您需要帮助格式化CLI命令和学习时,GUI模式特别有用 关于可用的选项。 GUI还可以从本地或 远程服务器。

在GUI模式下启动
$。../bin/jboss-cli.sh-gui

注意: 要连接到远程服务器,您可以通过-连接选项也是如此。 使用 -- help选项了解更多详细信息。

启动GUI模式后,您可能需要向下滚动以查找节点, 子系统 = 密钥斗篷-服务器。 如果右键单击节点并单击 探索子系统 = 密钥斗篷-服务器,您将获得一个仅显示的新选项卡 keycloak-服务器子系统。

cli gui

CLI脚本

CLI具有广泛的脚本功能。 脚本只是一个文本 其中包含CLI命令的文件。 考虑一个关闭主题的简单脚本 和模板缓存。

turn-off-caching.cli
/subsystem = keycloak-server/theme = defaults/:write-attribute(name = cacheThemes,value = false)
/子系统 = keycloak-server/theme = 默认值/: 写入属性 (名称 = 缓存模板,值 = false)

要执行脚本,我可以按照脚本CLI GUI中的菜单,或执行 命令行中的脚本如下:

$。../bin/jboss-cli.sh-file = turn-off-caching.cli

CLI食谱

以下是一些配置任务以及如何使用CLI命令执行它们。 请注意,除了第一个示例之外,我们使用通配符路径**表示 您应该替换或keycloak-server子系统的路径。

对于独立的,这仅意味着:

**=/子系统 = 密钥斗篷-服务器

对于域模式,这意味着类似:

**=/配置文件 = 身份验证-服务器-群集/子系统 = 密钥斗篷-服务器

更改服务器的web上下文

/subsystem = keycloak-server/: 写属性 (name = web-context,value = myContext)

设置全局默认主题

**/主题 = 默认值/: 写入属性 (名称 = 默认值,值 = myTheme)

添加新的SPI和提供程序

**/spi = mySPI/: 添加
**/spi = mySPI/provider = myProvider/: 添加 (启用 = true)

禁用提供商

**/spi = mySPI/provider = myProvider/: 写入属性 (名称 = 启用,值 = false)

更改SPI的默认提供程序

**/spi = mySPI/: 写属性 (名称 = 默认提供程序,值 = myProvider)

配置dblock SPI

**/spi = dblock/: 添加 (默认提供程序 = jpa)
**/spi = dblock/provider = jpa/: 添加 (属性 ={lockWaitTimeout => “900”},enabled = true)

为提供程序添加或更改单个属性值

**/spi = dblock/provider = jpa/:map-put (名称 = 属性,键 = lockWaitTimeout,值 = 3)

从提供程序中删除单个属性

**/spi = dblock/provider = jpa/:map-remove(name = 属性,key = lockRecheckTime)

在类型的provider属性上设置值列表

**/spi = eventsStore/provider = jpa/:map-put (名称 = 属性,键 = 排除事件,值 =[EVENT1,EVENT2])

配置文件

Keycloak中有一些默认情况下未启用的功能,这些功能包括未完全启用的功能 支持。 此外,还有一些默认情况下启用的功能,但可以禁用。

可以启用和禁用的功能有:

名称 描述 默认情况下启用 支持级别

账户2

新帐户管理控制台

是的

支持

帐户 _ 应用编程接口

帐户管理REST API

是的

支持

管理 _ 精细 _ 颗粒 _ 认证

细粒度的管理权限

预览

ciba

OpenID Connect客户端发起的反向通道身份验证 (CIBA)

是的

支持

客户端 _ 策略

添加客户端配置策略

是的

支持

标准杆

OAuth 2.0推送授权请求 (PAR)

是的

支持

声明 _ 用户 _ 配置文件

使用声明式样式配置用户配置文件

预览

码头工人

Docker注册协议

支持

模仿

管理员模拟用户的能力

是的

支持

openshift_integration

扩展以确保OpenShift的安全

预览

脚本

使用JavaScript编写自定义验证器

预览

令牌 _ 交换

令牌交换服务

预览

上传脚本

上传脚本

已弃用

网络认证

W3C网络身份验证 (WebAuthn)

是的

预览

要启用所有预览功能,请使用以下方式启动服务器:

bin/独立。sh | 蝙蝠-Dkeycloak。配置文件 = 预览

您可以通过创建文件来永久设置独立/配置文件。属性 (或域/服务器-一个/配置文件.属性对于服务器-一在域模式下)。 将以下内容添加到 文件:

配置文件 = 预览

要启用特定功能,请通过以下方式启动服务器:

bin/独立。sh | bat -Dkeycloak。配置文件。功能。<功能名称> = 启用

例如,启用Docker使用-Dkeycloak.profile.feature.doc ker = 启用

您可以在配置文件。属性文件通过添加:

功能.Doc ker = 启用

要禁用特定功能,请通过以下方式启动服务器:

bin/独立。sh | 蝙蝠-Dkeycloak。配置文件。功能。<功能名称> = 禁用

例如,禁用模拟使用-Dkeycloak。配置文件。功能。模拟 = 禁用

您可以在配置文件。属性文件通过添加:

功能。模拟 = 禁用

关系数据库设置

Keycloak带有自己的基于Java的嵌入式关系数据库,称为h2。 这是Keycloak将用于持久化数据的默认数据库,并且实际上只存在,以便您可以运行身份验证 开箱即用的服务器。 我们强烈建议您将其替换为更适合生产的外部数据库。 H2数据库 在高并发情况下不是很可行,也不应在集群中使用。 本章的目的是为了 向您展示如何将Keycloak连接到更成熟的数据库。

Keycloak使用两种分层技术来保存其关系数据。 底层的分层技术是JDBC。 JDBC 是一个Java API,用于连接到RDBMS。 每种数据库类型都有不同的JDBC驱动程序 由您的数据库供应商提供。 本章讨论如何配置Keycloak以使用这些特定于供应商的驱动程序之一。

持久性的顶层分层技术是Hibernate JPA。 这是映射Java的关系映射API的对象 关系数据的对象。 Keycloak的大多数部署将永远不必触及配置方面 冬眠,但是如果您遇到这种罕见的情况,我们将讨论如何做到这一点。

数据源配置在数据源配置章节野蝇23文档

RDBMS设置检查表

这些是为Keycloak配置RDBMS所需执行的步骤。

  1. 找到并下载数据库的JDBC驱动程序

  2. 将驱动程序JAR打包到一个模块中,然后将该模块安装到服务器中

  3. 在服务器的配置文件中声明JDBC驱动程序

  4. 修改数据源配置以使用数据库的JDBC驱动程序

  5. 修改数据源配置以定义数据库的连接参数

本章将使用PostgresSQL作为其所有示例。 其他数据库按照相同的步骤进行安装。

打包JDBC驱动程序

查找并下载您的RDBMS的JDBC驱动程序JAR。 在使用此驱动程序之前,必须将其打包到模块中并将其安装到服务器中。 模块定义了加载到Keycloak类路径中的jar以及这些jar对其他模块的依赖关系。 它们的设置非常简单。

&hellip;/模块/您的Keycloak发行版的目录,您需要创建一个目录结构来保存您的模块定义。 约定是使用JDBC驱动程序的Java包名称作为目录结构的名称。 对于PostgreSQL,创建目录组织/postgresql/main。 将您的数据库驱动程序JAR复制到此目录中,然后创建一个空的模块.xml文件也在里面。

模块目录

db模块

完成此操作后,打开模块.xml文件并创建以下XML:

模块XML
<?xml version = "1.0"?>
<模块 xmlns=urn:jboss: 模块: 1.3 名称=组织。postgresql>

    <资源>
        <资源-根 路径=postgresql-9.4.1212.jar/>
    </资源>

    <依赖>
        <模块 名称=javax.api/>
        <模块 名称=javax。交易。应用编程接口/>
    </依赖>
</模块>

模块名称应与模块的目录结构匹配。 所以,组织/postgresql地图到组织。postgresql。 的资源-根路径属性应指定驱动程序的JAR文件名。 其余的只是任何JDBC驱动程序JAR都会有的正常依赖关系。

声明并加载JDBC驱动程序

接下来要做的是将新打包的JDBC驱动程序声明到部署配置文件中,以便在服务器启动时加载并可用。 你在哪里执行这个动作取决于你的操作模式。 如果您以标准模式部署,请编辑&hellip;/独立/配置/独立.xml。 如果您以标准群集模式部署,请编辑&hellip;/独立/配置/standalone-ha.xml。 如果您以域模式部署,请编辑&hellip;/域/配置/域.xml。 在域模式下,您需要确保编辑正在使用的配置文件:身份验证-服务器-独立或者身份验证-服务器-群集

在配置文件中,搜索司机中的XML块数据源子系统。 您应该看到为H2 JDBC驱动程序声明的预定义驱动程序。 在这里,您将声明外部数据库的JDBC驱动程序。

JDBC驱动程序
  <子系统 xmlns=urn:jboss: 域: 数据源: 6.0>
     <数据源>
       ...
       <司机>
          <驱动程序 名称=h2 模块=h2database.h2>
              <xa-数据源-类>组织。h2.jdbcx.JdbcDataSource</xa-数据源类>
          </驱动程序>
       </驱动程序>
     </数据源>
  </子系统>

司机XML块您需要声明一个额外的JDBC驱动程序。 它需要有一个名称你可以选择做任何你想做的事。 您指定模块指向模块您之前为驱动程序JAR创建的包。 最后,您必须指定驱动程序的Java类。 下面是安装PostgreSQL驱动程序的示例,该驱动程序存在于本章前面定义的模块示例中。

声明您的JDBC驱动程序
  <子系统 xmlns=urn:jboss: 域: 数据源: 6.0>
     <数据源>
       ...
       <司机>
          <驱动程序 名称=postgresql 模块=组织。postgresql>
              <xa-数据源-类>组织。postgresql.xa.PGXADataSource</xa-数据源类>
          </驱动程序>
          <驱动程序 名称=h2 模块=h2database.h2>
              <xa-数据源-类>组织。h2.jdbcx.JdbcDataSource</xa-数据源类>
          </驱动程序>
       </驱动程序>
     </数据源>
  </子系统>

修改Keycloak数据源

声明JDBC驱动程序后,您必须修改Keycloak使用的现有数据源配置 将其连接到您的新外部数据库。 你会做的 这在您注册JDBC驱动程序的同一配置文件和XML块中。 这里有一个例子 这将设置到您的新数据库的连接:

声明您的JDBC驱动程序
  <子系统 xmlns=urn:jboss: 域: 数据源: 6.0>
     <数据源>
       ...
       <数据源 jndi-名称=java:jboss/数据源/密钥衣 池名称=钥匙衣帽 已启用= 使用-java-上下文=>
           <连接-网址>jdbc:postgresql:// 本地主机/密钥斗篷</连接-网址>
           <驱动程序>postgresql</驱动程序>
           <池>
               <最大池大小>20</最大池大小>
           </pool>
           <安全>
               <用户名>威廉</用户名>
               <密码>密码</密码>
           </安全>
       </数据源>
        ...
     </数据源>
  </子系统>

搜索数据源定义钥匙衣帽。 您首先需要修改连接-网址。 的 供应商JDBC实现的文档应指定此连接URL值的格式。

接下来定义司机你将使用。 这是您在上一节中声明的JDBC驱动程序的逻辑名称 章。

每次要执行事务时,打开与数据库的新连接都是昂贵的。 为了补偿,数据源 实现维护开放连接池。 的最大泳池尺寸指定它将池的最大连接数。 您可能希望根据系统的负载更改此值。

最后,至少使用PostgreSQL,您需要定义连接到数据库所需的数据库用户名和密码。 你 可能担心这个在例子中是明文的。 有一些方法可以混淆这一点,但这超出了 本指南的范围。

有关数据源功能的更多信息,请参见数据源配置章节野蝇23文档

数据库配置

此组件的配置在独立。xml,standalone-ha.xml,或者域。xml文件在您的发行版中。 此文件的位置取决于您的操作模式

数据库配置
<子系统 xmlns=urn:jboss: 域: keycloak-服务器: 1.1>
    ...
    <spi 名称=连接sjpa>
     <提供者 名称=默认 已启用=>
         <属性>
             <属性 名称=数据源 =java:jboss/数据源/密钥衣/>
             <属性 名称=initializeEmpty =/>
             <属性 名称=迁移策略 =手册/>
             <属性 名称=迁移导出 =${jboss.home.dir}/keycloak-database-update.sql/>
         </属性>
     </提供者>
    </spi>
    ...
</子系统>

可能的配置选项有:

数据源

数据源的JNDI名称

jta

用于指定数据源是否支持JTA的布尔属性

驾驶方言

数据库方言的价值。 在大多数情况下,您不需要指定此属性,因为Hibernate会自动检测方言。

initializeEmpty

初始化数据库 (如果为空)。 如果设置为false,则必须手动初始化数据库。 如果要手动初始化数据库,请将migrationStrategy设置为手册它将使用SQL命令创建一个文件来初始化数据库。 默认为true。

迁移策略

用于迁移数据库的策略。 有效值为更新,手册验证。 Update将自动迁移数据库架构。 Manual将使用SQL命令将所需的更改导出到文件,您可以在数据库上手动执行这些命令。 验证将简单地检查数据库是否是最新的。

迁移导出

在哪里编写手动数据库初始化/迁移文件的路径。

showSql

指定Hibernate是否应该在控制台中显示所有SQL命令 (默认为false)。 这很冗长!

格式sql

指定Hibernate是否应格式化SQL命令 (默认为true)

全球统计区间

将从Hibernate记录有关已执行的DB查询和其他事情的全局统计信息。 统计信息始终以指定的间隔 (以秒为单位) 报告给服务器日志,并在每次报告后清除。

架构

指定要使用的数据库架构

这些配置开关和更多内容在野蝇23发展指南

数据库的Unicode注意事项

Keycloak中的数据库架构仅在以下特殊字段中说明Unicode字符串:

  • 领域: 显示名称、HTML显示名称

  • 联盟提供者: 显示名称

  • 用户: 用户名、给定名称、姓氏、属性名称和值

  • 组: 名称、属性名称和值

  • 角色: 名称

  • 对象描述

否则,字符仅限于数据库编码中包含的字符,通常为8位。 然而,对于一些人来说 数据库系统,可以启用Unicode字符的UTF-8编码,并在所有 文本字段。 通常,与8位编码相比,字符串的最大长度要短一些。

一些数据库需要对数据库和/或JDBC驱动程序进行特殊设置,以便能够处理Unicode字符。 请在下面找到您的数据库的设置。 请注意,如果此处列出了数据库,它仍然可以正常工作 前提是它可以在数据库和JDBC驱动程序级别上正确处理UTF-8编码。

从技术上讲,Unicode支持所有字段的关键标准是数据库是否允许设置Unicode 字符集VARCHARCHAR字段。 如果是的话,Unicode很有可能是合理的,通常是在 字段长度的费用。 如果它只支持Unicode在NVARCHARNCHAR字段,Unicode支持所有文本 字段不太可能,因为Keycloak架构使用VARCHARCHAR领域广泛。

Oracle数据库

如果数据库是在Unicode支持下创建的,Unicode字符将得到正确处理VARCHARCHAR 字段 (例如,通过使用AL32UTF8字符集作为数据库字符集)。 JDBC不需要特殊设置 司机。

如果数据库字符集不是Unicode,那么要在特殊字段中使用Unicode字符,JDBC驱动程序需要 要配置连接属性oracle.jdbc.de faultNChar设置为。 这可能是明智的,尽管不是 严格必要的,也要设置甲骨文。jdbc。转换字符连接属性到。 这些属性 可以设置为系统属性或连接属性。 请注意设置oracle.jdbc.de faultNChar 可能会对业绩产生负面影响。 有关详细信息,请参阅Oracle JDBC驱动程序配置文档。

微软服务器数据库

仅对特殊字段正确处理Unicode字符。 JDBC驱动程序或数据库没有特殊设置 必要。

MySQL数据库

如果数据库是在Unicode支持下创建的,Unicode字符将得到正确处理VARCHARCHAR 中的字段创建数据库命令 (例如,通过使用utf8字符集作为默认数据库字符集 MySQL 5.5。 请注意utf8mb4字符集不起作用,因为不同的存储要求utf8 字符集[1])。 请注意,在这种情况下,长度 对非特殊字段的限制不适用,因为创建列是为了容纳给定数量的字符, 不是字节。 如果数据库默认字符集不允许存储Unicode,则只有特殊字段允许存储 Unicode值。

在JDBC驱动程序设置的一侧,有必要添加一个连接属性字符编码 = UTF-8到JDBC 连接设置。

PostgreSQL数据库

当数据库字符集为UTF8。 在这种情况下,Unicode字符可以在任何 字段,对于非特殊字段没有减少字段长度。 不需要JDBC驱动程序的特殊设置。

PostgreSQL数据库的字符集是在创建时确定的。 您可以确定默认值 使用SQL命令的PostgreSQL集群的字符集

显示服务器编码;

如果默认字符集不是UTF 8,则可以使用UTF8作为其字符集创建数据库,如下所示:

创建 数据库带编码的Keycloak'UTF8';

主机名

Keycloak在许多事情上使用公共主机名。 例如,在发送的令牌发行方字段和url中 密码重置电子邮件。

主机名SPI提供了一种为请求配置主机名的方法。 默认提供程序允许设置 前端请求的固定URL,同时允许后端请求基于请求URI。 也有可能 在内置提供商不提供所需功能的情况下,开发自己的提供商。

默认提供程序

默认主机名提供程序使用已配置的前端url作为前端请求的基本URL (来自 用户代理),并使用请求URL作为后端请求 (来自客户端的直接请求) 的基础。

前端请求不必具有与Keycloak服务器相同的上下文路径。 这意味着你可以暴露Keycloak 例如,在https://auth.example.org或者https://example.org/keycloak而在内部,它的网址可以是 https:// 10.0.0.10:8080/auth

这使得用户代理 (浏览器) 通过公共域名向Keycloak发送请求成为可能, 而内部客户端可以使用内部域名或ip地址。

这反映在OpenID Connect发现端点中,例如授权 _ 端点使用 前端URL,而令牌 _ 端点使用后端URL。 作为此处的注释,例如,公共客户将联系 通过公共端点的Keycloak,这将导致授权 _ 端点令牌 _ 端点 一样。

要设置Keycloak的frontendUrl,您可以通过add-Dkeycloak.frontendUrl = https://auth.example.org到 启动,或者您可以在独立。xml。 请参见下面的示例:

<spi 名称=主机名>
    <默认提供程序>默认</默认提供程序>
    <提供者 名称=默认 已启用=>
        <属性>
            <属性 名称=前端url =https://auth.example.com/>
            <属性 名称=forceBackendUrlToFrontendUrl =/>
        </属性>
    </提供者>
</spi>

要更新前端url使用jboss-cli使用以下命令:

/子系统 = keycloak-server/spi = 主机名/提供程序 = 默认值: 写入属性 (名称 = 属性.frontendUrl,值 = “https://auth.example.com”)

如果您希望所有请求都通过公共域名,则可以强制后端请求将前端URL用作 通过设置forceBackendUrlToFrontendUrl

也可以覆盖单个领域的默认前端URL。 这可以在管理控制台中完成。

如果您不想公开公共域上的管理员端点和控制台,请使用属性管理url要设置 管理控制台的固定URL,与前端url。 还需要阻止访问 /授权/管理在外部,有关如何执行此操作的详细信息,请参阅服务器管理指南

自定义提供程序

要开发自定义主机名提供程序,您需要实现组织。Keycloak。网址。主机名称提供工厂组织。密钥斗篷。网址。主机名称提供程序

按照中的 “服务提供商接口” 部分中的说明进行操作服务器开发指南 有关如何开发自定义提供程序的更多信息。

网络设置

Keycloak可能会在某些网络限制下开箱即用。 首先,所有网络端点都绑定到本地主机 因此,auth服务器实际上只能在一台本地计算机上使用。 对于基于HTTP的连接,它不使用默认端口 比如80岁和443岁。 HTTPS/SSL不是开箱即用的,没有它,Keycloak有很多安全性 漏洞。 最后,Keycloak 可能经常需要与外部服务器建立安全的SSL和HTTPS连接,因此需要设置信任存储,以便端点可以 被正确验证。 本章讨论了所有这些事情。

绑定地址

默认情况下,Keycloak绑定到localhost环回地址127.0.0.1。 如果 您希望身份验证服务器在您的网络上可用。 通常,我们建议您部署反向代理 或公共网络上的负载平衡器,并将流量路由到专用网络上的各个Keycloak服务器实例。 但是,无论哪种情况,您仍然需要设置网络接口以绑定到其他内容本地主机

设置绑定地址非常容易,可以在命令行上使用独立的。sh或者 域。sh中讨论的引导脚本选择操作模式章。

$ 独立。sh -b 192.168.0.5

-b交换机为任何公共接口设置IP绑定地址。

或者,如果您不想在命令行中设置绑定地址,则可以编辑部署的配置文件配置。 打开配置文件 (独立。xml或者域。xml取决于你的 操作模式) 并寻找接口XML块。

    <接口>
        <接口 名称=管理>
            <inet-地址 =${jboss.bind.address.management:127.0.0.1}/>
        </接口>
        <接口 名称=公众>
            <inet-地址 =${jboss.bind.地址: 127.0.0.1}/>
        </接口>
    </接口>

公众接口对应于创建公开可用的套接字的子系统。 一个例子 这些子系统中的web层提供了Keycloak的身份验证端点。 的管理 接口对应于由WildFly的管理层打开的套接字。 特别是插座 它允许你使用jboss-cli.sh命令行界面和WildFly web控制台

在看公众接口你看到它有一个特殊的字符串${jboss.bind.地址: 127.0.0.1}。 这个字符串 表示值127.0.0.1可以通过设置Java系统属性在命令行上重写,即:

$ domain.sh -Djboss.bind.address = 192.168.0.5

-b只是这个命令的简写符号。 因此,您可以直接在配置文件配置中更改绑定地址值,也可以在命令行中更改 你开机。

设置时有更多选项可用接口定义。 有关更多信息,请参见网络接口野蝇23文档

套接字端口绑定

为每个套接字打开的端口都有一个预定义的默认值,可以在命令行或配置内重写。 为了说明此配置,让我们假装您正在运行独立模式和 打开&hellip;/独立/配置/独立.xml。 搜索套接字-绑定-组

    <套接字-绑定-组 名称=标准插座 默认接口=公众 端口偏移=${jboss.socket.binding.port-offset:0}>
        <套接字绑定 名称=管理-http 接口=管理 港口=${jboss.management.http.port:9990}/>
        <套接字绑定 名称=管理-https 接口=管理 港口=${jboss.management.https.port:9993}/>
        <套接字绑定 名称=ajp 港口=${jboss.ajp.port:8009}/>
        <套接字绑定 名称=http 港口=${jboss.http.port:8080}/>
        <套接字绑定 名称=https 港口=${jboss.https.port:8443}/>
        <套接字绑定 名称=txn-恢复-环境 港口=4712/>
        <套接字绑定 名称=txn-状态-管理器 港口=4713/>
        <出站套接字绑定 名称=邮件-smtp>
            <远程目标 主机=本地主机 港口=25/>
        </出站套接字绑定>
    </套接字-绑定-组>

套接字-绑定定义将由服务器打开的套接字连接。 这些绑定指定 接口(绑定地址) 他们使用以及将打开的端口号。 你最感兴趣的是:

http

定义用于Keycloak HTTP连接的端口

https

定义用于Keycloak HTTPS连接的端口

ajp

此套接字绑定定义了用于AJP协议的端口。 该协议被Apache HTTPD服务器使用 结合mod-群集当您使用Apache HTTPD作为负载均衡器时。

管理-http

定义了WildFly CLI和web console使用的HTTP连接。

跑步时域模式设置套接字配置 作为例子有点棘手域。xml文件有多个套接字-绑定-组定义。 如果你向下滚动 到服务器组定义你可以看到什么套接字-绑定-组用于每个服务器组

域套接字绑定
    <服务器组>
        <服务器组 名称=负载平衡器组 简介=负载平衡器>
            ...
            <套接字-绑定-组 参考=负载平衡器插座/>
        </服务器组>
        <服务器组 名称=身份验证-服务器-组 简介=身份验证-服务器-群集>
            ...
            <套接字-绑定-组 参考=ha-插座/>
        </服务器组>
    </服务器组>
设置时有更多选项可用套接字-绑定-组定义。 有关更多信息,请参见套接字绑定组野蝇23文档

设置HTTPS/SSL

默认情况下,未设置Keycloak来处理SSL/HTTPS。 强烈建议您在Keycloak服务器本身上或在Keycloak服务器前面的反向代理上启用SSL。

此默认行为由每个Keycloak领域的SSL/HTTPS模式定义。 这将在 服务器管理指南,但让我们给出一些上下文和这些模式的简要概述。

外部请求

只要您坚持使用私有ip地址 (例如本地主机,127.0.0.1,10.x,192.168.x,以及172.16.x。 如果您没有在服务器上配置SSL/HTTPS,或者尝试从非私有ip地址通过HTTP访问Keycloak,则会收到错误消息。

Keycloak不需要SSL。 这真的应该只在开发中使用,当你在玩东西的时候。

所有请求

Keycloak要求所有ip地址都使用SSL。

可以在Keycloak管理控制台中配置每个领域的SSL模式。

为Keycloak服务器启用SSL/HTTPS

如果您没有使用反向代理或负载平衡器来处理HTTPS流量,则需要启用HTTPS 对于Keycloak服务器。 这涉及到

  1. 获取或生成包含SSL/HTTP流量的私钥和证书的密钥库

  2. 配置Keycloak服务器以使用此keypair和证书。

创建证书和Java密钥库

为了允许HTTPS连接,您需要获取自签名或第三方签名的证书并将其导入Java密钥库,然后才能在部署Keycloak服务器的web容器中启用HTTPS。

自签名证书

在开发中,您可能没有第三方签名证书可用于测试Keycloak部署,因此您需要生成自签名证书 使用关键工具Java JDK附带的实用程序。

$ keytool -genkey-别名localhost -keyalg RSA -keystore keycloak.jks-有效性10950
    输入密钥库密码: 秘密
    重新输入新密码: 秘密
    你的名字和姓氏是什么?
    [未知]: 本地主机
    你的组织单位叫什么名字?
    [未知]: Keycloak
    你们组织的名字是什么?
    [未知]: 红帽
    你的城市或地方的名字是什么?
    [未知]: 韦斯特福德
    您的州或省的名称是什么?
    [未知]: 马
    这个单元的两个字母的国家代码是什么?
    [未知]: 美国
    CN = localhost,OU = Keycloak,O = Test,L = Westford,ST = MA,C = US正确吗?
    [否]: 是的

你应该回答你的名字和姓氏是什么? 与您要安装服务器的计算机的DNS名称有关的问题。 出于测试目的,本地主机应该使用。 执行此命令后,Keycloak。jks文件将在您执行的同一目录中生成关键工具命令。

如果您想要第三方签名的证书,但没有,则可以在以下位置免费获得一个cacert.org。 不过,在执行此操作之前,您必须先做一些设置。

首先要做的是生成证书请求:

$ keytool -certreq-别名你的域-keystore keycloak.jks > keycloak.careq

哪里你的领域是为其生成此证书的DNS名称。 Keytool生成请求:

----- 开始新的证书请求 -----
MIIC2jCCAcICAQAwZTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAk1BMREwDwYDVQQHEwhXZXN0Zm9y
ZDEQMA4GA1UEChMHUmVkIEhhdDEQMA4GA1UECxMHUmVkIEhhdDESMBAGA1UEAxMJbG9jYWxob3N0
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr7kck2TaavlEOGbcpi9c0rncY4HhdzmY
Ax2nZfq1eZEaIPqI5aTxwQZzzLDK9qbeAd8Ji79HzSqnRDxNYaZu7mAYhFKHgixsolE3o5Yfzbw1
29RvyeUVe + WZxv5oo9wolVVpdSINIMEL2LaFhtX/c1dqiqYVpfnvFshZQaIg2nL8juzZcBjj4as
H98gIS7khql/dkZKsw9NLvyxgJvp7PaXurX29fNf3ihG + oFrL22oFyV54BWWxXCKU/GPn61EGZGw
Ft2qSIGLdctpMD1aJR2bcnlhEjZKDksjQZoQ5YMXaAGkcYkG6QkgrocDE2YXDbi7GIdf9MegVJ35
2DQMpwIDAQABoDAwLgYJKoZIhvcNAQkOMSEwHzAdBgNVHQ4EFgQUQwlZJBA + fjiDdiVzaO9vrE/i
n2swDQYJKoZIhvcNAQELBQADggEBAC5FRvMkhal3q86tHPBYWBuTtmcSjs4qUm6V6f63frhveWHf
PzRrI1xH272XUIeBk0gtzWo0nNZnf0mMCtUBbHhhDcG82xolikfqibZijoQZCiGiedVjHJFtniDQ
9bMDUOXEMQ7gHZg5q6mJfNG9MbMpQaUVEEFvfGEQQxbiFK7hRWU8S23/d80e8nExgQxdJWJ6vd0X
MzzFK6j4Dj55bJVuM7GFmfdNC52pNOD5vYe47Aqh8oajHX9XTycVtPXl45rrWAH33ftbrS8SrZ2S
vqIFQeuLL3BaHwpl3t7j2lMWcK1p80laAxEASib/fAwrRHpLHBXRcq6uALUOZl4Alt8 =
----- 结束新证书请求 -----

将此ca请求发送到您的CA。 CA将向您颁发签名证书并将其发送给您。 在导入新证书之前,您必须获取并导入CA的根证书。 您可以从CA (即: root.crt) 下载证书并按以下方式导入:

$ keytool -import -keystore keycloak.jks-文件根。crt-别名根

最后一步是将新的CA生成的证书导入到密钥库:

$ keytool -import -alias yourdomain -keystore keycloak.jks-文件your-certificate.cer
配置Keycloak以使用密钥库

现在您有了一个带有适当证书的Java密钥库,您需要配置您的Keycloak安装以使用它。 首先,您必须编辑独立。xml,standalone-ha.xml,或者host.xml文件使用密钥库并启用HTTPS。 然后,您可以将密钥库文件移动到配置/部署的目录或您选择的位置中的文件,并提供绝对路径。 如果您使用的是绝对路径,请删除可选的相对于参数来自您的配置 (请参见操作模式)。

添加新的安全领域使用CLI的元素:

$ /core-service = 管理/安全领域 = UndertowRealm:add()

$ /core-service = management/security-realm = UndertowRealm/server-identity = ssl:add(keystore-path = keycloak.jks,keystore-relative-至 = jboss.server.config.dir,keystore-password = secret)

如果使用域模式,则应在每个主机中使用/主机 = <主机名称>/前缀 (为了创建安全领域在所有这些),像这样,你会为每个主机重复:

$ /host = <主机名称>/core-service = management/security-realm = UndertowRealm/server-identity = ssl:add(keystore-path = keycloak.jks,keystore-relative-至 = jboss.server.config.dir,keystore-password = secret)

在独立或主机配置文件中,安全领域元素应该是这样的:

<安全领域 名称=地下王国>
    <服务器身份>
        <ssl>
            <密钥库 路径=Keycloak。jks 相对于=jboss.server.config.dir 密钥库-密码=秘密 />
        </ssl>
    </服务器身份>
</安全领域>

接下来,在独立或每个域配置文件中,搜索安全领域。 修改https-监听器要使用创建的领域:

$/子系统 = undertow/服务器 = 默认服务器/https-listener = https:write-attribute (名称 = 安全领域,值 = UndertowRealm)

如果使用域模式,请在命令前加上正在使用的配置文件:/配置文件 = <配置文件名称>/

结果元素,服务器名称 = "默认服务器",它是的子元素子系统xmlns = "urn:jboss: 域: undertow:12.0",应包含以下节:

<子系统 xmlns=urn:jboss: 域: undertow:12.0>
   <缓冲区-缓存 名称=默认/>
   <服务器 名称=默认服务器>
      <https-监听器 名称=https 套接字-绑定=https 安全领域=地下王国/>
   ...
</子系统>

传出HTTP请求

Keycloak服务器通常需要向其保护的应用程序和服务发出非浏览器HTTP请求。 auth服务器通过维护HTTP客户端连接池来管理这些传出连接。 有些事情 您需要在独立。xml,standalone-ha.xml,或者域。xml。 此文件的位置 取决于你的操作模式

HTTP客户端配置示例
<spi 名称=连接shttpclient>
    <提供者 名称=默认 已启用=>
        <属性>
            <属性 名称=连接-池-大小 =256/>
        </属性>
    </提供者>
</spi>

可能的配置选项有:

建立-连接-超时-millis

建立套接字连接的超时。

套接字-超时-millis

如果传出请求在此时间内未收到数据,请超时连接。

连接-池-大小

池中可以有多少个连接 (默认情况下128)。

每条路线的最大汇集

每个主机可以汇集多少个连接 (默认为64个)。

连接-ttl-millis

以毫秒为单位的最大连接时间。 默认情况下未设置。

最大连接空闲时间

连接在连接池中可能空闲的最长时间 (默认为900秒)。 将启动Apache HTTP客户端的后台清理线程。 设置为-1来禁用此检查和后台线程。

禁用cookie

默认情况下。 当设置为true时,这将禁用任何cookie缓存。

客户端密钥库

这是Java密钥库文件的文件路径。 此密钥库包含双向SSL的客户端证书。

客户端-密钥库-密码

客户端密钥库的密码。 这是必需如果客户端密钥库已设置。

客户端密钥密码

客户端密钥的密码。 这是必需如果客户端密钥库已设置。

代理映射

表示传出HTTP请求的代理配置。 请参阅上的部分传出HTTP请求的代理映射有关更多详细信息。

禁用信任管理器

如果传出请求需要HTTPS,并且此配置选项设置为您不必指定信任商店。 此设置应仅在开发过程中使用,并且从不在生产中,因为它将禁用SSL证书的验证。 这是可选。 默认值为

传出HTTP请求的代理映射

Keycloak发送的传出HTTP请求可以选择使用基于逗号分隔的代理映射列表的代理服务器。 代理映射表示基于正则表达式的主机名模式和代理uri的组合,形式为主机名称模式; proxyUri, 例如:

。* \。(谷歌 | 谷歌) \。com;http:// www-proxy.acme.com:8080

要确定传出HTTP请求的代理,目标主机名与配置的 主机名模式。 第一个匹配模式确定要使用的proxy-uri。 如果没有配置的模式与给定的主机名匹配,则不使用代理。

如果代理服务器需要身份验证,请以这种格式包含代理用户的凭据用户名: 密码 @。 例如:

。* \。(谷歌 | 谷歌) \。com;http:// user01:pas2w0rd@www-proxy.acme.com:8080

特殊价值无代理对于proxy-uri可以用来指示没有代理 应该用于匹配关联主机名模式的主机。 可以在代理映射的末尾指定一个catch-all模式来定义默认值 代理所有传出请求。

下面的示例演示proxy-mapping配置。

# 对Google api的所有请求都应使用http:// www-proxy.acme.com:8080作为代理
。* \。(谷歌 | 谷歌) \。com;http:// www-proxy.acme.com:8080

# 对内部系统的所有请求都不应使用代理
。* \.acme \.com; 无代理

# 所有其他请求都应使用http:// fallback:8080作为代理
。*;http:// 回退: 8080

这可以通过以下方式进行配置jboss-cli指挥。 请注意,您需要正确地转义正则表达式模式,如下所示。

回声设置: 为HttpClient SPI配置代理路由

# 如果还没有连接shttpclient定义
/子系统 = 密钥斗篷-服务器/spi = 连接shttpclient/provider = 默认值: 添加 (启用 = true)

# 配置代理映射
/子系统 = keycloak-server/spi = connectionsHttpClient/provider = 默认值: 写属性 (名称 = 属性。代理映射,值 = [“。* \。(谷歌 | 谷歌leapis)\ \。com;http:// www-proxy.acme.com:8080 “,”。* \ \.acme \ \.com; 无代理 ","。*;http:// 回退: 8080 "])

jboss-cli命令导致以下子系统配置。 请注意,需要编码字符与& quot;

<spi 名称=连接shttpclient>
    <提供者 名称=默认 已启用=>
        <属性>
            <属性
            名称=代理映射
            =[& quot;。* \。(谷歌 | 谷歌) \ \。com;http:// www-proxy.acme.com:8080& quot;,& quot;。* \ \.acme \ \.com; 无代理& quot;,& quot;。*;http:// 回退: 8080& quot;]/>
        </属性>
    </提供者>
</spi>

传出HTTPS请求信任存储

当Keycloak在远程HTTPS端点上调用时,它必须验证远程服务器的证书,以确保它正在连接到受信任的服务器。 为了防止中间人攻击,这是必要的。 这些远程服务器的证书或签署这些证书的CA 证书必须放在信任存储中。 此信任库由Keycloak服务器管理。

当安全地连接到identity broker、LDAP identity provider时,发送电子邮件时,以及用于与客户端应用程序的反向通道通信时,使用truststore。

默认情况下,未配置truststore提供程序,并且任何https连接都可以追溯到标准的java truststore配置,如 Java的JSSE参考指南。 如果没有信任 建立,那么这些传出的HTTPS请求将失败。

您可以使用关键工具要创建新的truststore文件或将受信任的主机证书添加到现有文件:

$ keytool-导入-别名主机域-keystore truststore.jks-文件host-certificate.cer

信任存储在独立。xml, standalone-ha.xml,或者域。xml文件在您的发行版中。 此文件的位置 取决于你的操作模式。 您可以使用以下模板添加您的truststore配置:

<spi 名称=信任商店>
    <提供者 名称=文件 已启用=>
        <属性>
            <属性 名称=文件 =通往你的道路。包含公共证书的jks文件/>
            <属性 名称=密码 =密码/>
            <属性 名称=主机名-验证-策略 =通配符/>
            <属性 名称=已启用 =/>
        </属性>
    </提供者>
</spi>

此设置的可能配置选项有:

文件

Java密钥库文件的路径。 HTTPS请求需要一种方法来验证他们正在与之对话的服务器的主机。 这就是trustore所做的。 密钥库包含一个或多个受信任的主机证书或证书颁发机构。 此truststore文件应仅包含受保护主机的公共证书。 这是必需如果已启用是真的。

密码

信任商店的密码。 这是必需如果已启用是真的。

主机名-验证-策略

通配符默认情况下。 对于HTTPS请求,这将验证服务器证书的主机名。 任何表示主机名未被验证。 通配符允许子域名中的通配符,即 * .foo.com。 严格CN必须完全匹配主机名。

已启用

如果为false (默认值),则将忽略truststore配置,并且证书检查将退回到JSSE配置,如所述。 如果设置为true,则必须配置文件,以及密码对于信任商店。

聚类

本节介绍将Keycloak配置为在集群中运行。 有一个数字 设置集群时必须做的事情,特别是:

本指南前面已经讨论了选择操作模式和配置共享数据库。 在本章中 我们将讨论设置负载平衡器和提供专用网络。 我们还将讨论一些你需要的问题 要注意在引导群集中的主机时。

可以在没有IP多播的情况下对Keycloak进行群集,但是此主题超出了本指南的范围。 有关更多信息,请参见JGroups的章节野蝇23文档

建议部署Keycloak的网络架构是在 将请求路由到专用网络上的Keycloak服务器的公共ip地址。 这个 隔离所有群集连接,并提供了保护服务器的好方法。

默认情况下,没有任何东西可以阻止未经授权的节点加入群集并广播多播消息。 这就是为什么群集节点应该位于专用网络中,并使用防火墙保护它们免受外部攻击的原因。

聚类示例

Keycloak确实附带了一个利用域模式的开箱即用的群集演示。 查看 群集域示例章节了解更多细节。

设置负载平衡器或代理

本节讨论在放置反向代理或负载均衡器之前需要配置的许多内容 在你的集群Keycloak部署前面。 它还包括配置内置的负载平衡器, 是群集域示例

下图说明了负载均衡器的使用。 在此示例中,负载平衡器充当三个客户端和三个Keycloak服务器集群之间的反向代理。

负载平衡器图示例

负载平衡器

识别客户端ip地址

Keycloak中的一些功能依赖于遥控器 连接到身份验证服务器的HTTP客户端的地址是客户端机器的真实ip地址。 示例包括:

  • 事件日志-失败的登录尝试将使用错误的源ip地址记录

  • 需要SSL-如果需要的SSL设置为外部 (默认),它应该要求所有外部请求的SSL

  • 身份验证流-使用ip地址的自定义身份验证流,例如仅针对外部请求显示OTP

  • 动态客户端注册

当您在Keycloak身份验证服务器前面有一个反向代理或负载平衡器时,这可能会出现问题。 通常的设置是,您在公共网络上有一个前端代理,可以负载平衡和转发请求 到位于专用网络中的后端Keycloak服务器实例。 在这种情况下,您需要进行一些额外的配置 以便实际的客户端ip地址被转发到Keycloak服务器实例并由其处理。 具体来说:

  • 配置您的反向代理或负载平衡器以正确设置X-转发-用于X-转发-ProtoHTTP头。

  • 配置反向代理或负载平衡器以保留原始的 “主机” HTTP标头。

  • 配置身份验证服务器以从X-转发-用于头。

配置您的代理以生成X-转发-用于X-转发-ProtoHTTP标头并保留 原件主机HTTP标头超出了本指南的范围。 采取额外的预防措施,以确保 X-转发-用于标头由您的代理设置。 如果您的代理配置不正确,则流氓客户端可以自己设置此标头并欺骗Keycloak 认为客户端是从与实际情况不同的ip地址连接的。 这变得非常重要,如果你正在做 任何黑白的ip地址列表。

除了代理本身之外,您还需要在Keycloak方面进行一些配置。 如果您的代理通过HTTP协议转发请求,那么您需要配置Keycloak来拉客户端的 来自X-转发-用于报头,而不是来自网络数据包。 为此,打开配置文件 (独立。xml,standalone-ha.xml,或者域。xml取决于你的 操作模式) 并寻找urn:jboss: 域: undertow:12.0XML块。

X-转发-用于HTTP配置
<子系统 xmlns=urn:jboss: 域: undertow:12.0>
   <缓冲区-缓存 名称=默认/>
   <服务器 名称=默认服务器>
      <ajp-监听器 名称=ajp 套接字-绑定=ajp/>
      <http-listener 名称=默认 套接字-绑定=http 重定向-套接字=https
          代理地址转发=/>
      ...
   </服务器>
   ...
</子系统>

添加代理地址转发属性为http监听元素。 将值设置为

如果您的代理使用AJP协议而不是HTTP来转发请求 (即Apache HTTPD mod-cluster),那么您有 以不同的方式配置事物。 而不是修改http监听,您需要添加一个过滤器到 从AJP数据包中提取此信息。

X-转发-用于AJP配置
<子系统 xmlns=urn:jboss: 域: undertow:12.0>
     <缓冲区-缓存 名称=默认/>
     <服务器 名称=默认服务器>
         <ajp-监听器 名称=ajp 套接字-绑定=ajp/>
         <http-listener 名称=默认 套接字-绑定=http 重定向-套接字=https/>
         <主机 名称=默认主机 别名=本地主机>
             ...
             <过滤器-参考 名称=代理对等/>
         </主机>
     </服务器>
        ...
     <过滤器>
         ...
         <过滤器 名称=代理对等
                 类名=io.undertow.server.处理程序.Proxypeeraddressshandler
                 模块=io.undertow.core />
     </过滤器>
 </子系统>

使用反向代理启用HTTPS/SSL

假设您的反向代理不使用端口8443 SSL,您还需要配置重定向到哪个端口HTTPS流量。

<子系统 xmlns=urn:jboss: 域: undertow:12.0>
    ...
    <http-listener 名称=默认 套接字-绑定=http
        代理地址转发= 重定向-套接字=代理-https/>
    ...
</子系统>

添加重定向-套接字属性为http监听元素。 值应为代理-https它指向一个 套接字绑定你也需要定义

然后添加一个新的套接字-绑定元素到套接字-绑定-组元素:

<套接字-绑定-组 名称=标准插座 默认接口=公众
    端口偏移=${jboss.socket.binding.port-offset:0}>
    ...
    <套接字绑定 名称=代理-https 港口=443/>
    ...
</套接字-绑定-组>

验证配置

您可以通过打开路径来验证反向代理或负载均衡器配置/auth/realms/master/。知名/openid-配置 通过反向代理。 例如,如果反向代理地址是https://acme.com/然后打开URL https://acme.com/auth/realms/master/。知名/openid-configuration。 这将显示一个JSON文档,其中列出了一个数字 Keycloak的端点。 确保端点以您的地址 (方案、域和端口) 开始 反向代理或负载均衡器。 通过这样做,您可以确保Keycloak使用的是正确的端点。

您还应该验证Keycloak是否看到请求的正确源ip地址。 要检查这个,你可以 尝试使用无效的用户名和/或密码登录到管理控制台。 这应该在服务器日志中显示警告 像这样的东西:

08:14:21,287警告XNIO-1任务-45 [org.keycloak.events] 类型 = LOGIN_ERROR,realmId = master,clientId = security-admin-console,userId = 8f20d7ba-4974-4811-a695-242c8fbd1bf8,ipAddress = X.X.X.X,error = 无效 _ user_credentials,auth_method = openid-connect,auth_type = code,redirect_uri = http:// localhost:8080/身份验证/管理/主/控制台/?重定向片段 = % 2Frealms % 2Fmaster % 2fevent-设置,代码id = a3d48b67-a439-4546-b992-e93311d6493e,用户名 = 管理员

检查的值ipAddress是您尝试登录的机器的ip地址,而不是ip地址 反向代理或负载均衡器的。

使用内置的负载均衡器

本节介绍配置内置负载平衡器,该负载平衡器将在 群集域示例

群集域示例仅设计为运行 在一台机器上。 要在另一个主机上调出一个奴隶,你需要

  1. 编辑域。xml文件指向您的新主机从机

  2. 复制服务器分发。 你不需要域。xml,host.xml,或者host-master.xml文件。 你也不需要 的独立/目录。

  3. 编辑host-slave.xml文件以更改使用的绑定地址或在命令行上覆盖它们

用负载均衡器注册新主机

让我们首先看看使用中的负载平衡器配置注册新的主机从机域。xml。 打开这个 文件并转到undertow配置负载平衡器简介。 添加新的主机定义称为 remote-host3反向代理XML块。

域。xml反向代理配置
<子系统 xmlns=urn:jboss: 域: undertow:12.0>
  ...
  <处理程序>
      <反向代理 名称=lb处理器>
         <主机 名称=主机1 出站套接字绑定=remote-host1 方案=ajp 路径=/ 实例-id=我的路线1/>
         <主机 名称=主机2 出站套接字绑定=remote-host2 方案=ajp 路径=/ 实例-id=我的路线2/>
         <主机 名称=remote-host3 出站套接字绑定=remote-host3 方案=ajp 路径=/ 实例-id=我的路线3/>
      </反向代理>
  </处理程序>
  ...
</子系统>

输出-套接字-绑定是指向套接字-绑定稍后在域。xml文件。 的实例-id属性对于新主机也必须是唯一的,因为cookie使用此值来启用粘性 负载平衡时的会话。

接下来转到负载平衡器插座 套接字-绑定-组并添加出站套接字绑定对于remote-host3。 这个新的 绑定需要指向新主机的主机和端口。

domain.xml出站套接字绑定
<套接字-绑定-组 名称=负载平衡器插座 默认接口=公众>
    ...
    <出站套接字绑定 名称=remote-host1>
        <远程目标 主机=本地主机 港口=8159/>
    </出站套接字绑定>
    <出站套接字绑定 名称=remote-host2>
        <远程目标 主机=本地主机 港口=8259/>
    </出站套接字绑定>
    <出站套接字绑定 名称=remote-host3>
        <远程目标 主机=192.168.0.5 港口=8259/>
    </出站套接字绑定>
</套接字-绑定-组>
主绑定地址

接下来你要做的就是改变公众管理绑定主主机的地址。 要么 编辑域。xml文件,如绑定地址章 或者在命令行中指定这些绑定地址,如下所示:

$ domain.sh-host-config = host-master.xml -Djboss.bind.address = 192.168.0.2 -Djboss.bind.address.management = 192.168.0.2
主机从绑定地址

接下来你必须改变公众,管理,和域控制器绑定地址 (jboss.domain.master-address)。 要么编辑 host-slave.xml文件或在命令行上指定它们,如下所示:

$ domain.sh -- host-config = host-slave.xml
     -Djboss.绑定.地址 = 192.168.0.5
      -Djboss.绑定.地址.管理 = 192.168.0.5
       -Djboss.domain.master.address = 192.168.0.2

的值jboss.bind.地址jboss.bind.address.management与主机从机的ip地址有关。 的价值jboss.domain.master.address需要是域控制器的ip地址,也就是主主机的管理地址。

配置其他负载平衡器

负载平衡中的部分野蝇23文档有关如何使用其他基于软件的负载平衡器的信息。

粘性会话

典型的群集部署由负载平衡器 (反向代理) 和专用网络上的2个或更多Keycloak服务器组成。 出于性能目的, 如果负载平衡器将与特定浏览器会话相关的所有请求转发到同一Keycloak后端节点,则可能会很有用。

原因是,Keycloak在封面下使用Infinispan分布式缓存来保存与当前身份验证会话和用户会话相关的数据。 默认情况下,Infinispan分布式缓存配置有一个所有者。 这意味着特定会话仅保存在一个群集节点上,而其他节点需要 如果他们想访问会话,可以远程查找会话。

例如,如果具有ID的身份验证会话123保存在Infinispan缓存中的节点1,然后节点2需要查找此会话, 它需要将请求发送到节点1通过网络返回特定的会话实体。

如果特定的会话实体始终在本地可用,这是有益的,这可以在粘性会话的帮助下完成。 具有公共前端负载均衡器和两个后端Keycloak节点的集群环境中的工作流可以是这样的:

  • 用户发送初始请求以查看Keycloak登录屏幕

  • 此请求由前端负载均衡器提供服务,该负载均衡器将其转发到某个随机节点 (例如node1)。 严格地说,节点不需要是随机的, 但是可以根据其他一些标准 (客户端ip地址等) 进行选择。 这完全取决于底层负载均衡器 (反向代理) 的实现和配置。

  • Keycloak创建具有随机ID的身份验证会话 (例如 123) 并将其保存到Infinispan缓存中。

  • Infinispan分布式缓存根据会话ID的散列分配会话的主所有者。 见Infinispan文档有关此的更多详细信息。 让我们假设Infinispan已分配节点2成为本次会议的所有者。

  • Keycloak创建cookie身份验证 _ 会话 _ 标识格式如下<会话id>。<所有者节点id>。 在我们的示例案例中,它将是123.节点2

  • 响应返回给用户与Keycloak登录屏幕和AUTH_SESSION_ID cookie在浏览器

从这一点来看,如果负载平衡器将所有下一个请求转发到节点2因为这是节点,是具有ID的身份验证会话的所有者123 因此,Infinispan可以在本地查找此会话。 身份验证完成后,身份验证会话将转换为用户会话,该会话也将保存在 节点2因为它有相同的ID123

粘性会话对于群集设置不是强制性的,但是由于上述原因,它对性能有好处。 您需要将您的负载平衡器配置为粘性 在身份验证 _ 会话 _ 标识饼干。 如何做到这一点取决于您的负载平衡器。

建议在Keycloak端使用系统属性jboss.node.name在启动期间,对应的值 到你的路线名称。 例如,-Djboss.node.name = node1将使用节点1识别路线。 这条路线将由 当节点是特定密钥的所有者时,Infinispan缓存并将附加到AUTH_SESSION_ID cookie。 这是 使用此系统属性的启动命令的示例:

cd $ rhsso _ 节点1
。/standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset = 100 -Djboss.node.name = node1

通常在生产环境中,路由名称应使用与后端主机相同的名称,但不是必需的。 你可以 使用不同的路由名称。 例如,如果要在专用网络中隐藏Keycloak服务器的主机名。

禁用添加路由

一些负载平衡器可以配置为自己添加路由信息,而不是依赖后端Keycloak节点。 但是,如上所述,建议通过Keycloak添加路由。 这是因为当这样做时,性能会提高, 由于Keycloak知道实体是特定会话的所有者,并且可以路由到该节点,该节点不一定是本地节点。

如果您愿意,您可以通过Keycloak禁用向AUTH_SESSION_ID cookie添加路由信息,方法是添加以下内容 进入你的RHSSO_HOME/独立/配置/standalone-ha.xmlKeycloak子系统配置中的文件:

<子系统 xmlns=urn:jboss: 域: keycloak-服务器: 1.1>
  ...
    <spi 名称=粘性会话编码器>
        <提供者 名称=infinispan 已启用=>
            <属性>
                <属性 名称=shouldAttachRoute =/>
            </属性>
        </提供者>
    </spi>

</子系统>

组播网络设置

开箱即用的集群支持需要IP组播。 多播是一种网络广播协议。 该协议在启动时用于发现和加入集群。 它还用于广播消息以复制和失效Keycloak使用的分布式缓存。

Keycloak的群集子系统在JGroups堆栈上运行。 开箱即用,群集的绑定地址将绑定到以127.0.0.1为默认ip地址的专用网络接口。 你必须编辑你的standalone-ha.xml或者域。xml中讨论的章节绑定地址章。

专用网络配置
    <接口>
        ...
        <接口 名称=私人>
            <inet-地址 =${jboss.bind.address.private:127.0.0.1}/>
        </接口>
    </接口>
    <套接字-绑定-组 名称=标准插座 默认接口=公众 端口偏移=${jboss.socket.binding.port-offset:0}>
        ...
        <套接字绑定 名称=jgroups-mping 接口=私人 港口=0 多播-地址=${jboss.de故障。多播。地址: 230.0.0.4} 多播端口=45700/>
        <套接字绑定 名称=jgroups-tcp 接口=私人 港口=7600/>
        <套接字绑定 名称=jgroups-tcp-fd 接口=私人 港口=57600/>
        <套接字绑定 名称=jgroups-udp 接口=私人 港口=55200 多播-地址=${jboss.de故障。多播。地址: 230.0.0.4} 多播端口=45688/>
        <套接字绑定 名称=jgroups-udp-fd 接口=私人 港口=54200/>
        <套接字绑定 名称=modcluster 港口=0 多播-地址=224.0.1.105 多播端口=23364/>
        ...
    </套接字-绑定-组>

您想要配置的是jboss.绑定.地址.私人jboss.de fault.多播.地址以及群集堆栈上服务的端口。

可以在没有IP多播的情况下对Keycloak进行群集,但是此主题超出了本指南的范围。 有关更多信息,请参见JGroups野蝇23文档

保护集群通信

当群集节点在专用网络上隔离时,它需要访问专用网络才能加入群集或查看群集中的通信。 此外,您还可以为群集通信启用身份验证和加密。 只要您的专用网络是安全的,就不必启用身份验证和加密。 在任何一种情况下,Keycloak都不会在群集上发送非常敏感的信息。

如果要为群集通信启用身份验证和加密,请参阅野蝇文件

序列化集群启动

允许Keycloak集群节点同时启动。 当Keycloak服务器实例启动时,它可能会进行一些数据库迁移、导入或首次初始化。 DB锁用于防止群集节点同时启动时启动操作彼此冲突。

默认情况下,此锁的最大超时时间为900秒。 如果某个节点等待此锁的时间超过超时时间 它将无法启动。 通常,您不需要增加/减少默认值,但以防万一可以在 独立。xml,standalone-ha.xml,或者域。xml文件在您的发行版中。 此文件的位置 取决于你的操作模式

<spi 名称=dblock>
    <提供者 名称=jpa 已启用=>
        <属性>
            <属性 名称=lockWaitTimeout =900/>
        </属性>
    </提供者>
</spi>

引导集群

在集群中启动Keycloak取决于您的操作模式

独立模式
$ bin/standalone.sh -- server-config = standalone-ha.xml
域模式
$ bin/domain.sh -- host-config = host-master.xml
$ bin/domain.sh -- host-config = host-slave.xml

您可能需要使用其他参数或系统属性。 例如,参数-b对于绑定主机或系统属性 jboss.node.name指定路线的名称,如粘性会话节。

故障排除

  • 请注意,当您运行集群时,您应该在两个集群节点的日志中看到类似的消息:

    INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (传入-10,共享 = udp)
    ISPN000094: 收到新的集群视图: [节点1/密钥衣 | 1] (2) [节点1/密钥衣,节点2/密钥衣]

    如果您只看到一个节点,则可能是您的群集主机没有连接在一起。

    通常,最佳实践是将群集节点放在专用网络上,而无需防火墙进行通信。 可以仅在网络的公共访问点上启用防火墙。 如果由于某种原因仍然需要在群集节点上启用防火墙,则需要打开一些端口。 默认值是具有多播地址230.0.0.4的UDP端口55200和多播端口45688。 请注意,如果要为JGroups堆栈启用诊断等其他功能,则可能需要打开更多端口。 Keycloak将大部分聚类工作委托给Infinispan/JGroups。 有关更多信息,请参见JGroups野蝇23文档

  • 如果您对故障转移支持 (高可用性) 、驱逐、到期和缓存调优感兴趣,请参阅 服务器缓存配置

服务器缓存配置

Keycloak有两种类型的缓存。 一种类型的缓存位于数据库前面,以减少数据库的负载 并通过将数据保存在内存中来减少总体响应时间。 领域、客户端、角色和用户元数据保存在这种类型的缓存中。 此缓存是本地缓存。 即使您在具有更多Keycloak服务器的集群中,本地缓存也不使用复制。 相反,它们仅在本地保留副本,并且如果条目更新,则会向群集的其余部分发送无效消息 而条目被逐出。 有单独的复制缓存工作,哪个任务是向整个集群发送有关哪些条目的无效消息 应该从当地缓存中驱逐出去。 这大大减少了网络流量,使事情变得高效,并避免了传输敏感 线上的元数据。

第二种缓存处理管理用户会话、离线令牌和跟踪登录失败,以便 服务器可以检测到密码网络钓鱼和其他攻击。 这些缓存中保存的数据是临时的,仅在内存中, 但可能会在整个集群中复制。

本章讨论了针对群集和非群集部署的这些缓存的一些配置选项。

这些缓存的更高级配置可以在Infinispan的部分野蝇23文档

驱逐和到期

为Keycloak配置了多个不同的缓存。 有一个领域缓存,它保存有关安全应用程序、一般安全数据和配置选项的信息。 还有一个包含用户元数据的用户缓存。 两个缓存都默认为最多10000个条目,并使用最近最少使用的逐出策略。 它们中的每个还与对象修订缓存绑定,该对象修订缓存控制群集设置中的逐出。 此缓存是隐式创建的,并且具有配置大小的两倍。 这同样适用于授权缓存,它保存 授权数据。 的钥匙缓存保存关于外部密钥的数据,不需要有专用的修订缓存。 相反 它有过期在其上明确声明,因此密钥会定期过期,并强制从外部客户端或 身份提供者。

这些缓存的逐出策略和最大条目可以在独立。xml,standalone-ha.xml,或者 域。xml取决于你的操作模式。 在配置文件中,有带有infinispan的部分 子系统,它看起来类似于这样:

<子系统 xmlns=urn:jboss: 域: infinispan:12.0>
    <缓存容器 名称=Keycloak>
        <本地缓存 名称=领域>
            <对象-内存 尺寸=10000/>
        </本地缓存>
        <本地缓存 名称=用户>
            <对象-内存 尺寸=10000/>
        </本地缓存>
        ...
        <本地缓存 名称=钥匙>
            <对象-内存 尺寸=1000/>
            <过期 最大空闲=3600000/>
        </本地缓存>
        ...
    </缓存容器>

要限制或扩大允许条目的数量,只需添加或编辑对象元素或过期特定缓存的元素 配置。

此外,还有单独的缓存会议,客户会议,离线消息,离线eclientsessions, 登录失败动作令牌。 这些缓存分布在集群环境中,并且默认情况下它们的大小不受限制。 如果它们是有界的,那么可能会丢失一些会话。 过期会话内部清除 通过Keycloak本身来避免增加这些缓存的大小 无限制。 如果您看到由于大量会话而导致的内存问题,则可以尝试:

  • 增加群集的大小 (群集中的更多节点意味着会话在节点之间的分布更均匀)

  • 增加Keycloak服务器进程的内存

  • 减少所有者的数量,以确保缓存保存在一个地方。 见复制和故障转移有关更多详细信息

  • 禁用分布式缓存的l1-lifespan。 有关更多详细信息,请参阅Infinispan文档

  • 减少会话超时,这可以在Keycloak管理控制台中为每个领域单独完成。 但这可能会影响 最终用户的可用性。 见超时有关更多详细信息。

还有一个额外的复制缓存,工作,多用于在集群节点间发送消息; 也是无界的 默认情况下。 但是,此缓存不应引起任何内存问题,因为此缓存中的条目非常短暂。

复制和故障转移

有这样的缓存会议,身份验证会话,离线消息,登录失败和其他几个 (见驱逐和到期有关更多详细信息), 使用群集设置时,它们被配置为分布式缓存。 条目是 不是复制到每个节点,而是选择一个或多个节点作为该数据的所有者。 如果节点不是特定缓存项的所有者,则它会查询 获取它的集群。 这对于故障转移意味着,如果所有拥有一条数据的节点都出现故障,则该数据 永远消失了。 默认情况下,Keycloak仅为数据指定一个所有者。 所以如果那个节点掉了 数据丢失了。 这通常意味着用户将被注销,并且必须再次登录。

您可以通过更改业主中的属性分布式缓存声明。

业主
<子系统 xmlns=urn:jboss: 域: infinispan:12.0>
   <缓存容器 名称=Keycloak>
       <分布式缓存 名称=会议 业主=2/>
...

在这里,我们对其进行了更改,因此至少有两个节点将复制一个特定的用户登录会话。

推荐的所有者数量确实取决于您的部署。 如果您不在乎用户是否被记录 当一个节点出现故障时,那么一个所有者就足够好了,你将避免复制。
将您的环境配置为使用带有粘性会话的loadbalancer通常是明智的。 这对性能是有益的 作为提供特定请求的Keycloak服务器,通常将是来自分布式缓存的数据的所有者 因此将能够在本地查找数据。 见粘性会话有关更多详细信息。

禁用缓存

要禁用领域或用户缓存,您必须编辑独立。xml,standalone-ha.xml, 或者域。xml文件在您的发行版中。 此文件的位置 取决于你的操作模式。 下面是配置最初的样子。

    <spi 名称=用户缓存>
        <提供者 名称=默认 已启用=/>
    </spi>

    <spi 名称=realmCache>
        <提供者 名称=默认 已启用=/>
    </spi>

要禁用缓存,请设置已启用要禁用的缓存的属性为false。 你必须重新启动你的 此更改生效的服务器。

在运行时清除缓存

要清除领域或用户缓存,请转到Keycloak管理控制台领域设置 → 缓存配置页面。 在此页面上,您可以清除领域缓存、用户缓存或外部公钥缓存。

缓存将被清除所有领域!

Keycloak运算符

Keycloak运算符为技术预览并且没有得到完全支持。

Keycloak运算符在 Kubernetes或 开放班次。 您可以使用此运算符创建自定义资源 (CRs),该资源可自动执行管理任务。 例如,您可以创建自定义资源来执行这些任务,而不是在Keycloak管理控制台中创建客户端或用户。 自定义资源是定义管理任务参数的YAML文件。

您可以创建自定义资源来执行以下任务:

为领域、客户端和用户创建自定义资源后,您可以使用Keycloak管理控制台或使用库伯特尔指挥。 但是,您不能同时使用这两种方法,因为运算符对您修改的自定义资源执行单向同步。 例如,如果您修改了领域自定义资源,则更改将显示在管理控制台中。 但是,如果使用管理控制台修改领域,则这些更改对自定义资源没有影响。

开始使用操作员在集群上安装Keycloak运算符

在集群上安装Keycloak运算符

要安装Keycloak运算符,可以使用:

使用操作员生命周期管理器安装

您可以将操作员安装在开放班次或者Kubernetes集群。

OpenShift集群上的安装
先决条件
  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序

在OpenShift 4.4群集上执行此过程。

  1. 打开OpenShift容器平台web控制台。

  2. 在左列中,单击运算符,运算符集线器

  3. 搜索Keycloak运算符。

    OpenShift中的OperatorHub选项卡

    运算符openshift运算符集线器

  4. 单击Keycloak运算符图标。

    打开安装页面。

    OpenShift上的操作员安装页面

    操作员olm安装

  5. 点击安装

  6. 选择一个命名空间,然后单击订阅。

    OpenShift中的名称空间选择

    已安装的命名空间

    操作员开始安装。

额外资源
在Kubernetes集群上安装
先决条件
  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序

对于Kubernetes集群,请执行以下步骤。

  1. OperatorHub.io上的Keycloak运算符

  2. 点击安装

  3. 按照屏幕上的说明操作。

    Kubernetes上的操作员安装页面

    操作员集线器安装

额外资源

从命令行安装

您可以从命令行安装Keycloak运算符。

先决条件
  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序
  1. 从该位置获取要安装的软件:Github回购

  2. 安装所有必需的自定义资源定义:

    $ kubectl apply -f部署/crds/
  3. 创建一个新的命名空间 (或重用现有的命名空间),如命名空间我的项目:

    $ kubectl应用名称空间我的项目
  4. 为操作员部署角色、角色绑定和服务帐户:

    $ kubectl apply -f部署/角色.yaml -n myproject
    $ kubectl应用-f部署/角色 _ 绑定
    $ kubectl应用-f部署/服务 _ 帐户。yaml -n我的项目
  5. 部署操作员:

    $ kubectl apply -f deploy/operator.yaml -n myproject
  6. 确认操作员正在运行:

    $ kubectl获取部署Keycloak-操作员
    名称准备最新可用年龄
    keycloak-操作员1/1 1 1 41s
额外资源

应用监控操作员

在使用操作员安装Keycloak或创建组件之前,我们建议您安装跟踪操作员活动的应用程序监视操作员。 要查看操作员的指标,可以使用Grafana仪表板和来自应用程序监视操作员的Prometheus警报。 例如,您可以查看诸如控制器运行时协调循环数、协调循环时间和错误等指标。

Keycloak运算符与应用程序监视运算符的集成不需要任何操作。 您只需要在集群中安装应用监控操作员。

安装应用监控操作员

先决条件
  • 安装了Keycloak操作员。

  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序
  1. 通过使用文档

  2. 注释用于Keycloak运算符安装的名称空间。 例如:

    kubectl label namespace <namespace> monitoring-key = 中间件
  3. 登录到OpenShift web控制台。

  4. 通过在应用监控命名空间。

    OpenShift web控制台中的路由

    运营商应用监控路由

查看操作员指标

Grafana和Promotheus各自提供有关操作员活动的图形信息。

  • 操作员安装预定义的Grafana仪表板,如下所示:

    Grafana仪表板

    操作员graphana仪表板

    如果您进行自定义,我们建议您克隆Grafana仪表板,以便在升级过程中不会覆盖您的更改。

  • 操作员安装一组预定义的Prometheus警报,如下所示:

    普罗米修斯警报

    运营商普罗米修斯警报

额外资源

有关更多信息,请参见访问普罗米修斯、警报管理器和Grafana

使用自定义资源的Keycloak安装

您可以使用操作员通过创建Keycloak自定义资源来自动安装Keycloak。 当您使用自定义资源安装Keycloak时,您将创建此处描述并在下面的图形中说明的组件和服务。

  • Keycloak-数据库-秘密-存储属性,例如数据库用户名,密码和外部地址 (如果连接到外部数据库)

  • 凭据-<CR-Name>-管理员用户名和密码登录Keycloak管理控制台 (<CR-Name>是基于Keycloak自定义资源名称)

  • Keycloak-作为具有高可用性支持的StatefulSet实现的Keycloak部署规范

  • Keycloak-postgresql-启动PostgreSQL数据库安装

  • Keycloak-发现服务-执行JDBC_PING发现

  • Keycloak服务-通过HTTPS连接到Keycloak (不支持HTTP)

  • Keycloak-postgresql服务-连接内部和外部 (如果使用) 数据库实例

  • Keycloak路由-从OpenShift访问Keycloak管理控制台的网址

  • KeycloakIngress-从Kubernetes访问Keycloak管理控制台的URL

运营商组件和服务如何交互

操作员组件

Keycloak自定义资源

Keycloak自定义资源是一个YAML文件,它定义了安装的参数。 这个文件包含三个属性。

  • 实例-控制在高可用性模式下运行的实例数量。

  • 外部访问-如果已启用,操作员为OpenShift创建路由 或者库伯内斯的入口 对于Keycloak集群。

  • 外部数据库-仅当您要连接外部托管的数据库时才适用。 该主题涵盖在外部数据库本指南的部分。

Keycloak自定义资源的YAML文件示例
apiVersion:keycloak.org/v1alpha1
种类:Keycloak
元数据:
  名称:示例-Keycloak
  标签:
   app:示例-Keycloak
规格:
  实例:1
  外部访问:
    已启用:

您可以更新YAML文件,并且更改将显示在Keycloak管理控制台中,但是对管理控制台的更改不会更新自定义资源。

在OpenShift上创建Keycloak自定义资源

在OpenShift上,您使用自定义资源创建一条路由,该路由是管理控制台的URL,并找到保存管理控制台用户名和密码的秘密。

先决条件
  • 您有此自定义资源的YAML文件。

  • 您具有群集管理员权限或管理员授予的等效权限级别。

  • 如果要立即开始跟踪所有操作员活动,请在创建此自定义资源之前安装监视应用程序。 见应用监控操作员

程序
  1. 使用您的YAML文件创建路由:kubectl apply -f <文件名>。yaml -n <命名空间>。 例如:

    $ kubectl apply -fKeycloak。yaml -nKeycloak
    keycloak.keycloak.org/示例-keycloak创建

    在OpenShift中创建了一条路线。

  2. 登录到OpenShift web控制台。

  3. 选择网络,路线寻找Keycloak。

    OpenShift web控制台中的路由屏幕

    路线ocp

  4. 在带有Keycloak路由的屏幕上,单击下面的URL位置

    出现Keycloak管理控制台登录屏幕。

    管理控制台登录屏幕

    登录空

  5. 在OpenShift web控制台中找到管理控制台的用户名和密码; 下工作负载,点击秘密寻找Keycloak。

    OpenShift网络控制台中的秘密屏幕

    秘密ocp

  6. 在管理控制台登录屏幕中输入用户名和密码。

    管理控制台登录屏幕

    登录完成

    现在,您已登录到由Keycloak自定义资源安装的Keycloak实例。 您已经准备好为领域、客户端和用户创建自定义资源。

    Keycloak大师领域

    新安装cr

  7. 检查自定义资源的状态:

    $ kubectl描述Keycloak <CR-name>

在Kubernetes上创建Keycloak自定义资源

在Kubernetes上,您可以使用自定义资源创建一个入口,该入口是管理控制台的ip地址,并找到保存该控制台用户名和密码的秘密。

先决条件
  • 您有此自定义资源的YAML文件。

  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序
  1. 使用您的YAML文件创建入口。kubectl apply -f <文件名>。yaml -n <命名空间>。 例如:

    $ kubectl apply -fKeycloak。yaml -nKeycloak
    keycloak.keycloak.org/示例-keycloak创建
  2. 查找入口:kubectl获取入口-n <CR-name>。 例如:

    $ kubectl获取入口-n示例-keycloak
    名称主机地址端口年龄
    Keycloak.Redhat.com 192.0.2.0 80 3米
  3. 将地址 (入口) 复制并粘贴到web浏览器中。

    出现Keycloak管理控制台登录屏幕。

    管理控制台登录屏幕

    登录空

  4. 找到用户名和密码。

    $ kubectl获取秘密凭证-<CR-Name> -o go-template = '{{范围 $ k,$ v := .data }}{{ printf "% s: " $ k }}{{ 如果不是 $ v }}{{$ v }}{{ else }}{{$ v | base64decode }}{{ end }}{{ "\ n" }}{{ end}}'
  5. 在管理控制台登录屏幕中输入用户名和密码。

    管理控制台登录屏幕

    登录完成

    现在,您已登录到由Keycloak自定义资源安装的Keycloak实例。 您已经准备好为领域、客户端和用户创建自定义资源。

    管理控制台主领域

    新安装cr

结果

操作员处理自定义资源后,使用以下命令查看状态:

$ kubectl描述Keycloak <CR-name>
Keycloak自定义资源状态
名称:示例-Keycloak
命名空间:Keycloak
标签:app = 示例-Keycloak
注释:<无>
API版本:keycloak.org/v1alpha1
种类:Keycloak
规格:
  外部访问:
    已启用:
  实例:1
状态:
  证书秘密:凭证-示例-Keycloak
  内部URL:https:// <部署实例的外部URL>
  消息:
  :和解
  准备好了:
  二级资源:
    部署:
      Keycloak-postgresql
    持久性卷索赔:
      Keycloak-postgresql-声明
    普罗米修斯统治:
      Keycloak
    路线:
      Keycloak
    秘密:
      凭证-示例-Keycloak
      Keycloak-数据库-秘密
    服务:
      Keycloak-postgresql
      Keycloak
      Keycloak-发现
    服务监视器:
      Keycloak
    有状态集:
      Keycloak
  版本:
事件:
额外资源

创建领域自定义资源

您可以使用运算符在自定义资源定义的Keycloak中创建领域。 您可以在YAML文件中定义领域自定义资源的属性。

您可以更新YAML文件,并且更改将显示在Keycloak管理控制台中,但是对管理控制台的更改不会更新自定义资源。

示例YAML文件境界自定义资源
apiVersion:keycloak.org/v1alpha1
种类:KeycloakRealm
元数据:
  名称:测试
  标签:
    app:示例-Keycloak
规格:
  境界:
    id:基本
    境界:基本
    已启用:
    显示名称:基本领域
  实例选择器:
    匹配标签:
      app:示例-Keycloak
先决条件
  • 您有此自定义资源的YAML文件。

  • 在YAML文件中,app实例选择器匹配Keycloak自定义资源的标签。 匹配这些值可确保您在Keycloak的正确实例中创建领域。

  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序
  1. 在您创建的YAML文件上使用此命令:kubectl apply -f <领域-名称>。yaml。 例如:

    $ kubectl应用-f初始 _ 真实。yaml
    keycloak.keycloak.org/test创建
  2. 登录Keycloak相关实例的管理控制台。

  3. 单击选择领域,然后找到您创建的领域。

    新境界开启。

    管理控制台主领域

    测试领域cr

结果

操作员处理自定义资源后,使用以下命令查看状态:

$ kubectl描述Keycloak <CR-name>
领域自定义资源状态
名称:示例-keycloakrealm
命名空间:Keycloak
标签:app = 示例-Keycloak
注释:<无>
API版本:keycloak.org/v1alpha1
种类:KeycloakRealm
元数据:
  创建时间戳:2019-12-03T09:46:02Z
  终结器:
    境界。清理
  一代:1
  资源版本:804596
  自我链接:/apis/keycloak.org/v1alpha1/命名空间/keycloak/keycloakrealms/示例-keycloakrealm
  UID:b7b2f883-15b1-11ea-91e6-02cb885627a6
规格:
  实例选择器:
    匹配标签:
      App:示例-Keycloak
  境界:
    显示名称:基本领域
    已启用:
    Id:基本
    境界:基本
状态:
  登录网址:
  消息:
  :和解
  准备好了:
事件:<无>

额外资源

创建客户端自定义资源

您可以使用运算符在自定义资源定义的Keycloak中创建客户端。 您可以在YAML文件中定义领域的属性。

您可以更新YAML文件,并且更改将显示在Keycloak管理控制台中,但是对管理控制台的更改不会更新自定义资源。

客户端自定义资源的YAML文件示例
apiVersion:keycloak.org/v1alpha1
种类:KeycloakClient
元数据:
  名称:示例-客户端
  标签:
    app:app = 示例-Keycloak
规格:
  realmSelector:
     匹配标签:
      app:<KeycloakRealm自定义资源的匹配标签>
  客户:
    # 如果未提供,则自动生成
    # id: 123
    clientId:客户秘密
    秘密:客户秘密
    #...
    # Keycloak客户端的其他属性
先决条件
  • 您有此自定义资源的YAML文件。

  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序
  1. 在您创建的YAML文件上使用此命令:kubectl apply -f <客户端名称>。yaml。 例如:

    $ kubectl应用-f初始客户。yaml
    keycloak.keycloak.org/示例-客户端创建
  2. 登录Keycloak相关实例的Keycloak管理控制台。

  3. 单击客户端。

    新客户端出现在客户端列表中。

    客户

结果

创建客户端后,运算符创建一个包含客户端ID和客户端的秘密使用以下命名模式:keycloak-客户端-秘密-<自定义资源名称>。 例如:

客户的秘密
apiVersion:v1
数据:
  客户id:<base64编码客户端ID>
  客户 _ 秘密:<base64编码客户端秘密>
种类:秘密

操作员处理自定义资源后,使用以下命令查看状态:

$ kubectl描述Keycloak <CR-name>
客户端自定义资源状态
名称:客户秘密
命名空间:Keycloak
标签:app = 示例-Keycloak
API版本:keycloak.org/v1alpha1
种类:KeycloakClient
规格:
  客户:
    客户端验证器类型:客户秘密
    客户端Id:客户秘密
    Id:Keycloak-客户-秘密
  领域选择器:
    匹配标签:
      App:Keycloak
状态:
  消息:
  :和解
  准备好了:
  二级资源:
    秘密:
      Keycloak-客户-秘密
事件:<无>
额外资源

创建用户自定义资源

您可以使用运算符在自定义资源定义的Keycloak中创建用户。 您可以在YAML文件中定义用户自定义资源的属性。

您可以更新YAML文件中的属性 (密码除外),并且更改将显示在Keycloak管理控制台中,但是对管理控制台的更改不会更新自定义资源。

用户自定义资源的YAML文件示例
apiVersion:keycloak.org/v1alpha1
种类:KeycloakUser
元数据:
  名称:示例-用户
规格:
  用户:
    用户名:真实用户
    名字:约翰
    姓氏:Doe
    电子邮件:user@example.com
    已启用:
    电子邮件已验证:
    真实角色:
      -离线访问
    客户角色:
      账户:
        -管理帐户
      领域管理:
        -管理-用户
  realmSelector:
    匹配标签:
      app:示例-Keycloak
先决条件
  • 您有此自定义资源的YAML文件。

  • realmSelector匹配现有领域自定义资源的标签。

  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序
  1. 在您创建的YAML文件上使用此命令:kubectl应用-f <用户 _ cr>。yaml。 例如:

    $ kubectl应用-f初始 _ 用户.Yaml
    keycloak.keycloak.org/示例-用户创建
  2. 登录Keycloak相关实例的管理控制台。

  3. 单击用户。

  4. 搜索您在YAML文件中定义的用户。

    用户在列表中。

    用户列表

结果

创建用户后,操作员使用 以下命名模式:凭证-<境界名称>-<用户名>-<命名空间>。 下面是一个例子:

KeycloakUser秘密
种类:秘密
apiVersion:v1
数据:
  密码:<base64编码密码>
  用户名:<base64编码用户名>
类型:不透明

操作员处理自定义资源后,请使用以下命令查看状态:

$ kubectl描述Keycloak <CR-name>
用户自定义资源状态
名称:示例-领域-用户
命名空间:Keycloak
标签:app = 示例-Keycloak
API版本:keycloak.org/v1alpha1
种类:KeycloakUser
规格:
  领域选择器:
    匹配标签:
      App:示例-Keycloak
  用户:
    电子邮件:realm_user@redhat.com
    凭据:
      类型:密码
      :<用户密码>
    已验证电子邮件:
    已启用:
    名字:约翰
    姓氏:Doe
    用户名:真实用户
状态:
  消息:
  :和解
事件:<无>
额外资源

连接到外部数据库

您可以通过修改Keycloak自定义资源并创建一个Keycloak-数据库-秘密YAML文件。 请注意,值是Base64编码的。

示例YAML文件Keycloak-数据库-秘密
apiVersion:v1
种类:秘密
元数据:
    名称:Keycloak-数据库-秘密
    命名空间:Keycloak
stringData:
    POSTGRES_DATABASE:<数据库名称>
    POSTGRES_EXTERNAL_ADDRESS:<外部数据库IP或URL (可通过K8s解析)>
    POSTGRES_EXTERNAL_PORT:<外部数据库端口>
    # 强烈建议使用 <'Keycloak CR-Name'-postgresql>
    POSTGRES_HOST:<数据库服务名称>
    POSTGRES_PASSWORD:<数据库密码>
    # AWS备份功能所需
    POSTGRES_SUPERUSER:
    POSTGRES_USERNAME:<数据库用户名>
 类型:不透明

以下属性设置数据库的主机名或ip地址和端口。

  • POSTGRES_EXTERNAL_ADDRESS-外部数据库的ip地址或主机名。 此地址需要在Kubernetes集群中是可解析的。

  • POSTGRES_EXTERNAL_PORT-(可选) 一个数据库端口。

对于托管或外部数据库,其他属性的工作方式相同。 设置它们如下:

  • POSTGRES_DATABASE-要使用的数据库名称。

  • POSTGRES_HOST-的名称服务用于与数据库通信。 通常Keycloak-postgresql

  • POSTGRES_USERNAME-数据库用户名

  • POSTGRES_PASSWORD-数据库密码

  • POSTGRES_SUPERUSER-指示备份是否应以超级用户身份运行。 通常

Keycloak自定义资源需要更新以启用外部数据库支持。

示例YAML文件Keycloak支持外部数据库的自定义资源
apiVersion:keycloak.org/v1alpha1
种类:Keycloak
元数据:
  标签:
      app:示例-Keycloak
  名称:示例-Keycloak
  命名空间:Keycloak
规格:
  外部数据库:
    已启用:
  实例:1
先决条件
  • 你有一个YAML文件Keycloak-数据库-秘密

  • 您已经修改了要设置的Keycloak自定义资源外部数据库

  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序
  1. 找到PostgreSQL数据库的秘密:kubectl获取秘密 <secret_for_db> -o yaml。 例如:

    $ kubectl得到秘密Keycloak-db-秘密-o yaml
    apiVersion: v1
    数据
      POSTGRES_DATABASE: cm9vdA = =
      POSTGRES_EXTERNAL_ADDRESS: MTcyLjE3LjAuMw = =
      POSTGRES_EXTERNAL_PORT: NTQzMg = =

    POSTGRES_EXTERNAL_ADDRESS是Base64格式。

  2. 解码秘密的值:回声 “<编码 _ 秘密>” | base64-解码。 例如:

    $ 回声 "MTcyLjE3LjAuMw = =" | base64-解码
    192.0.2.3
  3. 确认解码后的值与您的数据库的IP地址匹配:

    $ kubectl得到豆荚-o宽
    名称就绪状态重新启动年龄IP
    keycloak-0 1/1运行0 13m 192.0.2.0
    keycloak-postgresql-c8vv27m 1/1运行0 24m 192.0.2.3
  4. 确认Keycloak-postgresql出现在正在运行的服务列表中:

    $ kubectl获得svc
    名称类型群集-IP外部-IP端口年龄
    密钥斗篷集群ip 203.0.113.0 <无> 8443/TCP 27m
    keycloak-发现集群ip无 <无> 8080/TCP 27m
    keycloak-postgresql集群ip 203.0.113.1 <无> 5432/TCP 27m

    Keycloak-postgresql服务向后端的一组ip地址发送请求。 这些ip地址称为端点。

  5. 查看由Keycloak-postgresql服务以确认他们使用您的数据库的ip地址:

    $ kubectl获取端点Keycloak-postgresql
    名称端点年龄
    Keycloak-postgresql 192.0.2.3.5432 27m
  6. 确认Keycloak与外部数据库一起运行。 这个例子显示一切都在运行:

    $ kubectl获得豆荚
    名称就绪状态重新启动年龄IP
    keycloak-0 1/1运行0 26m 192.0.2.0
    keycloak-postgresql-c8vv27m 1/1运行0 36m 192.0.2.3
额外资源

调度数据库备份

您可以使用运算符来安排由自定义资源定义的数据库的自动备份。 自定义资源触发备份作业 (或CronJob在定期备份的情况下) 并报告其状态。

有两个选项可以安排备份:

如果您拥有AWS S3存储,则可以执行一次性备份或定期备份。 如果您没有AWS S3存储,则可以备份到本地存储。

备份到AWS S3存储

您可以一次或定期将数据库备份到AWS S3存储。 要定期备份数据,请输入有效的CronJob进入时间表

对于AWS S3存储,您可以为备份自定义资源创建YAML文件,并为AWS secret创建YAML文件。 备份自定义资源需要一个YAML文件,结构如下:

apiVersion:keycloak.org/v1alpha1
种类:KeycloakBackup
元数据:
  名称:<CR名称>
规格:
  aws:
    # 可选-仅用于定期备份。
    # 遵循通常的crond语法 (例如,使用 “0 1 *” 每天在上午1点执行备份。)
    时间表:<Cron作业时间表>
    # 必需-包含访问S3存储的凭据的密钥的名称
    证书secretname:<包含S3凭证的秘密>

AWS secret需要具有以下结构的YAML文件:

AWS S3秘密
apiVersion:v1
种类:秘密
元数据:
  名称:<秘密名称>
类型:不透明
stringData:
  Aws_s3 _ 桶 _ 名称:<S3存储桶名称>
  AWS_ACCESS_KEY_ID:<AWS访问密钥ID>
  AWS_SECRET_ACCESS_KEY:<AWS密钥>
先决条件
  • 您的备份自定义资源YAML文件包括证书secretname引用了一个秘密包含AWS S3凭据。

  • 你的KeycloakBackup自定义资源具有aws子属性。

  • 您有一个AWS S3秘密的YAML文件,其中包括<秘密名称>与备份自定义资源中标识的资源匹配。

  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序
  1. 使用凭据创建秘密:kubectl apply -f <secret_for_aws>。yaml。 例如:

    $ kubectl应用-f秘密。yaml
    Keycloak.keycloak.org/aws_s3_secreated
  2. 创建备份作业:kubectl应用-f <备份 _ crname>。yaml。 例如:

    $ kubectl应用-f aws_one-time-backup.yaml
    Keycloak.keycloak.org/aws_s3_backup已创建
  3. 查看备份作业列表:

    $ kubectl找到工作
    名称完成持续时间
    Aws_s3 _ 备份0/1 6s
  4. 查看已执行的备份作业列表。

    $ kubectl获得豆荚
    名称就绪状态重新启动年龄
    aws_s3_backup-5b4rfdd 0/1完成0 24s
    keycloak-0 1/1运行0 52m
    keycloak-postgresql-c824c6-vv27m 1/1运行0 71m
  5. 查看已完成备份作业的日志:

    $ kubectl日志aws_s3_backup-5b4rf
    ==> 组件数据转储已完成
    。
    。
    。
    。
    [来源,bash,subs = + 属性]

备份作业的状态也出现在AWS控制台中。

备份到本地存储

您可以使用Operator创建备份作业,该作业对本地持久卷执行一次性备份。

备份自定义资源的YAML文件示例
apiVersion:keycloak.org/v1alpha1
种类:KeycloakBackup
元数据:
  名称:测试-备份
先决条件
  • 您有此自定义资源的YAML文件。 一定要省略aws来自此文件的子属性。

  • 你有一个持久卷用一个索赔参考只保留一个持久的体积由Keycloak运算符创建。

程序
  1. 创建备份作业:kubectl应用-f <备份 _ crname>。 例如:

    $ kubectl应用-f one-time-backup.yaml
    keycloak.keycloak.org/测试-备份

    运算符创建一个持久的体积使用以下命名方案:Keycloak-备份-<CR-name>

  2. 查看卷列表:

    $ kubectl获得聚氯乙烯
    名称状态卷
    keycloak-备份-测试-备份绑定pvc-e242-ew022d5-093q-3134n-41-adff
    密钥斗篷-postresql-声明绑定pvc-e242-vs29202-9bcd7-093q-31-zadj
  3. 查看备份作业列表:

    $ kubectl找到工作
    名称完成持续时间
    测试-备份0/1 6s
  4. 查看已执行的备份作业列表:

    $ kubectl获得豆荚
    名称就绪状态重新启动年龄
    test-backup-5b4rf 0/1完成0 24s
    keycloak-0 1/1运行0 52m
    keycloak-postgresql-c824c6-vv27m 1/1运行0 71m
  5. 查看已完成备份作业的日志:

    $ kubectl日志test-backup-5b4rf
    ==> 组件数据转储已完成
    。
    。
    。
    。
额外资源

安装扩展和主题

您可以使用操作员安装公司或组织所需的扩展和主题。 扩展或主题可以是Keycloak可以使用的任何内容。 例如,您可以添加度量扩展。 您将扩展或主题添加到Keycloak自定义资源。

Keycloak自定义资源的YAML文件示例
apiVersion:keycloak.org/v1alpha1
种类:Keycloak
元数据:
  名称:示例-Keycloak
  标签:
   app:Keycloak
规格:
  实例:1
  扩展:
   -<url _ 扩展 _ 或 _ 主题>
  外部访问:
    已启用:

您可以以与任何其他扩展相同的方式打包和部署主题。 见部署主题手动输入以获取更多信息。

先决条件
  • 您有一个Keycloak自定义资源的YAML文件。

  • 您具有群集管理员权限或管理员授予的等效权限级别。

程序
  1. 编辑Keycloak自定义资源的YAML文件:kubectl编辑 <CR-name>

  2. 添加一行名为扩展:之后实例行。

  3. 为您的自定义扩展名或主题添加一个URL到JAR文件。

  4. 保存文件。

操作员下载扩展或主题并安装。

用于管理自定义资源的命令选项

创建自定义请求后,您可以使用库伯特尔指挥。

  • 要编辑自定义请求,请使用以下命令:kubectl编辑 <CR-name>

  • 要删除自定义请求,请使用以下命令:kubectl删除 <CR-name>

例如,要编辑名为的领域自定义请求测试领域,使用以下命令:

$ kubectl编辑测试领域

打开一个窗口,您可以在其中进行更改。

您可以更新YAML文件,并且更改将显示在Keycloak管理控制台中,但是对管理控制台的更改不会更新自定义资源。

升级策略

您可以配置操作员如何执行Keycloak升级。 您可以从以下升级策略中进行选择。

  • 重新创建: 这是默认策略。 操作员删除所有Keycloak副本,可选地创建备份 然后基于更新的Keycloak图像创建副本。 此策略适用于重大升级,因为 单个Keycloak版本正在访问基础数据库。 缺点是Keycloak需要关闭 升级期间关闭。

  • 滚动: 操作员一次删除一个副本,然后根据较新的Keycloak图像再次创建它。 这个 确保零停机升级,但更适合不需要数据库迁移的次要版本升级 由于数据库由多个Keycloak版本同时访问。 不支持自动备份 有了这个策略。

Keycloak自定义资源的YAML文件示例
apiVersion:keycloak.org/v1alpha1
种类:Keycloak
元数据:
  名称:示例-Keycloak
  标签:
   app:Keycloak
规格:
  实例:2
  迁移:
    战略:重新创建
    备份:
      已启用:
  外部访问:
    已启用:
额外资源

1。跟踪为https://issues.redhat.com/browse/ KEYCLOAK-3873