rocketmq icon indicating copy to clipboard operation
rocketmq copied to clipboard

[Bug] Bug title ACL 2.0 无法正常开启

Open zergduan opened this issue 1 year ago • 2 comments

Before Creating the Bug Report

  • [X] I found a bug, not just asking a question, which should be created in GitHub Discussions.

  • [X] I have searched the GitHub Issues and GitHub Discussions of this repository and believe that this is not a duplicate.

  • [X] I have confirmed that this bug belongs to the current repository, not other repositories of RocketMQ.

Runtime platform environment

Oracle Linux 9

RocketMQ version

5.3.0

JDK Version

OpenJDK 21

Describe the Bug

无法正常开启 ACL 2.0

Steps to Reproduce

使用传统架构(不启动Proxy,Broker 2主+2从,NameServer * 2 ),使用以下步骤开启 ACL 2.0:

  1. 修改 broker 的 conf 文件,添加以下内容: aclEnable=true authenticationEnabled = true authenticationProvider = org.apache.rocketmq.auth.authentication.provider.DefaultAuthenticationProvider initAuthenticationUser = {"username":"rocketmq","password":"admin#123"} innerClientAuthenticationCredentials = {"accessKey":"rocketmq","secretKey":"admin#123"} authenticationMetadataProvider = org.apache.rocketmq.auth.authentication.provider.LocalAuthenticationMetadataProvider authorizationEnabled = true authorizationProvider = org.apache.rocketmq.auth.authorization.provider.DefaultAuthorizationProvider authorizationMetadataProvider = org.apache.rocketmq.auth.authorization.provider.LocalAuthorizationMetadataProvider

  2. 重启 broker 进程

  3. 修改 mqadmin 客户端配置文件 $ROKETMQ_HOME/conf/tools.yml ...... #accessKey: rocketmq2 #secretKey: 12345678 accessKey: rocketmq secretKey: admin#123 ......

  4. 在 mqadmin 客户端执行命令查询 ACL配置: ./mqadmin listacl
    --namesrvAddr <NameServer_IP>:<NameServer_Port>
    --clusterName <ClusterName>

4.1 当 mqadmin 客户端为 NameServer 或 Broker 时, ./mqadmin listacl
--namesrvAddr <NameServer_IP>:<NameServer_Port>
--clusterName <ClusterName> 可以正常返回结果

4.2 当 mqadmin 客户端不是 NameServer 和 Broker 时(非RocketMQ集群中的节点), ./mqadmin listacl
--namesrvAddr <NameServer_IP>:<NameServer_Port>
--clusterName <ClusterName> 返回报错:

org.apache.rocketmq.tools.command.SubCommandException: ListAclSubCommand command failed at org.apache.rocketmq.tools.command.auth.ListAclSubCommand.execute(ListAclSubCommand.java:114) at org.apache.rocketmq.tools.command.MQAdminStartup.main0(MQAdminStartup.java:177) at org.apache.rocketmq.tools.command.MQAdminStartup.main(MQAdminStartup.java:127) Caused by: org.apache.rocketmq.client.exception.MQBrokerException: CODE: 1 DESC: org.apache.rocketmq.acl.common.AclException: No acl config for rocketmq, org.apache.rocketmq.acl.plain.PlainPermissionManager.validate(PlainPermissionManager.java:606) For more information, please visit the url, https://rocketmq.apache.org/docs/bestPractice/06FAQ at org.apache.rocketmq.client.impl.MQClientAPIImpl.listAcl(MQClientAPIImpl.java:3492) at org.apache.rocketmq.tools.admin.DefaultMQAdminExtImpl.listAcl(DefaultMQAdminExtImpl.java:1998) at org.apache.rocketmq.tools.admin.DefaultMQAdminExt.listAcl(DefaultMQAdminExt.java:941) at org.apache.rocketmq.tools.command.auth.ListAclSubCommand.execute(ListAclSubCommand.java:104)

What Did You Expect to See?

期望可以正常获得 ACL和用户配置

What Did You See Instead?

返回报错,rocketmq用户没有默认的ACL配置,没有权限运行 mqadmin

Additional Context

不理解 ACL 2.0 的底层逻辑~

按照文档描述开启 ACL 2.0 修改broker参数,将 initAuthenticationUser 和 innerClientAuthenticationCredentials 设置为 rocketmq,并自定义这个用户的 secretKey(不使用默认的 12345678); 在mqadmin客户端修改 tools.yml 的配置,指定设置的 rocketmq 作为认证用户连接NameServer,使用 mqadmin 命令调用 ACL 2.0 API 查看默认 ACL 配置

当 mqadmin 客户端不是 nameserver 时,报错rocketmq没有ACL配置。。。我有以下问题:

  1. initAuthenticationUser 和 innerClientAuthenticationCredentials 有什么区别? 在使用上有什么不同?是否有文档说明? 按照我的理解: a. initAuthenticationUser 指定一个集群启动时自动创建的用户/密码( AK/SK) b. innerClientAuthenticationCredentials 设置了节点之间可以用于管理认证/鉴权的管理员账号 也就是说,当我设置 initAuthenticationUser = rocketmq / admin#123,那么只需要将 innerClientAuthenticationCredentials 设置为 rocketmq 既可以,这样就可以保证以下策略: 集群节点间 ( Nameserver - broker 之间,Proxy - broker之间) 可以使用 rocketmq 这个用户来进行 账户和权限的配置和读取。

但是为什么 innerClientAuthenticationCredentials 需要同时设置 AK 和 SK? 如果initAuthenticationUser 和 innerClientAuthenticationCredentials 的 AK 设置相同,但是SK设置不同会怎么样???,例如:

initAuthenticationUser = {"username":"rocketmq","password":"admin#123"} innerClientAuthenticationCredentials = {"accessKey":"rocketmq","secretKey":"XXXXX"}

如果按照上面的配置会出现什么样的行为? rocketmq 这个用户的 SK到底是哪个??

  1. 我理解 initAuthenticationUser 用户默认创建用户(AK/SK),应该用于 mqadmin 来设置其它 AK/SK 和对应 ACL配置,但是为什么这个 initAuthenticationUser 指定的用户没有默认的管理员权限(使用时报错 No acl config for rocketmq)
  2. 既然 ACL 2.0 取消了 白名单,那么 默认用户 initAuthenticationUser 应该默认授权管理员权限,否则如何进行其它用户的相关认证权限配置?是不是我理解错了?

zergduan avatar Sep 30 '24 05:09 zergduan

Hello @zergduan , please refer to: https://mp.weixin.qq.com/s/g_CUAXrzQ1TQhIDrhX-zkw

yx9o avatar Oct 01 '24 06:10 yx9o

Hello @zergduan , please refer to: https://mp.weixin.qq.com/s/g_CUAXrzQ1TQhIDrhX-zkw

感谢您的回复,我参考了您提供的内容找到了问题原因:

问题1. 当 mqadmin 客户端是 NameServer 和 Broker 时(非RocketMQ集群中的节点), mqadmin listacl 可以正常返回结果; 当 mqadmin 客户端不是 NameServer 和 Broker 时(非RocketMQ集群中的节点), mqadmin listacl 返回报错 org.apache.rocketmq.acl.common.AclException: No acl config for rocketmq

结论: 因为我的Broker参数中同时启用了 ACL 1.0 和 ACL 2.0,如下: aclEnable=true authenticationEnabled = true 并且ACL 1.0配置文件plain_acl.yml中将broker和nameserver节点设置到白名单中,且 rocketmq 这个用户并不存在于 plain_acl.yml中;目前测试已知当 ACL 1.0 和 2.0 同时启用时,有如下行为: a. 认证过程同时参考 ACL 1.0 和 2.0 的配置,即: 当mqadmin客户端在ACL 1.0 白名单中时,可以通过认证;当mqadmin客户端不在ACL 1.0的白名单且用户名不存在于ACL1.0的account中,但是用户名存在于在ACL 2.0配置中时,也可以完成认证。 b. 鉴权过程优先使用 ACL 1.0,即: 当访问用户名在ACL 2.0存在ACL配置,但是此用户名在 ACL 1.0 中不存在 ACL 配置时,此用户无法通过鉴权,会报错 No acl config for <用户名>;也就是说ACL 1.0的配置优先进行鉴权,当鉴权失败后,不会再进行ACL 2.0的鉴权。

问题2. initAuthenticationUser 和 innerClientAuthenticationCredentials 有什么区别? 在使用上有什么不同?

结论: initAuthenticationUser 仅设置于 Broker中,它随Broker启动被创建,默认super类型(最高权限),即此配置为服务端配置; innerClientAuthenticationCredentials 设置于 Broker 和 Proxy 中,即此配置为客户端配置,当 Broker 和 Proxy 访问集群中其它Broker时,将发送这个信息(AK/SK),访问Broker收到此信息后将与ACL配置中的用户对比来完成认证和鉴权。

zergduan avatar Oct 10 '24 02:10 zergduan

This issue is stale because it has been open for 365 days with no activity. It will be closed in 3 days if no further activity occurs.

github-actions[bot] avatar Oct 11 '25 00:10 github-actions[bot]

This issue was closed because it has been inactive for 3 days since being marked as stale.

github-actions[bot] avatar Oct 14 '25 00:10 github-actions[bot]