防火墙ACL配置自动化方案探讨

主要介绍了一些各品牌防火墙配置自动化生成的思路,功能包括核查现有配置,判断是否需要新增配置,以及自动生成新增配置命令。并且在新增配置中,如何有效结合调用现有配置,避免在自动化生成的过程中引起防火墙配置量的野蛮增长,产生大量冗余配置。

 

1,ACL配置命名规范

自动化执行一个ACL需求时,需要输入一个唯一的编号(可以跟随需求单),命名过程中会使用到,太长的话,天融信防火墙命名可能会报错,推荐字母+六位数字,例如A000001

为了不影响存量配置,建议所有自动化的匹配规则全部都在规范命名后的地址组/端口组/ACL组内开展

 

防火墙自动化之前,必须要明确ACL命名的规范性,否则自动化无从谈起,甚至还会影响生产

以下面需求为例:

需求单A000001: 源地址(10.10.10.1, 10.10.10.2);目标地址(20.20.20.1, 20.20.20.2);目标端口(TCP: 80,443);

需求单A000002: 源地址(10.10.10.3, 10.10.10.4);目标地址(20.20.20.1, 20.20.20.2);目标端口(TCP: 80,443);

需求单A000003: 源地址(10.10.10.5, 10.10.10.6);目标地址(20.20.20.1, 20.20.20.2);目标端口(TCP: 80,443);

需求单A000004: 源地址(10.10.10.1, 10.10.10.2);目标地址(20.20.20.1, 20.20.20.2);目标端口(TCP: 80,443,8443);

需求单A000005: 源地址(10.10.10.3, 10.10.10.4);目标地址(20.20.20.1, 20.20.20.2);目标端口(TCP: 80,443,8443);

需求单A000006: 源地址(10.10.10.5, 10.10.10.6);目标地址(20.20.20.1, 20.20.20.2);目标端口(TCP: 80,443,8443);

需求单A000007: 源地址(20.20.20.1, 20.20.20.2);目标地址(10.10.10.1, 10.10.10.2);目标端口(TCP: 80,443);

假设源地址接口是outside,目标地址接口是inside

 

怎么建地址组/端口组合适呢?

 

1.1,端口组

cisco:如果是访问一个端口,不用创建端口组,直接eq ...。如果是开通多个端口,必须建立端口组,才能被ACL调用。

juniper/华为/天融信:可以在ACL中直接调用端口,因此建议不用建端口组了。自动化时直接在ACL中罗列开通端口即可,其中juniper/天融信需要事先为端口自定义一个名称,华为连名称都不用定义。

 

cisco多个端口需要定义端口组,但是处理也比较简单,不用和本次开通单号做关联,可以搜索现有的自动化端口组名称(不建议调用非规范命名的端口组),有则调用,没有则新建。

以A需求为例,如果不存在包含80,443端口的TCP端口组,则新建端口组:pg_A000001。(如果是UDP可以建pgu_A000001)

后续如果是开通TCP80,TCP443的,可以直接调用端口组pg_A000001

后续如果是开通TCP80,TCP443,TCP8443的,不允许往pg_A000001中添加8443,然后再调用pg_A000001。而应当根据需求单号,新建一个地址组。

不允许往现有规范命名的端口组内加成员!!!

 

1.2,地址组

需求单A000001: 源地址(10.10.10.1, 10.10.10.2);目标地址(20.20.20.1, 20.20.20.2);目标端口(TCP: 80,443)

假设根据开通单号A000001,命名为:

A000001_src(10.10.10.1, 10.10.10.2)

A000001_dst(20.20.20.1, 20.20.20.2)

pg_A000001(80, 443)

access-list  outside  extended permit tcp object-group  A000001_src object-group A000001_dst object-group pg_A000001

 

需求单A000002:

需求单A000002: 源地址(10.10.10.3, 10.10.10.4);目标地址(20.20.20.1);目标端口(TCP: 80,443)

需求单A000002和需求单A000001的目标地址/目标端口完全一样

根据1.1,端口组可以直接调用现有的pg_A000001

地址组如果不考虑融合现有策略,完全新建:

A000002_src(10.10.10.1, 10.10.10.2)

A000002_dst(20.20.20.1, 20.20.20.2)

pg_A000001(80, 443)

这样,配置量增长会非常快,如果有100个需求单都是访问20.20.20.1, 20.20.20.2的80和443端口,源地址/目的地址/acl都会被重复创建100遍。但其实这100条ACL完全可以融合成1条ACL。

那如果选择融合,直接将需求单B的源地址(10.10.10.1, 10.10.10.2)加到A000001_src,这样可行吗?

可能存在如下问题:

1)如果该源地址组被其他ACL调用,则可能扩大了其他ACL的访问范围, 假如存在10.10.10.1, 10.10.10.2访问100.100.100.1的需求,其中10.10.10.1, 10.10.10.2地址组名称用的也是A000001_src

2)更糟糕的是如果被反方向deny调用,则可能影响现有系统的访问,例如存在deny 某些地址(inside) 访问 A000001_src(outside) 的ACL

 

因此:

地址组名称可以被反复调用和地址组名称可以添加成员是一对矛盾

可以被反复调用就不允许添加成员,可以添加成员就应该禁止被反复调用


指定如下地址组命名规范:

目的地址组名称: 所在防火墙接口_开通工单, 可以被其他"同方向"ACL调用但禁止添加成员("同方向",意味着只能作为目的地址被调用)

源地址组名称: to_目的地址组名称_开通工单, 禁止被其他ACL调用但可以往里面添加成员

 

1.3,规范后的开通单案例

根据1.1-1.2,前述需求单A000001-A000002可以做如下命名:

需求单A000001:新建源地址组 to_inside_A000001_A000001,新建目的地址组inside_A000001,新建端口组pg_A000001

需求单A000002:将10.10.10.3, 10.10.10.4添加至to_inside_A000001_A000001

需求单A000003:将10.10.10.5, 10.10.10.6添加至to_inside_A000001_A000001

需求单A000004:新建源地址组to_inside_A000001_A000004,新建端口组pg_A000004

需求单A000005:将10.10.10.3, 10.10.10.4添加至to_inside_A000001_A000004

需求单A000006:将10.10.10.5, 10.10.10.6添加至to_inside_A000001_A000004

需求单A000007:新建源地址组to_outside_A000007_A000007,目的地址组outside_A000007

 

注意

需求单4:由于目的地址组inside_A000001已经创建过,可以直接调用,但是端口组和源地址组需要新建

需求单7:即使20.20.20.1, 20.20.20.2和10.10.10.1, 10.10.10.2都已经被创建过,但是方向不同,都不能拿来调用,需要全部新建

实际上:就是把 "接口+目标服务器+端口" 绑定起来看作一种"服务",后续需求单如果是访问已有的"服务",就可以往该"服务"的"客户端(即源地址)"内添加。如果该服务不存在,就需要新建。

这样可以在 "完全不融合导致配置野蛮增长" 和 "融合太紧密导致放宽策略或者出现问题" 做个折中

 

1.4,存在PAT时的命名

PAT策略的地址组名称,不应该调用ACL组名称

 

2,ACL配置自动化的思路

主要涉及模块:

1)配置采集

2)配置解析

3)策略分析,策略分析又包含路径分析,策略核查,配置生成模块

 

3,配置采集

配置采集通过paramiko定制脚本,获取防火墙配置文件。

 

4,配置解析

对各品牌防火墙(思科、天融信、juniper、华为)不同版本的防火墙配置文件进行解析,转换为三张表格:

表格一:地址表,记录地址组名称和地址组成员的对应关系

表格二:端口表,记录端口组名称和端口组成员的对应关系

表格三:ACL策略表,记录ACL主要信息

备注:

不同品牌防火墙记录信息会有差异,例如地址表中juniper需要记录区域信息

主要采用正则表达式 + pandas每天定时对防火墙配置进行读取和解析,供后续模块调用

返回的类型是表格, 可以通过excel, json, 数据库保存。数据库有点大材小用,excel表格单元格内数据量太大无法保存(例如地址组中有conf列会记录该地址组相关配置,如果成员数量过多就无法显示),推荐用json,后续模块调用时可以直接将json转pandas。


5,策略分析

5.1,路径生成模块(需要结合公司实际场景定制)

直接调用配置生成模块,不仅需要提供防火墙名称,防火墙端口等信息,如果涉及多个防火墙,还需要逐一罗列,对运维人员交互不友好

因此还需要结合公司实际网络环境,定制各网段间访问的关系,例如A网段访问B网段经过哪几个防火墙,以及分别是涉及防火墙的哪几个接口,思科防火墙的入向策略名等等

如果网络环境比较复杂可能全部罗列比较困难

对于HUB-SPOKEN有环形网的场景,可以通过记录每个网段到环形网经过的防火墙(以及相应接口),这样所有通过环形网互相访问的网段就无需逐一罗列,同时再补充一张不经过环形网的特殊访问表即可

 

5.2,策略核查模块

策略核查模块针对输入的ACL访问需求,做如下核查:

1)检查源地址、目的地址、目的端口, 三元素完全一致的ACL,返回所有命中的ACL(包括)

2)检查目的地址、目的端口,两个元素完全一致的ACL,并且目的地址组命名符合第一章的命名规范的(添加源地址时避免影响存量不规范配置),返回该ACL所有信息

备注:这里只是做最简单的描述,实际实现时,还涉及到协议tcp/udp,而且不同防火墙需要的acl字段也有差异,思科只需要传策略名,其他品牌防火墙还有源区域和目的区域等等。

 

5.3, 配置生成模块

这块比较简单,主要是结合策略核查模块的结果,以及各品牌防火墙的配置命令,做如下三步:

1)三元素完全一致的ACL,并且第一条是permit的,直接反馈现有配置,无需新增配置

2)三元素中有目的地址、目的端口,两个元素完全一致的ACL,直接将需求中的源地址往现有源地址组名称中添加

3)根据本次工单号,依据命名规范,新增配置。新增配置时需要考虑是否有现有的目的地址组,端口组(思科)可以调用

 

后续会逐一对各模块实现细节和相应代码进行展开分析

 

posted @ 2020-12-03 16:02  GUXH  阅读(1169)  评论(1编辑  收藏  举报