8.3. 示例:将 AMQ Broker 配置为使用 Red Hat Single Sign-On


本例演示了如何将 AMQ Broker 配置为使用 Red Hat Single Sign-On 来使用 JAAS 登录模块来身份验证和授权。

先决条件

  • 与 LDAP 目录集成的 Red Hat Single Sign-On 实例。

    • LDAP 目录填充 AMQ Broker 的用户和角色信息。
    • Red Hat Single Sign-On 配置为联合来自 LDAP 服务器的用户。
    • Red Hat Single Sign-On 被配置为使用 role-ldap-mapper 将角色信息从 LDAP 映射到红帽单点登录。
  • 一个 Red Hat Single Sign-On 域,它有:

    • 使用以下设置配置的应用程序(如 AMQ 管理控制台)的客户端,可以使用 oAuth 协议获取令牌:

      身份验证流程:标准流

      有效的 Redirect URI:AMQ Management Console 的 OpenShift Container Platform 路由。例如 :http://artemis-wconsj-0-svc-rte-kc-ldap-tests-0eae49.apps.redhat-412t.broker.app-services-dev.net/console/*

    • 如果您有无法使用 oAuth 协议获取令牌的消息客户端应用程序,使用以下设置配置单独的客户端:

      身份验证流程:直接访问授予

      有效的 Redirect URI: *

注意

Red Hat Single Sign-On 中的每个域都包括一个名为 Broker 的客户端。这个客户端与 AMQ Broker 无关。

流程

  1. 创建名为 login.config 的文本文件,并添加 JAAS 登录模块配置,以将 AMQ Broker 与 Red Hat Single Sign-On 连接。例如:

    console {
        // ensure the operator can connect to the broker by referencing the existing properties config
        org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule sufficient
            org.apache.activemq.jaas.properties.user="artemis-users.properties"
            org.apache.activemq.jaas.properties.role="artemis-roles.properties"
            baseDir="/home/jboss/amq-broker/etc";
    
       org.keycloak.adapters.jaas.BearerTokenLoginModule sufficient
            keycloak-config-file="/amq/extra/secrets/sso-jaas-config/_keycloak-bearer-token.json"
            role-principal-class=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal;
    };
    activemq {
        org.keycloak.adapters.jaas.BearerTokenLoginModule sufficient
            keycloak-config-file="/amq/extra/secrets/sso-jaas-config/_keycloak-bearer-token.json"
            role-principal-class=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal;
    
        org.keycloak.adapters.jaas.DirectAccessGrantsLoginModule sufficient
            keycloak-config-file="/amq/extra/secrets/sso-jaas-config/_keycloak-direct-access.json"
            role-principal-class=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal;
    
        org.apache.activemq.artemis.spi.core.security.jaas.PrincipalConversionLoginModule required
           principalClassList=org.keycloak.KeycloakPrincipal;
    };
    注意
    • .json 配置文件的路径必须采用 /amq/extra/secrets/name-jaas-config 的格式。对于 名称,请指定字符串值。您必须使用相同的字符串值和 -jaas-config 后缀来命名稍后在此流程中创建的 secret。
    • 在示例 login.config 文件中,名为 console 的域用于验证 AMQ 管理控制台用户以及名为 activemq 的域来验证消息传递客户端。

以下登录模块在示例 login.config 文件中配置。

登录模块描述和使用

org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule

这是默认登录模块,包含 artemis-users.properties 文件,其中包含 Operator 向代理进行身份验证的默认用户。

org.keycloak.adapters.jaas.BearerTokenLoginModule

此登录模块用于应用程序,如 AMQ 管理控制台,可以使用 oAuth 协议获取令牌。当用户在浏览器窗口中打开 AMQ 管理控制台时,它们会被重定向到 Red Hat Single Sign-On 控制台,以登录来获取 bearer 令牌。

org.keycloak.adapters.jaas.DirectAccessGrantsLoginModule

非 HTTP 应用程序(如消息传递客户端)需要这个登录模块,它们无法使用 oAuth 协议。使用这个登录模块,代理首先使用 Red Hat Single Sign-On 中配置的 secret 验证客户端,然后代表客户端获取令牌。

org.apache.activemq.artemis.spi.core.security.jaas.PrincipalConversionLoginModule

需要此登录模块才能将接收的 Keycloak 主体转换为 AMQ Broker 使用的 JAAS 主体。

注意

login.config 文件示例中,每个 .json 属性文件名都有一个下划线前缀。当报告 JaasPropertiesApplied 条件的状态时,Operator 会忽略前缀为下划线的文件。如果文件名没有下划线前缀,JaasPropertiesApplied 条件的状态会永久显示 OutofSync,因为代理无法识别第三方登录模块使用的属性文件。有关状态报告的更多信息,请参阅 第 4.3.2.1 节 “使用安全自定义资源(CR)配置默认的 JAAS 登录模块”

  1. 为登录模块中引用的每个 .json 属性文件创建文本文件,并将 AMQ Broker 连接到 Red Hat Single Sign-On 所需的详细信息。例如:

    _keycloak-bearer-token.json
    {
        "realm": "amq-broker-ldap",
        "resource": "amq-console",
        "auth-server-url": "https://keycloak-svc-rte-kc-ldap-tests-0eae49.apps.412t.broker.app-services-dev.net",
        "principal-attribute": "preferred_username",
        "use-resource-role-mappings": false,
        "ssl-required": "external",
        "confidential-port": 0
    }
    _keycloak-direct-access.json
    {
        "realm": "amq-broker-ldap",
        "resource": "amq-broker",
        "auth-server-url": "https://keycloak-svc-rte-kc-ldap-tests-0eae49.apps.412t.broker.app-services-dev.net",
        "principal-attribute": "preferred_username",
        "use-resource-role-mappings": false,
        "ssl-required": "external",
        "credentials": {
            "secret": "Lfk6g1ZKlGzNT6eRkz0d1scM4M29Ohmn"
        }
    }
    realm
    配置为在 Red Hat Single Sign-On 中验证 AMQ Broker 应用程序和服务的域。
    resource
    在 Red Hat Single Sign-On 中配置的客户端的客户端 ID。
    auth-server-url
    Red Hat Single Sign-On 服务器的基本 URL。
    principal-attribute
    用于填充 UserPrincipal 名称的 token 属性。
    use-resource-role-mappings
    如果设置为 true,Red Hat Single Sign-On 会在令牌中查找用户的应用程序级别角色映射。如果为 false,它会查看用户角色映射的域级别。默认值为 false。
    ssl-required
    确保与 Red Hat Single Sign-On 服务器与和来自 Red Hat Single Sign-On 服务器的所有通信都是通过 HTTPS。默认值为 外部,这意味着外部请求默认需要 HTTPS。
    credentials
    在 Red Hat Single Sign-On 中配置的 secret,代理用来登录到 Red Hat Single Sign-On,并代表客户端获取令牌。
  2. 创建名为 _keycloak-js-client.json 的文本文件,并添加 AMQ 管理控制台所需的配置,将用户重定向到 Red Hat Single Sign-On Admin Console 的 URL,其中输入其凭证。例如:

    {
      "realm": "amq-broker-ldap",
      "clientId": "amq-console",
      "url": "https://keycloak-svc-rte-kc-ldap-tests-0eae49.apps.412t.broker.app-services-dev.net"
    }
  3. 使用 oc create secret 命令创建包含登录模块配置中引用的文件的 secret。例如:

    oc create secret generic sso-jaas-config --from-file=login.config --from-file=artemis-users.properties --from-file=artemis-roles.properties --from-file=_keycloak-bearer-token.json --from-file=_keycloak-direct-access.json --from-file=_keycloak-js-client.json
    注意
    • secret 名称必须具有 -jaas-config 后缀,以便 Operator 可以识别 secret 包含登录模块配置,并将任何更新传播到每个代理 Pod。
    • secret 名称必须与您在 login.config 文件中指定的 .json 配置文件路径中的最后一个目录名称匹配。例如,如果配置文件的路径为 /amq/extra/secrets/sso-jaas-config,您必须指定一个 secret 名称 sso-jaas-config

    有关如何创建 secret 的更多信息,请参阅 Kubernetes 文档中的 Secret

  4. 将您创建的 secret 添加到代理部署的 ActiveMQArtemis 自定义资源(CR)实例中。

    1. 使用 OpenShift 命令行界面:

      1. 以具有特权在项目中为代理部署 CR 的用户身份登录 OpenShift。
      2. 编辑部署的 CR。

         oc edit ActiveMQArtemis <CR instance name> -n <namespace>
    2. 使用 OpenShift Container Platform Web 控制台:

      1. 以具有特权在项目中为代理部署 CR 的用户登录到控制台。
      2. 在左侧窗格中,点 Operators Installed Operator
      3. Red Hat Integration - AMQ Broker for RHEL 8 (Multiarch) operator。
      4. AMQ Broker 选项卡。
      5. 单击 ActiveMQArtemis 实例名称的名称。
      6. YAML 标签。

        在控制台中,会打开 YAML 编辑器,供您配置 CR 实例。

  5. 创建一个 extraMounts 属性和 secrets 属性,并添加 secret 的名称。以下示例将名为 custom-jaas-config 的 secret 添加到 CR 中。

    deploymentPlan:
      ...
      extraMounts:
        secrets:
        - "sso-jaas-config"
      ...
  6. ActiveMQArtemis CR 中,创建一个环境变量,其中包含 AMQ 管理控制台使用 Red Hat Single Sign-On 进行身份验证所需的 hawtio 设置。当托管代理的 JVM 时,环境变量的内容作为参数传递到 Java 应用程序启动程序。例如:

    env:
    - name: JAVA_ARGS_APPEND
      value: -Dhawtio.rolePrincipalClasses=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal
          -Dhawtio.keycloakEnabled=true -Dhawtio.keycloakClientConfig=/amq/extra/secrets/sso-jaas-config/_keycloak-js-client.json
          -Dhawtio.authenticationEnabled=true -Dhawtio.realm=console

    有关 hawtio 设置的更多信息,请参阅 hawtio 文档

  7. ActiveMQArtemis CR 的 spec 部分中,添加一个 brokerProperties 属性,并为 LDAP 目录中配置的角色添加权限。您可以为单个地址授予角色权限。或者,您可以使用 # 符号指定通配符匹配,为所有地址授予角色权限。例如:

    spec:
      ...
      brokerProperties:
      - securityRoles.#.producers.send=true
      - securityRoles.#.consumers.consume=true
      ...
  8. 保存 CR。

    Operator 在每个 Pod 上的 /amq/extra/secrets/secret 名称目录中挂载 secret 中的文件,并将代理 JVM 配置为读取挂载的 login.config 文件,该文件包含 SSO 配置,而不是默认的 login.config 文件。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.