5.3. 授权客户端
5.3.1. 客户端授权方法
要授权客户端对代理执行操作,如创建和删除地址和队列,以及发送和接收消息,您可以使用以下方法:
- 基于用户和角色的授权
- 为经过身份验证的用户和角色配置代理安全设置。
- 配置 LDAP 以授权客户端
- 配置 轻量级目录访问协议( LDAP)登录模块,以处理身份验证和授权。LDAP 登录模块会根据存储在中央 X.500 目录服务器中的用户数据检查传入的凭据,并根据用户角色设置权限。
- 配置 Kerberos 以授权客户端
-
配置 Java 身份验证和授权服务 (JAAS) K
rb5LoginModule
登录模块,将凭证传递给PropertiesLoginModule
或LDAPLoginModule
登录模块,它将 Kerberos 验证的用户映射到 AMQ Broker 角色。
5.3.2. 配置基于用户和角色的授权
5.3.2.1. 设置权限
权限通过 broker.xml
配置文件中的 < security-setting&
gt; 元素根据队列(基于其地址)定义。您可以在配置文件的 <security-settings>
项中定义多个 <security-setting>
实例。您可以指定一个准确的地址匹配,或者使用数字符号(#
)和星号(*
)通配符字符来定义通配符匹配。
可将不同的权限提供给与地址匹配的队列集合。这些权限显示在下表中。
允许用户… | 使用此参数… |
---|---|
创建地址 |
|
删除地址 |
|
在匹配地址下创建一个持久队列 |
|
删除匹配地址下的持久队列 |
|
在匹配地址下创建一个不可配置队列 |
|
在匹配地址下删除不可配置队列 |
|
发送消息到匹配的地址 |
|
使用绑定到匹配地址的队列的消息 |
|
通过将管理消息发送到管理地址来调用管理操作 |
|
浏览绑定到匹配地址的队列 |
|
对于每个权限,您可以指定被授予权限的角色列表。如果给定用户有任何角色,则他们被授予该组地址的权限。
以下章节显示了一些权限配置示例。
5.3.2.1.1. 为一个地址配置消息生产
以下流程演示了如何为单个地址配置消息生产权限。
流程
-
打开 &
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
键,请包含数字符号(DSL
)通配符字符,以将设置应用到匹配的地址 集合。例如:<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.#
-
数字符号(
DSL
)通配符字符由代理解释为"任何单词序列"。词语用句点(.
)分隔。在本例中,安全设置适用于以字符串 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
发送
和使用
。因此,由于在一个
安全设置
块中指定的权限不会被另一个继承,因此您可以通过不指定这些权限来有效地拒绝更具体的安全设置
块的权限。
5.3.2.1.5. 使用用户配置队列
自动创建队列时,队列将被分配连接客户端的用户名。此用户名作为元数据包含在队列中。名称由 JMX 和 AMQ Broker 管理控制台公开。
以下流程演示了如何在代理配置中手动定义的队列中添加用户名。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 对于给定队列,
添加用户
密钥。分配一个值。例如:<address name="ExampleQueue"> <anycast> <queue name="ExampleQueue" user="admin"/> </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 属性和方法的访问。RBAC 可让管理员根据角色为所有用户授予正确的访问权限,如 Web 控制台、管理界面和核心信息等。
5.3.2.2.1. 配置基于角色的访问控制
以下示例演示了如何将角色映射到特定的 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
的方法,那么代理会将访问权限与list
方法配置中定义的角色匹配。 您还可以使用完整的 MBean 方法名称来配置访问。例如:
<access method="listMessages" roles="view,update,amq"/>
-
在本例中,匹配项应用于具有域名
启动或重启代理。
-
On Linux:
<broker_instance_dir>/bin/artemis run
-
在 Windows 上:
<broker_instance_dir> \bin\artemis-service.exe start
-
On Linux:
您还可以通过添加与 MBean 属性匹配的 key
属性来匹配域中的特定 MBeans。
5.3.2.2.2. 基于角色的访问示例
本节显示了应用基于角色的访问控制的示例:
以下示例演示了如何使用 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 的特定角色。在本例中,命名的 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>
您可能希望为同一属性的不同集合(例如,不同的队列集合)来映射角色。在这种情况下,您可以在配置文件中包含多个 match
元素。但是,就可以在同一域中有多个匹配项。
例如,假设配置了两个 < ;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.3. 配置 whitelist 元素
白名单是一组预先批准的域或 MBeans,不需要用户身份验证。您可以提供必须绕过身份验证的域列表或 MBeans 列表。例如,您可以使用白名单来指定 AMQ Broker 管理控制台要运行的任何 MBeans。
以下示例演示了如何配置 whitelist
元素。
流程
-
打开 &
lt;broker_instance_dir> /etc/management.xml
配置文件。 搜索
whitelist
元素并编辑配置:<whitelist> <entry domain="hawtio"/> </whitelist>
在本例中,任何具有域
hawtio
的 MBean 都被允许访问,而无需身份验证。您也可以使用 <entry domain="hawtio" key="type=rhacm"/>
形式的通配符条目来匹配 MBean 属性。启动或重启代理。
-
On Linux:
<broker_instance_dir>/bin/artemis run
-
在 Windows 上:
<broker_instance_dir> \bin\artemis-service.exe start
-
On Linux:
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
元素中指定的 match
字符串不同,您在 resource-limit-settings
中指定的 match
字符串 无法使用 通配符语法。相反,Match 字符串定义将资源限值设置应用到的特定用户。