01
背景描述
某客户部署在 DMZ 区的 SRX 345 防火墙之前是透明模式部署在网络内,现需要对其增加 4 层的安全策略,由于涉及到大量客户端与服务器通信的需求,以及服务器之间通信的需求,且网段规划不合理,网关在核心上,导致策略比较混乱。
整体配置策略调试花了三周左右,期间多次更改策略,需要和客户核对,并且需要对接多个部门负责应用的人确认业务的流量。
SRX 的命令网络工程师看还可以,但是客户对防火墙不是很了解,所以需要自动化的方式将策略整理为其他形式,例如 excel 的方式更直观,同时准确性也得到了保证,这一点非常重要。
02
Juniper 策略的基本知识
一条策略包含如下内容
policy-name
from-zone
to-zone
source-address
不是直接写地址,而是 address-book 或 address-set
destination-address
同 source-address 一样
application
action
address-set
包含一个或多个address-book
address-book
包含一个地址或域名
03
实现流程
获取 SRX 策略的配置
Juniper 的 Junos 可以输出多种配置方式,例如 set 类型的配置命令、xml、json(12版本不支持),为使代码有更强的适应性,使用了 xml 格式的源配置文件
如下代码定义一个函数将 xml 转为 json 格式,方便分析
def xml_to_json(xml_str): xmlparse = xmltodict.parse(xml_str) jsonstr = json.dumps(xmlparse, indent=1) return jsonstr
获取 address_book 与 address_set
def get_address_book(): finnal_address_list = [] # os.chdir('/Users/houmingming/cache') with open('SRX345config.xml') as file: j = json.loads(xml_to_json(file.read())) address_book_raw = j['rpc-reply']['configuration']['security']['address-book'] for x in address_book_raw['address']: try: finnal_address_list.append([address_book_raw['name'], x['name'], x['ip-prefix'], 'ip-prefix']) except KeyError: finnal_address_list.append([address_book_raw['name'], x['name'], x['dns-name']['name'], 'dns-name']) address_book_set = address_book_raw['address-set'] for x in address_book_set: for i in x['address']: for y in finnal_address_list: if i['name'] == y[1]: y.insert(1, x['name']) for x in finnal_address_list: if len(x) == 4: x.insert(1, 'None') return finnal_address_list
def get_address_set(): # os.chdir('/Users/houmingming/cache') with open('SRX345config.xml') as file: j = json.loads(xml_to_json(file.read())) address_book_raw = j['rpc-reply']['configuration']['security']['address-book']['address-set'] finally_address_set = [] for x in address_book_raw: for i in x['address']: # print(i['name']) finally_address_set.append([x['name'], i['name']]) return finally_address_set
分析策略
从字典中获取策略包含的元素,并返回一个列表
def policy_analysis(): with open('SRX345config.xml') as file: j = json.loads(xml_to_json(file.read())) finally_policy = [] for value in j['rpc-reply']['configuration']['security']['policies']['policy']: for x in value['policy']: try: