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 时,更改会在不需要重启代理的情况下生效。
-
您可以配置
ActiveMQArtemisSecurity
CRD 中未定义的 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
,正确的密钥会插入到您从文本文件创建的 secret 中。以下是登录模块配置示例: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=anne
Copy 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.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意secret 名称必须具有
-jaas-config
后缀,以便 Operator 可以识别 secret 包含登录模块配置,并将任何更新传播到每个代理 Pod。有关如何创建 secret 的更多信息,请参阅 Kubernetes 文档中的 Secret。
将您创建的 secret 添加到代理部署的自定义资源(CR)实例中。
使用 OpenShift 命令行界面:
- 以具有特权的用户身份登录 OpenShift,以便在代理部署的项目中部署 CR。
编辑部署的 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
元素并添加权限。您可以为单个地址授予角色权限。或者,您可以使用#
符号指定通配符匹配,为所有地址授予角色权限。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在示例中,group2 角色分配为所有地址
发送
权限,并且分配 group1 角色消耗
、createAddress
、createNonDurableQueue
并将权限浏览到
所有地址。注意在 Java 属性文件中,冒号(:)是一个保留字符,用于分隔键/值对中的键和值。如果要向完全限定队列名称(FQQN)授予权限,它由地址名称和以冒号(::)分隔的队列名称组成,则必须使用反斜杠(\)字符来转义 FQQN 中的冒号字符。例如:
spec: ... brokerProperties: - 'securityRoles."my-address\:\:my-queue".group2.send=true'
spec: ... brokerProperties: - 'securityRoles."my-address\:\:my-queue".group2.send=true'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
保存 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 yaml
Copy 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: JaasPropertiesApplied
Copy 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: JaasPropertiesApplied
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
当您在 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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
代理 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 登录模块。
先决条件
您必须已安装了 AMQ Broker Operator。有关安装 Operator 的两个替代方法的详情,请参考:
- 您应该熟悉代理安全性,如安全 代理中所述
您可以在创建代理部署前或之后部署安全 CR。但是,如果您在创建代理部署后部署安全 CR,则会重启代理 pod 以接受新配置。
开始配置自定义资源(CR)实例,以定义用户以及代理部署的关联安全配置。
使用 OpenShift 命令行界面:
以具有特权的用户身份登录 OpenShift,以便在代理部署的项目中部署 CR。
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
或角色值指定值,则生成的配置可能会导致意外的结果。前面的配置定义了两个用户:
-
名为
prop-module
的属性LoginModule
,用于定义名为sam
的用户,角色名为sender
。 -
名为
prop-module
的属性LoginModule
,定义名为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>.yaml
Copy 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=robspassword
Copy 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>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 OpenShift Web 控制台:
- 配置完 CR 后,点 Create。
其他资源
如需有关 OpenShift Container Platform 中 secret 的更多信息,请参阅 OpenShift Container Platform 文档中的 向 pod 提供敏感数据。