在自己的虛擬機上驗證了一下RocketMQ ACL權限驗證,記錄一下過程。
1、配置前的集群裝填
使用了最簡單的2m-noslave集群進行測試。配置文件如下:
vm1(192.168.29.100)
brokerClusterName=vmlocal brokerName=broker-a brokerId=0 deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH listenPort=10921 brokerIP1=192.168.29.100 namesrvAddr=192.168.29.100:9876;192.168.29.101:9876 autoCreateTopicEnable=false autoCreateSubscriptionGroup=true storePathRootDir=/home/data/rocketmq/rootdir-a-m storePathCommitLog=/home/data/rocketmq/commitlog-a-m storePathConsumerQueue=/home/data/rocketmq/consumequeue-a-m storePathIndex=/home/data/rocketmq/index-a-m storeCheckpoint=/home/data/rocketmq/checkpoint-a-m
vm2(192.168.29.101)
brokerClusterName=vmlocal brokerName=broker-b brokerId=0 deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH listenPort=10921 brokerIP1=192.168.29.101 namesrvAddr=192.168.29.100:9876;192.168.29.101:9876 autoCreateTopicEnable=false autoCreateSubscriptionGroup=true storePathRootDir=/home/data/rocketmq/rootdir-b-m storePathCommitLog=/home/data/rocketmq/commitlog-b-m storePathConsumerQueue=/home/data/rocketmq/consumequeue-b-m storePathIndex=/home/data/rocketmq/index-b-m storeCheckpoint=/home/data/rocketmq/checkpoint-b-m
啟動命令:
vm1:nohup sh /home/rocketmq-all-4.6.1/bin/mqnamesrv >/home/rocketmq-all-4.6.1/logs/mqnamesrv.log & vm2:nohup sh /home/rocketmq-all-4.6.1/bin/mqnamesrv >/home/rocketmq-all-4.6.1/logs/mqnamesrv.log & vm1:nohup sh /home/rocketmq-all-4.6.1/bin/mqbroker -c /home/rocketmq-all-4.6.1/conf/2m-noslave/broker-a.properties >/home/rocketmq-all-4.6.1/logs/broker-a-m.log 2>&1 & vm2:nohup sh /home/rocketmq-all-4.6.1/bin/mqbroker -c /home/rocketmq-all-4.6.1/conf/2m-noslave/broker-b.properties >/home/rocketmq-all-4.6.1/logs/broker-b-m.log 2>&1 &
正常啟動之后:
sh /home/rocketmq-all-4.6.1/bin/mqadmin clusterList -n "192.168.29.100:9876;192.168.29.101:9876"
驗證可以正常生產數據:
驗證可以正常消費數據:
2、開啟權限驗證
修改broker的啟動文件。增加配置項:aclEnable=true
/home/rocketmq-all-4.6.1/conf/2m-noslave/broker-a.properties /home/rocketmq-all-4.6.1/conf/2m-noslave/broker-b.properties
3、確保plain_acl.yml文件存在
我使用的是rocketmq4.6.1版本,解壓縮之后,在conf路徑下就已經有了plain_acl.yml文件,不需要單獨創建。
plain_acl.yml文件內容默認如下:
globalWhiteRemoteAddresses: - 10.10.103.* - 192.168.0.* accounts: - accessKey: RocketMQ secretKey: 12345678 whiteRemoteAddress: admin: false defaultTopicPerm: DENY defaultGroupPerm: SUB topicPerms: - topicA=DENY - topicB=PUB|SUB - topicC=SUB groupPerms: # the group should convert to retry topic - groupA=DENY - groupB=PUB|SUB - groupC=SUB - accessKey: rocketmq2 secretKey: 12345678 whiteRemoteAddress: 192.168.1.* # if it is admin, it could access all resources admin: true
不進行其他修改,重新嘗試生產數據,就發現生產失敗,權限已經生效
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.InternalThreadLocalMap). RocketMQLog:WARN Please initialize the logger system properly. org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still failed, cost [2688]ms, Topic: t3, BrokersSent: [broker-a, broker-b, broker-a] See http://rocketmq.apache.org/docs/faq/ for further details. at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:664) at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1342) at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1288) at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:324) at normal.Producer.main(Producer.java:29) Caused by: org.apache.rocketmq.client.exception.MQBrokerException: CODE: 1 DESC: org.apache.rocketmq.acl.common.AclException: No accessKey is configured, org.apache.rocketmq.acl.plain.PlainPermissionManager.validate(PlainPermissionManager.java:394) For more information, please visit the url, http://rocketmq.apache.org/docs/faq/ at org.apache.rocketmq.client.impl.MQClientAPIImpl.processSendResponse(MQClientAPIImpl.java:709) at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:505) at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:487) at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:431) at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:853) at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:583) ... 4 more
4、plain_acl.yml配置
==globalWhiteRemoteAddresses==
全局白名單,其類型為數組,即支持多個配置。其支持的配置格式如下:
空:表示不設置白名單,該條規則默認返回false。
"*":表示全部匹配,該條規則直接返回true,將會阻斷其他規則的判斷,請慎重使用。
192.168.0.{100,101}:多地址配置模式,ip地址的最后一組,使用{},大括號中多個ip地址,用英文逗號(,)隔開。
192.168.1.100,192.168.2.100:直接使用,分隔,配置多個ip地址。
192.168..或192.168.100-200.10-20:每個IP段使用 "*" 或"-"表示范圍。
==accounts==
配置用戶信息,該類型為數組類型。
【accessKey】
登錄用戶名,長度必須大於6個字符。
【secretKey】
登錄密碼。長度必須大於6個字符。
【whiteRemoteAddress】
用戶級別的IP地址白名單。其類型為一個字符串,其配置規則與globalWhiteRemoteAddresses,但只能配置一條規則。
【admin】
boolean類型,設置是否是admin。如下權限只有admin=true時才有權限執行。
UPDATE_AND_CREATE_TOPIC:更新或創建主題。
UPDATE_BROKER_CONFIG:更新Broker配置。
DELETE_TOPIC_IN_BROKER:刪除主題。
UPDATE_AND_CREATE_SUBSCRIPTIONGROUP:更新或創建訂閱組信息。
DELETE_SUBSCRIPTIONGROUP:刪除訂閱組信息。
【defaultTopicPerm】
默認topic權限。該值默認為DENY(拒絕)。
【defaultGroupPerm】
默認消費組權限,該值默認為DENY(拒絕),建議值為SUB。
【topicPerms】
設置topic的權限。其類型為數組。例如:
DENY:拒絕
PUB:擁有發送權限
SUB:擁有訂閱權限
PUB|SUB:擁有發送及訂閱權限
【groupPerms】
設置消費組的權限。其類型為數組,其可選擇值在下節介紹。可以為每一消費組配置不一樣的權限。
【小插曲】