深色模式
中间件安全
摘要:中间件安全事故大多来自三件事:默认账号没改、管理端口暴露在公网、明文传输。本文给出认证授权、TLS 与网络隔离的落地配置,并附一份可直接执行的加固检查清单。
适用环境
bash
# 先看暴露面:哪些端口监听在 0.0.0.0
sudo ss -ltnp | awk '$4 ~ /0\.0\.0\.0|:\*:/ {print}'
# 是否有默认账号
sudo rabbitmqctl list_users -q
curl -s -k https://127.0.0.1:9200 -u elastic:changeme -o /dev/null -w '%{http_code}\n'1
2
3
4
5
6
2
3
4
5
6
操作步骤
1. 网络隔离:只监听内网地址
nginx
# Nginx:管理类 location 限定来源
location = /nginx_status {
stub_status;
allow 10.0.0.0/8;
deny all;
}1
2
3
4
5
6
2
3
4
5
6
properties
# Kafka:内网监听
listeners=INTERNAL://10.0.0.1:9092
advertised.listeners=INTERNAL://10.0.0.1:90921
2
3
2
3
bash
# 用防火墙兜底,只放通可信网段
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="9092" protocol="tcp" accept'
sudo firewall-cmd --reload1
2
3
2
3
2. 清理默认账号
bash
# RabbitMQ
sudo rabbitmqctl delete_user guest
sudo rabbitmqctl add_user appuser 'StrongPass!2026'
sudo rabbitmqctl set_permissions -p /prod appuser ".*" ".*" ".*"
# Elasticsearch
sudo /opt/elasticsearch/bin/elasticsearch-reset-password -u elastic1
2
3
4
5
6
7
2
3
4
5
6
7
3. 开启认证(Kafka SASL)
properties
# broker 侧
listeners=SASL_PLAINTEXT://:9092
sasl.enabled.mechanisms=SCRAM-SHA-5121
2
3
2
3
bash
/opt/kafka/bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter \
--add-config 'SCRAM-SHA-512=[password=StrongPass]' \
--entity-type users --entity-name appuser1
2
3
2
3
properties
# 客户端 producer.properties / consumer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="appuser" password="StrongPass";1
2
3
4
2
3
4
4. 配置 TLS
nginx
# Nginx TLS 基线
server {
listen 443 ssl http2;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=31536000" always;
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
bash
# ES 8.x 默认已开启 TLS;7.x 需手动启用安全特性
# elasticsearch.yml: xpack.security.transport.ssl.enabled: true1
2
2
5. 隐藏版本号
nginx
server_tokens off; # 响应头不再暴露 Nginx 版本号1
bash
# 按最小权限原则回收不需要的权限(RabbitMQ 示例:去掉写权限)
sudo rabbitmqctl set_permissions -p /prod readonlyuser "^$" "^$" ".*"1
2
2
6. 加固检查清单脚本
bash
cat > /usr/local/bin/mw_sec_check.sh <<'EOF'
#!/usr/bin/env bash
echo "== 1. 公网暴露端口 =="
sudo ss -ltnp | awk '$4 ~ /0\.0\.0\.0/ {print " RISK:", $0}'
echo "== 2. Nginx 版本是否隐藏 =="
curl -sI http://127.0.0.1/ | grep -i '^server:' | grep -q '[0-9]\.' \
&& echo " RISK: 版本号暴露" || echo " OK"
echo "== 3. 弱口令默认账号 =="
sudo rabbitmqctl list_users -q | grep -q '^guest' && echo " RISK: guest 存在" || echo " OK"
echo "== 4. TLS 是否启用 =="
echo | timeout 5 openssl s_client -connect 127.0.0.1:443 2>/dev/null \
| grep -q 'Protocol *: *TLSv1' && echo " OK" || echo " RISK: 443 未启用 TLS"
EOF
chmod +x /usr/local/bin/mw_sec_check.sh1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
DANGER
安全配置变更前请确认有回滚路径:误配 SASL 会让所有客户端瞬间连不上 Kafka,误收权限会导致 RabbitMQ 业务停摆。先在测试环境验证,再选低峰期灰度上线。
验证
bash
/usr/local/bin/mw_sec_check.sh
# 认证生效:无凭据访问应被拒绝
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list # 未配 SASL 应报错
# TLS 生效
curl -sI https://127.0.0.1/ | head -1
echo | openssl s_client -connect 127.0.0.1:443 2>/dev/null | grep -E 'Protocol|Cipher'
# 管理端口不可从公网访问(从外部机器探测应超时)
nc -z -w3 <公网IP> 15672 && echo "RISK: 15672 暴露" || echo "OK"1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
常见坑
WARNING
开启了 SASL/TLS 却只改了 broker 配置、没改客户端配置,会表现为"所有客户端集体连不上"。请务必双端同步修改,并保留一个可快速回退的配置备份。
WARNING
防火墙只在部分节点上放通、漏了新扩容的节点,会造成"部分流量不通"的诡异故障。集群扩容时请把安全组/防火墙策略纳入标准交付清单。
DANGER
把中间件管理界面(RabbitMQ 15672、ES 9200、Kafka 的 JMX 9999)直接暴露公网,等同于把数据库管理端口挂在互联网上。这类端口必须只允许内网或跳板机访问,并开启强认证。