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>
实例。您可以指定准确的地址匹配,也可以使用数字符号(#
)和星号(*
)通配符定义通配符匹配。
可以向与地址匹配的队列授予不同的权限。这些权限在下表中显示。
允许用户进入… | 使用此参数… |
---|---|
创建地址 |
|
删除地址 |
|
在匹配的地址下创建一个持久队列 |
|
删除匹配地址下的持久队列 |
|
在匹配的地址下创建不可durable 队列 |
|
删除匹配地址下的不可durable 队列 |
|
向匹配的地址发送消息 |
|
使用来自绑定到匹配地址的队列的消息 |
|
通过将管理消息发送到管理地址调用管理操作 |
|
浏览绑定到匹配地址的队列 |
|
对于每个权限,您可以指定授予该权限的角色列表。如果给定用户具有任何角色,则会授予他们该组地址的权限。
下面的部分显示了一些权限配置示例。
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>
根据上述配置,所有权限都将赋予所有 队列的客户机 角色的成员。这在配置了匿名身份验证以为每个用户分配
客户机
角色的开发场景中很有用。
其他资源
- 要了解如何配置更复杂的用例,请参阅 第 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开头的任何地址。 权限类型="createDurableQueue"
-
只有具有
admin
角色的用户才能创建或删除 durable 队列,绑定到以字符串 globalqueues.europe开头的地址。 权限类型="createNonDurableQueue"
-
任何具有
admin
、guest
或europe-users
角色的用户都可以创建或删除绑定到字符串 globalqueues.europe开头的临时队列。 权限类型="send"
-
具有
admin
或europe-users
角色的任何用户可以发送消息到绑定到以字符串 globalqueues.europe开头的地址的队列。 权限类型="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.#
match 比第一个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"/> </anycast> </address>
根据上述配置,
admin
用户分配给队列ExampleQueue
。
- 在队列中配置用户不会更改该队列的任何安全语义 - 它仅用于该队列中的元数据。
用户与角色之间的映射,由名为 安全管理器 的组件处理。安全管理器从存储在代理上的属性文件中读取用户凭据。默认情况下,AMQ Broker 使用
org.apache.activemq.artemis.spi.security.security.ActiveMQJAASSecurityManager
安全管理器。此默认安全管理器与红帽 JBoss 企业应用平台(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>
-
在本例中,匹配应用到任何 MBean 属性,其域名为
org.apache. located.apache.apache.apache
。 -
访问
view
,update
, 或amq
角色来匹配 MBean 属性由您添加到角色的list*
,get*
,set*
,is*
, 和*
访问方法控制。方法="*"
(wildcard)语法用作一种捕获方式,用于指定配置中没有列出的所有其他方法。配置中的每个访问方法都会转换为 MBean 方法调用。 -
调用的 MBean 方法与配置中列出的方法匹配。例如,如果您在带有
org.apache.activemq.artemis
域的 MBean 上调用listMessages
的方法,则代理将访问返回到列表
方法配置中定义的角色。 您还可以使用完整的 MBean 方法名称配置访问权限。例如:
<access method="listMessages" roles="view,update,amq"/>
-
在本例中,匹配应用到任何 MBean 属性,其域名为
启动或重启代理。
-
在 Linux: &
lt;broker_instance_dir> /bin/artemis run
-
在 Windows: &
lt;broker_instance_dir> \bin\artemis-service.exe start
-
在 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
属性将角色映射到特定的命名队列。在本例中,named 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&
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。
以下示例流程演示了如何配置 白名单
元素。
流程
-
打开 &
lt;broker_instance_dir> /etc/management.xml
配置文件。 搜索
whitelist
元素并编辑配置:<whitelist> <entry domain="hawtio"/> </whitelist>
在这个示例中,任何带有域
hawtio
的 MBean 被允许在没有身份验证的情况下进行访问。您还可以为 MBean 属性使用表单 <entry domain="hawtio" key="type=*"/&
gt; 的通配符条目来匹配。启动或重启代理。
-
在 Linux: &
lt;broker_instance_dir> /bin/artemis run
-
在 Windows: &
lt;broker_instance_dir> \bin\artemis-service.exe start
-
在 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
,这表示没有限制。 max-queues
-
定义匹配用户可以创建的队列数。默认值为
-1
,这表示没有限制。
与您在 代理配置
的 address-setting
元素中指定的匹配字符串不同,您在 resource-limit-settings
中指定的 match
字符串 无法 使用通配符语法。相反,match 字符串会定义一个特定用户,用于应用资源限值设置。