Skip to content
清晨的一缕阳光
返回

RocketMQ 安全加固与权限管理实战

RocketMQ 安全性是企业级应用的核心要求。本文将深入探讨 RocketMQ 安全加固的完整方案,包括 ACL 授权、白名单、加密传输、审计日志等。

一、安全架构

1.1 安全层次

graph TB
    subgraph 网络安全
        WL[IP 白名单]
        SSL[SSL 加密]
    end
    
    subgraph 认证层
        ACL[ACL 认证]
        TOKEN[Token 认证]
    end
    
    subgraph 授权层
        TOPIC[Topic 权限]
        GROUP[Group 权限]
    end
    
    subgraph 审计层
        AUDIT[审计日志]
        MONITOR[监控告警]
    end
    
    WL --> ACL
    ACL --> TOPIC
    TOPIC --> AUDIT

1.2 安全特性对比

特性4.x5.0说明
ACL访问控制列表
白名单IP 白名单
SSL加密传输
鉴权插件可扩展鉴权
审计日志操作审计

二、ACL 配置

2.1 启用 ACL

Broker 配置

# broker.conf

# 启用 ACL
aclEnable=true

# ACL 配置文件路径
aclConfigFilePath=/etc/rocketmq/plain_acl.yml

# 访问密钥(可选)
accessKey=rocketmq
secretKey=12345678

2.2 ACL 配置文件

plain_acl.yml

# ACL 配置
accounts:
  # 管理员账户
  - accessKey: admin
    secretKey: admin123
    whiteRemoteAddress: "*"
    admin: true
    defaultTopicPerm: DENY
    defaultGroupPerm: DENY
    topicPerms:
      - topicA=PUB|SUB
      - topicB=PUB|SUB
      - topicC=PUB|SUB
    groupPerms:
      - groupA=SUB
      - groupB=SUB

  # 生产者账户
  - accessKey: producer
    secretKey: producer123
    whiteRemoteAddress: "192.168.1.*"
    admin: false
    defaultTopicPerm: DENY
    defaultGroupPerm: DENY
    topicPerms:
      - order-topic=PUB
      - pay-topic=PUB
    groupPerms: []

  # 消费者账户
  - accessKey: consumer
    secretKey: consumer123
    whiteRemoteAddress: "192.168.2.*"
    admin: false
    defaultTopicPerm: DENY
    defaultGroupPerm: DENY
    topicPerms:
      - order-topic=SUB
      - pay-topic=SUB
    groupPerms:
      - order-consumer-group=SUB
      - pay-consumer-group=SUB

# 全局白名单
whiteRemoteAddress: 192.168.1.1;192.168.1.2;192.168.1.*

2.3 客户端配置

Producer 配置

DefaultMQProducer producer = new DefaultMQProducer("producer-group");
producer.setNamesrvAddr("ns1:9876");

// ACL 配置
producer.setVipChannelEnabled(false);
producer.setInstanceName("producer-instance");

// 添加认证信息
Map<String, String> headers = new HashMap<>();
headers.put(RemotingHelper.ROCKETMQ_SECURITY_HEADER, "producer:producer123");

producer.start();

Consumer 配置

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer-group");
consumer.setNamesrvAddr("ns1:9876");
consumer.subscribe("order-topic", "*");

// ACL 配置
consumer.setVipChannelEnabled(false);
consumer.setInstanceName("consumer-instance");

// 添加认证信息
Map<String, String> headers = new HashMap<>();
headers.put(RemotingHelper.ROCKETMQ_SECURITY_HEADER, "consumer:consumer123");

consumer.start();

三、IP 白名单

3.1 Broker 白名单

# broker.conf

# 全局白名单
whiteRemoteAddress=192.168.1.1;192.168.1.2;192.168.1.*

# NameServer 白名单
namesrvAddr=192.168.1.10:9876;192.168.1.11:9876

3.2 动态白名单

public class WhiteListManager {
    
    private final Set<String> whiteList = ConcurrentHashMap.newKeySet();
    
    /**
     * 添加白名单
     */
    public void addWhiteList(String ip) {
        whiteList.add(ip);
        log.info("添加白名单:{}", ip);
    }
    
    /**
     * 移除白名单
     */
    public void removeWhiteList(String ip) {
        whiteList.remove(ip);
        log.info("移除白名单:{}", ip);
    }
    
    /**
     * 检查 IP
     */
    public boolean isAllowed(String ip) {
        // 检查精确匹配
        if (whiteList.contains(ip)) {
            return true;
        }
        
        // 检查通配符匹配
        for (String pattern : whiteList) {
            if (pattern.endsWith("*")) {
                String prefix = pattern.substring(0, pattern.length() - 1);
                if (ip.startsWith(prefix)) {
                    return true;
                }
            }
        }
        
        return false;
    }
}

四、SSL 加密

4.1 证书生成

#!/bin/bash
# 生成 SSL 证书

# 生成 CA 证书
openssl req -new -x509 -keyout ca-key -out ca-cert -days 365 \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=my-ca"

# 生成 Broker 密钥库
keytool -keystore /var/ssl/private/rocketmq.server.keystore.jks \
  -alias localhost -validity 365 -genkey -keyalg RSA \
  -dname "CN=rocketmq-broker-1, OU=IT, O=MyCompany, L=Beijing, ST=Beijing, C=CN"

# 生成 CSR
keytool -keystore /var/ssl/private/rocketmq.server.keystore.jks \
  -alias localhost -certreq \
  -file /tmp/rocketmq-server-signing-request.crt

# CA 签名
openssl x509 -req -CA /tmp/ca-cert -CAkey /tmp/ca-key \
  -in /tmp/rocketmq-server-signing-request.crt \
  -out /tmp/rocketmq-server-signed.crt -days 365 -CAcreateserial

# 导入证书
keytool -keystore /var/ssl/private/rocketmq.server.keystore.jks \
  -alias CARoot -import -file /tmp/ca-cert

keytool -keystore /var/ssl/private/rocketmq.server.keystore.jks \
  -alias localhost -import -file /tmp/rocketmq-server-signed.crt

# 生成信任库
keytool -keystore /var/ssl/private/rocketmq.server.truststore.jks \
  -alias CARoot -import -file /tmp/ca-cert

4.2 Broker SSL 配置

# broker.conf

# SSL 监听器
listenPort=9893
tlsTestModeEnable=false
tlsConfigFilePath=/etc/rocketmq/tls.properties

tls.properties

# SSL 配置
tls.test.mode.enable=false
tls.server.need.client.auth=none
tls.server.keyPath=/var/ssl/private/rocketmq.server.keystore.jks
tls.server.keyPassword=keystore-password
tls.server.certPath=/var/ssl/private/rocketmq.server.keystore.jks
tls.server.authClient=false
tls.server.trustCertPath=/var/ssl/private/rocketmq.server.truststore.jks

4.3 Client SSL 配置

// 开启 SSL
System.setProperty("tls.enable", "true");
System.setProperty("tls.config.file", "/etc/rocketmq/client-tls.properties");

// 客户端 TLS 配置
// client-tls.properties
tls.test.mode.enable=false
tls.client.keyPath=/var/ssl/private/rocketmq.client.keystore.jks
tls.client.keyPassword=keystore-password
tls.client.certPath=/var/ssl/private/rocketmq.client.keystore.jks
tls.client.trustCertPath=/var/ssl/private/rocketmq.client.truststore.jks

DefaultMQProducer producer = new DefaultMQProducer("producer-group");
producer.setNamesrvAddr("192.168.1.10:9893");  // SSL 端口
producer.start();

五、审计日志

5.1 审计配置

# broker.conf

# 启用审计日志
enableAuditLog=true

# 审计日志路径
auditLogPath=/var/log/rocketmq/audit.log

# 审计日志级别
auditLogLevel=INFO

5.2 审计日志格式

2026-08-15 10:00:00,123 INFO [AuditLog] action=send, topic=order-topic, producer=producer-group, ip=192.168.1.100, result=success
2026-08-15 10:00:01,456 INFO [AuditLog] action=receive, topic=order-topic, consumer=consumer-group, ip=192.168.1.101, result=success
2026-08-15 10:00:02,789 WARN [AuditLog] action=send, topic=order-topic, producer=producer-group, ip=192.168.1.102, result=denied

5.3 审计分析脚本

#!/bin/bash
# 审计日志分析脚本

AUDIT_LOG="/var/log/rocketmq/audit.log"

echo "=== 操作统计 ==="
grep "action=" $AUDIT_LOG | \
  awk -F'action=' '{print $2}' | \
  awk -F',' '{print $1}' | \
  sort | uniq -c | sort -rn

echo -e "\n=== 拒绝统计 ==="
grep "result=denied" $AUDIT_LOG | \
  awk -F'producer=' '{print $2}' | \
  awk -F',' '{print $1}' | \
  sort | uniq -c | sort -rn

echo -e "\n=== 最近拒绝记录 ==="
grep "result=denied" $AUDIT_LOG | tail -20

echo -e "\n=== 按 IP 统计 ==="
grep "result=denied" $AUDIT_LOG | \
  awk -F'ip=' '{print $2}' | \
  awk -F',' '{print $1}' | \
  sort | uniq -c | sort -rn

六、安全最佳实践

6.1 配置建议

环境ACL白名单SSL审计
开发
测试
生产
金融

6.2 密钥管理

#!/bin/bash
# 密钥轮换脚本

OLD_SECRET="old-secret"
NEW_SECRET="new-secret"
ACCESS_KEY="producer"

# 更新 ACL 配置
sed -i "s/$ACCESS_KEY:$OLD_SECRET/$ACCESS_KEY:$NEW_SECRET/" /etc/rocketmq/plain_acl.yml

# 重启 Broker 使配置生效
mqshutdown broker
mqbroker -c /etc/rocketmq/broker.conf &

# 通知客户端更新密钥
# ...

echo "密钥已更新"

6.3 安全检查清单

安全检查:
- [ ] 启用 ACL 授权
- [ ] 配置 IP 白名单
- [ ] 启用 SSL 加密
- [ ] 启用审计日志
- [ ] 定期轮换密钥
- [ ] 监控异常访问
- [ ] 定期安全审计
- [ ] 限制管理权限

七、监控告警

7.1 安全指标

指标说明告警阈值
acl_denied_countACL 拒绝次数> 20/分钟
white_list_denied白名单拒绝次数> 10/分钟
ssl_handshake_failedSSL 握手失败> 5/分钟
audit_log_denied审计拒绝记录> 50/小时

7.2 Prometheus 告警

# alerting_rules.yml
groups:
  - name: rocketmq-security
    rules:
      - alert: RocketMQAclDenied
        expr: rate(rocketmq_acl_denied_count[5m]) > 20
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "ACL 拒绝率过高"
      
      - alert: RocketMQWhiteListDenied
        expr: rate(rocketmq_white_list_denied[5m]) > 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "白名单拒绝率过高"
      
      - alert: RocketMQSSLHandshakeFailed
        expr: rate(rocketmq_ssl_handshake_failed[5m]) > 5
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "SSL 握手失败率过高"

八、故障排查

8.1 ACL 拒绝

排查步骤

# 1. 检查 ACL 配置
cat /etc/rocketmq/plain_acl.yml

# 2. 检查客户端密钥
# 确认 accessKey 和 secretKey 正确

# 3. 检查 Topic/Group 权限
# 确认有对应权限

# 4. 查看审计日志
tail -f /var/log/rocketmq/audit.log | grep "denied"

8.2 SSL 连接失败

排查步骤

# 1. 检查证书
keytool -list -v -keystore /var/ssl/private/rocketmq.server.keystore.jks

# 2. 检查 SSL 配置
cat /etc/rocketmq/tls.properties

# 3. 测试 SSL 连接
openssl s_client -connect broker-1:9893

# 4. 查看 Broker 日志
tail -f /var/log/rocketmq/broker.log | grep -i "ssl"

总结

RocketMQ 安全加固的核心要点:

  1. ACL 授权:账户管理、Topic 权限、Group 权限
  2. IP 白名单:全局白名单、动态白名单
  3. SSL 加密:证书管理、加密配置
  4. 审计日志:操作记录、分析脚本
  5. 最佳实践:配置建议、密钥管理、安全检查

核心要点

参考资料


分享这篇文章到:

上一篇文章
Kafka 生产者发送机制详解
下一篇文章
Agent 评估与调试实战