一、前言
企业安全防护策略中会要求操作系统开启防火墙,开启iptables防火墙后,对于业务网络访问意味着要经常去变更调整iptables防火墙策略。如果是管理几台服务器,手工登录操作下还能接受。但在实际大型IT架构中,可能涉及到的服务器成千上万,iptables变动起来如果没有自动化的手段那种痛苦可想而知。遇到过的痛苦比如有:
痛点1:云改数转之际,针对多系统上云过程中网络开放申请工单策略繁多且规则复杂(细化后一个工单,主机iptables策略可能面临成千上万条),需要梳理出全部的三元组关系(源地址、目的地址、目的端口),导致人工梳理通常需要大半天时间,给上云工作带来很大的困扰,急需一个便利的批量组合处理工具。
痛点2:现网环境不是全部都是统一的标准化iptables模板,有些历史主机iptables开放情况各不相同,每次开通规则前还需对主机iptables开放情况先进行确认,人工确认的方式耗时较大,急需一个工具可以自动判断iptables的实情。
痛点3:主机防火墙网络权限开放后,最后需要进行开放策略的验证探测,人工探测存在取样不充分,探测效率不高的情况,急需一个工具可以在策略开通后telnet自动验证策略开通情况。
二、实现过程
1、先从源头上规范定义申请工单内容,输出标准规范的网络申请模板《上云系统主机侧开放策略模板》,例如
2、定义好输入格式后,针对应用申请的一对多、多对多和多对一的网络权限要求,通过python编写组合处理程序,输入工单内容后,自动输出全部三元组对应关系,解决了"痛点一"的问题。
程序对应文件名"list.py"---由主shell脚本调用执行
python
#!/usr/bin/python
# -*- coding: utf-8 -*-
# encoding=utf-8
import commands
import re
from itertools import combinations
from functools import reduce
inputf = open('/root/iptables/port.txt','r')
list1=[]
while True:
line=inputf.readline()
if (len(line)<1):
break;
outl=re.split('#',line)
i=0
while i<len(outl)-1:
list1.append(outl[i])
i=i+1
list1.append(outl[i][0:-1])
#print list1
inputf.close()
inputf = open('/root/iptables/dest.ip','r')
list2=[]
while True:
line=inputf.readline()
if (len(line)<4):
break;
outl=re.split(',',line)
i=0
while i<len(outl)-1:
list2.append(outl[i])
i=i+1
list2.append(outl[i][0:-1])
#print list2
inputf.close()
inputf = open('/root/iptables/source.ip','r')
list3=[]
while True:
line=inputf.readline()
if (len(line)<4):
break;
outl=re.split(',',line)
i=0
while i<len(outl)-1:
list3.append(outl[i])
i=i+1
list3.append(outl[i][0:-1])
#print list3
inputf.close()
dict = {
'目的地址':list1,
'目的端口':list2,
'源地址':list3,
}
lists=[]
def suiji(num):
for key in combinations(dict.keys(), num):
for i in key:
lists.append(dict[i])
# print(lists)
code = '-'
fn = lambda x, code='-': reduce(lambda x, y: [str(i) + code + str(j) for i in x for j in y], x)
print(fn(lists, code))
#lists.clear()
# print('------------end----------')
if __name__ == '__main__':
suiji(3)
3、通过调用list.py命令输出的结果,遍历策略中的目的地址,对目的地址的saltstack客户端和iptables情况进行分类汇总,输出到指定目录下指定文件。如果通过检测可salt且iptables为标准模板的主机,输出开放iptables的批量操作脚本,运行后即可批量开放对应主机权限;对于无法salt和非标准iptables的主机根据对应日志文件再进行人工判断处理。引用的程序对应文件名"chuli.sh",这一步解决了"痛点二"的问题。
4、最后,再根据策略中源地址salt情况,输出抽样telnet验证的批量操作脚本。关于telnet的拨测是使用了该文中介绍的telnetfull的工具。引用的程序对应文件名"chuli.sh",这一步解决了"痛点三"的问题。
telnetfull工具参考如下:
https://vincentwong.blog.csdn.net/article/details/135333290
三、实现效果
1、将应用申请的策略表格,按照模板规范要求检查没问题后,直接copy导入到chuli.txt文件中。例如:
2、然后执行命令 sh chuli.sh,输入处理的工单号
3、执行命令结束后无报错出现如下提示,表示执行处理正常。
4、执行结束后,在result子目录对应工单目录下生成8个结果文档
chuli.txt:备份工单提交的策略申请内容
Iptables-null:目标地址未启动iptables的策略清单,无需处理,输出记录。
Iptables-ok:目标地址已启动标准iptables的策略清单,作为输出自动脚本的传参文件。
Iptables-other:目标地址已启动非标准iptables的策略单,需人工查看继续判断处理
salt-notok:目标地址无法被salt管理的策略清单,需人工查看继续判断处理
salt_iptables.log: 自动输出的批量iptables开放脚本(开通策略无脑粘贴即可)
shuchu.log:根据提交的工单内容,组合输出的全部策略的三元组组合对应清单
salt_telnet.log:自动输出的批量telnet验证脚本(验证策略无脑粘贴即可)
5、 执行1-4的步骤后,大大提升了之前处理网络策略的时间,也解放了生产力。