访问控制
1. 访问控制功能简介
访问控制 (ACL) 主要为 RocketMQ 提供了 Topic 资源级别的更高级的访问控制功能。在使用 RocketMQ 访问控制时,用户可以将用户名和密码参数注入客户端以实现签名,服务器可以通过访问控制参数实现对各种资源的权限管理和验证。
ACL 控制在增强集群访问控制安全性的同时,会增加部署过程和运维管理的复杂性。通常仅建议在网络环境不安全、业务数据敏感、多个部门和租户混合的情况下使用。如果生产集群本身是私有集群,并且没有被外部部门和租户访问,则可以关闭它。
2. 访问控制的定义和属性值
2.1 权限定义
RocketMQ Topic 资源访问控制的定义主要如以下表格所示,分为以下四类
权限 | 定义 |
---|---|
DENY | 拒绝 |
ANY | PUB 或 SUB 权限 |
PUB | 发送权限 |
SUB | 订阅权限 |
2.2 权限定义的关键属性
字段 | 值 | 定义 |
---|---|---|
globalWhiteRemoteAddresses | *;192.168.*.*;192.168.0.1 | 全局 IP 白名单 |
accessKey | 字符串 | 访问密钥 |
secretKey | 字符串 | 密钥 |
whiteRemoteAddress | *;192.168.*.*;192.168.0.1 | 用户 IP 白名单 |
admin | true;false | 是否为管理员帐户 |
defaultTopicPerm | DENY;PUB;SUB;PUB|SUB | 默认 Topic 权限 |
defaultGroupPerm | DENY;PUB;SUB;PUB|SUB | 默认 ConsumerGroup 权限 |
topicPerms | topic=permission | 每个 Topic 的权限 |
groupPerms | group=permission | 每个 Consumer Group 的权限 |
有关具体信息,请参阅 **distribution/conf/plain_acl.yml** 配置文件。
3. 支持访问控制的集群部署
在如上所述在 **distribution/conf/plain_acl.yml** 配置文件中定义权限属性后,您可以通过打开 **aclEnable** 开关变量来打开 RocketMQ 集群的 ACL 功能。以下是启用 Broker 上 ACL 功能的属性配置文件内容:
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathRootDir=/data/rocketmq/rootdir-a-m
storePathCommitLog=/data/rocketmq/commitlog-a-m
autoCreateSubscriptionGroup=true
## if acl is open,the flag will be true
aclEnable=true
listenPort=10911
brokerIP1=XX.XX.XX.XX1
namesrvAddr=XX.XX.XX.XX:9876
4. 访问控制的主要流程
ACL 的主要流程分为两部分,主要包括权限解析和权限验证。
4.1 权限解析
Broker 解析客户端的 RequestCommand 请求并获取需要验证的属性字段,主要包括
- AccessKey:类似于用户名,它指的是用户主体,对应于权限数据。
- Signature:客户端使用 SecretKey 签名的字符串,服务器随后使用 SecretKey 验证该字符串。
4.2 权限验证
Broker 端的权限验证逻辑主要分为以下步骤
- 检查是否命中全局 IP 白名单;如果是,则认为已通过验证;否则,转到 2。
- 检查是否命中用户 IP 白名单;如果是,则认为已通过验证;否则,转到 3。
- 验证签名,如果验证失败,则抛出异常;如果通过,则转到 4。
- 根据用户请求所需的权限验证用户拥有的权限;如果失败,则抛出异常。
验证用户所需的权限需要关注以下内容
- UPDATE_AND_CREATE_TOPIC 等特殊请求只能由管理员帐户操作。
- 对于某个资源,如果存在显式配置权限,则使用配置的权限;如果不存在显式配置权限,则使用默认权限。
5. 热加载修改的访问控制定义
RocketMQ 访问控制存储的默认实现基于 yml 配置文件。用户可以动态修改访问控制定义的属性,而无需重新启动 Broker 服务节点。
6. 访问控制的使用限制
- 如果 ACL 与高可用性部署(Master/Slave 架构)一起启用,则需要在 Broker Master 节点的 distribution/conf/plain_acl.yml 配置文件中设置全局白名单信息,即在 Master 节点的 plain_acl.yml 配置文件中将 Slave 节点的 IP 地址设置为全局白名单。
- 如果 ACL 与高可用性部署(多副本 Dledger 架构)一起启用,因为当节点宕机时,Dledger Group 中会自动选择主节点,因此需要在 Dledger Group 中所有 Broker 节点的 plain_acl.yml 配置文件中将白名单设置为所有 Broker 节点的 IP 地址。
7. ACL mqadmin 配置管理命令
7.1 更新 ACL 配置文件中的“account”属性的值
该命令的示例如下:
$ sh mqadmin updateAclConfig -n 192.168.1.2:9876 -b 192.168.12.134:10911 -a RocketMQ -s 1234567809123 -t topicA=DENY,topicD=SUB -g groupD=DENY,groupB=SUB
解释:如果不存在,它将在 ACL Config YAML 配置文件中创建;如果存在,它将更新相应的“accounts”属性;如果指定了集群名称,则该命令将在集群中的每个 Broker 节点上执行;否则,该命令将在单个 Broker 节点上执行。
参数 | 值 | 定义 |
---|---|---|
n | eg:192.168.1.2:9876 | Namesrv 地址(必需) |
c | eg:DefaultCluster | 指定集群名称(与 Broker 地址选择一个) |
b | eg:192.168.12.134:10911 | 指定 Broker 地址(与集群名称选择一个) |
a | eg:RocketMQ | 访问密钥值(必需) |
s | eg:1234567809123 | 密钥值(可选) |
m | eg:true | 是否为管理员帐户(可选) |
w | eg:192.168.0.* | whiteRemoteAddress,用户 IP 白名单(可选) |
i | eg:DENY;PUB;SUB;PUB|SUB | defaultTopicPerm,默认 Topic 权限(可选) |
u | eg:DENY;PUB;SUB;PUB|SUB | defaultGroupPerm,默认 Consumer Group 权限(可选) |
t | eg:topicA=DENY,topicD=SUB | topicPerms,每个 Topic 的权限(可选) |
g | eg:groupD=DENY,groupB=SUB | groupPerms,每个 Consumer Group 的权限(可选) |
7.2 删除 ACL 配置文件中相应的“account”
该命令的示例如下:
$ sh mqadmin deleteAccessConfig -n 192.168.1.2:9876 -c DefaultCluster -a RocketMQ
解释:如果指定了集群名称,则该命令将在集群中的每个 Broker 节点上执行;否则,该命令将在单个 Broker 节点上执行。参数“a”是访问密钥的值,用于标识唯一的帐户 ID,因此可以在命令参数中指定帐户 ID。
参数 | 值 | 定义 |
---|---|---|
n | eg:192.168.1.2:9876 | namesrv 地址(必需) |
c | eg:DefaultCluster | 指定集群名称(与 Broker 地址选择一个) |
b | eg:192.168.12.134:10911 | 指定 Broker 地址(与集群名称选择一个) |
a | eg:RocketMQ | 访问密钥值(必需) |
7.3 更新 ACL 配置文件中的全局白名单
该命令的示例如下:
sh mqadmin updateGlobalWhiteAddr -n 192.168.1.2:9876 -b 192.168.12.134:10911 -g 10.10.154.1,10.10.154.2
解释:如果指定了集群名称,则该命令将在集群中的每个 Broker 节点上执行;否则,该命令将在单个 Broker 节点上执行。参数“g”是全局 IP 白名单的值,用于更新 ACL 配置文件中的“globalWhiteRemoteAddresses”字段属性值。
参数 | 值 | 定义 |
---|---|---|
n | eg:192.168.1.2:9876 | namesrv 地址(必需) |
c | eg:DefaultCluster | 指定集群名称(与 Broker 地址选择一个) |
b | eg:192.168.12.134:10911 | 指定 Broker 地址(与集群名称选择一个) |
g | eg:10.10.154.1,10.10.154.2 | 全局 IP 白名单(必需) |
7.4 查询集群 Broker 的 ACL 配置文件版本信息
该命令的示例如下:
sh mqadmin clusterAclConfigVersion -n 192.168.1.2:9876 -c DefaultCluster
解释:如果指定了集群名称,则该命令将在集群中的每个 Broker 节点上执行;否则,该命令将在单个 Broker 节点上执行。
参数 | 值 | 定义 |
---|---|---|
n | eg:192.168.1.2:9876 | namesrv 地址(必需) |
c | eg:DefaultCluster | 指定集群名称(与 Broker 地址选择一个) |
b | eg:192.168.12.134:10911 | 指定 Broker 地址(与集群名称选择一个) |
7.5 查询集群 Broker 的 ACL 配置文件的全部内容
该命令的示例如下:
sh mqadmin getAccessConfigSubCommand -n 192.168.1.2:9876 -c DefaultCluster
解释:如果指定了集群名称,则命令将在集群中的每个 Broker 节点上执行;否则,命令将在单个 Broker 节点上执行。
参数 | 值 | 定义 |
---|---|---|
n | eg:192.168.1.2:9876 | namesrv 地址(必需) |
c | eg:DefaultCluster | 指定集群名称(与 Broker 地址选择一个) |
b | eg:192.168.12.134:10911 | 指定 Broker 地址(与集群名称选择一个) |
特别注意:在社区的版本中,已经修复了启用 Acl 身份验证后,Master/Slave 和 Dledger 模式下 Broker 数据同步异常的问题。[4.5.1]具体的 PR 链接是:https://github.com/apache/rocketmq/pull/1149