提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
数据中心的网络安全防护首先是防火墙的策略管理。随着数据中心的不断建设,防火墙安全策略不断增加,少则几百条,多则几千条到上万条,管理难度不断增加。各规则的源地址、目的地址存在着交集和包含关系。如果新增规则时对现有防火墙的关系缺乏清晰的了解,将导致防火墙的规则越来越紊乱,导致存在很大的业务安全和网络安全隐患。
目前对防火墙策略进行高效管理的工具不多,防火墙策略的梳理和管理十分不方便。因此,工作之余利用强大的Python语言开发了一款防火墙策略管理小工具,读入防火墙策略配置文件,提取地址集合、服务集合和规则集合,分析规则地址的包含关系,利用有向图工具绘制出规则包含关系层次树状图,从而为下一步的规则融合和检测提供一个清晰的视图!
一、防火墙配置文件
本人对网络技术接触时间不长,防火墙的基本操作和运维几乎不懂。目前通过对华为和华三两款防火墙的配置文件进行分析发现与安全规则相关的主要配置包括三部分:
1. 地址集合
格式如下:
#
ip address-set 地址1 type object
address 0 10.3.59.198 mask 32
#
ip address-set 地址2 type object
address 0 range 10.1.13.83 10.1.13.85
address 1 10.1.13.88 mask 32
上述集合中包括了range和mask两种格式。
2. 服务集合
格式如下:
#
ip service-set TCP_8288 type object
service 0 protocol tcp source-port 0 to 65535 destination-port 8288
#
ip service-set TCP_7002-65535 type object
service 0 protocol tcp source-port 0 to 65535 destination-port 7002 to 65535
#
ip service-set TCP_2294/7100/7200/7300/7800/9230/9103 type object
service 0 protocol tcp source-port 0 to 65535 destination-port 2294 7100 7200 7300 7800 9103 9230
上述集合中包含了单个端口和端口段两种格式。
3. 规则集合
格式如下:
rule name rule32432423
policy logging
session logging
source-address address-set 10.3.0.0/16
destination-address address-set 地址集合1
service TCP_49
profile av AV_LOG
profile ips IPS_LOG
action permit
rule name rule435323
policy logging
session logging
source-address address-set 10.1.13.83/84/85/88
source-address address-set 地址集合2
destination-address address-set 10.3.98.27/32
service TCP_9027
profile av AV_LOG
profile ips IPS_LOG
action permit
在规则中定义了目的地址、源地址、服务和action。
二、防火墙策略管理小工具的开发
1. 主要功能
- 配置文件读入:能够从不同厂家格式的配置文件中读取规则集。关键点是如何适应不同格式的配置文件。
- 规则自身的融合:将规则源地址、目的地址和服务端口中连续部分融合成地址段和端口段。
- 规则包含关系分析:分析各规则目的地址、源地址的包含关系(暂没包括端口关系),去掉闭合(即从一个规则到另一个规则存在两个以上的连接)的短连接,只保留最长连接(这点与传统图处理保留最短连接不同)。
- 规则包含关系层次树的绘制(注意该树可能有多个根节点)。
2. 框架设计
2.1 IP_Set对象
- 以起止地址来统一表示单个IP和IP地址段
- 根据地址字符串分析出起止IP地址
- 地址集合融合成地址段
2.2 Service对象
- 包括源端口、目的端口和协议
- 服务集合融合
2.3 Rule对象
- 包括目的地址集合、源地址集合、服务集合、Enable、Permit
- 规则自身融合
2.4 CfgReader对象
- 读入地址集合:根据lua脚本中cfg的配置读取
- 读入服务集合:根据lua脚本中cfg的配置读取
cfg = {}
cfg['ipset_header'] = 'object-group ip address'
cfg['ipset_name'] = 3 --name所在的字段位置
cfg['ipset_linestart'] = ' ' --行开始的标志字符
cfg['servset_header'] = 'object-group service'
cfg['servset_name'] = 2
cfg['servset_linestart'] = ' '
cfg['rule_header'] = ' rule '
cfg['rule_name'] = 4
cfg['rule_linestart'] = ' '
2.5 规则格式化读取lua脚本
2.5.1 读取源地址lua脚本
line为行字符串内容,linsegs为line以空格分劈的字符数组,addrdic为地址集合字典。
返回true, ips则表示为地址集合对象。
返回false,ipstr则表示为标准格式的IP字符串
function read_srcips(line, linesegs, addrdic)
if(string.find(line, "source%-ip") ~= nil) then
ipstr = linesegs[3]
status, ips = pcall(function(dic, key) return dic[key] end, addrdic, ipstr)
if status then
return true, ips
else
if string.match(ipstr, '%d+%.%d+%.%d+%.%d+') ~= nil then
return false, ipstr
end
end
end
return nil, nil
end
2.5.2 服务集合
line为行字符串内容,linsegs为line以空格分劈的字符数组,servdic为服务集合字典。
返回true, ips则表示为服务集合对象。
返回false,ipstr则表示为标准格式的服务字符串
function read_servs(line, linesegs, servdic)
if(string.find(line, "service") ~= nil) then
servstr = linesegs[3]
--print(pcall(function(dic, key) return dic[key] end, servdic, servstr))
if pcall(function(dic, key) return dic[key] end, servdic, servstr) then
return true, servdic[servstr]
else
--print(servstr)
--print(string.match(servstr, '%d+%-?%d*'))
if string.match(servstr, '%d+%-?%d*') ~= nil then
return false, 'tcp:0-65535:'..servstr
end
end
end
return nil, nil
end
2.6 rule_inclusion设计
- 分析规则源地址和目的地址是否存在包含关系,如果存在则添加到有向图中。
- 清除有向图中所有的闭合,只保留最长连接。
- 绘制层次关系树图
2.7 GUI设计
- 采用比较简单的DearPyGui开发界面,设置处理的lua脚本
- 导入配置文件,显示规则列表
- 规则包含关系分析,将层次关系树图(svg格式)保存在GraphFig目录下
2.8 SVG图浏览设计
由于一般图片浏览不支持svg格式图片,写了一个displaysvg.html页面,通过js来浏览规则包含关系层次树。
三、使用和示例
1. 程序文件夹
2. FirwallWin.exe
运行程序,导入test.cfg,显示如下界面,并进行规则包含分析,等待分析结束!!
浏览层次关系树图
打开displaysvg.html,选择GraphFig下所有的文件,选择所有文件!就可以浏览了!个人觉得这两个图的规则的包含关系有点匪夷所思!
四、未来工作和程序下载
防火墙管理小工具下载:https://download.csdn.net/download/tkyjqh/14926685
未来的工作:
- 防火墙高危端口规则分析
- 防火墙规则优化分析
总结
本小工具开发时间短,估计还存在不少Bug,对不同厂家的配置文件也没有多试,如有不爽,请多包含。欢迎留言指正!!!!