Python之——实现集中式的病毒扫描

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/78994928

本文是基于《Python之——病毒检测模块pyClamad的安装(基于CentOS 6.5系统)》和《Python之——pyClamad模块常用方法说明》的实战篇,若没有阅读《Python之——病毒检测模块pyClamad的安装(基于CentOS 6.5系统)》和《Python之——pyClamad模块常用方法说明》,请先阅读《Python之——病毒检测模块pyClamad的安装(基于CentOS 6.5系统)》和《Python之——pyClamad模块常用方法说明》。

注意:这里我们用的服务器为CentOS 6.5 x64, 主机名为liuyazhuang121, IP为192.168.209.121

一、架构描述

本文实现了一个集中式的病毒扫描管理,可以针对不同的业务环境定制扫描策略,比如:扫描对象、描述模式、扫描路径、调度频率等。实现的架构如下图,首先业务服务器打开clamd服务(监听3310端口),管理服务器启用多线程对指定的服务集群进行扫描,扫描模式、扫描路径会传递到clamd,最后返回扫描结果给管理服务器端。

二、具体实现

这里我们通过ClamdNetworkSocket()方法实现与业务服务器建立socket连接,再通过启动不同的扫描方式实施病毒扫描并返回结果,实现的扫描脚本scanner.py代码如下:

1# -*- coding:UTF-8 -*- 2''' 3Created on 2018年1月6日 4 5@author: liuyazhuang 6''' 7import time 8import pyclamd 9from threading import Thread 10 11class Scan(Thread): 12 def __init__(self, IP, scan_type, file): 13 Thread.__init__(self) 14 self.IP = IP 15 self.scan_type = scan_type 16 self.file = file 17 self.connstr = "" 18 self.scanresult = "" 19 20 def run(self): 21 """多进程run方法""" 22 try: 23 #创建网络套接字连接对象 24 cd = pyclamd.ClamdNetworkSocket(self.IP, 3310) 25 26 #测试连通性 27 if cd.ping(): 28 self.connstr = self.IP + " connection [OK]" 29 #重载clamd病毒特征库,建议更新病毒库后做reload()操作 30 cd.reload() 31 #选择不同的扫描模式 32 if self.scan_type == "contscan_file": 33 self.scanresult = "{0}\n.".format(cd.contscan_file(self.file)) 34 elif self.scan_type == "multiscan_file": 35 self.scanresult = "{0}\n.".format(cd.multiscan_file(self.file)) 36 elif self.scan_type == "scan_file": 37 self.scanresult = "{0}\n.".format(cd.scan_file(self.file)) 38 #线程挂起1秒 39 time.sleep(1) 40 else: 41 self.connstr = self.IP + " ping error, exit" 42 return 43 except Exception, e: 44 self.connstr = self.IP + " " + str(e) 45 46#扫描主机列表 47IPs = ['192.168.209.121'] 48#指定扫描模式,支持contscan_file、multiscan_file、scan_file 49scantype = "multiscan_file" 50#指定扫描路径 51scanfile = "/data/www" 52i = 1 53 54#指定启动线程数 55threadnum = 2 56#存储扫描Scan类线程对象列表 57scanlist = [] 58 59for ip in IPs: 60 #创建扫描Scan类对象,参数(IP,扫描模式,扫描路径) 61 currp = Scan(ip, scantype, scanfile) 62 #追加对象到列表 63 scanlist.append(currp) 64 65 #当达到指定的线程数或IP列表数后启动、退出线程 66 if i % threadnum == 0 or i == len(IPs): 67 for task in scanlist: 68 #启动线程 69 task.start() 70 71 for stask in scanlist: 72 #等待所有子线程退出,并输出扫描结果 73 task.join() 74 #打印服务器连接信息 75 print task.connstr 76 #打印扫描结果 77 print task.scanresult 78 scanlist = [] 79 80 i+=1 81

三、初步扫描结果

此时,我们通过python scanner.py运行扫描程序,结果为未发现病毒程序。具体扫描结果如下:

1[root@liuyazhuang121 chapter4]# python scanner.py 2192.168.209.121 connection [OK] 3None 4. 5[root@liuyazhuang121 chapter4]# 6

四、生成带病毒特征的文件

我们现在生成一个带病毒特征的文件,这里我们同样利用Python的pyclamd生成病毒特征的文件,这里我们新建一个Python脚本create.py,具体代码如下:

1# -*- coding:UTF-8 -*- 2''' 3Created on 2018年1月7日 4 5@author: liuyazhuang 6''' 7import pyclamd 8cd = pyclamd.ClamdNetworkSocket('192.168.209.121', 3310) 9#通过EICAR()方法生成一个带有病毒特征的文件/tmp/EICAR,编译测试 10void = open('/tmp/EICAR', 'w').write(cd.EICAR()) 11
1我们运行这个脚本后会在/tmp目录下生成一个EICAR病毒特征文件,如下: 2
1[root@liuyazhuang121 chapter4]# python create.py 2[root@liuyazhuang121 chapter4]# cat /tmp/EICAR 3X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* 4
1此时,我们将/tmp/EICAR文件移动到/data/www目录下。 2
1 mv /tmp/EICAR /data/www 2

五、再次扫描结果

此时,我们再次执行扫描脚本scanner.py,结果如下:

1[root@liuyazhuang121 chapter4]# python scanner.py 2192.168.209.121 connection [OK] 3{u'/data/www/EICAR': ('FOUND', 'Eicar-Test-Signature')} 4. 5[root@liuyazhuang121 chapter4]# 6
1这里,发现一个病毒特征文件/data/www/EICAR。 2

六、执行删除病毒文件命令,再次扫描

这里,我们执行命令

1rm /data/www/EICAR 2
1删除病毒特征文件,然后再次执行扫描脚本文件,得出结果如下: 2
1[root@liuyazhuang121 chapter4]# python scanner.py 2192.168.209.121 connection [OK] 3None 4. 5[root@liuyazhuang121 chapter4]# 6
1此时,未发现任何病毒特征文件。 2

到此,我们实现的病毒扫描案例结束。

代码交流 2021