您的位置 首页 rocketmq

RocketMQ – 权限控制:ACL配置与安全访问

RocketMQ - 权限控制:ACL配置与安全访问_rocketmq 原生acl控制-CSDN博客

RocketMQ - 权限控制:ACL配置与安全访问 🔒

💡 注意:ACL 验证发生在 Broker 端,NameServer 不参与权限控制。

 

启用 ACL:三步配置 Broker

第一步:修改 broker.conf

在 Broker 配置文件中启用 ACL:

# 启用 ACL
aclEnable=true

# 可选:指定 ACL 配置文件路径(默认 conf/plain_acl.yml)
aclFile=/path/to/plain_acl.yml

⚠️ 修改后需重启 Broker 生效。

第二步:创建 plain_acl.yml

该文件定义所有用户及其权限。默认位于 $ROCKETMQ_HOME/conf/plain_acl.yml

# 全局白名单(可选)
globalWhiteRemoteAddresses:
  - 192.168.0.*
  - 10.0.0.5

# 用户列表
accounts:
  # 管理员账户(拥有所有权限)
  - accessKey: admin
    secretKey: 1234567890
    whiteRemoteAddress: 192.168.1.0/24
    admin: true

  # 订单系统账户
  - accessKey: order_app
    secretKey: order_secret_2025
    whiteRemoteAddress: 10.10.1.0/24
    defaultTopicPerm: DENY
    defaultGroupPerm: DENY
    topicPerms:
      - "OrderTopic=PUB|SUB"
      - "CommonTopic=SUB"
    groupPerms:
      - "ORDER_CONSUMER_GROUP=DENY"  # 注意:Group 权限通常用于消费控制

  # 风控系统账户
  - accessKey: risk_app
    secretKey: risk_secret_2025
    whiteRemoteAddress: 10.10.2.0/24
    topicPerms:
      - "RiskAlertTopic=PUB|SUB"
      - "UserBehaviorTopic=SUB"
    groupPerms:
      - "RISK_CONSUMER_GROUP=SUB"

权限说明

权限值 含义
PUB 允许发送消息到 Topic
SUB 允许从 Topic 消费消息
PUB|SUB 读写权限
DENY 显式拒绝(优先级高于默认)

📌 重要规则

  • 若未设置 defaultTopicPerm,默认为 PUB|SUB危险!
  • admin: true 用户绕过所有权限检查
  • whiteRemoteAddress 支持 CIDR(如 192.168.1.0/24)和通配符(*

 

客户端集成:如何携带认证信息?
ACL 启用后,所有客户端必须提供有效的 AccessKey/SecretKey,否则请求将被拒绝。

Java 原生客户端示例

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.security.AclClientRPCHook;
import org.apache.rocketmq.common.AclConfig;

public class SecureProducer {
    public static void main(String[] args) throws Exception {
        // 创建 ACL Hook
        AclClientRPCHook aclHook = new AclClientRPCHook(
            new AclConfig("order_app", "order_secret_2025")
        );

        DefaultMQProducer producer = new DefaultMQProducer(
            "ORDER_PRODUCER_GROUP",
            aclHook  // 注入 Hook
        );
        producer.setNamesrvAddr("192.168.1.10:9876");
        producer.start();

        // 发送消息(自动携带认证)
        producer.send(new Message("OrderTopic", "Hello ACL".getBytes()));
        System.out.println("Message sent securely!");

        producer.shutdown();
    }
}

 

Consumer

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(
    "ORDER_CONSUMER_GROUP",
    new AclClientRPCHook(new AclConfig("order_app", "order_secret_2025"))
);
consumer.setNamesrvAddr("192.168.1.10:9876");
consumer.subscribe("OrderTopic", "*");
// ... register listener
consumer.start();

✅ 关键点:通过 AclClientRPCHook 自动在每次 RPC 请求中附加签名。

Spring Boot 集成:优雅的安全配置 🌱

在 Spring Boot 项目中,可通过配置文件注入 ACL 凭证。

1. 添加依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.2.3</version>
</dependency>

2. application.yml 配置

rocketmq:
  name-server: 192.168.1.10:9876
  producer:
    group: order-producer-group
    # ACL 凭证(Spring Boot Starter 2.2.0+ 支持)
    access-key: ${ROCKETMQ_ACCESS_KEY:order_app}
    secret-key: ${ROCKETMQ_SECRET_KEY:order_secret_2025}

🔒 安全建议:通过环境变量或配置中心(如 Nacos)注入密钥,不要硬编码在代码中!

 

3. 使用 RocketMQTemplate

@Service
public class OrderService {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    public void sendOrder(String orderId) {
        // 自动使用配置的 ACL 凭证
        rocketMQTemplate.convertAndSend("OrderTopic", "Order: " + orderId);
    }
}

✅ Spring Boot Starter 内部会自动创建 AclClientRPCHook,无需手动干预。

权限模型详解:Topic、Group、IP 三位一体 🎯

RocketMQ ACL 支持三个维度的权限控制:

1. Topic 权限(核心)

控制对特定 Topic 的发送(PUB)和订阅(SUB)能力。

topicPerms:
  - "OrderTopic=PUB|SUB"   # 可发可收
  - "LogTopic=PUB"         # 仅可发送(如日志收集)
  - "SecretTopic=DENY"     # 显式拒绝(即使 default 是允许)

2. Consumer Group 权限
控制是否允许以某个 Group 名称启动消费者。

groupPerms:
  - "PAYMENT_CONSUMER_GROUP=SUB"  # 允许使用此 Group 消费
  - "ADMIN_GROUP=DENY"            # 禁止使用此 Group

3. IP 白名单(网络层防护)
限制客户端来源 IP,防止凭证泄露后的滥用。

whiteRemoteAddress: 10.10.1.0/24

支持格式:

单 IP:192.168.1.10
CIDR:192.168.1.0/24
通配符:192.168.*.*
全局白名单:globalWhiteRemoteAddresses(对所有用户生效)

⚠️ 安全提示:若未设置 whiteRemoteAddress,则不限制 IP(仅靠密钥)

 

多租户场景实战:隔离三个业务系统

假设公司有三个团队共用 RocketMQ 集群:

团队 Topic Consumer Group 网段
订单 OrderTopic, PaymentTopic ORDER_GROUP, PAY_GROUP 10.10.1.0/24
风控 RiskTopic, UserBehavior RISK_GROUP 10.10.2.0/24
日志 AppLogTopic LOG_GROUP 10.10.3.0/24

 

plain_acl.yml 配置

globalWhiteRemoteAddresses:
  - 127.0.0.1  # 允许本地调试

accounts:
  # 订单团队
  - accessKey: team_order
    secretKey: order_key_2025
    whiteRemoteAddress: 10.10.1.0/24
    defaultTopicPerm: DENY
    defaultGroupPerm: DENY
    topicPerms:
      - "OrderTopic=PUB|SUB"
      - "PaymentTopic=PUB|SUB"
      - "CommonEvent=SUB"
    groupPerms:
      - "ORDER_GROUP=SUB"
      - "PAY_GROUP=SUB"

  # 风控团队
  - accessKey: team_risk
    secretKey: risk_key_2025
    whiteRemoteAddress: 10.10.2.0/24
    defaultTopicPerm: DENY
    topicPerms:
      - "RiskTopic=PUB|SUB"
      - "UserBehavior=SUB"
    groupPerms:
      - "RISK_GROUP=SUB"

  # 日志团队
  - accessKey: team_log
    secretKey: log_key_2025
    whiteRemoteAddress: 10.10.3.0/24
    defaultTopicPerm: DENY
    topicPerms:
      - "AppLogTopic=PUB"  # 日志只写不读

效果验证
订单服务无法消费 RiskTopic(权限拒绝)
风控服务无法向 PaymentTopic 发消息
日志服务无法订阅任何 Topic
任何团队都无法从非授权网段访问

✅ 实现了严格的业务隔离。

动态更新 ACL 配置(无需重启 Broker)🔄
生产环境中,频繁重启 Broker 是不可接受的。RocketMQ 支持热加载 ACL 配置。

 

方法一:使用 mqadmin 命令

# 更新 ACL 配置(从远程 URL 或本地文件)
sh bin/mqadmin updateAclConfig \
  -n 192.168.1.10:9876 \
  -b 192.168.1.11:10911 \  # Broker 地址
  -a '{"accessKey":"new_app","secretKey":"new_secret","topicPerms":["NewTopic=PUB"]}'

官方命令文档:https://rocketmq.apache.org/docs/operation/03tools/

方法二:直接修改 plain_acl.yml + 触发 reload

  1. 编辑 plain_acl.yml
  2. 执行命令触发重载
sh bin/mqadmin reloadAclConfig -n 192.168.1.10:9876 -b 192.168.1.11:10911

💡 Broker 会监听文件变化(默认 10 秒检查一次),也可手动触发。

 

常见错误与排查指南 ❌

错误 1:org.apache.rocketmq.client.exception.MQClientException: No route info of this topic

  • 原因:Producer 无 PUB 权限,Broker 拒绝创建 Topic 路由
  • 解决:检查 topicPerms 是否包含 PUB

错误 2:org.apache.rocketmq.acl.common.AclException: No permission for topic

  • 原因:Consumer 无 SUB 权限
  • 解决:确认 topicPerms 包含 SUB,且 Group 有权限

错误 3:AUTHENTICATION_FAILED

  • 原因:AccessKey/SecretKey 错误,或 IP 不在白名单
  • 排查步骤
    1. 检查客户端凭证是否正确
    2. 查看 Broker 日志:logs/acl.log
    3. 确认客户端 IP 是否匹配 whiteRemoteAddress

错误 4:配置不生效

  • 原因:Broker 未启用 aclEnable=true
  • 验证:查看 Broker 启动日志是否有 Load ACL config file success

关键日志位置

  • Broker 主日志:logs/rocketmqlogs/broker.log
  • ACL 专用日志:logs/rocketmqlogs/acl.log

安全加固最佳实践 ✅

1. 最小权限原则

  • 默认拒绝所有(defaultTopicPerm: DENY
  • 按需授权,避免 PUB|SUB 泛滥

2. 密钥管理

  • 定期轮换 SecretKey(每 90 天)
  • 使用配置中心(如 Vault、Nacos)管理密钥
  • 禁止将密钥提交到 Git

3. 网络隔离

  • 结合 IP 白名单 + VPC 安全组
  • NameServer 和 Broker 部署在内网,不暴露公网

4. 审计日志

开启 ACL 审计(默认已记录到 acl.log),定期分析异常访问。

5. 管理员账户保护

  • admin 账户仅限运维使用
  • 限制其 IP(如跳板机 IP)
  • 避免在应用中使用

 

与外部认证系统集成(高级)

虽然 RocketMQ ACL 基于静态配置,但可通过以下方式对接企业认证体系:

方案一:自定义 ACL 插件

实现 org.apache.rocketmq.acl.AccessValidator 接口,从 LDAP、OAuth2 获取权限。

public class LdapAclValidator implements AccessValidator {
    @Override
    public void validate(PlainAccessResource resource) throws AclException {
        // 1. 从 resource 获取 AccessKey
        // 2. 查询 LDAP 验证用户
        // 3. 查询权限数据库
        // 4. 抛出 AclException 若无权限
    }
}

然后在 broker.conf 中指定:

aclAccessValidator=your.package.LdapAclValidator

插件开发指南:https://github.com/apache/rocketmq/tree/develop/acl

方案二:API 网关代理

在客户端与 Broker 之间部署 API 网关(如 Kong、APISIX),由网关完成认证鉴权,转发时附加内部凭证。

✅ 适合已有统一认证体系的企业。

性能影响评估 ⚖️

ACL 会在每次 RPC 请求时执行验证,带来轻微性能开销:

场景 TPS 下降 延迟增加
无 ACL 基准 基准
启用 ACL(本地文件) < 3% < 0.5ms
自定义插件(远程调用) 5%~15% 1~5ms

📊 测试环境:RocketMQ 5.0, 16C32G, SSD
💡 结论:内置 ACL 性能损耗可忽略,安全收益远大于成本


未来展望:更强大的安全能力 🚀

RocketMQ 社区正在规划以下安全增强:

  • TLS 加密传输:防止中间人攻击(部分版本已支持)
  • RBAC 模型:基于角色的权限管理
  • 审计日志标准化:对接 SIEM 系统(如 ELK、Splunk)
  • Kubernetes Secrets 集成:云原生密钥管理

Roadmap:https://github.com/apache/rocketmq/milestones

总结:安全是持续的过程,不是一次性配置 🔁

RocketMQ ACL 为你提供了构建安全消息系统的坚实基础。但请记住:

  • 🔒 安全不是功能,而是文化:开发、测试、运维需共同维护
  • 🔄 定期审查权限:离职员工、下线业务应及时清理账户
  • 🧪 演练攻击场景:模拟凭证泄露、越权访问,验证防护有效性
  • 📜 符合合规要求:如 GDPR、等保 2.0 对数据隔离的要求

通过合理配置 ACL,你不仅能保护 RocketMQ 集群,更能赢得业务方的信任——安全,是最好的用户体验

 

🌟 最后提醒:永远不要在生产环境运行 aclEnable=false 的集群!

 

欢迎来撩 : 汇总all

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章