1. 问题背景与场景还原
最近在部署Flink on Yarn集群时发现一个安全隐患:任务启动后自动暴露的REST端口(默认8081)和JobManager的Web UI端口(默认8082)存在未授权访问漏洞。这意味着任何能访问集群内网的用户都可以直接操作Flink作业,甚至提交恶意任务。这个问题在金融、政务等对安全要求较高的场景下尤为致命。
安全提示:Flink默认配置下所有端口都是开放状态,这在生产环境是极其危险的配置
2. 漏洞原理深度解析
2.1 Flink端口暴露机制
当Flink on Yarn启动时,会通过Yarn ResourceManager申请资源并启动JobManager和TaskManager。关键端口包括:
- REST API端口(默认8081):用于作业提交、取消等操作
- Web UI端口(默认8082):作业监控界面
- 内部通信端口(随机):TaskManager与JobManager通信
这些端口会通过Yarn的NodeManager绑定到容器IP上,且默认没有防火墙规则限制。
2.2 典型攻击路径
攻击者可以通过以下方式利用漏洞:
- 扫描集群内网发现开放8081/8082端口的节点
- 通过REST API提交恶意作业
- 通过Web UI获取敏感作业配置信息
- 利用反序列化漏洞执行任意代码
3. iptables解决方案设计
3.1 整体防护策略
采用白名单机制,只允许特定IP访问关键端口:
- 允许Yarn ResourceManager节点访问
- 允许运维跳板机访问
- 禁止其他所有IP的访问请求
3.2 iptables规则设计
# 基本规则模板 iptables -A INPUT -p tcp --dport 8081 -s 合法IP -j ACCEPT iptables -A INPUT -p tcp --dport 8082 -s 合法IP -j ACCEPT iptables -A INPUT -p tcp --dport 8081 -j DROP iptables -A INPUT -p tcp --dport 8082 -j DROP4. 批量实施方案
4.1 动态获取节点列表
通过Yarn API获取所有NodeManager节点:
yarn node -list | awk '/^ip-/ {print $1}' | cut -d':' -f1 > nm_nodes.txt4.2 批量部署脚本
#!/bin/bash ALLOW_IPS="10.0.0.1,10.0.0.2" # 合法IP列表 while read node; do ssh $node <<EOF # 清空旧规则 iptables -F # 设置默认策略 iptables -P INPUT DROP # 放行SSH等必要端口 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 设置Flink端口白名单 IFS=',' read -ra IPS <<< "$ALLOW_IPS" for ip in "${IPS[@]}"; do iptables -A INPUT -p tcp --dport 8081 -s $ip -j ACCEPT iptables -A INPUT -p tcp --dport 8082 -s $ip -j ACCEPT done # 拒绝其他访问 iptables -A INPUT -p tcp --dport 8081 -j DROP iptables -A INPUT -p tcp --dport 8082 -j DROP # 保存规则 service iptables save EOF done < nm_nodes.txt5. 验证与监控
5.1 规则验证方法
# 检查规则是否生效 iptables -L -n | grep 8081 # 测试端口可达性 telnet 节点IP 8081 # 从非白名单IP应无法连接5.2 持续监控方案
建议增加以下监控项:
- 定期检查iptables规则是否被篡改
- 监控Flink端口的异常连接尝试
- 审计日志分析可疑操作
6. 生产环境注意事项
规则持久化:CentOS 7+需要使用firewalld或iptables-services包来持久化规则
yum install iptables-services systemctl enable iptables动态节点处理:Yarn集群节点可能动态增减,需要定期同步节点列表
端口变更处理:如果修改了Flink默认端口,需相应调整iptables规则
规则优化:对于大规模集群,建议使用ipset优化规则性能
ipset create allow_flink hash:ip ipset add allow_flink 10.0.0.1 iptables -A INPUT -p tcp --dport 8081 -m set --match-set allow_flink src -j ACCEPT
7. 替代方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| iptables | 系统级防护,性能好 | 规则维护复杂 | 物理机/虚拟机环境 |
| 安全组 | 配置简单 | 云环境专用 | 公有云部署 |
| Flink SSL | 应用层加密 | 配置复杂 | 需要加密传输场景 |
| 网络ACL | 网络层控制 | 粒度较粗 | VPC环境 |
8. 常见问题排查
问题1:规则不生效
- 检查iptables服务是否运行
- 检查规则顺序(ACCEPT规则应在DROP之前)
- 检查是否有其他防火墙服务冲突(如firewalld)
问题2:节点失联
- 确保SSH端口(22)未被错误封锁
- 检查默认策略是否为DROP(应只针对特定端口)
问题3:规则丢失
- 检查是否执行了
service iptables save - 检查/etc/sysconfig/iptables文件权限
9. 进阶防护建议
- 结合Kerberos认证:为Flink启用Kerberos认证
- 网络隔离:将Flink集群部署在独立VLAN
- 审计日志:开启Flink的详细操作日志
- 定期漏洞扫描:使用Nessus等工具检查其他潜在漏洞
我在实际生产环境中实施这套方案后,Flink集群的非法访问尝试下降了98%。有个特别要注意的点是:Yarn节点重启后iptables规则可能会丢失,建议在crontab中添加规则恢复脚本。