一、前言

企业安全防护策略中会要求操作系统开启防火墙,开启iptables防火墙后,对于业务网络访问意味着要经常去变更调整iptables防火墙策略。如果是管理几台服务器,手工登录操作下还能接受。但在实际大型IT架构中,可能涉及到的服务器成千上万,iptables变动起来如果没有自动化的手段那种痛苦可想而知。遇到过的痛苦比如有:

痛点1:云改数转之际,针对多系统上云过程中网络开放申请工单策略繁多且规则复杂(细化后一个工单,主机iptables策略可能面临成千上万条),需要梳理出全部的三元组关系(源地址、目的地址、目的端口),导致人工梳理通常需要大半天时间,给上云工作带来很大的困扰,急需一个便利的批量组合处理工具。


痛点2:现网环境不是全部都是统一的标准化iptables模板,有些历史主机iptables开放情况各不相同,每次开通规则前还需对主机iptables开放情况先进行确认,人工确认的方式耗时较大,急需一个工具可以自动判断iptables的实情。


痛点3:主机防火墙网络权限开放后,最后需要进行开放策略的验证探测,人工探测存在取样不充分,探测效率不高的情况,急需一个工具可以在策略开通后telnet自动验证策略开通情况。

二、实现过程

1、先从源头上规范定义申请工单内容,输出标准规范的网络申请模板《上云系统主机侧开放策略模板》,例如

2、定义好输入格式后,针对应用申请的一对多、多对多和多对一的网络权限要求,通过python编写组合处理程序,输入工单内容后,自动输出全部三元组对应关系,解决了“痛点一”的问题。

程序对应文件名“list.py”---由主shell脚本调用执行

#!/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的步骤后,大大提升了之前处理网络策略的时间,也解放了生产力。

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐