服务器安装和配置指南

Red Hat Single Sign-On 7.5

用于 Red Hat Single Sign-On 7.5

Red Hat Customer Content Services

摘要

本指南包含安装和配置 Red Hat Single Sign-On 7.5 的信息

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

第 1 章 《指南》概述

本指南的目的是在引导 Red Hat Sign-On 服务器第一次引导前需要完成的步骤。如果您只想测试驱动 Red Hat Single Sign-On,则通过自己的嵌入式和仅本地数据库即可开箱即用。对于将要在生产环境中运行的实际部署,您需要确定如何在运行时(单机或域模式)管理服务器配置,为 Red Hat Single Sign-On 存储配置共享数据库,设置加密和 HTTPS,最后设置 Red Hat Single Sign-On 在集群中运行。本指南介绍了部署服务器之前必须执行的任何预引导决策和设置的每个方面。

特别需要注意的是,红帽单点登录是从 JBoss EAP 应用服务器衍生而来。许多关于 JBoss EAP 配置元素配置红帽单点登录的诸多方面。如果您想要更详细地浏览本手册外,本指南会将您定向到手册之外的文档。

第 2 章 安装软件

您可以通过下载 ZIP 文件并解压缩它或使用 RPM 来安装 Red Hat Single Sign-On。本章回顾系统要求以及目录结构。

2.1. 安装先决条件

安装 Red Hat Single Sign-On 服务器提供了这些先决条件:

  • 运行 Java 的操作系统
  • Java 8 JRE 或 Java 11 JRE
  • zip 或 gzip 和 tar
  • 至少 512M RAM
  • 至少 1G 磁盘空间
  • 一个共享的外部数据库,如 PostgreSQL、MySQL、Oracle 等。如果要在集群中运行,Red Hat Single Sign-On 需要外部共享数据库。如需更多信息,请参阅本指南的 数据库配置 部分。
  • 如果要在集群中运行,则机器上的网络多播支持。红帽单点登录可在没有多播的情况下进行集群,但这需要大量配置更改。如需更多信息 请参阅本指南的集群部分。
  • 在 Linux 上,建议使用 /dev/urandom 作为随机数据的来源,以防止红帽在缺少可用熵而出现红帽单点登录挂起,除非安全策略强制使用 /dev/random。要在 Oracle JDK 8 和 OpenJDK 8 上实现,将启动时 java.security.egd 系统属性设置为 file:/dev/urandom

2.2. 从 ZIP 文件安装 RH-SSO

Red Hat Single Sign-On 服务器下载 ZIP 文件包含用于运行 Red Hat Single Sign-On 服务器的脚本和二进制文件。您首先安装 7.5 服务器,然后安装 7.5.3 服务器补丁。

流程

  1. 访问红帽客户门户
  2. 下载 Red Hat Single Sign-On 7.5 服务器。
  3. 使用适当的 unzip 实用程序(如 unzip、tar 或 Expand-Archive)解包 ZIP 文件。
  4. 返回 红帽客户门户网站
  5. Patches 选项卡。
  6. 下载 Red Hat Single Sign-On 7.5.3 服务器补丁。
  7. 将下载的文件放在您选择的目录中。
  8. 前往 JBoss EAP 的 bin 目录。
  9. 启动 JBoss EAP 命令行界面。

    Linux/Unix

    $ jboss-cli.sh

    Windows

    > jboss-cli.bat

  10. 应用补丁。

    $ patch apply <path-to-zip>/rh-sso-7.5.3-patch.zip

其他资源

有关应用补丁的详情,请参阅 补丁 ZIP/Installer 安装

2.3. 从 RPM 安装 RH-SSO

注意

在 Red Hat Enterprise Linux 7 和 8 中,术语频道被使用术语仓库替代。在这些说明中,仅使用术语存储库。

您必须订阅 JBoss EAP 7.4 和 RH-SSO 7.5 存储库,然后才能从 RPM 安装 RH-SSO。

注意

您无法继续接收 EAP RPM 的升级,但停止接收 RH-SSO 的更新。

2.3.1. 订阅 JBoss EAP 7.4 存储库

前提条件

  1. 使用 Red Hat Subscription Manager 确保您的 Red Hat Enterprise Linux 系统已注册到您的帐户。如需更多信息,请参阅 红帽订阅管理文档
  2. 如果您已订阅了另一个 JBoss EAP 存储库,必须先退订该存储库。

对于 Red Hat Enterprise Linux 6,7:使用 Red Hat Subscription Manager,使用以下命令订阅 JBoss EAP 7.4 存储库。根据您的 Red Hat Enterprise Linux 版本,将 <RHEL_VERSION> 替换为 6 或 7。

subscription-manager repos --enable=jb-eap-7.4-for-rhel-<RHEL_VERSION>-server-rpms --enable=rhel-<RHEL_VERSION>-server-rpms

对于 Red Hat Enterprise Linux 8:使用 Red Hat Subscription Manager,使用以下命令订阅 JBoss EAP 7.4 存储库:

subscription-manager repos --enable=jb-eap-7.4-for-rhel-8-x86_64-rpms --enable=rhel-8-for-x86_64-baseos-rpms --enable=rhel-8-for-x86_64-appstream-rpms

2.3.2. 订阅 RH-SSO 7.5 存储库并安装 RH-SSO 7.5

前提条件

  1. 使用 Red Hat Subscription Manager 确保您的 Red Hat Enterprise Linux 系统已注册到您的帐户。如需更多信息,请参阅 红帽订阅管理文档
  2. 确保您已订阅了 JBoss EAP 7.4 存储库。如需更多信息,请参阅订阅 JBoss EAP 7.4 存储库

流程

  1. 对于 Red Hat Enterprise Linux 6,7:使用 Red Hat Subscription Manager,使用以下命令订阅 RH-SSO 7.5 存储库:根据您的 Red Hat Enterprise Linux 版本,将 <RHEL_VERSION> 替换为 6 或 7。

    subscription-manager repos --enable=rh-sso-7.5-for-rhel-<RHEL-VERSION>-server-rpms
  2. 对于 Red Hat Enterprise Linux 8:使用 Red Hat Subscription Manager,使用以下命令订阅 RH-SSO 7.5 存储库:

    subscription-manager repos --enable=rh-sso-7.5-for-rhel-8-x86_64-rpms
  3. 对于 Red Hat Enterprise Linux 6,7:使用以下命令从订阅的 RH-SSO 7.5 存储库中安装 RH-SSO:

    yum groupinstall rh-sso7
  4. 对于 Red Hat Enterprise Linux 8:使用以下命令安装来自您订阅的 RH-SSO 7.5 存储库中的 RH-SSO:

    dnf groupinstall rh-sso7

您的安装已完成。RPM 安装的默认 RH-SSO_HOME 路径为 /opt/rh/rh-sso7/root/usr/share/keycloak。

其他资源

有关为 Red Hat Single Sign-On 安装 7.5.3 补丁的详情,请参考 RPM 修复

2.4. 重要目录

以下是服务器分发中的一些重要目录:

bin/
它包含用于启动服务器或在服务器上执行某些其他管理操作的各种脚本。
domain/
它包含在 域模式下运行 Red Hat Single Sign-On 时的配置文件和工作目录。
modules/
这些都是服务器使用的所有 Java 库。
standalone/
它包含 以独立模式运行 Red Hat Single Sign-On 时的配置文件和工作目录。
standalone/deployments/
如果您正在向 Red Hat Single Sign-On 编写扩展,可以在这里放置扩展。有关此问题的更多信息,请参阅 服务器开发人员指南
themes/
该目录包含服务器显示的所有 html、样式表、JavaScript 文件和映像。此处您可以修改现有主题或创建自己的主题。有关此问题的更多信息,请参阅 服务器开发人员指南

第 3 章 使用操作模式

在生产环境中部署 Red Hat Single Sign-On 前,您需要决定要使用的哪种操作模式。

  • 是否在集群中运行 Red Hat Single Sign-On?
  • 您是否想要通过集中方式管理您的服务器配置?

您选择的操作模式会影响配置数据库、配置缓存甚至引导服务器的方式。

提示

红帽单点登录基于 JBoss EAP 应用服务器构建。本指南仅会介绍在特定模式中部署的基础知识。如果您需要具体信息,最好是 JBoss EAP 配置指南

3.1. 使用独立模式

单机操作模式仅在您希望运行一个工作时有用,并且只有一个红帽单点登录服务器实例。它不适用于集群部署,且所有缓存都是非分布式且仅限本地的。不建议在生产环境中使用单机模式,因为您有单点故障。如果您的独立模式服务器停机,用户将无法登录。这个模式实际上只可用于测试驱动器,并使用 Red Hat Single Sign-On 的功能进行播放

3.1.1. 以独立模式引导

以单机模式运行服务器时,您需要根据操作系统引导服务器。这些脚本位于服务器分发的 bin/ 目录中。

独立启动脚本

standalone boot files

引导服务器:

Linux/Unix

$ .../bin/standalone.sh

Windows

> ...\bin\standalone.bat

3.1.2. 独立配置

本指南中批量指导您如何配置 Red Hat Single Sign-On 的基础架构级别。这些方面是在特定于 Red Hat Single Sign-On 的应用程序服务器的配置文件中配置的。在单机操作模式中,此文件位于 …​/standalone/configuration/standalone.xml 中。此文件还用于配置特定于 Red Hat Single Sign-On 组件的非基础架构级别。

独立配置文件

standalone config file

警告

您在服务器运行时对此文件所做的任何更改都无效,甚至可能会被服务器覆盖。改为使用命令行脚本或 JBoss EAP 的 Web 控制台。如需更多信息,请参阅 JBoss EAP 配置指南

3.2. 使用独立集群模式

当您要在集群中运行 Red Hat Single Sign-On 时,会适用独立集群操作模式。这个模式要求您在要运行服务器实例的每个机器上具有 Red Hat Single Sign-On 分发副本。最初部署这种模式非常简单,但可能会变得非常繁琐。要进行配置更改,您需要修改每台计算机上的每个发行版。对于大型集群,此模式可能会变得耗时且容易出错。

3.2.1. 独立集群配置

分发主要具有预配置的应用服务器配置文件,可在集群内运行。它具有网络、数据库、缓存和发现的所有特定基础架构设置。此文件位于 …​/standalone/configuration/standalone-ha.xml 中。这个配置中缺少一些。在不配置共享数据库连接的情况下,您无法在集群中运行 Red Hat Single Sign-On。您还需要在集群前部署一些类型的负载均衡器。本指南 的集群 和数据库 部分将指导您完成这些事务。

独立 HA 配置

standalone ha config file

警告

您在服务器运行时对此文件所做的任何更改都无效,甚至可能会被服务器覆盖。改为使用命令行脚本或 JBoss EAP 的 Web 控制台。如需更多信息,请参阅 JBoss EAP 配置指南

3.2.2. 使用独立集群模式引导

您可以使用相同的引导脚本启动 Red Hat Single Sign-On,与您在独立模式中执行。不同之处在于,您将传递额外标记以指向 HA 配置文件。

独立集群启动脚本

standalone boot files

引导服务器:

Linux/Unix

$ .../bin/standalone.sh --server-config=standalone-ha.xml

Windows

> ...\bin\standalone.bat --server-config=standalone-ha.xml

3.3. 使用域集群模式

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

以标准模式运行集群可能会很快成为随着集群大小增长而变化。每次需要配置更改时,都会在集群的每个节点上执行它。域模式通过提供存储和发布配置来解决此问题。设置可能非常复杂,但最终值得设置。此功能内置于红帽单点登录从 JBoss EAP 应用服务器中。

注意

本指南将介绍域模式的基本知识。有关如何在群集中设置域模式的详细步骤,应从 JBoss EAP 配置指南 获取。

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

域控制器
域控制器是一个负责为集群中的每个节点存储、管理和发布常规配置的过程。这个过程是集群中的节点获取其配置的核心点。
主机控制器
主机控制器负责管理特定计算机上的服务器实例。您要将它配置为运行一个或多个服务器实例。域控制器也可以与各计算机上的主机控制器交互,以管理集群。为减少正在运行的进程数量,域控制器也充当其上运行的计算机上的主机控制器。
域配置集
域配置文件是一组指定的配置,可供服务器用于从其启动。域控制器可以定义由不同服务器使用的多个域配置文件。
服务器组
服务器组是服务器的集合。它们作为.您可以将域配置文件分配到服务器组,并且该组中的每个服务都将使用该域配置文件作为其配置。

在域模式中,域控制器在 master 节点上启动。集群的配置位于域控制器中。接下来,在集群中的每个机器上启动主机控制器。每个主机控制器部署配置指定在该机器上启动多少个 Red Hat Single Sign-On 服务器实例。当主机控制器启动时,它会启动多个 Red Hat Single Sign-On 服务器实例,因为它已配置为执行此操作。这些服务器实例从域控制器拉取其配置。

注意

在一些环境中,如 Microsoft Azure,域模式并不适用。请参考 JBoss EAP 文档。

3.3.1. 域配置

本指南中的各种其他章节将引导您配置各种方面,如数据库、HTTP 网络连接、缓存和其他基础架构相关事项。虽然单机模式使用 standalone.xml 文件来配置这些内容,但域模式使用 …​/domain/configuration/domain.xml 配置文件。这是定义了 Red Hat Single Sign-On 服务器的域配置文件和服务器组。

domain.xml

domain file

警告

您在域控制器运行时对此文件所做的任何更改都无效,甚至可能会被服务器覆盖。改为使用命令行脚本或 JBoss EAP 的 Web 控制台。如需更多信息,请参阅 JBoss EAP 配置指南

我们来看一下此 domain.xml 文件的一些方面。auth-server-standaloneauth-server-clustered 配置集 XML 块是您要在其中做出大量配置决策的位置。您可以在此处配置诸如网络连接、缓存和数据库连接等内容。

auth-server 配置集

    <profiles>
        <profile name="auth-server-standalone">
            ...
        </profile>
        <profile name="auth-server-clustered">
            ...
        </profile>

auth-server-standalone 配置集是一个非集群设置。auth-server-clustered 配置集是集群设置。

如果进一步向下滚动,您会看到定义了各种 socket-binding-groups

socket-binding-groups

    <socket-binding-groups>
        <socket-binding-group name="standard-sockets" default-interface="public">
           ...
        </socket-binding-group>
        <socket-binding-group name="ha-sockets" default-interface="public">
           ...
        </socket-binding-group>
        <!-- load-balancer-sockets should be removed in production systems and replaced with a better software or hardware based one -->
        <socket-binding-group name="load-balancer-sockets" default-interface="public">
           ...
        </socket-binding-group>
    </socket-binding-groups>

此配置被定义各种连接器的默认端口映射,它们通过每个 Red Hat Single Sign-On 服务器实例打开。包含 ${…​} 的任何值都是可在命令行中使用 -D 开关(例如)覆盖的值。

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

Red Hat Single Sign-On 的服务器组的定义位于 服务器组 XML 块中。它指定使用的域配置文件(默认),以及主机控制器引导实例时 Java 虚拟机的一些默认引导参数。它还将 socket-binding-group 绑定到服务器组。

服务器组

    <server-groups>
        <!-- load-balancer-group should be removed in production systems and replaced with a better software or hardware based one -->
        <server-group name="load-balancer-group" profile="load-balancer">
            <jvm name="default">
                <heap size="64m" max-size="512m"/>
            </jvm>
            <socket-binding-group ref="load-balancer-sockets"/>
        </server-group>
        <server-group name="auth-server-group" profile="auth-server-clustered">
            <jvm name="default">
                <heap size="64m" max-size="512m"/>
            </jvm>
            <socket-binding-group ref="ha-sockets"/>
        </server-group>
    </server-groups>

3.3.2. 主机控制器配置

Red Hat Single Sign-On 附带两个主机控制器配置文件,该文件位于 …​/domain/configuration/ 目录中: host-master.xmlhost-slave.xmlhost-master.xml 配置为启动域控制器、负载平衡器和一个红帽单点登录服务器实例。host-slave.xml 配置为与域控制器通信并引导一个红帽单点登录服务器实例。

注意

负载均衡器不是必需的服务。它已存在,以便您可以轻松测试驱动开发机器上的集群。虽然在生产环境中可用时,您可以选择替换它(如果使用不同的硬件或软件使用的负载均衡器)。

主机控制器配置

host files

要禁用负载均衡器服务器实例,请编辑 host-master.xml 并注释掉或删除 "load-balancer" 条目。

    <servers>
        <!-- remove or comment out next line -->
        <server name="load-balancer" group="loadbalancer-group"/>
        ...
    </servers>

值得注意的是,需要注意此文件是身份验证服务器实例的声明。它具有一个 port-offset 设置。domain.xml socket-binding-group 或 server group 中定义的任何网络端口都将添加 port-offset 值。对于此示例域设置,我们这样做是为了使负载均衡器服务器打开的端口与启动的身份验证服务器实例不会有冲突。

    <servers>
        ...
        <server name="server-one" group="auth-server-group" auto-start="true">
             <socket-bindings port-offset="150"/>
        </server>
    </servers>

3.3.3. 服务器实例工作目录

主机 文件中定义的每个 Red Hat Single Sign-On 服务器实例会在 …​/domain/servers/{SERVER NAME} 下创建一个工作目录。额外的配置可以放在那里,以及服务器实例需求或创建的任何临时、日志或数据文件。这些服务器目录的结构最终看起来像任何其他 JBoss EAP 引导服务器一样。

工作目录

domain server dir

3.3.4. 使用域集群模式引导

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

域启动脚本

domain boot files

引导服务器:

Linux/Unix

$ .../bin/domain.sh --host-config=host-master.xml

Windows

> ...\bin\domain.bat --host-config=host-master.xml

在运行引导脚本时,您需要传递通过 --host-config 交换机要使用的主机控制配置文件。

3.3.5. 使用示例集群域进行测试

您可以使用示例 domain.xml 配置测试驱动器集群。这个示例域应该在一台机器中运行,并引导:

  • 域控制器
  • HTTP 负载均衡器
  • 两个红帽单点登录服务器实例

流程

  1. 运行 domain.sh 脚本两次,以启动两个独立的主机控制器。

    第一个是 master 主机控制器,它启动域控制器、HTTP 负载均衡器和一个 Red Hat Sign-On 身份验证服务器实例。第二个是启动仅身份验证服务器实例的从属主机控制器。

  2. 配置从属主机控制器,以使其可以安全地与域控制器通信。执行以下步骤:

    如果省略这些步骤,从属主机无法从域控制器获取集中式配置。

    1. 通过创建服务器 admin 用户和在主从卷之间共享的机密来设置安全连接。

      运行 …​/bin/add-user.sh 脚本。

    2. 当脚本询问要添加的用户类型时,选择 管理用户

      这个选择会生成一个 secret,您要剪切并粘贴到 …​/domain/configuration/host-slave.xml 文件中。

      添加 App Server Admin

      $ add-user.sh
       What type of user do you wish to add?
        a) Management User (mgmt-users.properties)
        b) Application User (application-users.properties)
       (a): a
       Enter the details of the new user to add.
       Using realm 'ManagementRealm' as discovered from the existing property files.
       Username : admin
       Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file.
        - The password should not be one of the following restricted values {root, admin, administrator}
        - The password should contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
        - The password should be different from the username
       Password :
       Re-enter Password :
       What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]:
       About to add user 'admin' for realm 'ManagementRealm'
       Is this correct yes/no? yes
       Added user 'admin' to file '/.../standalone/configuration/mgmt-users.properties'
       Added user 'admin' to file '/.../domain/configuration/mgmt-users.properties'
       Added user 'admin' with groups to file '/.../standalone/configuration/mgmt-groups.properties'
       Added user 'admin' with groups to file '/.../domain/configuration/mgmt-groups.properties'
       Is this new user going to be used for one AS process to connect to another AS process?
       e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
       yes/no? yes
       To represent the user add the following to the server-identities definition <secret value="bWdtdDEyMyE=" />

      注意

      add-user.sh 脚本不会将用户添加到 Red Hat Single Sign-On 服务器,而是添加到底层的 JBoss 企业应用平台中。此脚本中使用的凭据仅用于演示目的。请使用在您的系统中生成的系统。

  3. 将 secret 值剪切并粘贴到 …​/domain/configuration/host-slave.xml 文件中,如下所示:

         <management>
             <security-realms>
                 <security-realm name="ManagementRealm">
                     <server-identities>
                         <secret value="bWdtdDEyMyE="/>
                     </server-identities>
  4. …​/domain/configuration/host-slave.xml 文件中添加所创建的用户的用户名:

         <remote security-realm="ManagementRealm" username="admin">
  5. 运行引导脚本两次,在一台开发机器上模拟两个节点集群。

    引导 master

    $ domain.sh --host-config=host-master.xml

    启动从设备

    $ domain.sh --host-config=host-slave.xml

  6. 打开浏览器,再转到 http://localhost:8080/auth 以试用它。

3.4. 使用跨站点复制模式

在 Red Hat Single Sign-On 7.2 中作为技术预览功能引进的跨站点复制,在任何 Red Hat SSO 7.x 版本中不再作为支持的功能提供,包括最新的 RH-SSO 7.6 版本。红帽不推荐在自己的环境中实施或使用此功能,因为它不被支持。另外,这个功能的支持例外不再被视为或接受。

讨论了跨站点复制的新解决方案,并特别考虑红帽构建的 Keycloak (RHBK)的未来发行版本,这是将要引入的产品,而不是 Red Hat SSO 8。很快将提供更多详细信息。

第 4 章 管理子系统配置

红帽单点登录的低级别配置是通过编辑您的分发中的 standalone.xmlstandalone-ha.xmldomain.xml 文件来完成。此文件的位置取决于您的 操作模式

尽管此处可以配置无用设置,但本节将重点介绍 keycloak-server 子系统的配置。无论您使用哪一个配置文件,键cloak -server 子系统的配置都是相同的。

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

<subsystem xmlns="urn:jboss:domain:keycloak-server:1.1">
   <web-context>auth</web-context>
   ...
</subsystem>

请注意,在服务器重新引导之前,此子系统所做的所有更改都无效。

4.1. 配置 SPI 供应商

在其他上下文中,会使用该设置在其他上下文中讨论每个配置设置的具体设置。但是,了解用于声明 SPI 提供商设置的格式会很有用。

红帽单点登录是一个高度可扩展的高度模块化系统。有 50 个以上的服务提供商接口(SPI),您可以交换出每个 SPI 的实现。SPI 的实现称为 提供程序

SPI 声明中的所有元素都是可选的,但完整的 SPI 声明类似如下:

<spi name="myspi">
    <default-provider>myprovider</default-provider>
    <provider name="myprovider" enabled="true">
        <properties>
            <property name="foo" value="bar"/>
        </properties>
    </provider>
    <provider name="mysecondprovider" enabled="true">
        <properties>
            <property name="foo" value="foo"/>
        </properties>
    </provider>
</spi>

这里我们为 SPI myspi 定义了两个提供程序。default-provider 列为 myprovider。但是,它最多是 SPI,决定它如何对待这个设置。某些 SPI 允许多个提供程序,有些则不允许。因此,default-provider 可以帮助选择 SPI。

另请注意,每个提供程序定义了自己的一组配置属性。以上两个供应商都有名为 foo 的属性只是一个一致性。

各个属性值的类型由提供程序解释。但是,有一个例外。考虑 eventsStore SPI 的 jpa 供应商:

<spi name="eventsStore">
    <provider name="jpa" enabled="true">
        <properties>
            <property name="exclude-events" value="[&quot;EVENT1&quot;,
                                                    &quot;EVENT2&quot;]"/>
        </properties>
    </provider>
</spi>

我们看到值开头并以方括号结尾。这意味着该值将作为列表传递到提供程序。在本例中,系统会将提供商传递一个列表,其中有两个元素值 EVENT1EVENT2。要在列表中添加更多值,只需用逗号分隔各个列表元素。不幸的是,您需要用 " 来转义每个列表元素周围的引号。

按照 服务器开发人员指南 中的步骤,了解自定义供应商和提供程序配置的更多详情。

4.2. 启动 JBoss EAP CLI

除了手动编辑配置之外,您还可以通过 jboss-cli 工具发出命令来更改配置。CLI 允许您本地或远程配置服务器。在结合脚本脚本时,这特别有用。

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

Linux/Unix

$ .../bin/jboss-cli.sh

Windows

> ...\bin\jboss-cli.bat

这将使您进入提示,如下所示:

提示

[disconnected /]

如果要在运行中的服务器上执行命令,您将首先执行 connect 命令。

connect

[disconnected /] connect
connect
[standalone@localhost:9990 /]

您可以考虑自己,"我没有输入任何用户名或密码!"。如果您在运行单机服务器或域控制器的同一计算机上运行 jboss-cli,并且您的帐户具有适当文件权限,则不必设置或输入 admin 用户名和密码。请参见 JBoss EAP 配置指南,了解在使用该设置时如何使操作更加安全。

4.3. CLI 嵌入式模式

如果您发生在与单机服务器相同的机器上,并且您希望在服务器不激活时发出命令,则可以将服务器嵌入到 CLI 中,并在禁止传入请求的特殊模式中进行更改。要做到这一点,首先使用您要更改的配置文件执行 embed-server 命令。

embed-server

[disconnected /] embed-server --server-config=standalone.xml
[standalone@embedded /]

4.4. 使用 CLI GUI 模式

CLI 也可以在 GUI 模式下运行。GUI 模式会启动 Swing 应用程序,允许您以图形方式查看和编辑 正在运行的 服务器的完整管理模型。当您需要格式化 CLI 命令并了解可用选项时,GUI 模式特别有用。GUI 也可以从本地或远程服务器检索服务器日志。

流程

  1. 在 GUI 模式中启动 CLI

    $ .../bin/jboss-cli.sh --gui

    注:要连接到远程服务器,您也可以传递 --connect 选项。使用 --help 选项以获取更多详细信息。

  2. 向下滚动,以查找节点 子系统=keycloak-server
  3. 右键单击 节点,再选择 Explore subsystem=keycloak-server

    新选项卡仅显示 keycloak-server 子系统。

    keycloak-server subsystem

    keycloak-server subsystem

4.5. CLI 脚本

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

turn-off-caching.cli

/subsystem=keycloak-server/theme=defaults/:write-attribute(name=cacheThemes,value=false)
/subsystem=keycloak-server/theme=defaults/:write-attribute(name=cacheTemplates,value=false)

要执行该脚本,您可以遵循 CLI GUI 中的 Scripts 菜单,或者从命令行执行脚本,如下所示:

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

4.6. CLI 配方

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

对于独立,这只是:

** = /subsystem=keycloak-server

对于域模式,这意味着:

** = /profile=auth-server-clustered/subsystem=keycloak-server

4.6.1. 更改服务器的 Web 上下文

/subsystem=keycloak-server/:write-attribute(name=web-context,value=myContext)

4.6.2. 设置全局默认值 theme

**/theme=defaults/:write-attribute(name=default,value=myTheme)

4.6.3. 添加新的 SPI 和提供程序

**/spi=mySPI/:add
**/spi=mySPI/provider=myProvider/:add(enabled=true)

4.6.4. 禁用供应商

**/spi=mySPI/provider=myProvider/:write-attribute(name=enabled,value=false)

4.6.5. 更改 SPI 的默认供应商

**/spi=mySPI/:write-attribute(name=default-provider,value=myProvider)

4.6.6. 配置 dblock SPI

**/spi=dblock/:add(default-provider=jpa)
**/spi=dblock/provider=jpa/:add(properties={lockWaitTimeout => "900"},enabled=true)

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

**/spi=dblock/provider=jpa/:map-put(name=properties,key=lockWaitTimeout,value=3)

4.6.8. 从供应商中删除单个属性

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

4.6.9. 在类型列表的供应商属性上设置值

**/spi=eventsStore/provider=jpa/:map-put(name=properties,key=exclude-events,value=[EVENT1,EVENT2])

第 5 章 profiles

默认情况下,Red Hat Single Sign-On 有以下启用的功能,这些功能不包括没有完全支持的功能。另外,还有默认启用的一些功能,但可以禁用该功能。

可启用和禁用的功能有:

名称Description默认启用支持级别

account2

新帐户管理控制台

支持

account_api

帐户管理 REST API

支持

admin_fine_grained_authz

精细授予管理权限

预览

ciba

OpenID Connect 客户端发起后端身份验证(CIBA)

支持

client_policies

添加客户端配置策略

支持

PAR

OAuth 2.0 推送身份验证请求(PAR)

支持

declarative_user_profile

使用声明式风格配置用户配置集

预览

docker

Docker Registry 协议

支持

模拟

管理员能够模拟用户

支持

openshift_integration

启用保护 OpenShift 的扩展

预览

脚本

使用 JavaScript 编写自定义验证器

预览

token_exchange

令牌交换服务

预览

upload_scripts

上传脚本

已弃用

web_authn

W3C Web 身份验证(WebAuthn)

预览

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

bin/standalone.sh|bat -Dkeycloak.profile=preview

您可以通过在域模式中为 server-one 创建文件 standalone/configuration/profile.properties (或 domain/servers/server-one/configuration/profile.properties )来永久设置此设置。将以下内容添加到该文件中:

profile=preview

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

bin/standalone.sh|bat -Dkeycloak.profile.feature.<feature name>=enabled

例如,要启用 Docker,请使用 -Dkeycloak.profile.feature.docker=enabled

您可以通过添加以下内容在 profile.properties 文件中永久设置此项:

feature.docker=enabled

要禁用特定功能,请使用以下内容启动服务器:

bin/standalone.sh|bat -Dkeycloak.profile.feature.<feature name>=disabled

例如,禁用 Impersonation use -Dkeycloak.profile.feature.impersonation=disabled

您可以通过添加以下内容在 profile.properties 文件中永久设置此项:

feature.impersonation=disabled

第 6 章 设置关系数据库

红帽单点登录附带自己的嵌入式 Java 关系数据库,名为 H2。这是 Red Hat Single Sign-On 将用来持久保留数据的默认数据库,并且实际上仅存在,以便您可以开箱即用地运行身份验证服务器。我们强烈推荐您将其替换为更生产就绪的外部数据库。H2 数据库在高并发情况下并不可行,不应在集群中使用。本章的目的是将 Red Hat Single Sign-On 连接到更成熟的数据库。

红帽单点登录使用两种分层技术来保留其关系数据。底层的技术为 JDBC。JDBC 是一种用于连接到 RDBMS 的 Java API。每个数据库类型都有不同的 JDBC 驱动程序,这些驱动程序由您的数据库厂商提供。本章讨论如何配置 Red Hat Single Sign-On 以使用这些特定厂商的其中一个驱动程序。

持久性的顶级技术是 Hibernate JPA。这是一个用于关系映射 API 的对象,可将 Java 对象映射到关系数据。红帽单点登录的大多数部署无需接触 Hibernate 的配置方面,但我们将会讨论如何完成该操作,如果遇到很少见的意外情况,我们将会探讨如何完成该操作。

注意

JBoss EAP 配置 指南中的数据源配置一章中 已详细阐述了数据源配置章节

6.1. 数据库设置检查列表

以下是获取为 Red Hat Single Sign-On 配置的 RDBMS 的步骤。

  1. 为您的数据库查找并下载 JDBC 驱动程序
  2. 将驱动程序 JAR 打包成模块,并将此模块安装到服务器中
  3. 在服务器的配置配置文件中声明 JDBC 驱动程序
  4. 修改数据源配置以使用数据库的 JDBC 驱动程序
  5. 修改数据源配置,以定义与数据库的连接参数

本章将针对所有示例使用 PostgresSQL。其他数据库遵循相同的安装步骤。

6.2. 打包 JDBC 驱动程序

为您的 RDBMS 查找并下载 JDBC 驱动程序 JAR。在使用这个驱动程序前,您必须将它打包成模块并将其安装到服务器中。模块定义了 JAR,它们被加载到 Red Hat Single Sign-On classpath 中,并且这些 JARs 在其他模块上具有的依赖项。

流程

  1. 创建一个目录结构,在 Red Hat Single Sign-On 分发的 …​/modules/ 目录中保存您的模块定义。

    其惯例是将 JDBC 驱动程序的 Java 软件包名称用作目录结构的名称。对于 PostgreSQL,创建目录 org/postgresql/main

  2. 将数据库驱动程序 JAR 复制到此目录中,并在其中也创建一个空的 module.xml 文件。

    模块目录

    Module Directory

  3. 打开 module.xml 文件并创建以下 XML:

    模块 XML

    <?xml version="1.0" ?>
    <module xmlns="urn:jboss:module:1.3" name="org.postgresql">
    
        <resources>
            <resource-root path="postgresql-9.4.1212.jar"/>
        </resources>
    
        <dependencies>
            <module name="javax.api"/>
            <module name="javax.transaction.api"/>
        </dependencies>
    </module>

    • 模块名称应与您的模块的目录结构匹配。因此,org/postgresql 映射到 org.postgresql
    • resource-root path 属性应指定驱动程序的 JAR 文件名。
    • 其余的仅仅是任何 JDBC 驱动程序 JAR 需要的正常依赖项。

6.3. 声明并载入 JDBC 驱动程序

将 JDBC 声明到您的部署配置文件中,以便它会在服务器引导时加载并变为可用。

前提条件

您已打包了 JDBC 驱动程序。

流程

  1. 根据您的部署模式编辑其中一个文件来声明您的 JDBC 驱动程序:

    • 对于标准模式,编辑 …​/standalone/configuration/standalone.xml
    • 对于标准集群模式,编辑 …​/standalone/configuration/standalone-ha.xml.
    • 对于域模式,编辑 …​/domain/configuration/domain.xml

      在域模式中,确保您编辑使用的配置集: auth-server-standaloneauth-server-clustered

  2. 在配置集中,搜索 datasources 子系统中的 驱动程序 XML 块。

    您应该会看到为 H2 JDBC 驱动程序声明了预定义的驱动程序。在这里,您要为外部数据库声明 JDBC 驱动程序。

    JDBC 驱动程序

      <subsystem xmlns="urn:jboss:domain:datasources:6.0">
         <datasources>
           ...
           <drivers>
              <driver name="h2" module="com.h2database.h2">
                  <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
              </driver>
           </drivers>
         </datasources>
      </subsystem>

  3. 驱动程序 XML 块中,声明一个额外的 JDBC 驱动程序。

    • 这个驱动程序分配任何名称
    • 指定 module 属性,它指向您之前为驱动程序 JAR 创建的模块软件包。
    • 指定驱动程序的 Java 类。

      以下是安装在本章前面定义的模块示例中的 PostgreSQL 驱动程序的示例。

      声明您的 JDBC 驱动程序

        <subsystem xmlns="urn:jboss:domain:datasources:6.0">
           <datasources>
             ...
             <drivers>
                <driver name="postgresql" module="org.postgresql">
                    <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
                </driver>
                <driver name="h2" module="com.h2database.h2">
                    <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                </driver>
             </drivers>
           </datasources>
        </subsystem>

6.4. 修改 Red Hat Single Sign-On 数据源

您可以修改 Red Hat Single Sign-On 用来将其连接到您的新外部数据库的现有数据源配置。您可以在您注册了 JDBC 驱动程序的同一配置文件和 XML 块中执行此操作。以下是设置新数据库连接的示例:

声明您的 JDBC 驱动程序

  <subsystem xmlns="urn:jboss:domain:datasources:6.0">
     <datasources>
       ...
       <datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
           <connection-url>jdbc:postgresql://localhost/keycloak</connection-url>
           <driver>postgresql</driver>
           <pool>
               <max-pool-size>20</max-pool-size>
           </pool>
           <security>
               <user-name>William</user-name>
               <password>password</password>
           </security>
       </datasource>
        ...
     </datasources>
  </subsystem>

前提条件

  • 您已声明您的 JDBC 驱动程序。

流程

  1. 搜索 KeycloakDS 的数据源 定义。

    您首先需要修改 connection-url。厂商的 JDBC 实施的文档应指定此连接 URL 值的格式。

  2. 定义要使用的 驱动程序

    这是您在本章之前声明的 JDBC 驱动程序的逻辑名称。

    每次您要执行事务时,每次都打开到数据库的新连接会非常昂贵。为补偿,数据源实施可维护一个打开的连接池。max-pool-size 指定它池的最大连接数。根据系统负载,您可能需要更改这个值。

  3. 定义连接数据库所需的数据库用户名和密码。至少 PostgreSQL 需要此步骤。您可以担心这些凭据在示例中的明文中处于明文状态。存在方法来混淆这些凭据,但这些方法超出了本指南的讨论范畴。
注意

有关数据源功能的更多信息,请参阅 JBoss EAP 配置 指南中的数据源配置章节

6.5. 数据库配置

此组件的配置可在您的分发中的 standalone.xmlstandalone-ha.xmldomain.xml 文件中找到。此文件的位置取决于您的 操作模式

数据库配置

<subsystem xmlns="urn:jboss:domain:keycloak-server:1.1">
    ...
    <spi name="connectionsJpa">
     <provider name="default" enabled="true">
         <properties>
             <property name="dataSource" value="java:jboss/datasources/KeycloakDS"/>
             <property name="initializeEmpty" value="false"/>
             <property name="migrationStrategy" value="manual"/>
             <property name="migrationExport" value="${jboss.home.dir}/keycloak-database-update.sql"/>
         </properties>
     </provider>
    </spi>
    ...
</subsystem>

可能的配置选项有:

dataSource
dataSource 的 JNDI 名称
JTA
布尔值属性来指定数据源是否 JTA 能够
driverDialect
数据库价值。在大多数情况下,您无需将此属性指定为 dialect,将被 Hibernate 自动探测到。
initializeEmpty
如果为空,初始化数据库。如果设置为 false,则必须手动初始化数据库。如果要手动将数据库设置 migrationStrategy 初始化为 manual,这将创建一个带有 SQL 命令的文件来初始化数据库。默认值为 true。
migrationStrategy
用于迁移数据库的策略。有效值为 更新手动 和验证。更新将自动迁移数据库架构。手动将使用您可以在数据库中手动执行的 SQL 命令导出所需的更改到文件。验证将简单地检查数据库是否为最新状态。
migrationExport
写入数据库初始化/迁移文件的位置。
showSql
指定 Hibernate 是否应该在控制台中显示所有 SQL 命令(默认为false)。这是非常详细!
formatSql
指定 Hibernate 是否应该格式化 SQL 命令(默认为true)
globalStatsInterval
将从 Hibernate 记录全局统计信息,了解已执行 DB 查询及其他情况。统计数据始终报告为服务器日志(以秒为单位),并在每个报告后清除。
schema
指定要使用的数据库 schema

6.6. 数据库的 Unicode 注意事项

Red Hat Single Sign-On 中的数据库模式只考虑以下特殊字段中 Unicode 字符串:

  • realms:显示名称、HTML 显示名称
  • federation Providers:显示名称
  • Users:用户名、给定名称、姓、属性名称和值
  • groups:名称、属性名称和值
  • roles: name
  • 对象描述

否则,字符仅限于数据库编码中的字符,通常为 8 位。然而,对于某些数据库系统,可以启用 Unicode 字符的 UTF-8 编码,并在所有文本字段中使用完整的 Unicode 字符。通常,该字符串的长度比 8 位编码的情况要短。

某些数据库需要对数据库和/或 JDBC 驱动程序进行特殊设置,才能处理 Unicode 字符。请在下面查找您的数据库的设置。请注意,如果此处列出数据库,它仍然可正常工作,只要它处理数据库和 JDBC 驱动程序级别的 UTF-8 编码。

从技术上讲,Unicode 支持的关键条件是数据库是否允许为 VARCHARCHAR 字段设置 Unicode 字符。如果是,则 Unicode 将非常明显的几率,通常是字段长度的开支。如果它只支持 NVARCHARNCHAR 字段中的 Unicode 支持,因为 Keycloak 模式使用 VARCHARCHAR 字段。

6.6.1. Oracle 数据库

VARCHARCHAR 字段(例如,使用 AL32UTF8 字符集作为数据库字符集),可以正确处理 Unicode 字符支持。JDBC 驱动程序不需要特殊设置。

如果数据库字符集不是 Unicode,则需要在特殊字段中使用 Unicode 字符,则需要将 connection 属性 oracle.jdbc.defaultNChar 设置为 true。虽然这不是绝对必要,但严格要求将 oracle.jdbc.convertNcharLiterals 连接属性设置为 true。这些属性可以设置为系统属性或连接属性。请注意,设置 oracle.jdbc.defaultNChar 可能会对性能造成负面影响。详情请查看 Oracle JDBC 驱动程序配置文档。

6.6.2. Microsoft SQL Server 数据库

Unicode 字符只针对特殊字段正确处理。不需要对 JDBC 驱动程序或数据库进行特殊设置。

6.6.3. MySQL 数据库

CREATE DATABASE 命令中的 VARCHARCHAR 字段(例如,使用 utf8 字符设置为 MySQL 5.5 中设置的默认数据库字符)中,可以使用 Unicode 字符来创建数据库。请注意,utf8mb4 字符集无法正常工作,因为 utf8 字符集的不同存储要求 [1]).请注意,在这种情况下,不会应用对非特殊字段的长度限制,因为创建的列是为了容纳给定数量的字符数,而不是字节。如果数据库默认字符集不允许存储 Unicode,则只有特殊字段允许存储 Unicode 值。

在 JDBC 驱动程序设置的两侧,需要在 JDBC 连接设置中添加 连接属性字符Encoding=UTF-8

6.6.4. PostgreSQL 数据库

数据库字符集为 UTF8 时支持 Unicode。在这种情况下,任何字段中都可以使用 Unicode 字符,非特殊字段没有减少字段长度。不需要对 JDBC 驱动程序进行特殊设置。

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

show server_encoding;

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

create database keycloak with encoding 'UTF8';

第 7 章 使用公共主机名

Red Hat Single Sign-On 将公共主机名用于很多事项。例如,在令牌签发者字段中,在密码重置电子邮件中发送的 URL。

Hostname SPI 提供了为请求配置主机名的方法。默认供应商允许为 frontend 请求设置固定 URL,同时允许后端请求基于请求 URI。如果内置供应商不提供所需的功能,还可以开发自己的供应商。

7.1. 默认供应商

默认主机名供应商使用配置的 frontendUrl 作为 frontend 请求的基本 URL (来自用户代理的请求),并使用请求 URL 作为后端请求(直接来自客户端的请求)。

frontend 请求不必具有与 Keycloak 服务器相同的 context-path。这意味着,您可以在 https://auth.example.orghttps://example.org/keycloak 上公开 Keycloak,而内部的 URL 可以是 https://10.0.0.10:8080/auth。

这样,用户代理(浏览器)可以通过公共域名向 Red Hat Single Sign-On 发送请求,而内部客户端可以使用内部域名或 IP 地址。

这反映在 OpenID Connect Discovery 端点中,例如 authorization_endpoint 使用 frontend URL,而 token_endpoint 使用后端 URL。此时,实例的公共客户端将通过公共端点联系 Keycloak,这将导致 authorization_endpointtoken_endpoint 的基础。

要为 Keycloak 设置 frontendUrl,您可以将 -Dkeycloak.frontendUrl=https://auth.example.org 传递给启动,或者在 standalone.xml 中配置它。请参见以下示例:

<spi name="hostname">
    <default-provider>default</default-provider>
    <provider name="default" enabled="true">
        <properties>
            <property name="frontendUrl" value="https://auth.example.com"/>
            <property name="forceBackendUrlToFrontendUrl" value="false"/>
        </properties>
    </provider>
</spi>

使用以下命令更新 frontendUrl

/subsystem=keycloak-server/spi=hostname/provider=default:write-attribute(name=properties.frontendUrl,value="https://auth.example.com")

如果您希望所有请求通过公共域名,您也可以强制后端请求使用 frontend URL,方法是将 forceBackendUrlToFrontendUrl 设置为 true

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

如果您不想在公共域中公开 admin 端点和控制台,请使用 adminUrl 属性 adminUrl 为 admin 控制台设置固定 URL,这与 frontendUrl 不同。另外,还需要从外部阻止对 /auth/admin 的访问,以获取有关如何引用 服务器管理指南 的详细信息。

7.2. 自定义供应商

要开发自定义主机名提供程序,您需要实施 org.keycloak.urls.HostnameProviderFactoryorg.keycloak.urls.HostnameProvider

有关如何开发自定义提供程序的更多信息,请参阅《 服务器开发人员指南》 中的 Service Provider Interfaces 部分的说明。

第 8 章 设置网络

Red Hat Single Sign-On 的默认安装可能会遇到一些网络限制。对于其中一个,所有网络端点都绑定到 localhost,因此 auth 服务器实际上仅在一个本地计算机上可用。对于基于 HTTP 的连接,不使用 80 和 443 等默认端口。HTTPS/SSL 没有配置开箱即用,如果没有它,Red Hat Single Sign-On 有许多安全漏洞。最后,Red Hat Single Sign-On 可能需要为外部服务器提供安全 SSL 和 HTTPS 连接,因此需要设置信任存储,以便正确验证端点。本章讨论所有这些因素。

8.1. 绑定地址

默认情况下,Red Hat Single Sign-On 绑定到 localhost 回环地址 127.0.0.1。如果您需要网络中提供的身份验证服务器,则这不是非常实用的默认值。通常,我们建议您在公共网络上部署反向代理或负载均衡器,并将流量路由到私有网络上的单个 Red Hat Single Sign-On 服务器实例。在这两种情况下,您仍需要设置网络接口以绑定到 localhost 以外的其他接口。

设置绑定地址非常简单,可以在命令行中使用 standalone.shdomain.sh boot 脚本(在 Choosing an Operating Mode 章节中讨论) 在命令行中完成。

$ standalone.sh -b 192.168.0.5

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

或者,如果您不想在命令行中设置绑定地址,您可以编辑部署的配置集配置。打开 profile 配置文件(standalone.xmldomain.xml,具体取决于您的 操作模式),并查找 接口 XML 块。

    <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
        </interface>
        <interface name="public">
            <inet-address value="${jboss.bind.address:127.0.0.1}"/>
        </interface>
    </interfaces>

公共接口 对应于创建可公开提供的套接字的子系统。这些子系统的一个示例是 Web 层,提供 Red Hat Single Sign-On 的身份验证端点。管理界面与 JBoss EAP 的管理层开启的套接字对应。特别是允许使用 jboss-cli.sh 命令行界面和 JBoss EAP Web 控制台的套接字。

在查看 公共接口 时,您会看到它有一个特殊的字符串 ${jboss.bind.address:127.0.0.1}。这个字符串 表示 可以通过设置 Java 系统属性(如:

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

-b 只是此命令的一种简写表示法。因此,您可以直接在配置集配置中更改 bind 地址值,或者在引导时在命令行中更改它。

注意

设置 接口 定义时还有更多选项。有关更多信息,请参阅 JBoss EAP 配置指南中的 网络接口

8.2. 套接字端口绑定

为每个套接字打开的端口有一个预定义默认值,可在命令行中或配置内被覆盖。为了说明此配置,我们预先 以独立模式运行,并打开 …​/standalone/configuration/standalone.xml。搜索 socket-binding-group

    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
        <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
        <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
        <socket-binding name="http" port="${jboss.http.port:8080}"/>
        <socket-binding name="https" port="${jboss.https.port:8443}"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <outbound-socket-binding name="mail-smtp">
            <remote-destination host="localhost" port="25"/>
        </outbound-socket-binding>
    </socket-binding-group>

socket-bindings 定义服务器将打开的套接字连接。这些绑定指定它们使用 的接口 (绑定地址)以及它们将打开的端口号。您最感兴趣的内容包括:

http
定义用于 Red Hat Single Sign-On HTTP 连接的端口
https
定义用于 Red Hat Single Sign-On HTTPS 连接的端口
ajp
此套接字绑定定义用于 AJP 协议的端口。当您将 Apache HTTPD 用作负载均衡器时,Apache HTTPD 服务器将这个协议与 mod-cluster 结合使用。
management-http
定义 JBoss EAP CLI 和 Web 控制台使用的 HTTP 连接。

当在 模式下运行时,套接字配置会稍微复杂,因为示例 domain.xml 文件定义了多个 socket-binding-groups。如果向下滚动到 server-group 定义,您可以看到每个 server-group 使用什么 socket-binding-group

域套接字绑定

    <server-groups>
        <server-group name="load-balancer-group" profile="load-balancer">
            ...
            <socket-binding-group ref="load-balancer-sockets"/>
        </server-group>
        <server-group name="auth-server-group" profile="auth-server-clustered">
            ...
            <socket-binding-group ref="ha-sockets"/>
        </server-group>
    </server-groups>

注意

设置 socket-binding-group 定义时还有更多选项。有关更多信息,请参阅 JBoss EAP 配置指南中的 套接字绑定组

8.3. 设置 HTTPS/SSL

警告

默认情况下,Red Hat Single Sign-On 没有设置来处理 SSL/HTTPS。强烈建议您在红帽单点登录服务器本身或在 Red Hat Single Sign-On 服务器前启用 SSL。

这个默认行为由每个 Red Hat Single Sign-On 域的 SSL/HTTPS 模式定义。《 服务器管理指南》 中会对此进行更为详细的探讨,但让我们给出一些上下文并简要概述这些模式。

外部请求
Red Hat Single Sign-On 可以在没有 SSL 的情况下开箱即用,只要您坚持使用 localhost127.0.0.110.x.x.x、192.x.x 和 172.16.x.x 等私有 IP 地址。如果您没有在服务器上配置的 SSL/HTTPS,或者尝试从非专用 IP 地址通过 HTTP 访问 Red Hat Single Sign-On,则会出现错误。
none
红帽单点登录不需要 SSL。只有在您关注的事情时,这才应该真正在开发中使用。
所有请求
红帽单点登录需要所有 IP 地址的 SSL。

在 Red Hat Single Sign-On 管理控制台中配置每个域的 SSL 模式。

8.3.1. 为 Red Hat Single Sign-On 服务器启用 SSL/HTTPS

如果您不使用反向代理或负载均衡器来处理 HTTPS 流量,则需要为 Red Hat Single Sign-On 服务器启用 HTTPS。这涉及

  1. 获取或生成包含 SSL/HTTP 流量的私钥和证书的密钥存储
  2. 配置红帽单点登录服务器以使用此密钥对和证书。

8.3.1.1. 创建证书和 Java 密钥存储

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

8.3.1.1.1. 自签名证书

在开发过程中,您可能没有可用的第三方签名证书来测试红帽单点登录部署,因此您将需要使用 Java JDK 附带的 keytool 程序生成自签名证书。

$ keytool -genkey -alias localhost -keyalg RSA -keystore keycloak.jks -validity 10950
    Enter keystore password: secret
    Re-enter new password: secret
    What is your first and last name?
    [Unknown]:  localhost
    What is the name of your organizational unit?
    [Unknown]:  Keycloak
    What is the name of your organization?
    [Unknown]:  Red Hat
    What is the name of your City or Locality?
    [Unknown]:  Westford
    What is the name of your State or Province?
    [Unknown]:  MA
    What is the two-letter country code for this unit?
    [Unknown]:  US
    Is CN=localhost, OU=Keycloak, O=Test, L=Westford, ST=MA, C=US correct?
    [no]:  yes

当您看到 问题是您的名字和姓氏 时,请提供您安装该服务器的机器的 DNS 名称。出于测试目的,应使用 localhost。执行此命令后,keycloak.jks 文件将与您执行 keytool 命令的同一目录中生成。

如果您希望第三方签名证书,但没有有一个证书,您可以获得位于 cacert.org 的免费证书。但是,您首先需要使用以下步骤。

流程

  1. 生成证书请求:

    $ keytool -certreq -alias yourdomain -keystore keycloak.jks > keycloak.careq

    其中 您的域 是生成此证书的 DNS 名称。keytool 生成请求:

    -----BEGIN NEW CERTIFICATE REQUEST-----
    MIIC2jCCAcICAQAwZTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAk1BMREwDwYDVQQHEwhXZXN0Zm9y
    ZDEQMA4GA1UEChMHUmVkIEhhdDEQMA4GA1UECxMHUmVkIEhhdDESMBAGA1UEAxMJbG9jYWxob3N0
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr7kck2TaavlEOGbcpi9c0rncY4HhdzmY
    Ax2nZfq1eZEaIPqI5aTxwQZzzLDK9qbeAd8Ji79HzSqnRDxNYaZu7mAYhFKHgixsolE3o5Yfzbw1
    29RvyeUVe+WZxv5oo9wolVVpdSINIMEL2LaFhtX/c1dqiqYVpfnvFshZQaIg2nL8juzZcBjj4as
    H98gIS7khql/dkZKsw9NLvyxgJvp7PaXurX29fNf3ihG+oFrL22oFyV54BWWxXCKU/GPn61EGZGw
    Ft2qSIGLdctpMD1aJR2bcnlhEjZKDksjQZoQ5YMXaAGkcYkG6QkgrocDE2YXDbi7GIdf9MegVJ35
    2DQMpwIDAQABoDAwLgYJKoZIhvcNAQkOMSEwHzAdBgNVHQ4EFgQUQwlZJBA+fjiDdiVzaO9vrE/i
    n2swDQYJKoZIhvcNAQELBQADggEBAC5FRvMkhal3q86tHPBYWBuTtmcSjs4qUm6V6f63frhveWHf
    PzRrI1xH272XUIeBk0gtzWo0nNZnf0mMCtUBbHhhDcG82xolikfqibZijoQZCiGiedVjHJFtniDQ
    9bMDUOXEMQ7gHZg5q6mJfNG9MbMpQaUVEEFvfGEQQxbiFK7hRWU8S23/d80e8nExgQxdJWJ6vd0X
    MzzFK6j4Dj55bJVuM7GFmfdNC52pNOD5vYe47Aqh8oajHX9XTycVtPXl45rrWAH33ftbrS8SrZ2S
    vqIFQeuLL3BaHwpl3t7j2lMWcK1p80laAxEASib/fAwrRHpLHBXRcq6uALUOZl4Alt8=
    -----END NEW CERTIFICATE REQUEST-----
  2. 将此 CA 请求发送到您的证书颁发机构(CA)。

    CA 将为您签发签名证书并将其发送给您。

  3. 获取并导入 CA 的 root 证书。

    您可以从 CA 下载证书(换句话说:root.crt)并导入如下:

    $ keytool -import -keystore keycloak.jks -file root.crt -alias root
  4. 将您的新 CA 生成的证书导入到您的密钥存储中:

    $ keytool -import -alias yourdomain -keystore keycloak.jks -file your-certificate.cer

8.3.1.2. 配置 Red Hat Single Sign-On 以使用 Keystore

现在,您已具有适当证书的 Java 密钥存储,您需要配置 Red Hat Single Sign-On 安装才能使用它。

流程

  1. 编辑 standalone.xmlstandalone-ha.xmlhost.xml 文件,以使用密钥存储并启用 HTTPS。
  2. 将密钥存储文件移到部署的 配置/ 目录中,或者您选择的位置或提供该文件的绝对路径。

    如果您使用绝对路径,请从您的配置中删除可选的 relative-to 参数(See 操作模式)。

  3. 使用 CLI 添加新的 security-realm 元素:

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

    如果使用域模式,应在每个主机中使用 /host=<host_name>/ 前缀执行命令(在所有主机中都创建 security-realm )。下面是一个示例,您可以为每个主机重复:

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

    在独立或主机配置文件中,security-realms 元素应类似如下:

    <security-realm name="UndertowRealm">
        <server-identities>
            <ssl>
                <keystore path="keycloak.jks" relative-to="jboss.server.config.dir" keystore-password="secret" />
            </ssl>
        </server-identities>
    </security-realm>
  4. 在独立或每个域配置文件中,搜索任何 安全域 实例。
  5. 修改 https-listener 以使用创建的域:

    $ /subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=security-realm, value=UndertowRealm)

    如果使用域模式,为命令添加与以下内容一起使用的配置集: /profile=<profile_name>/

    生成的元素 server name="default-server" 是指 subsystem xmlns="urn:jboss:domain:undertow:12.0" 的子元素,它应包含以下小节:

    <subsystem xmlns="urn:jboss:domain:undertow:12.0">
       <buffer-cache name="default"/>
       <server name="default-server">
          <https-listener name="https" socket-binding="https" security-realm="UndertowRealm"/>
       ...
    </subsystem>

8.4. 传出 HTTP 请求

Red Hat Single Sign-On 服务器通常需要向它安全的应用程序和服务发出非浏览器 HTTP 请求。auth 服务器通过维护 HTTP 客户端连接池来管理这些传出连接。您需要在 standalone.xmlstandalone-ha.xmldomain.xml 中进行配置。此文件的位置取决于您的 操作模式

HTTP 客户端配置示例

<spi name="connectionsHttpClient">
    <provider name="default" enabled="true">
        <properties>
            <property name="connection-pool-size" value="256"/>
        </properties>
    </provider>
</spi>

可能的配置选项有:

establish-connection-timeout-millis
建立套接字连接的超时时间。
socket-timeout-millis
如果传出请求没有收到数据时,请超时连接。
connection-pool-size
池中可以有多少个连接(默认为128)。
max-pooled-per-route
每个主机可池连接数量(默认为 64)。
connection-ttl-millis
以毫秒为单位进行的最大连接时间。默认情况下不设置。
max-connection-idle-time-millis
连接在连接池中可能保持闲置的最大时间(默认为900 秒)。将启动 Apache HTTP 客户端的后台清理线程。设置为 -1 可禁用此检查和后台线程。
disable-cookies
默认情况下为 true。当设置为 true 时,这将禁用任何 Cookie 缓存。
client-keystore
这是 Java 密钥存储文件的文件路径。此密钥存储包含双向 SSL 的客户端证书。
client-keystore-password
客户端密钥存储的密码。如果设置了 client-keystore,则这是 REQUIRED
client-key-password
客户端密钥的密码。如果设置了 client-keystore,则这是 REQUIRED
proxy-mappings
表示传出 HTTP 请求的代理配置。如需了解更多详细信息,请参阅有关 Proxy Mappings for Outgoing HTTP Requests 部分。
disable-trust-manager
如果传出请求需要 HTTPS,且这个配置选项被设置为 true,则不必指定信任存储。此设置仅应在开发期间使用,且不应 在生产环境中使用,因为它将禁用 SSL 证书的验证。这是 选项。默认值为 false

8.4.1. 传出 HTTP 请求的代理映射

Red Hat Single Sign-On 发送的传出 HTTP 请求可以选择使用基于以逗号分隔的代理映射列表的代理服务器。proxy-mapping 表示基于 regex 的 hostname 模式和 proxy-uri 的结合,格式为 hostnamePattern;proxyUri,例如:

.*\.(google|googleapis)\.com;http://www-proxy.acme.com:8080

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

如果代理服务器需要身份验证,请包含代理用户的凭据,格式为 username:password@。例如:

.*\.(google|googleapis)\.com;http://user01:pas2w0rd@www-proxy.acme.com:8080

proxy-uri 的特殊值 NO_PROXY 来表示不应用于匹配关联主机名模式的主机。可以在 proxy-mappings 的末尾指定一个概括性模式,为所有传出请求定义默认代理。

以下示例演示了 proxy-mapping 配置。

# All requests to Google APIs should use http://www-proxy.acme.com:8080 as proxy
.*\.(google|googleapis)\.com;http://www-proxy.acme.com:8080

# All requests to internal systems should use no proxy
.*\.acme\.com;NO_PROXY

# All other requests should use http://fallback:8080 as proxy
.*;http://fallback:8080

这可以通过以下 jboss-cli 命令进行配置。请注意,您需要正确转义 regex-pattern,如下所示。

echo SETUP: Configure proxy routes for HttpClient SPI

# In case there is no connectionsHttpClient definition yet
/subsystem=keycloak-server/spi=connectionsHttpClient/provider=default:add(enabled=true)

# Configure the proxy-mappings
/subsystem=keycloak-server/spi=connectionsHttpClient/provider=default:write-attribute(name=properties.proxy-mappings,value=[".*\\.(google|googleapis)\\.com;http://www-proxy.acme.com:8080",".*\\.acme\\.com;NO_PROXY",".*;http://fallback:8080"])

jboss-cli 命令产生以下子系统配置:请注意,一个需要用 " 字符编码为" 字符

<spi name="connectionsHttpClient">
    <provider name="default" enabled="true">
        <properties>
            <property
            name="proxy-mappings"
            value="[&quot;.*\\.(google|googleapis)\\.com;http://www-proxy.acme.com:8080&quot;,&quot;.*\\.acme\\.com;NO_PROXY&quot;,&quot;.*;http://fallback:8080&quot;]"/>
        </properties>
    </provider>
</spi>

8.4.2. 使用标准环境变量

另外,也可以使用标准环境变量来配置代理映射,即 HTTP_PROXYHTTPS_PROXYNO_PROXY 变量。

HTTP_PROXYHTTPS_PROXY 变量代表所有传出 HTTP 请求的代理服务器。红帽单点登录在两者之间没有不同。如果同时指定了这两者,则 HTTPS_PROXY 会优先考虑代理服务器使用的实际方案。

NO_PROXY 变量用于定义不应使用代理的主机名的逗号分隔列表。如果指定了主机名,则所有前缀(子域)也会在使用代理中排除。

获取以下示例:

HTTPS_PROXY=https://www-proxy.acme.com:8080
NO_PROXY=google.com,login.facebook.com

在本例中,所有传出的 HTTP 请求都将使用 https://www-proxy.acme.com:8080 代理服务器,但请求发送到示例 login.google.com,google.com,auth.login.facebook.com。但是,例如 groups.facebook.com 将通过代理进行路由。

注意

环境变量可以是小写或大写。小写优先级.例如,如果同时定义了 HTTP_PROXYhttp_proxy,则将使用 http_proxy

如果使用子系统配置(如上所述)定义代理映射,则 Red Hat Sign-On 不会考虑环境变量。在这种情况下,应该不使用代理服务器,尽管定义了 HTTP_PROXY 环境变量。要做到这一点,您可以指定一个通用没有代理路由,如下所示:

<spi name="connectionsHttpClient">
    <provider name="default" enabled="true">
        <properties>
            <property name="proxy-mappings" value=".*;NO_PROXY"/>
        </properties>
    </provider>
</spi>

8.4.3. 传出 HTTPS 请求信任存储

当 Red Hat Single Sign-On 在远程 HTTPS 端点上调用时,它必须验证远程服务器的证书以确保其连接到可信服务器。这是为了防止中间人攻击所必需的。这些远程服务器或者签名的 CA 的证书必须放在信任存储中。此信任存储由 Red Hat Single Sign-On 服务器管理。

当安全地连接到身份代理、LDAP 身份提供程序、发送电子邮件时以及与客户端应用程序后端通信时,会使用 truststore。

警告

默认情况下,不会配置信任存储提供程序,任何 https 连接都回退到标准的 java 信任存储配置,如 Java 的 JSSE 参考指南 中所述。如果没有建立信任,则这些传出 HTTPS 请求将失败。

您可以使用 keytool 创建新的信任存储文件,或将现有可信主机证书中添加可信主机证书:

$ keytool -import -alias HOSTDOMAIN -keystore truststore.jks -file host-certificate.cer

信任存储在分发的 standalone.xmlstandalone-ha.xmldomain.xml 文件中进行配置。此文件的位置取决于您的 操作模式。您可以使用以下模板添加信任存储配置:

<spi name="truststore">
    <provider name="file" enabled="true">
        <properties>
            <property name="file" value="path to your .jks file containing public certificates"/>
            <property name="password" value="password"/>
            <property name="hostname-verification-policy" value="WILDCARD"/>
            <property name="enabled" value="true"/>
        </properties>
    </provider>
</spi>

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

file
Java 密钥存储文件的路径。HTTPS 请求需要一种方式来验证所讨论的服务器主机。这是信任者的作用。密钥存储包含一个或多个可信主机证书或证书颁发机构。此信任存储文件应该只包含安全主机的公共证书。如果启用,这是 REQUIRED
password
truststore 的密码。如果启用,这是 REQUIRED
hostname-verification-policy
默认 WILDCARD。对于 HTTPS 请求,这会验证服务器证书的主机名。ANY 表示主机名不会被验证。WILDCARD 允许子域名(如 *.foo.com)中的通配符。STRICT CN 必须完全匹配主机名。
enabled
如果为 false (默认值),则信任存储配置将被忽略,证书检查将回退到 JSSE 配置,如所述。如果设置为 true,您必须为信任存储 配置文件、和 密码

第 9 章 配置 Red Hat Single Sign-On 以在集群中运行

要将 Red Hat Single Sign-On 配置为在集群中运行,您需要执行以下操作:

本指南前面介绍了选择操作模式和配置共享数据库。本章论述了设置负载均衡器并提供专用网络,以及引导集群中的主机。

注意

集群可使用没有 IP 多播的 Red Hat Single Sign-On,但本主题已超出本指南的范围。有关更多信息,请参阅 JBoss EAP 配置指南中的 JGroups 章节。

9.2. 集群示例

Red Hat Single Sign-On 还附带利用域模式的开箱即用的集群演示。详情请查看集群域示例 章节。

9.3. 设置负载均衡器或代理

本节讨论在集群的 Red Hat Single Sign-On 部署前面放置反向代理或负载均衡器前需要配置的多个内容。它还涵盖配置群集 域示例 的内置负载均衡器。

下图演示了负载平衡器的使用。在本例中,负载均衡器充当三个红帽单点登录服务器集群之间的反向代理。

Load Balancer 图表示例

load balancer

9.3.1. 识别客户端 IP 地址

Red Hat Single Sign-On 中的一些功能取决于连接身份验证服务器的 HTTP 客户端的远程地址是客户端计算机的实际 IP 地址。示例包括:

  • 事件日志 - 失败的登录尝试会记录错误的源 IP 地址
  • 需要 SSL - 如果需要 SSL (默认),它应该为所有外部请求使用 SSL
  • 身份验证流 - 使用 IP 地址进行自定义身份验证流,例如,只显示 OTP 用于外部请求
  • 动态客户端注册

如果您在 Red Hat Single Sign-On 身份验证服务器前有反向代理或负载均衡器,这可能会出现问题。常见的设置是,您有一个前端代理位于公共网络上,它会对请求进行负载平衡并将请求转发给位于专用网络中的 Red Hat Single Sign-On 服务器实例。在这种情况下,您需要执行一些额外的配置,以便实际的客户端 IP 地址被转发到红帽单点登录服务器实例并处理。具体来说:

  • 配置反向代理或负载均衡器,以正确设置 X-Forwarded-ForX-Forwarded-Proto HTTP 标头。
  • 配置反向代理或负载均衡器,以保留原始 'Host' HTTP 标头。
  • 配置身份验证服务器以从 X-Forwarded-For 标头读取客户端的 IP 地址。

配置代理来生成 X-Forwarded-ForX-Forwarded-Proto HTTP 标头并保留原始主机 HTTP 标头已超出本指南的范围。采取额外的预防措施,以确保代理设置了 X-Forwarded-For 标头。如果您的代理没有正确配置,则 恶意 客户端可以自己设置此标头,并提示红帽单点登录考虑客户端正在从不同 IP 地址进行连接,而不是实际情况。如果您正在执行任何黑色或白色 IP 地址列表,这非常重要。

除了代理本身外,您还需要在 Red Hat Single Sign-On of things 配置一些。如果您的代理通过 HTTP 协议转发请求,您需要配置 Red Hat Single Sign-On,以便从 X-Forwarded-For 标头(而不是从网络数据包)拉取客户端的 IP 地址。为此,请打开配置文件配置文件(standalone.xmlstandalone-ha.xmldomain.xml,具体取决于您的 操作模式),并查找 urn:jboss:domain:undertow:12.0 XML 块。

x-Forwarded-For HTTP 配置

<subsystem xmlns="urn:jboss:domain:undertow:12.0">
   <buffer-cache name="default"/>
   <server name="default-server">
      <ajp-listener name="ajp" socket-binding="ajp"/>
      <http-listener name="default" socket-binding="http" redirect-socket="https"
          proxy-address-forwarding="true"/>
      ...
   </server>
   ...
</subsystem>

proxy-address-forwarding 属性添加到 http-listener 元素。将值设为 true

如果您的代理正在使用 AJP 协议而不是 HTTP 来转发请求(例如,Apache HTTPD + mod-cluster),那么您必须配置不同的方法。您需要添加一个过滤器从 AJP 数据包拉取此信息,而不是修改 http-listener

x-Forwarded-For AJP 配置

<subsystem xmlns="urn:jboss:domain:undertow:12.0">
     <buffer-cache name="default"/>
     <server name="default-server">
         <ajp-listener name="ajp" socket-binding="ajp"/>
         <http-listener name="default" socket-binding="http" redirect-socket="https"/>
         <host name="default-host" alias="localhost">
             ...
             <filter-ref name="proxy-peer"/>
         </host>
     </server>
        ...
     <filters>
         ...
         <filter name="proxy-peer"
                 class-name="io.undertow.server.handlers.ProxyPeerAddressHandler"
                 module="io.undertow.core" />
     </filters>
 </subsystem>

9.3.2. 使用反向代理启用 HTTPS/SSL

假设您的反向代理不会将端口 8443 用于 SSL,那么您还需要将端口配置为重定向 HTTPS 流量的端口。

<subsystem xmlns="urn:jboss:domain:undertow:12.0">
    ...
    <http-listener name="default" socket-binding="http"
        proxy-address-forwarding="true" redirect-socket="proxy-https"/>
    ...
</subsystem>

流程

  1. redirect-socket 属性添加到 http-listener 元素。该值应该是 proxy-https,它指向您也需要定义的套接字绑定。
  2. socket-binding - group 元素中添加新的 socket-binding 元素:

    <socket-binding-group name="standard-sockets" default-interface="public"
        port-offset="${jboss.socket.binding.port-offset:0}">
        ...
        <socket-binding name="proxy-https" port="443"/>
        ...
    </socket-binding-group>

9.3.3. 验证配置

您可以验证反向代理或负载均衡器配置

流程

  1. 通过反向代理打开路径 /auth/realms/master/.well-known/openid-configuration

    例如,如果反向代理地址为 https://acme.com/,则打开 URL https://acme.com/auth/realms/master/.well-known/openid-configuration。这将显示一个 JSON 文档,列出 Red Hat Single Sign-On 的多个端点。

  2. 确保端点以您的反向代理或负载均衡器的地址(提取、域和端口)开头。通过执行此操作,您要确保 Red Hat Single Sign-On 使用正确的端点。
  3. 验证 Red Hat Single Sign-On 是否看到请求的正确源 IP 地址。

    要进行检查,您可以尝试使用无效的用户名和/或密码登录 Admin Console。这应该会在服务器日志中显示类似如下的警告:

    08:14:21,287 WARN  XNIO-1 task-45 [org.keycloak.events] type=LOGIN_ERROR, realmId=master, clientId=security-admin-console, userId=8f20d7ba-4974-4811-a695-242c8fbd1bf8, ipAddress=X.X.X.X, error=invalid_user_credentials, auth_method=openid-connect, auth_type=code, redirect_uri=http://localhost:8080/auth/admin/master/console/?redirect_fragment=%2Frealms%2Fmaster%2Fevents-settings, code_id=a3d48b67-a439-4546-b992-e93311d6493e, username=admin
  4. 检查 ipAddress 的值是您尝试登录的机器的 IP 地址,而不是反向代理或负载均衡器的 IP 地址。

9.3.4. 使用内置负载均衡器

本节介绍配置群集 域示例 中讨论的内置负载均衡器。

集群域示例 仅设计为在一台计算机上运行。要在另一个主机上启动从设备,您需要执行以下操作:

  1. 编辑 domain.xml 文件以指向您的新主机从设备
  2. 复制服务器分发。您不需要 domain.xmlhost.xmlhost-master.xml 文件。您不需要 独立/ 目录。
  3. 编辑 host-slave.xml 文件,以更改所用的绑定地址或在命令行中覆盖它们

流程

  1. 打开 domain.xml,以便您可以使用负载均衡器配置注册新主机从设备。
  2. 转到 load-balancer 配置集中的 undertow 配置。在 reverse-proxy XML 块中添加名为 remote- host 3 的新主机定义。

    domain.xml reverse-proxy config

    <subsystem xmlns="urn:jboss:domain:undertow:12.0">
      ...
      <handlers>
          <reverse-proxy name="lb-handler">
             <host name="host1" outbound-socket-binding="remote-host1" scheme="ajp" path="/" instance-id="myroute1"/>
             <host name="host2" outbound-socket-binding="remote-host2" scheme="ajp" path="/" instance-id="myroute2"/>
             <host name="remote-host3" outbound-socket-binding="remote-host3" scheme="ajp" path="/" instance-id="myroute3"/>
          </reverse-proxy>
      </handlers>
      ...
    </subsystem>

    output-socket-binding 是指向稍后在 domain.xml 文件中配置的 socket-binding 的逻辑名称。instance-id 属性还必须对新主机是唯一的,因为这个值供 Cookie 用于在负载平衡时启用粘性会话。

  3. 向下到 load-balancer-sockets socket-binding-group,再为 remote-host3 添加 outbound-socket-binding

    这个新绑定需要指向新主机的主机和端口。

    domain.xml outbound-socket-binding

    <socket-binding-group name="load-balancer-sockets" default-interface="public">
        ...
        <outbound-socket-binding name="remote-host1">
            <remote-destination host="localhost" port="8159"/>
        </outbound-socket-binding>
        <outbound-socket-binding name="remote-host2">
            <remote-destination host="localhost" port="8259"/>
        </outbound-socket-binding>
        <outbound-socket-binding name="remote-host3">
            <remote-destination host="192.168.0.5" port="8259"/>
        </outbound-socket-binding>
    </socket-binding-group>

9.3.4.1. Master 绑定地址

接下来,您需要做的是更改 master 主机的公共 和管理 绑定地址。按照 Bind Addresses 章节中所述编辑 domain.xml 文件,或者在命令行中指定这些绑定地址,如下所示:

$ domain.sh --host-config=host-master.xml -Djboss.bind.address=192.168.0.2 -Djboss.bind.address.management=192.168.0.2

9.3.4.2. 主机从属绑定地址

接下来,您必须更改 公共管理、域控制器绑定地址(jboss.domain.master-address)。编辑 host-slave.xml 文件或在命令行中指定它们,如下所示:

$ domain.sh --host-config=host-slave.xml
     -Djboss.bind.address=192.168.0.5
      -Djboss.bind.address.management=192.168.0.5
       -Djboss.domain.master.address=192.168.0.2

与主机从设备 IP 地址相关的 jboss.bind.addressjboss.bind.address.management 的值。jboss.domain.master.address 的值需要是域控制器的 IP 地址,这是 master 主机的管理地址。

其他资源

9.4. 粘性会话

典型的集群部署由负载均衡器(代理)以及 2 个或更多专用网络上的 Red Hat Single Sign-On 服务器组成。出于性能目的,如果负载均衡器将与特定浏览器会话相关的所有请求转发到同一红帽单点登录后端节点,则可能会很有用。

其原因在于,Red Hat Single Sign-On 正在使用在覆盖下的 Infinispan 分布式缓存来保存与当前身份验证会话和用户会话相关的数据。Infinispan 分布式缓存默认使用一个所有者进行配置。这意味着特定的会话只保存在一个集群节点中,如果其他节点想要访问会话,则其他节点需要远程查找会话。

例如,如果 ID 为 123 的身份验证会话保存在 node1 上的 Infinispan 缓存中,而 node2 需要通过网络将请求发送到 node1,才能返回特定的会话实体。

如果特定会话实体总是在本地可用,可以使用粘性会话的帮助来完成。集群环境中的工作流带有公共前端负载均衡器,两个后端 Red Hat Single Sign-On 节点都可以如下:

  • 用户发送初始请求以查看 Red Hat Single Sign-On 登录屏幕
  • 此请求由 frontend 负载均衡器提供,它转发到一些随机节点(如 node1)。严格说,节点不需要是随机的,但可以根据其他条件(客户端 IP 地址等)选择。它们都取决于底层负载均衡器(逆向代理)的实施和配置。
  • Red Hat Single Sign-On 使用随机 ID (如 123)创建身份验证会话,并将它保存到 Infinispan 缓存。
  • Infinispan 分布式缓存根据会话 ID 的哈希来分配会话的主所有者。有关此问题的详情,请参阅 Infinispan 文档。假设 Infinispan 分配 node2 为此会话的所有者。
  • Red Hat Single Sign-On 创建了 Cookie AUTH_SESSION_ID,其格式类似于 < session-id>.<owner-node-id>。在我们的示例中,它将是 123.node2
  • 使用 Red Hat Single Sign-On 登录屏幕和浏览器中的 AUTH_SESSION_ID Cookie 返回响应

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

在集群设置中不强制使用粘性会话,但出于上述原因,最好是性能。您需要通过 AUTH_SESSION_ID Cookie 将负载平衡器配置为粘性。它如何取决于您的负载均衡器。

建议在 Red Hat Single Sign-On 一侧使用系统属性 jboss.node.name,其值与路由名称对应。例如,-Djboss.node.name=node1 将使用 node1 来识别路由。此路由将由 Infinispan 缓存使用,并在节点是特定密钥的所有者时附加到 AUTH_SESSION_ID Cookie。以下是使用这个系统属性启动命令的示例:

cd $RHSSO_NODE1
./standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=100 -Djboss.node.name=node1

通常在生产环境中,路由名称应使用与后端主机相同的名称,但这不是必须的。您可以使用不同的路由名称。例如,如果您要隐藏您的专用网络内 Red Hat Single Sign-On 服务器的主机名。

9.4.1. 禁用添加路由

某些负载均衡器可以配置为自行添加路由信息,而不依赖于后端 Red Hat Sign-On 节点。但是,如上文所述,建议添加 Red Hat Single Sign-On 路由。这是因为,在这种提升性能时,Red Hat Single Sign-On 知道属于特定会话的实体,并可路由到该节点,这不一定是本地节点。

如果您愿意,可以在 Red Hat Single Sign-On 子系统配置中的 RHSSO_HOME/standalone/configuration/standalone-ha.xml 文件中禁用路由信息到 AUTH_SESSION_ID cookie:

<subsystem xmlns="urn:jboss:domain:keycloak-server:1.1">
  ...
    <spi name="stickySessionEncoder">
        <provider name="infinispan" enabled="true">
            <properties>
                <property name="shouldAttachRoute" value="false"/>
            </properties>
        </provider>
    </spi>

</subsystem>

9.5. 设置多播网络

默认集群支持需要 IP 多播。多播是网络广播协议。此协议在引导时用于发现和加入集群。它还用于广播用于复制消息,并使用 Red Hat Single Sign-On 使用的分布式缓存无效。

Red Hat Single Sign-On 的 cluster 子系统在 JGroups 堆栈上运行。开箱即用,集群的绑定地址绑定到专用网络接口,而 127.0.0.1 作为默认 IP 地址。

流程

  1. 编辑 Bind Address 章节中讨论的 standalone-ha.xmldomain.xml 部分。

    私有网络配置

        <interfaces>
            ...
            <interface name="private">
                <inet-address value="${jboss.bind.address.private:127.0.0.1}"/>
            </interface>
        </interfaces>
        <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
            ...
            <socket-binding name="jgroups-mping" interface="private" port="0" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45700"/>
            <socket-binding name="jgroups-tcp" interface="private" port="7600"/>
            <socket-binding name="jgroups-tcp-fd" interface="private" port="57600"/>
            <socket-binding name="jgroups-udp" interface="private" port="55200" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45688"/>
            <socket-binding name="jgroups-udp-fd" interface="private" port="54200"/>
            <socket-binding name="modcluster" port="0" multicast-address="224.0.1.105" multicast-port="23364"/>
            ...
        </socket-binding-group>

  2. 配置 jboss.bind.address.privatejboss.default.multicast.address,以及集群堆栈上服务的端口。

    注意

    集群可使用没有 IP 多播的 Red Hat Single Sign-On,但本主题已超出本指南的范围。有关更多信息,请参阅 JBoss EAP 配置指南中的 JGroups

9.6. 保护集群通信

当集群节点隔离在私有网络中时,它需要访问专用网络才能加入集群或查看集群中的通信。另外,您还可以为集群通信启用身份验证和加密。只要您的专用网络安全,就不需要启用身份验证和加密。在这两种情况下,Red Hat Single Sign-On 不会为集群发送非常敏感信息。

如果要启用集群通信的身份验证和加密,请参阅 JBoss EAP 配置指南中的 保护集群 的安全

9.7. 序列化集群启动

允许 Red Hat Single Sign-On 集群节点同时引导。当 Red Hat Single Sign-On 服务器实例启动时,它可能启动一些数据库迁移、导入或首次初始化。DB 锁定用于防止当集群节点同时引导时相互冲突。

默认情况下,这个锁定的最大超时为 900 秒。如果某个节点正在等待这个锁定,则无法启动失败。通常,您不需要增加/减少默认值,只需在 standalone.xml 中、standalone-ha.xmldomain.xml 文件中进行配置。此文件的位置取决于您的 操作模式

<spi name="dblock">
    <provider name="jpa" enabled="true">
        <properties>
            <property name="lockWaitTimeout" value="900"/>
        </properties>
    </provider>
</spi>

9.8. 引导集群

在集群中引导 Red Hat Single Sign-On 取决于您的 操作模式

独立模式

$ bin/standalone.sh --server-config=standalone-ha.xml

域模式

$ bin/domain.sh --host-config=host-master.xml
$ bin/domain.sh --host-config=host-slave.xml

您可能需要使用其他参数或系统属性。例如,绑定主机或系统属性 jboss.node.name 参数 -b 以指定路由的名称,如 Sticky Sessions 部分所述。

9.9. 故障排除

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

    INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (Incoming-10,shared=udp)
    ISPN000094: Received new cluster view: [node1/keycloak|1] (2) [node1/keycloak, node2/keycloak]

    如果您只看到提到的节点,集群主机可能不会被一起加入。

    通常,最好在没有防火墙的情况下,在私有网络中具有集群节点进行通信。只能在公共访问点上启用防火墙到您的网络。如果出于某种原因,您仍需要在集群节点上启用防火墙,则需要打开一些端口。默认值为 UDP 端口 55200,以及带有多播地址 230.0.0.4 的多播端口 45688。请注意,如果要启用其他功能,如针对 JGroups 堆栈诊断等其他功能,则您可能需要打开更多端口。红帽单点登录将大多数集群工作委托给 Infinispan/JGroups。有关更多信息,请参阅 JBoss EAP 配置指南中的 JGroups

  • 如果您有兴趣进行故障切换支持(高可用性)、驱除、过期和缓存调整,请参阅 第 10 章 服务器缓存配置

第 10 章 服务器缓存配置

红帽单点登录有两种缓存类型。一个类型的缓存位于数据库的前面,以减少 DB 的负载,并通过在内存中保留数据来降低总体响应时间。域、客户端、角色和用户元数据保存在这种类型的缓存中。这个缓存是本地缓存。即使您位于带有更多 Red Hat Single Sign-On 服务器的集群中,本地缓存也不会使用复制。相反,它们只会在本地保留副本,且该条目被更新到集群的其余部分中,且条目会被驱除。存在单独的复制缓存 工作,该任务将不validation消息发送到整个集群,有关应该从本地缓存驱除哪些条目。这可大大减少网络流量,使事情变得高效,并避免在线路上传输敏感元数据。

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

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

注意

这些缓存的更高级配置可在 JBoss EAP 配置指南Infinispan 部分找到。

10.1. 驱除和过期

为 Red Hat Single Sign-On 配置多个不同的缓存。有一个包含安全应用程序、常规安全数据和配置选项信息的 realm 缓存。还有一个包含用户元数据的用户缓存。这两个缓存都默认为 10000 条目,并使用最近一次使用的驱除策略。它们各自绑定到控制集群设置中驱除的对象修订缓存。这个缓存会被隐式创建,有两倍配置的大小。同样适用于 授权 缓存,它保存授权数据。密钥 缓存保存了有关外部密钥的数据,不需要具有专用修订缓存。它并没有明确声明了 过期时间,因此密钥会被定期过期并强制从外部客户端或身份提供程序下载。

这些缓存的驱除策略和最大条目可以在 standalone. xml、standalone -ha.xmldomain.xml 中配置,具体取决于您的 操作模式。在配置文件中,使用 infinispan 子系统有部分,它类似于:

<subsystem xmlns="urn:jboss:domain:infinispan:12.0">
    <cache-container name="keycloak">
        <local-cache name="realms">
            <object-memory size="10000"/>
        </local-cache>
        <local-cache name="users">
            <object-memory size="10000"/>
        </local-cache>
        ...
        <local-cache name="keys">
            <object-memory size="1000"/>
            <expiration max-idle="3600000"/>
        </local-cache>
        ...
    </cache-container>

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

此外,还有单独的缓存 会话clientSessions离线 会话、offClientSessionsloginFailuresactionTokens。这些缓存在集群环境中分发,它们默认不会绑定。如果他们有界线,那么某些会话可能会丢失。过期的会话由 Red Hat Single Sign-On 本身内部清除,以避免在不限制的情况下增大这些缓存的大小。如果因为大量会话造成内存问题,您可以尝试:

  • 增加集群大小(集群中更多节点意味着会在节点间平均分配会话)
  • 为 Red Hat Single Sign-On 服务器进程增加内存
  • 减少所有者数量,以确保缓存在一个位置保存。详情请查看 第 10.2 节 “复制和故障切换”
  • 为分布式缓存禁用 l1-lifespan。如需了解更多详细信息,请参阅 Infinispan 文档
  • 减少会话超时,该功能可单独为 Red Hat Single Sign-On 管理控制台中的每个域执行。但这可能会影响最终用户的可用性。如需了解更多详细信息 ,请参阅 超时

还有额外的复制缓存 工作,它最常用于在集群节点间发送消息;默认情况下也未绑定。但是,由于此缓存中条目非常短,所以这个缓存不应造成任何内存问题。

10.2. 复制和故障切换

有一些缓存,如 会话authenticationSessionsofflineSessionslogin Failure 和一些其他一些(更多详情请参阅 第 10.1 节 “驱除和过期” ),在使用集群设置时将它们配置为分布式缓存。条目不会复制到每个节点,而是选择一个或多个节点作为该数据的所有者。如果节点不是一个特定的缓存条目的所有者,它会查询集群来获取它。这意味着,如果所有拥有数据片段的节点都停机,则数据将永久丢失。默认情况下,Red Hat Single Sign-On 只为数据指定一个所有者。因此,如果一个节点停机,数据就会丢失。这通常意味着用户将被注销,并且必须重新登录。

您可以通过更改 distributed-cache 声明中的 owners 属性来更改复制数据的节点数量。

owners

<subsystem xmlns="urn:jboss:domain:infinispan:12.0">
   <cache-container name="keycloak">
       <distributed-cache name="sessions" owners="2"/>
...

在这里,我们更改了它,至少两个节点将复制一个特定用户的登录会话。

提示

推荐的所有者数量确实取决于您的部署。如果您不小心,如果用户在节点停机时注销,则一个所有者就足够了,并且您将避免复制。

提示

通常,将您的环境配置为使用带有粘性会话的负载均衡器。作为 Red Hat Single Sign-On 服务器的性能,Red Hat Single Sign-On 服务器会提供特定的请求,通常是来自分布式缓存中的数据的所有者,因此可以在本地查找数据。详情请查看 第 9.4 节 “粘性会话”

10.3. 禁用缓存

您可以禁用域或用户缓存。

流程

  1. 编辑分发中的 standalone.xmlstandalone-ha.xmldomain.xml 文件。

    此文件的位置取决于您的 操作模式。下面是一个示例配置文件。

        <spi name="userCache">
            <provider name="default" enabled="true"/>
        </spi>
    
        <spi name="realmCache">
            <provider name="default" enabled="true"/>
        </spi>
  2. 为您要禁用的缓存将 enabled 属性设置为 false。
  3. 重启服务器以使此更改生效。

10.4. 在运行时清除缓存

您可以清除域缓存、用户缓存或外部公钥。

流程

  1. 登录 Admin 控制台。
  2. 单击 Realm Settings
  3. Cache 选项卡。
  4. 清除域缓存、用户缓存或外部公钥的缓存。
注意

将对所有域清除缓存!

第 11 章 Red Hat Single Sign-On Operator

Red Hat Single Sign-On Operator 会在 Openshift 中自动进行 Red Hat Single Sign-On 管理。您可以使用此 Operator 创建自定义资源(CR)来自动执行管理任务。例如,您可以创建自定义资源来执行这些任务,而不在 Red Hat Single Sign-On admin 控制台中创建客户端或用户。自定义资源是一个 YAML 文件,用于定义管理任务的参数。

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

注意

为域、客户端和用户创建自定义资源后,您可以使用 Red Hat Sign-On admin 控制台或使用 oc 命令来管理这些资源。但是,您无法使用这两种方法,因为 Operator 会为您修改的自定义资源执行一种同步。例如,如果您修改 realm 自定义资源,则更改会显示在 admin 控制台中。但是,如果您使用 admin 控制台修改域,则这些更改对自定义资源没有影响。

通过在集群中安装 Red Hat Single Sign-On Operator 开始使用 Operator

11.1. 在集群上安装 Red Hat Single Sign-On Operator

要安装 Red Hat Single Sign-On Operator,您可以使用:

11.1.1. 使用 Operator Lifecycle Manager 安装

前提条件

  • 您有 cluster-admin 权限,或具有管理员授予的同等权限级别。

流程

在 OpenShift 集群上执行此步骤。

  1. 打开 OpenShift Container Platform Web 控制台。
  2. 在左侧列中,点 Operators、OperatorHub
  3. 搜索 Red Hat Single Sign-On Operator。

    OpenShift 中的 OperatorHub 标签页

    operator openshift operatorhub

  4. 点 Red Hat Single Sign-On Operator 图标。

    此时会打开 Install 页面。

    OpenShift 上的 Operator Install 页面

    operator olm installation

  5. Install
  6. 选择一个命名空间并点 Subscribe。

    OpenShift 中的命名空间选择

    installed namespace

    Operator 开始安装。

其他资源

11.2. 与不同 RH-SSO 版本兼容的 Operator

RH-SSO Operator 7.6 与 RH-SSO 7.5 完全兼容。7.6 Operator 默认部署 RH-SSO 7.6。要使用 RH-SSO 7.5 镜像,请通过设置 Operator pod 中的 RELATED_IMAGE_RHSSO 环境变量来覆盖镜像协调。要进行该更改,为 OpenShift 集群中的 RH-SSO Operator 更新 OLM 订阅,例如:

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
spec:
  channel: stable
  config:
    env:
      - name: RELATED_IMAGE_RHSSO
        value: 'registry.redhat.io/rh-sso-7/sso75-openshift-rhel8:7.5'
  name: rhsso-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  ...

完全支持在 RH-SSO 7.5 中使用 RH-SSO Operator 7.6。

其他资源

11.3. 在生产环境中使用 Red Hat Single Sign-On Operator

  • 在生产环境中不支持使用嵌入式 DB。
  • 备份 CRD 已被弃用,生产环境中不受支持。
  • 尽管 v1alpha1 版本,我们完全支持在生产环境中使用 CRD。我们不计划在这个 CRD 版本中进行任何更改。

11.4. 使用自定义资源安装 Red Hat Single Sign-On

您可以通过创建 Keycloak 自定义资源,使用 Operator 自动安装 Red Hat Single Sign-On。当您使用自定义资源安装 Red Hat Single Sign-On 时,您可以创建此处描述的组件和服务,并在下图所示。

  • Keycloak-db-secret - 存储数据库用户名、密码和外部地址(如果您连接到外部数据库)
  • 凭证-<CR-Name > - 要登录到 Red Hat Single Sign-On 管理控制台(< CR-Name&gt; 基于 Keycloak 自定义资源名称)的管理员用户名和密码。
  • Keycloak - Keycloak 部署规格作为具有高可用性支持的 StatefulSet 实现
  • Keycloak-postgresql - 启动 PostgreSQL 数据库安装
  • Keycloak-discovery Service - 执行 JDBC_PING 发现
  • Keycloak Service - 通过 HTTPS 连接到 Red Hat Single Sign-On (不支持 HTTP)
  • Keycloak-postgresql Service - 连接一个内部和外部(如果使用)数据库实例
  • Keycloak Route - 从 OpenShift 访问 Red Hat Single Sign-On 管理控制台的 URL

Operator 组件和服务如何交互

operator components

11.4.1. Keycloak 自定义资源

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

  • 实例 - 控制在高可用性模式下运行的实例数量。
  • externalAccess - 如果启用True,Operator 会为 Red Hat Single Sign-On 集群创建一个路由。
  • externalDatabase - 以连接到外部托管的数据库。该主题包括在本指南的 外部数据库 部分。把它设置为 false 应该仅用于测试目的,并安装嵌入式 PostgreSQL 数据库。请注意,生产环境中不支持 externalDatabase:false。

Keycloak 自定义资源的 YAML 文件示例

apiVersion: keycloak.org/v1alpha1
kind: Keycloak
metadata:
  name: example-sso
  labels:
    app: sso
spec:
  instances: 1
  externalAccess:
    enabled: True

注意

您可以更新 YAML 文件,并在 Red Hat Single Sign-On 管理控制台中显示更改,但更改管理控制台不会更新自定义资源。

11.4.2. 在 OpenShift 中创建 Keycloak 自定义资源

在 OpenShift 中,您可以使用自定义资源创建路由,这是 admin 控制台的 URL,再找到含有管理控制台的用户名和密码的 secret。

前提条件

  • 有用于此自定义资源的 YAML 文件。
  • 您有 cluster-admin 权限,或具有管理员授予的同等权限级别。

流程

  1. 使用 YAML 文件创建路由: oc create -f <filename>.yaml -n <namespace>。例如:

    $ oc create -f sso.yaml -n sso
    keycloak.keycloak.org/example-sso created

    在 OpenShift 中创建路由。

  2. 登录 OpenShift Web 控制台。
  3. 选择 Networking 、Route 和 search for Keycloak。

    OpenShift Web 控制台中的路由页面

    route ocp

  4. 在带有 Keycloak 路由的屏幕上,点 Location 下的 URL。

    此时会出现 Red Hat Single Sign-On 管理控制台登录屏幕。

    管理控制台登录屏幕

    login empty

  5. 在 OpenShift Web 控制台中找到 admin 控制台的用户名和密码;在 Workloads 下,点 Secrets 和 search Keycloak。

    OpenShift Web 控制台中的 secret 屏幕

    secrets ocp

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

    管理控制台登录屏幕

    login complete

    您现在已登录到一个由 Keycloak 自定义资源安装的 Red Hat Single Sign-On 实例。您已准备好为域、客户端和用户创建自定义资源。

    Red Hat Single Sign-On master realm

    new install cr

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

    $ oc describe keycloak <CR-name>

结果

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

$ oc describe keycloak <CR-name>

Keycloak 自定义资源状态

Name:         example-keycloak
Namespace:    keycloak
Labels:       app=sso
Annotations:  <none>
API Version:  keycloak.org/v1alpha1
Kind:         Keycloak
Spec:
  External Access:
    Enabled:  true
  Instances:  1
Status:
  Credential Secret:  credential-example-keycloak
  Internal URL:       https://<External URL to the deployed instance>
  Message:
  Phase:              reconciling
  Ready:              true
  Secondary Resources:
    Deployment:
      keycloak-postgresql
    Persistent Volume Claim:
      keycloak-postgresql-claim
    Prometheus Rule:
      keycloak
    Route:
      keycloak
    Secret:
      credential-example-keycloak
      keycloak-db-secret
    Service:
      keycloak-postgresql
      keycloak
      keycloak-discovery
    Service Monitor:
      keycloak
    Stateful Set:
      keycloak
  Version:
Events:

其他资源

11.5. 创建域自定义资源

您可以使用 Operator 在由自定义资源定义的 Red Hat Single Sign-On 中创建域。您可以在 YAML 文件中定义 realm 自定义资源的属性。

注意

您可以更新 YAML 文件和更改显示在 Red Hat Single Sign-On 管理控制台中,但更改管理控制台不会更新自定义资源。

Realm 自定义资源的 YAML 文件示例

apiVersion: keycloak.org/v1alpha1
kind: KeycloakRealm
metadata:
  name: test
  labels:
    app: sso
spec:
  realm:
    id: "basic"
    realm: "basic"
    enabled: True
    displayName: "Basic Realm"
  instanceSelector:
    matchLabels:
      app: sso

前提条件

  • 有用于此自定义资源的 YAML 文件。
  • 在 YAML 文件中,instanceSelector 下的 app 与 Keycloak 自定义资源的标签匹配。匹配这些值可确保您在 Red Hat Single Sign-On 的右侧实例中创建 realm。
  • 您有 cluster-admin 权限,或具有管理员授予的同等权限级别。

流程

  1. 在您创建的 YAML 文件中运行这个命令: oc create -f <realm-name>.yaml。例如:

    $ oc create -f initial_realm.yaml
    keycloak.keycloak.org/test created
  2. 登录到 Red Hat Single Sign-On 相关实例的 admin 控制台。
  3. 点 Select Realm 找到您创建的域。

    新的域将打开。

    管理控制台 master 域

    test realm cr

结果

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

$ oc describe keycloak <CR-name>

realm 自定义资源状态

Name:         example-keycloakrealm
Namespace:    keycloak
Labels:       app=sso
Annotations:  <none>
API Version:  keycloak.org/v1alpha1
Kind:         KeycloakRealm
Metadata:
  Creation Timestamp:  2019-12-03T09:46:02Z
  Finalizers:
    realm.cleanup
  Generation:        1
  Resource Version:  804596
  Self Link:         /apis/keycloak.org/v1alpha1/namespaces/keycloak/keycloakrealms/example-keycloakrealm
  UID:               b7b2f883-15b1-11ea-91e6-02cb885627a6
Spec:
  Instance Selector:
    Match Labels:
      App: sso
  Realm:
    Display Name:  Basic Realm
    Enabled:       true
    Id:            basic
    Realm:         basic
Status:
  Login URL:
  Message:
  Phase:      reconciling
  Ready:      true
Events:       <none>

其他资源

11.6. 创建客户端自定义资源

您可以使用 Operator 在 Red Hat Single Sign-On 中创建由自定义资源定义的客户端。您可以在 YAML 文件中定义 realm 的属性。

注意

您可以更新 YAML 文件和更改显示在 Red Hat Single Sign-On 管理控制台中,但更改管理控制台不会更新自定义资源。

Client 自定义资源的 YAML 文件示例

apiVersion: keycloak.org/v1alpha1
kind: KeycloakClient
metadata:
  name: example-client
  labels:
    app: sso
spec:
  realmSelector:
     matchLabels:
      app: <matching labels for KeycloakRealm custom resource>
  client:
    # auto-generated if not supplied
    #id: 123
    clientId: client-secret
    secret: client-secret
    # ...
    # other properties of Keycloak Client

前提条件

  • 有用于此自定义资源的 YAML 文件。
  • 您有 cluster-admin 权限,或具有管理员授予的同等权限级别。

流程

  1. 在您创建的 YAML 文件中运行这个命令: oc create -f <client-name>.yaml。例如:

    $ oc create -f initial_client.yaml
    keycloak.keycloak.org/example-client created
  2. 登录到 Red Hat Single Sign-On admin 控制台,以获取 Red Hat Single Sign-On 相关的实例。
  3. 点 Clients。

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

    clients

结果

创建客户端后,Operator 会使用以下命名模式创建一个包含 客户端 ID 和客户端 secret 的 Secret: keycloak-client-secret-<custom 资源名称>。例如:

客户端的机密

apiVersion: v1
data:
  CLIENT_ID: <base64 encoded Client ID>
  CLIENT_SECRET: <base64 encoded Client Secret>
kind: Secret

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

$ oc describe keycloak <CR-name>

客户端自定义资源状态

Name:         client-secret
Namespace:    keycloak
Labels:       app=sso
API Version:  keycloak.org/v1alpha1
Kind:         KeycloakClient
Spec:
  Client:
    Client Authenticator Type:     client-secret
    Client Id:                     client-secret
    Id:                            keycloak-client-secret
  Realm Selector:
    Match Labels:
      App:  sso
Status:
  Message:
  Phase:    reconciling
  Ready:    true
  Secondary Resources:
    Secret:
      keycloak-client-secret-client-secret
Events:  <none>

其他资源

11.7. 创建用户自定义资源

您可以使用 Operator 在 Red Hat Single Sign-On 中创建由自定义资源定义的用户。您可以在 YAML 文件中定义用户自定义资源的属性。

注意

您可以更新属性,但密码除外,在 Red Hat Single Sign-On 管理控制台中会显示更改,但管理控制台更改不会更新自定义资源。

用户自定义资源的 YAML 文件示例

apiVersion: keycloak.org/v1alpha1
kind: KeycloakUser
metadata:
  name: example-user
spec:
  user:
    username: "realm_user"
    firstName: "John"
    lastName: "Doe"
    email: "user@example.com"
    enabled: True
    emailVerified: False
    credentials:
      - type: "password"
        value: "12345"
    realmRoles:
      - "offline_access"
    clientRoles:
      account:
        - "manage-account"
      realm-management:
        - "manage-users"
  realmSelector:
    matchLabels:
      app: sso

前提条件

  • 有用于此自定义资源的 YAML 文件。
  • realmSelector 与现有域自定义资源的标签匹配。
  • 您有 cluster-admin 权限,或具有管理员授予的同等权限级别。

流程

  1. 对您创建的 YAML 文件使用此命令: oc create -f <user_cr>.yaml。例如:

    $ oc create -f initial_user.yaml
    keycloak.keycloak.org/example-user created
  2. 登录到 Red Hat Single Sign-On 相关实例的 admin 控制台。
  3. 点 Users。
  4. 搜索您在 YAML 文件中定义的用户。

    您可能需要切换到其他域来查找用户。

    realm user

结果

创建用户后,Operator 会使用以下命名模式创建一个 Secret: credential-<realm name>-<username>-<namespace >,其中包含了用户名,如果已在 CR 凭证 属性中指定,密码则为:

例如:

KeycloakUser Secret

kind: Secret
apiVersion: v1
data:
  password: <base64 encoded password>
  username: <base64 encoded username>
type: Opaque

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

$ oc describe keycloak <CR-name>

用户自定义资源状态

Name:         example-realm-user
Namespace:    keycloak
Labels:       app=sso
API Version:  keycloak.org/v1alpha1
Kind:         KeycloakUser
Spec:
  Realm Selector:
    Match Labels:
      App: sso
  User:
    Email:           realm_user@redhat.com
    Credentials:
      Type:          password
      Value:         <user password>
    Email Verified:  false
    Enabled:         true
    First Name:      John
    Last Name:       Doe
    Username:        realm_user
Status:
  Message:
  Phase:    reconciled
Events:     <none>

其他资源

11.8. 连接到外部数据库

您可以通过创建一个 keycloak-db-secret YAML 文件并将 Keycloak CR externalDatabase 属性设置为 enabled,来使用 Operator 连接到外部 PostgreSQL 数据库。请注意,值为 Base64 编码。

keycloak-db-secret的 YAML 文件示例

apiVersion: v1
kind: Secret
metadata:
    name: keycloak-db-secret
    namespace: keycloak
stringData:
    POSTGRES_DATABASE: <Database Name>
    POSTGRES_EXTERNAL_ADDRESS: <External Database IP or URL (resolvable by K8s)>
    POSTGRES_EXTERNAL_PORT: <External Database Port>
    POSTGRES_PASSWORD: <Database Password>
    # Required for AWS Backup functionality
    POSTGRES_SUPERUSER: "true"
    POSTGRES_USERNAME: <Database Username>
    SSLMODE: <TLS configuration for the Database connection>
type: Opaque

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

  • POSTGRES_EXTERNAL_ADDRESS - 一个 IP 地址或外部数据库的主机名。
  • POSTGRES_EXTERNAL_PORT - (可选)数据库端口。

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

  • POSTGRES_DATABASE - 要使用的数据库名称。
  • POSTGRES_USERNAME - 数据库用户名
  • POSTGRES_PASSWORD - 数据库密码
  • POSTGRES_SUPERUSER - 表示备份是否以超级用户身份运行。通常为
  • SSL_MODE - 表示是否连接到外部 PostgreSQL 数据库上的 TLS。检查 可能的值

启用 SSL_MODE 后,Operator 会搜索名为 keycloak-db-ssl-cert-secret 的 secret,其中包含 PostgreSQL 数据库使用的 root.crt。创建 secret 是可选的,只有在您希望验证数据库的证书时(例如 SSLMODE: verify-ca)才会使用该 secret。下面是一个示例:

operator 要使用的 TLS Secret 的 YAML 文件示例。

apiVersion: v1
kind: Secret
metadata:
  name: keycloak-db-ssl-cert-secret
  namespace: keycloak
type: Opaque
data:
  root.crt: {root.crt base64}

Operator 将创建一个名为 keycloak-postgresql 的服务。此服务由 Operator 配置,以根据 POSTGRES_EXTERNAL_ADDRESS 的内容公开外部数据库。Red Hat Single Sign-On 使用这个服务连接到数据库,这意味着它不会直接连接到数据库,而是通过这个服务。

Operator 将创建一个名为 keycloak-postgresql 的服务。此服务由 Operator 配置,以根据 POSTGRES_EXTERNAL_ADDRESS 的内容公开外部数据库。Red Hat Single Sign-On 使用这个服务连接到数据库,这意味着它不会直接连接到数据库,而是通过这个服务。

Keycloak 自定义资源需要更新来启用外部数据库支持。

支持外部数据库的 Keycloak 自定义资源的 YAML 文件示例

apiVersion: keycloak.org/v1alpha1
kind: Keycloak
metadata:
  labels:
      app: sso
  name: example-keycloak
  namespace: keycloak
spec:
  externalDatabase:
    enabled: true
  instances: 1

前提条件

  • 您有一个用于 keycloak-db-secret 的 YAML 文件。
  • 您已修改了 Keycloak 自定义资源,将 externalDatabase 设置为 true
  • 您有 cluster-admin 权限,或具有管理员授予的同等权限级别。

流程

  1. 查找 PostgreSQL 数据库的 secret: oc get secret <secret_for_db> -o yaml。例如:

    $ oc get secret keycloak-db-secret -o yaml
    apiVersion: v1
    data
      POSTGRES_DATABASE: cm9vdA==
      POSTGRES_EXTERNAL_ADDRESS: MTcyLjE3LjAuMw==
      POSTGRES_EXTERNAL_PORT: NTQzMg==

    POSTGRES_EXTERNAL_ADDRESS 是 Base64 格式。

  2. 解码 secret 的值: echo "<encoded_secret>" | base64 -decode。例如:

    $ echo "MTcyLjE3LjAuMw==" | base64 -decode
    192.0.2.3
  3. 确认已解码的值与您的数据库的 IP 地址匹配:

    $ oc get pods -o wide
    NAME                        READY  STATUS    RESTARTS   AGE   IP
    keycloak-0                  1/1    Running   0          13m   192.0.2.0
    keycloak-postgresql-c8vv27m 1/1    Running   0          24m   192.0.2.3
  4. 确认 keycloak-postgresql 出现在运行的服务列表中:

    $ oc get svc
    NAME                 TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)   AGE
    keycloak             ClusterIP  203.0.113.0    <none>       8443/TCP  27m
    keycloak-discovery   ClusterIP  None           <none>       8080/TCP  27m
    keycloak-postgresql  ClusterIP  203.0.113.1    <none>       5432/TCP  27m

    keycloak-postgresql 服务将请求发送到后端的一组 IP 地址。这些 IP 地址称为端点。

  5. 查看 keycloak-postgresql 服务使用的端点,以确认它们是否将 IP 地址用于您的数据库:

    $ oc get endpoints keycloak-postgresql
    NAME                  ENDPOINTS         AGE
    keycloak-postgresql   192.0.2.3.5432    27m
  6. 确认 Red Hat Single Sign-On 正在使用外部数据库运行。本例显示一切正在运行:

    $ oc get pods
    NAME                        READY  STATUS    RESTARTS   AGE   IP
    keycloak-0                  1/1    Running   0          26m   192.0.2.0
    keycloak-postgresql-c8vv27m 1/1    Running   0          36m   192.0.2.3

11.9. 调度数据库备份

警告

备份 CR 已被弃用,并可能在以后的版本中被删除。

您可以使用 Operator 来调度由自定义资源定义的数据库备份。自定义资源会触发备份作业并报告其状态。

您可以使用 Operator 创建对本地持久性卷执行一次性备份的备份作业。

备份自定义资源的 YAML 文件示例

apiVersion: keycloak.org/v1alpha1
kind: KeycloakBackup
metadata:
  name: test-backup

前提条件

  • 有用于此自定义资源的 YAML 文件。
  • 您有一个带有 claimRefPersistentVolume,以便只针对由 Red Hat Single Sign-On Operator 创建的 PersistentVolumeClaim 保留。

流程

  1. 创建备份作业: oc create -f <backup_crname>.例如:

    $ oc create -f one-time-backup.yaml
    keycloak.keycloak.org/test-backup

    Operator 创建带有以下命名方案的 PersistentVolumeClaimKeycloak-backup-<CR-name >。

  2. 查看卷列表:

    $ oc get pvc
    NAME                          STATUS   VOLUME
    keycloak-backup-test-backup   Bound    pvc-e242-ew022d5-093q-3134n-41-adff
    keycloak-postresql-claim      Bound    pvc-e242-vs29202-9bcd7-093q-31-zadj
  3. 查看备份作业列表:

    $ oc get jobs
    NAME           COMPLETIONS     DURATION     AGE
    test-backup    0/1             6s           6s
  4. 查看已执行的备份任务列表:

    $ oc get pods
    NAME                               READY    STATUS       RESTARTS    AGE
    test-backup-5b4rf                  0/1      Completed    0           24s
    keycloak-0                         1/1      Running      0           52m
    keycloak-postgresql-c824c6-vv27m   1/1      Running      0           71m
  5. 查看已完成的备份作业的日志:

    $ oc logs test-backup-5b4rf
    ==> Component data dump completed
    .
    .
    .
    .

其他资源

11.10. 安装扩展及其

您可以使用 Operator 安装您公司或机构所需的扩展。扩展或主题可以是 Red Hat Single Sign-On 可以使用的任何事物。例如,您可以添加指标扩展。您可以在 Keycloak 自定义资源中添加扩展或主题。

Keycloak 自定义资源的 YAML 文件示例

apiVersion: keycloak.org/v1alpha1
kind: Keycloak
metadata:
  name: example-keycloak
  labels:
   app: sso
spec:
  instances: 1
  extensions:
   - <url_for_extension_or_theme>
  externalAccess:
    enabled: True

您可以像任何其他扩展一样打包和部署主题。如需更多信息,请参阅 部署主题 手动条目。

前提条件

  • 您有一个用于 Keycloak 自定义资源的 YAML 文件。
  • 您有 cluster-admin 权限,或具有管理员授予的同等权限级别。

流程

  1. 编辑 Keycloak 自定义资源的 YAML 文件: oc edit <CR-name>
  2. 在实例行后添加名为 extensions: 的行。
  3. 在自定义扩展或主题的 JAR 文件中添加 URL。
  4. 保存该文件。

Operator 下载扩展或主题并安装它。

11.11. 用于管理自定义资源的命令选项

在创建自定义请求后,您可以使用 oc 命令编辑或删除请求。

  • 要编辑自定义请求,请使用以下命令: oc edit <CR-name>
  • 要删除自定义请求,请使用以下命令: oc delete <CR-name>

例如,要编辑名为 test-realm 的域自定义请求,请使用以下命令:

$ oc edit test-realm

这时将打开一个窗口,您可以在其中进行更改。

注意

您可以更新 YAML 文件和更改显示在 Red Hat Single Sign-On 管理控制台中,但更改管理控制台不会更新自定义资源。

11.12. 构建策略

您可以配置 Operator 如何执行 Red Hat Single Sign-On 升级。您可以从以下升级策略中选择。

  • Recreate :这是默认策略。Operator 会删除所有 Red Hat Single Sign-On 副本,可以选择创建备份,然后基于更新的 Red Hat Single Sign-On 镜像创建副本。此策略适合作为单一 Red Hat Single Sign-On 版本访问底层数据库的主要升级。不足之处是需要在升级过程中关闭 Red Hat Single Sign-On。
  • Rolling :Operator 会一次移除一个副本,并基于更新的红帽单点登录镜像再次创建副本。这样可保证零停机时间升级,但更适合不需要数据库进行的次版本升级,因为多个 Red Hat Single Sign-On 版本同时可以访问数据库。此策略不支持自动备份。

Keycloak 自定义资源的 YAML 文件示例

apiVersion: keycloak.org/v1alpha1
kind: Keycloak
metadata:
  name: example-keycloak
  labels:
   app: sso
spec:
  instances: 2
  migration:
    strategy: recreate
    backups:
      enabled: True
  externalAccess:
    enabled: True

法律通告

Copyright © 2022 Red Hat, Inc.
根据 Apache 许可证(版本 2.0)授权(License");除非遵守许可证,您可能不能使用此文件。您可以在以下位置获取许可证副本
除非适用法律或同意编写,许可证下的软件将由"AS IS"BASIS 分发,WITHOUT WARRANTIES 或 CONDITIONS OF ANY KIND,可以是表达或表示的。有关许可证下的权限和限制的具体语言,请参阅许可证。