4.3. 配置身份验证和授权
默认情况下,AMQ Broker 使用 Java 身份验证和授权服务(JAAS)属性登录模块来验证和授权用户。默认 JAAS 登录模块的配置存储在每个代理 Pod 上的 /home/jboss/amq-broker/etc/login.config 文件中,并从 artemis-users.properties 和 artemis-roles.properties 文件中读取用户和角色信息。您可以通过更新 ActiveMQArtemisSecurity 自定义资源(CR),将用户和角色信息添加到默认登录模块中的属性文件中。
更新 ActiveMQArtemisSecurity CR 的替代方案,以将用户和角色信息添加到默认属性文件,方法是在 secret 中配置一个或多个 JAAS 登录模块。此 secret 作为一个文件挂载到每个代理 Pod 上。与使用 ActiveMQArtemisSecurity CR 添加用户和角色信息相比,在 secret 中配置 JAAS 登录模块具有以下优点。
- 如果您在 secret 中配置属性登录模块,代理不需要在每次更新属性文件时重启。例如,当您向属性文件添加新用户并更新 secret 时,更改将生效,而无需重启代理。
-
您可以配置没有在
ActiveMQArtemisSecurityCRD 中定义的 JAAS 登录模块来验证用户。例如,您可以配置 LDAP 登录模块或任何其他 JAAS 登录模块。
以下部分介绍了为 AMQ Broker 配置身份验证和授权的方法。
4.3.1. 在 secret 中配置 JAAS 登录模块 复制链接链接已复制到粘贴板!
您可以在 secret 中配置 JAAS 登录模块,以使用 AMQ Broker 验证用户身份。创建 secret 后,您必须在主代理自定义资源(CR)中添加对 secret 的引用,并在 CR 中配置权限,以授予用户对 AMQ Broker 的访问权限。
流程
使用新的 JAAS 登录模块配置创建一个文本文件,并将文件保存为
login.config。通过将文件保存为login.config,正确的密钥会插入到您从文本文件创建的机密中。以下是登录模块配置示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 secret 中配置 JAAS 登录模块并在 CR 中添加对 secret 的引用后,AMQ Broker 不再使用默认的登录模块。但是,Operator 需要
artemis-users.properties文件中的用户(在默认登录模块中引用的)以便与代理进行身份验证。要确保 Operator 在配置新的 JAAS 登录模块后可以使用代理进行身份验证,您必须:-
在新的登录模块配置中包含默认属性登录模块,如上例所示。在示例中,默认属性登录模块使用
artemis-users.properties和artemis-roles.properties文件。如果在新的登录模块配置中包含默认登录模块,您必须将baseDir设置为/home/jboss/amq-broker/etc目录,其中包含每个代理 Pod 的默认属性文件。 将 Operator 所需的用户和角色信息添加到新登录模块配置中引用的属性文件中。您可以从代理 Pod 上的
/home/jboss/amq-broker/etc 目录中复制此信息。注意只有在代理首次调用登录模块时,才会加载登录模块中引用的属性文件。代理会按照
login.config文件中列出的顺序调用登录模块,直到它找到登录模块来验证用户。通过将包含 Operator 使用的凭证的登录模块放在login.config文件的末尾,当代理验证 Operator 时,所有前面的登录模块都会被调用。因此,任何状态消息都指出该属性文件在代理中不可见。
-
在新的登录模块配置中包含默认属性登录模块,如上例所示。在示例中,默认属性登录模块使用
如果创建的
login.config文件包含属性登录模块,请确保该模块中指定的用户和角色文件包含用户和角色信息。例如:- new-users.properties
ruben=ruben01! anne=anne01! rick=rick01! bob=bob01!
ruben=ruben01! anne=anne01! rick=rick01! bob=bob01!Copy to Clipboard Copied! Toggle word wrap Toggle overflow - new-roles.properties
admin=ruben, rick group1=bob group2=anne
admin=ruben, rick group1=bob group2=anneCopy to Clipboard Copied! Toggle word wrap Toggle overflow
使用
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
oc create secret generic custom-jaas-config --from-file=login.config --from-file=new-users.properties --from-file=new-roles.propertiesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意secret 名称必须具有
-jaas-config后缀,以便 Operator 可以识别 secret 包含登录模块配置,并将任何更新传播到每个代理 Pod。有关如何创建 secret 的更多信息,请参阅 Kubernetes 文档中的 Secret。
将您创建的 secret 添加到代理部署的自定义资源(CR)实例中。
使用 OpenShift 命令行界面:
- 以具有特权在项目中为代理部署 CR 的用户身份登录 OpenShift。
编辑部署的 CR。
oc edit ActiveMQArtemis <CR instance name> -n <namespace>
oc edit ActiveMQArtemis <CR instance name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 OpenShift Container Platform Web 控制台:
- 以具有特权在项目中为代理部署 CR 的用户登录到控制台。
-
在左侧窗格中,点
。 - 点 Red Hat Integration - AMQ Broker for RHEL 8 (Multiarch) operator。
- 点 AMQ Broker 选项卡。
- 单击 ActiveMQArtemis 实例名称的名称。
点 YAML 标签。
在控制台中,会打开 YAML 编辑器,供您配置 CR 实例。
创建
extraMounts元素和一个secrets元素,并添加 secret 的名称。以下示例将名为custom-jaas-config的 secret 添加到 CR 中。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 CR 中,为代理中配置的角色授予权限。
在 CR 的
spec部分中,添加一个brokerProperties元素并添加权限。您可以为单个地址授予角色权限。或者,您可以使用 192.168.1.0/24 符号指定通配符匹配,以授予所有地址的角色权限。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在示例中,group2 角色被分配给所有地址的权限,并且分配了 group1 角色
消耗、createAddress、createNonDurableQueue并浏览所有地址的权限。
保存 CR。
Operator 在每个 Pod 上的
/amq/extra/secrets/secret 名称目录中挂载login.config文件,并将代理 JVM 配置为读取挂载的login.config文件,而不是默认的login.config文件。如果login.config文件包含属性登录模块,则引用的用户和角色属性文件也会挂载到每个 Pod 上。查看 CR 中的状态信息,以验证部署中的代理是否使用 secret 中的 JAAS 登录模块进行身份验证。
使用 OpenShift 命令行界面:
在 CR 中为代理获取状态条件。
oc get activemqartemis -o yaml
$ oc get activemqartemis -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 OpenShift Web 控制台:
-
在 CR 中,进入
status部分。
-
在 CR 中,进入
在状态信息中,验证
JaasPropertiesApplied类型是否存在,这表示代理是否使用 secret 中配置的 JAAS 登录模块。例如:- lastTransitionTime: "2023-02-06T20:50:01Z" message: "" reason: Applied status: "True" type: JaasPropertiesApplied
- lastTransitionTime: "2023-02-06T20:50:01Z" message: "" reason: Applied status: "True" type: JaasPropertiesAppliedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 当您更新 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
- lastTransitionTime: "2023-02-06T20:55:20Z" message: 'new-users.properties status out of sync, expected: 287641156, current: 2177044732' reason: OutOfSync status: "False" type: JaasPropertiesAppliedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
当您在 secret 中引用的属性文件中更新用户或组信息时,请使用
oc set data命令更新 secret。您必须再次将所有文件读取到 secret 中,包括login.config文件。例如,如果您在此流程前面创建的new-users.properties文件中添加新用户,请使用以下命令更新custom-jaas-configsecret: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
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.propertiesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
代理 JVM 仅在 boot .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 登录模块”。
4.3.2.1. 使用安全自定义资源(CR)配置默认的 JAAS 登录模块 复制链接链接已复制到粘贴板!
以下流程演示了如何使用安全自定义资源(CR)配置默认的 JAAS 登录模块。
先决条件
您必须已安装了 AMQ Broker Operator。有关安装 Operator 的两个替代方法的详情,请参考:
- 您应该熟悉代理安全性,如 保护代理所述
您可以在创建代理部署前或之后部署安全 CR。但是,如果您在创建代理部署后部署了安全 CR,代理 pod 会重启以接受新配置。
开始配置自定义资源(CR)实例,以定义代理部署的用户和相关安全配置。
使用 OpenShift 命令行界面:
以具有特权在项目中为代理部署 CR 的用户身份登录 OpenShift。
oc login -u <user> -p <password> --server=<host:port>
oc login -u <user> -p <password> --server=<host:port>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑部署的 CR。
oc edit ActiveMQArtemis <CR instance name> -n <namespace>
oc edit ActiveMQArtemis <CR instance name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 OpenShift Container Platform Web 控制台:
- 以具有特权在项目中为代理部署 CR 的用户登录到控制台。
-
在左侧窗格中,点
。 - 点 Red Hat Integration - AMQ Broker for RHEL 8 (Multiarch) operator。
- 点 AMQ Broker 选项卡。
- 单击 ActiveMQArtemis 实例名称的名称
点 YAML 标签。
在控制台中,会打开 YAML 编辑器,供您配置 CR 实例。
在 CR 的
spec部分中,添加一行来定义用户和角色。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意始终为上例中的元素指定值。例如,如果您没有为
securityDomains.brokerDomain或 role 指定值,则生成的配置可能会导致意外的结果。以上配置定义了两个用户:
-
名为
prop-module的propertiesLoginModule,它定义了名为sam的用户,角色名为sender。 -
名为
prop-module的propertiesLoginModule,它定义了一个名为rob的用户,角色名为receiver。
这些角色的属性在
securityDomains的brokerDomain和broker部分中定义。例如,定义了send角色,以允许具有该角色的用户在任何地址上创建持久队列。默认情况下,配置适用于当前命名空间中 CR 定义的所有部署代理。要将配置限制到特定的代理部署,请使用 第 8.1.3 节 “安全自定义资源配置参考” 中描述的applyToCrNames选项。注意在
metadata部分中,您需要包含namespace属性,且仅在 使用 OpenShift Container Platform Web 控制台创建 CR 实例时才指定值。您应指定的值是代理部署的 OpenShift 项目的名称。-
名为
部署 CR 实例。
使用 OpenShift 命令行界面:
- 保存 CR 文件。
切换到代理部署的项目。
oc project <project_name>
$ oc project <project_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 CR 实例。
oc create -f <path/to/security_custom_resource_instance>.yaml
$ oc create -f <path/to/security_custom_resource_instance>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 OpenShift Web 控制台:
- 配置完 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 文件中插入它。
流程
使用
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
oc create secret generic security-properties-prop-module \ --from-literal=sam=samspassword \ --from-literal=rob=robspasswordCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 CR 的
spec部分中,添加您在 secret 中指定的用户名以及角色信息,但不包括每个用户的密码。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 部署 CR 实例。
使用 OpenShift 命令行界面:
- 保存 CR 文件。
切换到代理部署的项目。
oc project <project_name>
$ oc project <project_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 CR 实例。
oc create -f <path/to/address_custom_resource_instance>.yaml
$ oc create -f <path/to/address_custom_resource_instance>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 OpenShift Web 控制台:
- 完成配置 CR 后,点 Create。
其他资源
如需有关 OpenShift Container Platform 中 secret 的更多信息,请参阅 OpenShift Container Platform 文档中的 向 pod 提供敏感数据。