ActiveMQ Artemis用户无法删除队列(AMQ229213)权限配置咨询
ActiveMQ Artemis 队列删除权限配置问题
我正在ActiveMQ Artemis中创建仅具备特定队列删除权限的用户,已为该用户配置目标队列的deleteNonDurableQueue权限,执行Artemis CLI命令:
amq-broker queue delete --url url --user testuser_queue_delete_allow --password password --name queue.foo.bar
触发AMQ229213错误:
Exception in thread "main" ActiveMQSecurityException[errorType=SECURITY_EXCEPTION message=AMQ229213: User: testuser does not have permission=CREATE_ADDRESS for queue activemq.management.59973261-566f-4600-a0f6-1820c30f8727 on address activemq.management.59973261-566f-4600-a0f6-1820c30f8727] at ...
我尚未完全理解其权限模型,之前为testuser配置了activemq.management.#的manage、deleteNonDurableQueue等权限,但该用户似乎能删除所有队列,这是否正常?能否将删除权限限制为仅单个队列?
更新说明
Artemis运行于Kubernetes环境,由activemq-artemis-operator配置,以下为修改后的配置文件(队列名已更新为queue.foo.bar):
/etc/login.config
activemq { org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule sufficient org.apache.activemq.jaas.properties.user="artemis-users.properties" org.apache.activemq.jaas.properties.role="artemis-roles.properties"; };
/etc/broker.xml
<security-settings> <security-setting match="#"> <permission type="createNonDurableQueue" roles="testrole.queue.create.allow"/> </security-setting> <security-setting match="queue.foo.#"> <permission type="send" roles="testrole.queue.create.allow"/> <permission type="deleteDurableQueue" roles="testrole.queue.delete.allow"/> <permission type="deleteNonDurableQueue" roles="testrole.queue.delete.allow"/> </security-setting> </security-settings>
/etc/artemis-users.properties
admin = password testuser_queue_create_allow = password testuser_queue_delete_allow = password
/etc/artemis-roles.properties
admin = admin testrole.queue.delete.allow = testuser_queue_delete_allow testrole.queue.create.allow = testuser_queue_create_allow
问题分析与解决方案
1. AMQ229213错误原因
CLI执行队列删除操作时,会临时创建一个管理队列(即错误信息中的activemq.management.xxx)用于和broker交互,这个队列对应的地址需要CREATE_ADDRESS权限。当前配置未给删除用户分配该权限,因此触发安全异常。
2. 限制删除权限为单个队列的配置方法
要实现仅允许用户删除指定队列,需调整broker.xml的安全配置:
- 给删除用户分配管理队列所需的基础权限,限制到
activemq.management.#地址; - 精准指定目标队列的删除权限,避免使用
#通配符导致权限范围过大。
修改后的security-settings示例:
<security-settings> <!-- 允许创建用户创建非持久化队列 --> <security-setting match="#"> <permission type="createNonDurableQueue" roles="testrole.queue.create.allow"/> </security-setting> <!-- 给删除用户分配管理队列的必要权限 --> <security-setting match="activemq.management.#"> <permission type="createAddress" roles="testrole.queue.delete.allow"/> <permission type="createNonDurableQueue" roles="testrole.queue.delete.allow"/> <permission type="deleteNonDurableQueue" roles="testrole.queue.delete.allow"/> </security-setting> <!-- 仅允许删除用户操作指定队列 --> <security-setting match="queue.foo.bar"> <permission type="deleteDurableQueue" roles="testrole.queue.delete.allow"/> <permission type="deleteNonDurableQueue" roles="testrole.queue.delete.allow"/> </security-setting> </security-settings>
3. 之前权限过大的原因
配置activemq.management.#的manage权限时,manage是全能权限,包含几乎所有管理操作(包括删除任意队列),因此用户能删除所有队列属于正常情况,但不符合最小权限原则,应避免直接使用manage权限。
4. 配置验证
修改配置后重启broker,重新执行CLI删除命令:
amq-broker queue delete --url url --user testuser_queue_delete_allow --password password --name queue.foo.bar
此时应能成功删除指定队列,且无法操作其他队列。
内容的提问来源于stack exchange,提问作者zkygr
相关产品推荐
相关产品推荐

