5.3. 授权客户端
5.3.1. 客户端授权方法
要授权客户端在代理上执行操作,如创建和删除地址和队列,以及发送和使用消息,您可以使用以下方法:
- 基于用户和基于角色的授权
- 为经过身份验证的用户和角色配置代理安全设置。
- 配置 LDAP 以授权客户端
- 配置 轻量级目录访问协议 (LDAP)登录模块,以处理身份验证和授权。LDAP 登录模块针对存储在中央 X.500 目录服务器中的用户数据检查传入的凭证,并根据用户角色设置权限。
- 配置 Kerberos 以授权客户端
-
配置 Java 认证和授权服务 (JAAS)
Krb5LoginModule
登录模块,将凭证传递给PropertiesLoginModule
或LDAPLoginModule
登录模块,它将 Kerberos 验证的用户映射到 AMQ Broker 角色。
5.3.2. 配置基于用户和基于角色的授权
5.3.2.1. 设置权限
通过 broker.xml
配置文件中的 < security-setting>
; 元素,根据队列(基于其地址)定义权限。您可以在配置文件的 <security-settings>
项中定义多个 <security-setting>
实例。您可以指定一个准确的地址匹配,或者使用数字符号(#
)和星号(*
)通配符字符来定义通配符匹配。
可以为与地址匹配的队列集授予不同的权限。这些权限显示在下表中。
允许用户进行… | 使用此参数… |
---|---|
创建地址 |
|
删除地址 |
|
在匹配地址下创建持久队列 |
|
删除匹配地址下的持久队列 |
|
在匹配地址下创建非持久队列 |
|
删除匹配地址下的非持久队列 |
|
发送消息到匹配地址 |
|
使用绑定到匹配地址的队列中的消息 |
|
通过将管理消息发送到管理地址来调用管理操作 |
|
浏览绑定到匹配地址的队列 |
|
具有对管理操作子集的只读访问权限 |
|
访问变异管理操作,这是任何没有通过 |
|
对于每个权限,您可以指定授予该权限的角色列表。如果给定用户具有任何角色,则它们被授予该地址集合的权限。
以下章节显示了权限的一些配置示例。
5.3.2.1.1. 为单个地址配置消息 production
以下步骤演示了如何为单个地址配置消息生产权限。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
<security-settings>
项中添加一个单一的<security-setting>
项。对于match
键,请指定地址。例如:<security-settings> <security-setting match="my.destination"> <permission type="send" roles="producer"/> </security-setting> </security-settings>
根据上述配置,
制作者
角色的成员具有地址my.destination
的发送
权限。
5.3.2.1.2. 为单个地址配置消息消耗
以下流程演示了如何为单个地址配置消息消耗权限。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
<security-settings>
项中添加一个单一的<security-setting>
项。对于match
键,请指定地址。例如:<security-settings> <security-setting match="my.destination"> <permission type="consume" roles="consumer"/> </security-setting> </security-settings>
根据上述配置,
consumer
角色的成员具有地址my.destination
的consume
权限。
5.3.2.1.3. 在所有地址上配置完整的访问
以下步骤演示了如何配置对所有地址和相关队列的完整访问权限。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
<security-settings>
项中添加一个单一的<security-setting>
项。对于match
键,若要配置为对所有地址的访问,使用数字符号 (#
) 通配符字符。例如:<security-settings> <security-setting match="#"> <permission type="createDurableQueue" roles="guest"/> <permission type="deleteDurableQueue" roles="guest"/> <permission type="createNonDurableQueue" roles="guest"/> <permission type="deleteNonDurableQueue" roles="guest"/> <permission type="createAddress" roles="guest"/> <permission type="deleteAddress" roles="guest"/> <permission type="send" roles="guest"/> <permission type="browse" roles="guest"/> <permission type="consume" roles="guest"/> <permission type="manage" roles="guest"/> </security-setting> </security-settings>
根据上述配置,所有权限都授予所有队列的 guest 角色的成员。这在将匿名身份验证配置为为每个用户分配
guest
角色时非常有用。
其他资源
- 要了解配置更复杂的用例的信息,请参阅 第 5.3.2.1.4 节 “配置多个安全设置”。
5.3.2.1.4. 配置多个安全设置
以下示例步骤演示了如何为匹配的地址集合单独配置多个安全设置。这与本节中前面的示例相反,它演示了如何为 所有地址授予完全访问权限
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
<security-settings>
项中添加一个单一的<security-setting>
项。对于match
键,请包含数字符号(#
)通配符字符,以将设置应用到匹配的地址 集合。例如:<security-setting match="globalqueues.europe.#"> <permission type="createDurableQueue" roles="admin"/> <permission type="deleteDurableQueue" roles="admin"/> <permission type="createNonDurableQueue" roles="admin, guest, europe-users"/> <permission type="deleteNonDurableQueue" roles="admin, guest, europe-users"/> <permission type="send" roles="admin, europe-users"/> <permission type="consume" roles="admin, europe-users"/> </security-setting>
match=globalqueues.europe.#
-
数字符号(
#
)通配符字符由代理解释为"任意单词序列"。单词用句点(.
)分隔。在本例中,安全设置适用于以字符串 globalqueues.europe开头的任何地址。 permission type="createDurableQueue"
-
只有具有
admin
角色的用户才能创建或删除绑定到字符串 globalqueues.europe的地址的持久队列。 permission type="createNonDurableQueue"
-
具有
admin
、guest
或europe-users
角色的任何用户可以创建或删除绑定到字符串 globalqueues.europe的地址的临时队列。 permission type="send"
-
具有
admin
或europe-users
角色的任何用户可以发送消息到绑定到字符串 globalqueues.europe的地址的队列。 permission type="consume"
-
具有
admin
或europe-users
角色的任何用户都可以使用绑定到以字符串 globalqueues.europe开头的队列的消息。
(可选) 要将不同的安全设置应用到更严格的地址集合,请添加另一个 <
security-setting>
元素。对于match
键,请指定更具体的文本字符串。例如:<security-setting match="globalqueues.europe.orders.#"> <permission type="send" roles="europe-users"/> <permission type="consume" roles="europe-users"/> </security-setting>
在第二个
security-setting
元素中,globalqueues.europe.orders.#
的匹配比第一个security-setting
元素中的globalqueues.europe.#
匹配更加具体。对于与globalqueues.europe.orders.#
匹配的任何地址,权限createDurableQueue
,deleteDurableQueue
,createNonDurableQueue
,deleteNonDurableQueue
不是从文件的第一个security-setting
元素继承的。例如,对于地址globalqueues.europe.orders.plastics
,唯一存在的权限为europe-users
发送
和使用
。因此,因为一个
security-setting
块中指定的权限不会被另一个继承,因此您可以通过不指定这些权限,实际上可以有效地拒绝更具体的security-setting
块中的权限。
5.3.2.1.5. 使用用户配置队列
自动创建队列时,会为队列分配连接客户端的用户名。此用户名作为元数据包含在队列中。名称由 JMX 和 AMQ Broker 管理控制台公开。
以下流程演示了如何将用户名添加到您在代理配置中手动定义的队列中。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 对于给定队列,
添加用户
密钥。分配一个值。例如:<address name="ExampleQueue"> <anycast> <queue name="ExampleQueue"> <user>admin</user> </queue> </anycast> </address>
根据前面的配置,
admin
用户分配到队列ExampleQueue
。
- 在队列中配置用户不会更改该队列的任何安全语义 - 它仅用于该队列的元数据。
用户之间的映射及其已由称为 安全管理器 的组件处理的角色。安全管理器从存储在代理的属性文件中读取用户凭证。默认情况下,AMQ Broker 使用
org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager
安全管理器。此默认安全管理器提供与 JAAS 和 Red Hat JBoss Enterprise Application Platform (JBoss EAP)安全性的集成。要了解如何 使用自定义 安全管理器,请参阅 第 5.6.2 节 “指定自定义安全管理器”。
5.3.2.2. 配置基于角色的访问控制
基于角色的访问控制 (RBAC)用于限制对 MBeans 属性和方法的访问。Mbeans 是 AMQ Broker 公开管理 API 的方式,以支持管理操作。
您可以使用以下方法之一限制对 MBeans 的访问:
-
在
management.xml
文件中配置authorisation
元素,这是默认方法。 -
在
broker.xml
文件中配置安全设置。
与更新 management.xml
文件时,您不需要在更改 broker.xml
文件中的安全设置后重启代理。
5.3.2.2.1. 在 management.xml
文件中配置基于角色的访问控制。
为管理操作配置基于角色访问控制的默认方法是,在 management.xml
文件中配置 authorisation
元素。
以下示例步骤演示了如何将角色映射到特定的 MBeans 及其属性和方法。
先决条件
- 您定义的用户和角色。更多信息请参阅 第 5.2.2.1 节 “配置基本用户和密码身份验证”。
流程
-
打开 &
lt;broker_instance_dir> /etc/management.xml
配置文件。 搜索
role-access
元素并编辑配置。例如:<role-access> <match domain="org.apache.activemq.artemis"> <access method="list*" roles="view,update,amq"/> <access method="get*" roles="view,update,amq"/> <access method="is*" roles="view,update,amq"/> <access method="set*" roles="update,amq"/> <access method="*" roles="amq"/> </match> </role-access>
-
在本例中,匹配应用于具有域名
org.apache.activemq.apache
的任何 MBean 属性。 -
访问
view
,update
, 或amq
角色来匹配 MBean 属性由您添加到角色的list*
,get*
,set*
,is*
, 和*
访问方法控制。method="*"
(通配符) 语法作为一个 catch-all 的方式,适用于没有在配置中列出的所有其他方法。配置中的每个访问方法都会转换为 MBean 方法调用。 -
调用的 MBean 方法与配置中列出的方法匹配。例如,如果您在带有
org.apache.activemq.artemis
域的 MBean 上调用名为listMessages
的方法,则代理会将访问权限匹配回列表
方法配置中定义的角色。 您还可以使用完整的 MBean 方法名称配置访问权限。例如:
<access method="listMessages" roles="view,update,amq"/>
-
在本例中,匹配应用于具有域名
启动或重启代理。
-
在 Linux: &
lt;broker_instance_dir> /bin/artemis run
在 Windows 上:
<broker_instance_dir> \bin\artemis-service.exe start
您还可以通过添加与 MBean 属性匹配的
key
属性来匹配域中的特定 MBeans。
-
在 Linux: &
5.3.2.2.1.1. 基于角色的访问示例
本节演示了以下应用基于角色的访问控制的示例:
以下示例演示了如何使用 key
属性将角色映射到指定域中的所有队列。
<match domain="org.apache.activemq.artemis" key="subcomponent=queues"> <access method="list*" roles="view,update,amq"/> <access method="get*" roles="view,update,amq"/> <access method="is*" roles="view,update,amq"/> <access method="set*" roles="update,amq"/> <access method="*" roles="amq"/> </match>
以下示例演示了如何使用 key
属性将角色映射到特定的名为 queue。在本例中,命名队列为 exampleQueue
。
<match domain="org.apache.activemq.artemis" key="queue=exampleQueue"> <access method="list*" roles="view,update,amq"/> <access method="get*" roles="view,update,amq"/> <access method="is*" roles="view,update,amq"/> <access method="set*" roles="update,amq"/> <access method="*" roles="amq"/> </match>
以下示例演示了如何将角色映射到名称包含指定前缀的每个队列。在本例中,使用星号(*
)通配符运算符匹配所有以前缀 example 开头的队列名称。
<match domain="org.apache.activemq.artemis" key="queue=example*"> <access method="list*" roles="view,update,amq"/> <access method="get*" roles="view,update,amq"/> <access method="is*" roles="view,update,amq"/> <access method="set*" roles="update,amq"/> <access method="*" roles="amq"/> </match>
您可能想要对同一属性的不同集合(例如,不同的队列集合)以不同的方式映射角色。在这种情况下,您可以在配置文件中包含多个 匹配
元素。但是,可以在同一域中有多个匹配项。
例如,假设两个 & lt;match&
gt; 元素配置如下:
<match domain="org.apache.activemq.artemis" key="queue=example*">
和
<match domain="org.apache.activemq.artemis" key="queue=example.sub*">
基于此配置,org.apache.activemq.artemis
域中的名为 example.sub.queue
的队列与两个通配符键表达式匹配。因此,代理需要一个优先方案来决定哪组角色映射到队列;在第一个 match
项中指定的角色,或在第二个 match
项中指定的角色。
当同一域中有多个匹配项时,代理会在映射角色时使用以下优先级方案:
- 完全匹配优先于通配符匹配
- 较长的通配符匹配优先于较短的通配符匹配
在本例中,因为较长的通配符表达式与 example.sub.queue
的队列名称匹配,所以代理会应用第二个 < match
> 元素中配置的 role-mapping。
default-access
元素是每个方法调用的一个 catch-all 元素,它不使用 role-access
或 whitelist
配置进行处理。default-access
和 role-access
元素具有相同的 match
元素语义。
5.3.2.2.1.2. 配置 allowlist
元素
allowlist 是一组预先批准的域或 MBeans,不需要用户身份验证。您可以提供域列表或 MBeans 列表,或两者必须绕过身份验证。例如,您可以使用 允许列表
来指定运行 AMQ Broker 管理控制台所需的任何 MBeans。
以下示例流程演示了如何配置 allowlist
元素。
流程
-
打开 &
lt;broker_instance_dir> /etc/management.xml
配置文件。 搜索
allowlist
元素并编辑配置:<allowlist> <entry domain="hawtio"/> </allowlist>
在本例中,任何带有域
hawtio
的 MBean 都被允许在没有身份验证的情况下访问。您还可以对 MBean 属性使用 <entry domain="hawtio" key="typePROFILE"
/> 形式的通配符条目。启动或重启代理。
-
在 Linux: &
lt;broker_instance_dir> /bin/artemis run
-
在 Windows 上:
<broker_instance_dir> \bin\artemis-service.exe start
-
在 Linux: &
5.3.2.2.2. 在 broker.xml
文件中配置基于角色的访问控制
您可以在 broker.xml
文件中为管理操作配置基于角色的访问控制,而不是 management.xml
文件。对 broker.xml
文件中的权限更新不需要代理重启才能生效。
在 broker.xml
文件中,您可以为管理操作授予 view
或 edit
权限。特定管理操作可供具有
权限的角色使用,由预定义的正则表达式控制。任何匹配正则表达式的操作都可以由具有 查看或编辑
view
权限的角色访问,所有其他操作都需要 编辑权限
。
先决条件
- 您定义的用户和角色。更多信息请参阅 第 5.2.2.1 节 “配置基本用户和密码身份验证”。
流程
从
management.xml
文件中删除authorisation
元素配置,以防止代理使用此文件中的默认 RBAC 配置。-
编辑 &
lt;broker_instance_dir>/etc/management.xml
文件。 -
从文件中删除
authorisation
元素配置。 -
保存 &
lt;broker_instance_dir>/etc/management.xml
文件。
-
编辑 &
在代理 JVM 中添加环境变量,将代理配置为使用
broker.xml
文件中的 RBAC 配置。-
打开 &
lt;broker_instance_dir>/etc/artemis.profile
文件。 在 Java 系统参数的
JAVA_ARGS 列表
中添加以下参数:-Djavax.management.builder.initial=org.apache.activemq.artemis.core.server.management.ArtemisRbacMBeanServerBuilder
-
保存
artemis.profile
文件。
-
打开 &
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
文件,以配置 RBAC 来管理操作。 搜索
security-settings
元素,再为管理操作添加一个security-setting
元素。管理操作的匹配地址的格式是:
<_management-rbac-prefix_>.<_resource type_>.<_resource name_>.<_operation_>
management-rbac-prefix
参数的默认值为mops
。在以下示例 RBAC 配置中,匹配地址中的数字符号(#)将
admin
角色视图
和编辑
权限授予所有 MBeans。<security-settings> .. <security-setting match="mops.#"> <permission type="view" roles="admin"/> <permission type="edit" roles="admin"/> </security-setting> .. </security-setting>
-
保存 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。
其他管理操作的基于角色的访问控制示例
以下示例将 管理器
角色 视图
和编辑权限授予
activemq.management
地址。操作位置中的星号 packagemanifests 授予对所有操作的访问权限。
<security-setting match="mops.address.activemq.management.*"> <permission type="view" roles="manager"/> </security-setting>
以下示例有一个空角色列表,它拒绝所有用户使用代理 MBean 执行指定操作的权限 forceFailover
。
<security-setting match="mops.broker.forceFailover"> <permission type="edit" roles=""/> </security-setting>
5.3.2.3. 设置资源限值
有时,设置特定限制会超出与授权和身份验证相关的普通安全设置以外的特定限制。
5.3.2.3.1. 配置连接和队列限制
以下示例步骤演示了如何限制用户可以创建的连接和队列的数量。
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 添加
resource-limit-settings
元素。为max-connections
和max-queues
指定值。例如:<resource-limit-settings> <resource-limit-setting match="myUser"> <max-connections>5</max-connections> <max-queues>3</max-queues> </resource-limit-setting> </resource-limit-settings>
max-connections
-
定义匹配用户可以在代理上创建的会话数量。默认值为
-1,
这意味着没有限制。如果要限制会话数量,请考虑从 AMQ 核心协议 JMS 客户端到代理的连接会创建两个会话。 max-queues
-
定义匹配用户可以创建的队列数。默认值为
-1,
这意味着没有限制。
与您可以在代理配置的 address-setting
元素中指定的 匹配
字符串不同,您在 resource-limit-settings
中指定的匹配字符串 无法使用 通配符语法。相反,匹配字符串会定义将资源限值设置应用到的特定用户。