搜索

4.3. 配置身份验证和授权

download PDF

默认情况下,AMQ Broker 使用 Java 认证和授权服务(JAAS)属性登录模块来验证和授权用户。默认 JAAS 登录模块的配置存储在每个代理 Pod 上的 /home/jboss/amq-broker/etc/login.config 文件中,并从同一目录中的 artemis-users.propertiesartemis-roles.properties 文件中读取用户和角色信息。您可以通过更新 ActiveMQArtemisSecurity 自定义资源(CR),将用户和角色信息添加到默认登录模块中的属性文件中。

更新 ActiveMQArtemisSecurity CR 的替代方法是向默认属性文件添加用户和角色信息,方法是在 secret 中配置一个或多个 JAAS 登录模块。此 secret 作为文件挂载到每个代理 Pod 上。与使用 ActiveMQArtemisSecurity CR 来添加用户和角色信息相比,在 secret 中配置 JAAS 登录模块具有以下优点:

  • 如果在 secret 中配置属性登录模块,则代理不需要在每次更新属性文件时重启。例如,当您将新用户添加到属性文件中并更新 secret 时,更改会在不需要重启代理的情况下生效。
  • 您可以配置 ActiveMQArtemisSecurity CRD 中未定义的 JAAS 登录模块来验证用户。例如,您可以配置 LDAP 登录模块或任何其他 JAAS 登录模块。

以下部分描述了为 AMQ Broker 配置身份验证和授权的方法。

4.3.1. 在 secret 中配置 JAAS 登录模块

您可以在 secret 中配置 JAAS 登录模块,以使用 AMQ Broker 验证用户身份。创建 secret 后,您必须在主代理自定义资源(CR)中添加对 secret 的引用,并在 CR 中配置权限以授予用户对 AMQ Broker 的访问权限。

流程

  1. 使用新的 JAAS 登录模块配置创建一个文本文件,并将文件保存为 login.config。将文件保存为 login.config,正确的密钥会插入到您从文本文件创建的 secret 中。以下是登录模块配置示例:

    activemq {
       org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule sufficient
          reload=true
          org.apache.activemq.jaas.properties.user="new-users.properties"
          org.apache.activemq.jaas.properties.role="new-roles.properties";
    
       org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule sufficient
          reload=false
          org.apache.activemq.jaas.properties.user="artemis-users.properties"
          org.apache.activemq.jaas.properties.role="artemis-roles.properties"
          baseDir="/home/jboss/amq-broker/etc";
    };

    在 secret 中配置 JAAS 登录模块并在 CR 中添加对 secret 的引用后,AMQ Broker 不再使用默认的登录模块。但是,Operator 需要在默认登录模块中引用的 artemis-users.properties 文件中的用户与代理进行身份验证。要确保 Operator 可以在配置新的 JAAS 登录模块后与代理进行身份验证,您必须:

    • 在新的登录模块配置中包含默认属性登录模块,如上例中所示。在示例中,默认属性登录模块使用 artemis-users.propertiesartemis-roles.properties 文件。如果您在新的登录模块配置中包含默认登录模块,您必须将 baseDir 设置为 /home/jboss/amq-broker/etc 目录,其中包含每个代理 Pod 上的默认属性文件。
    • 将 Operator 所需的用户和角色信息添加到新登录模块配置中引用的属性文件中。您可以从代理 Pod 上的 /home/jboss/amq-broker/etc 目录中 复制此信息。

      注意

      只有在代理首次调用登录模块时,才会加载登录模块中引用的属性文件。代理会按照 login.config 文件中列出的顺序调用登录模块,直到它找到登录模块来验证用户。通过将包含 Operator 使用的凭证的登录模块放在 login.config 文件的末尾,当代理验证 Operator 时,所有前面的登录模块都会被调用。因此,任何状态消息都指出该属性文件在代理中不可见。

  2. 如果您创建的 login.config 文件包含属性登录模块,请确保模块中指定的用户和角色文件包含用户和角色信息。例如:

    new-users.properties
    ruben=ruben01!
    anne=anne01!
    rick=rick01!
    bob=bob01!
    new-roles.properties
    admin=ruben, rick
    group1=bob
    group2=anne
  3. 使用 oc create secret 命令从使用新登录模块配置创建的文本文件中创建 secret。如果登录模块配置包含属性登录模块,请在机密中包含相关的用户和角色文件。例如:

    oc create secret generic custom-jaas-config --from-file=login.config --from-file=new-users.properties --from-file=new-roles.properties
    注意

    secret 名称必须具有 -jaas-config 后缀,以便 Operator 可以识别 secret 包含登录模块配置,并将任何更新传播到每个代理 Pod。

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

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

    1. 使用 OpenShift 命令行界面:

      1. 以具有特权的用户身份登录 OpenShift,以便在代理部署的项目中部署 CR。
      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:
        - "custom-jaas-config"
      ...
  6. 在 CR 中,为代理配置的角色授予权限。

    1. 在 CR 的 spec 部分,添加一个 brokerProperties 元素并添加权限。您可以为单个地址授予角色权限。或者,您可以使用 # 符号指定通配符匹配,为所有地址授予角色权限。例如:

      spec:
        ...
        brokerProperties:
        - securityRoles.#.group2.send=true
        - securityRoles.#.group1.consume=true
        - securityRoles.#.group1.createAddress=true
        - securityRoles.#.group1.createNonDurableQueue=true
        - securityRoles.#.group1.browse=true
        ...

      在示例中,group2 角色分配为所有地址 发送 权限,并且分配 group1 角色 消耗createAddresscreateNonDurableQueue 并将权限浏览到 所有地址。

      注意

      在 Java 属性文件中,冒号(:)是一个保留字符,用于分隔键/值对中的键和值。如果要向完全限定队列名称(FQQN)授予权限,它由地址名称和以冒号(::)分隔的队列名称组成,则必须使用反斜杠(\)字符来转义 FQQN 中的冒号字符。例如:

      spec:
        ...
        brokerProperties:
        - 'securityRoles."my-address\:\:my-queue".group2.send=true'
  7. 保存 CR。

    Operator 在每个 Pod 上的 /amq/extra/secrets/secret 名称 目录中挂载 login.config 文件,并将代理 JVM 配置为读取挂载的 login.config 文件,而不是默认的 login.config 文件。如果 login.config 文件包含属性登录模块,则引用的用户和角色属性文件也会挂载到每个 Pod 上。

  8. 查看 CR 中的状态信息,以验证部署中的代理是否使用 secret 中的 JAAS 登录模块进行身份验证。

    1. 使用 OpenShift 命令行界面:

      1. 获取代理 CR 中的状态条件。

        $ oc get activemqartemis -o yaml
    2. 使用 OpenShift Web 控制台:

      1. 在 CR 中,进入到 status 部分。
    3. 在状态信息中,验证存在 JaasPropertiesApplied 类型,这表示代理正在使用 secret 中配置的 JAAS 登录模块。例如:

      - lastTransitionTime: "2023-02-06T20:50:01Z"
        message: ""
        reason: Applied
        status: "True"
        type: JaasPropertiesApplied

      当您更新 secret 中的任何文件时,reason 字段的值会显示 OutofSync,直到 OpenShift Container Platform 将 secret 中的最新文件传播到每个代理 Pod。例如,如果您在 new-users-properties 文件中添加新用户并更新 secret,您会看到以下状态信息,直到更新的文件被传播到每个 Pod:

      - lastTransitionTime: "2023-02-06T20:55:20Z"
        message: 'new-users.properties status out of sync, expected: 287641156, current: 2177044732'
        reason: OutOfSync
        status: "False"
        type: JaasPropertiesApplied
  9. 当您在 secret 中引用的属性文件中更新用户或组信息时,请使用 oc set data 命令更新 secret。您必须再次读取到 secret 的所有文件,包括 login.config 文件。例如,如果您向此流程前面创建的 new-users.properties 文件中添加新用户,请使用以下命令更新 custom-jaas-config secret:

    oc set data secret/custom-jaas-config --from-file=login.config=login.config --from-file=new-users.properties=new-users.properties --from-file=new-roles.properties=new-roles.properties
注意

代理 JVM 仅在 login.config 文件中读取配置。如果您更改了 login.config 文件中的配置,例如要添加新的登录模块并更新 secret,则代理不会在代理重启前使用新配置。

第 8.3 节 “示例:将 AMQ Broker 配置为使用 Red Hat Single Sign-On”

有关 JAAS 登录模块格式的详情,请参考 JAAS 登录配置文件

4.3.2. 使用安全自定义资源(CR)配置默认的 JAAS 登录模块

您可以使用 ActiveMQArtemisSecurity 自定义资源(CR)在默认的 JAAS 属性登录模块中配置用户和角色信息,以使用 AMQ Broker 验证用户的身份。有关使用 secret 在 AMQ Broker 中配置身份验证和授权的替代方法,请参考 第 4.3.1 节 “在 secret 中配置 JAAS 登录模块”

注意

从 AMQ Broker 7.12 开始,ActiveMQArtemis Security CR 已被弃用。

4.3.2.1. 使用安全自定义资源(CR)配置默认的 JAAS 登录模块

以下流程演示了如何使用安全自定义资源(CR)配置默认的 JAAS 登录模块。

先决条件

流程

您可以在创建代理部署前或之后部署安全 CR。但是,如果您在创建代理部署后部署安全 CR,则会重启代理 pod 以接受新配置。

  1. 开始配置自定义资源(CR)实例,以定义用户以及代理部署的关联安全配置。

    1. 使用 OpenShift 命令行界面:

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

        oc login -u <user> -p <password> --server=<host:port>
      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 实例。

  2. 在 CR 的 spec 部分中,添加行以定义用户和角色。例如:

    apiVersion: broker.amq.io/v1beta1
    kind: ActiveMQArtemisSecurity
    metadata:
      name: ex-prop
    spec:
      loginModules:
        propertiesLoginModules:
          - name: "prop-module"
            users:
              - name: "sam"
                password: "samspassword"
                roles:
                  - "sender"
              - name: "rob"
                password: "robspassword"
                roles:
                  - "receiver"
      securityDomains:
        brokerDomain:
          name: "activemq"
          loginModules:
            - name: "prop-module"
              flag: "sufficient"
      securitySettings:
        broker:
          - match: "#"
            permissions:
              - operationType: "send"
                roles:
                  - "sender"
              - operationType: "createAddress"
                roles:
                  - "sender"
              - operationType: "createDurableQueue"
                roles:
                  - "sender"
              - operationType: "consume"
                roles:
                  - "receiver"
                  ...
    注意

    始终为上例中的元素指定值。例如,如果您没有为 securityDomains.brokerDomain 或角色值指定值,则生成的配置可能会导致意外的结果。

    前面的配置定义了两个用户:

    • 名为 prop-module 的属性LoginModule,用于定义名为 sam 的用户,角色名为 sender
    • 名为 prop-module 的属性LoginModule,定义名为 rob 的用户,角色名为 receiver

    这些角色的属性在 securityDomainsbrokerDomainbroker 部分中定义。例如,定义了 send 角色,以允许具有该角色的用户在任何地址上创建持久队列。默认情况下,配置适用于当前命名空间中 CR 定义的所有部署代理。要将配置限制到特定的代理部署,请使用 第 8.1.3 节 “安全自定义资源配置参考” 中描述的 applyToCrNames 选项。

    注意

    metadata 部分中,您需要包含 namespace 属性,只有在使用 OpenShift Container Platform Web 控制台创建 CR 实例时才指定值。您应该指定的值是代理部署的 OpenShift 项目的名称。

  3. 部署 CR 实例。

    1. 使用 OpenShift 命令行界面:

      1. 保存 CR 文件。
      2. 切换到代理部署的项目。

        $ oc project <project_name>
      3. 创建 CR 实例。

        $ oc create -f <path/to/security_custom_resource_instance>.yaml
    2. 使用 OpenShift Web 控制台:

      1. 配置完 CR 后,点 Create

4.3.2.2. 将用户密码存储在 secret 中

第 4.3.2.1 节 “使用安全自定义资源(CR)配置默认的 JAAS 登录模块” 流程中,用户密码以明文形式存储在 ActiveMQArtemisSecurity CR 中。如果您不想在 CR 中以明文形式存储密码,您可以从 CR 中排除密码并将其存储在 secret 中。应用 CR 时,Operator 从 secret 检索每个用户的密码,并将其插入到代理 pod 上的 artemis-users.properties 文件中。

流程

  1. 使用 oc create secret 命令创建 secret,并添加每个用户名和密码。secret 名称必须遵循 security-properties-module name 的命名约定,其中 module name 是 CR 中配置的登录模块的名称。例如:

    oc create secret generic security-properties-prop-module \
      --from-literal=sam=samspassword \
      --from-literal=rob=robspassword
  2. 在 CR 的 spec 部分,添加您在 secret 中指定的用户名以及角色信息,但不包含每个用户的密码。例如:

    apiVersion: broker.amq.io/v1beta1
    kind: ActiveMQArtemisSecurity
    metadata:
      name: ex-prop
    spec:
      loginModules:
        propertiesLoginModules:
          - name: "prop-module"
            users:
              - name: "sam"
                roles:
                  - "sender"
              - name: "rob"
                roles:
                  - "receiver"
      securityDomains:
        brokerDomain:
          name: "activemq"
          loginModules:
            - name: "prop-module"
              flag: "sufficient"
      securitySettings:
        broker:
          - match: "#"
            permissions:
              - operationType: "send"
                roles:
                  - "sender"
              - operationType: "createAddress"
                roles:
                  - "sender"
              - operationType: "createDurableQueue"
                roles:
                  - "sender"
              - operationType: "consume"
                roles:
                  - "receiver"
                  ...
  3. 部署 CR 实例。

    1. 使用 OpenShift 命令行界面:

      1. 保存 CR 文件。
      2. 切换到代理部署的项目。

        $ oc project <project_name>
      3. 创建 CR 实例。

        $ oc create -f <path/to/address_custom_resource_instance>.yaml
    2. 使用 OpenShift Web 控制台:

      1. 配置完 CR 后,点 Create

其他资源

如需有关 OpenShift Container Platform 中 secret 的更多信息,请参阅 OpenShift Container Platform 文档中的 向 pod 提供敏感数据。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.