1. 程式人生 > >實現集中式的病毒掃描

實現集中式的病毒掃描

一、概要

  本次實踐實現了一個集中式的病毒掃描管理,可以針對不同業務環境定製掃描策略,比如掃描物件、描述模式、掃描路徑、排程頻率等。示例實現的架構圖見下圖,首先業務伺服器開啟clamd服務(監聽3310埠),管理伺服器啟用多執行緒對指定伺服器叢集進行掃描,掃描模式、掃描路徑會傳遞到clamd,最後返回掃描結果給管理服務端。

 

二、程式碼實現

本次實踐通過ClandNetworkSocket()方法實現業務伺服器建立掃描socket連線,在通過啟動不同掃描方式實施病毒掃描並返回結果。實現程式碼如下:

[[email protected] py_clamad]# cat simple1.py

#!/usr/bin/env python
# -*- coding: utf-8 *-


import time
import pyclamd
from threading import Thread


class Scan(Thread):
    def __init__(self,IP,scan_type,file):
        '''
        構造方法,引數初始化
        :param IP:
        :param scan_type:
        :param file:
        '''
        Thread.__init__(self)
        self.IP 
= IP self.scan_type = scan_type self.file = file self.connstr = "" self.scanresult = "" def run(self): ''' 多程序run方法 :return: ''' try: cd = pyclamd.ClamdNetworkSocket(self.IP,3310) #建立網路套接字連線物件
if cd.ping(): #探測連通性 self.connstr = self.IP+" connection [OK]" cd.reload() #過載clamd病毒庫特徵,建立更新病毒庫後做reload()操作 if self.scan_type == "contscan_file": #選擇不同的掃描模式 self.scanresult="{0}\n".format(cd.contscan_file(self.file)) elif self.scan_type == "multiscan_file": self.scanresult="{0}\n".format(cd.multiscan_file(self.file)) elif self.scan_type == "scan_file": self.scanresult = "{0}\n".format(cd.scan_file(self.file)) time.sleep(1) #執行緒掛起1秒 else: self.connstr = self.IP+ "ping error,exit" return except Exception as e: self.connstr=self.IP+" "+str(e) IPs = ['192.168.12.224','192.168.12.225'] #掃描主機列表 scantype = "multiscan_file" #指定掃描模式,支援multiscan_file、contscan_file、scan_file scanfile = "/data/www" #指定掃描路徑 i=1 threadnum = 2 #指定啟動的執行緒數 scanlist = [] #儲存掃描scan類執行緒物件列表 for ip in IPs: currp = Scan(ip,scantype,scanfile) #建立掃描Scan類物件,引數(IP,掃描模式,掃描路徑) scanlist.append(currp) #追加物件到列表 if i%threadnum == 0 or i == len(IPs): #當達到指定的執行緒數或IP列表數後啟動、退出執行緒 for task in scanlist: task.start() #啟動執行緒 for task in scanlist: task.join() #等待所有子執行緒退出,並輸出掃描結果 print(task.connstr) #列印伺服器連線資訊 print(task.scanresult) #列印掃描結果 scanlist = [] i +=1

通過EICAR()方法生成一個帶有病毒特徵的檔案/tmp/EICAR,把生成的檔案放到腰掃描的目錄下(/data/www)程式碼如下

>>> import pyclamd
>>> cd = pyclamd.ClamdAgnostic()
>>> cd.ping()
True
>>> print(cd.version().split()[0])
ClamAV
>>> print(cd.reload())
RELOADING
>>> print(cd.stats().split()[0])
POOLS:
>>> void = open('/tmp/EICAR','w').write(cd.EICAR())     #磁碟程式碼有誤,應該以wb模式開啟
>>> void = open('/tmp/NO_EICAR','w').write('no virus in this file')
>>> cd.scan_file('/tmp/EICAR')
{'/tmp/EICAR': ('FOUND', 'Eicar-Test-Signature')}
>>> cd.scan_file('/tmp/NO_EICAR') is None
True
>>> cd.scan_stream(cd.EICAR())
{'stream': ('FOUND', 'Eicar-Test-Signature')}
官方示例程式碼

親測可用

>>> import pyclamd
>>> cd = pyclamd.ClamdAgnostic()
>>> void = open('/tmp/EICAR','wb').write(cd.EICAR())
>>> void = open('/tmp/NO_EICAR','w').write('no virus in this file')
>>> cd.scan_file('/tmp/EICAR')
{'/tmp/EICAR': ('FOUND', 'Eicar-Test-Signature')}
>>> cd.scan_file('/tmp/NO_EICAR') is None
True
>>> cd.scan_stream(cd.EICAR())
{'stream': ('FOUND', 'Eicar-Test-Signature')}

把生成的病毒特徵檔案拷貝至/dada/www掃描目錄下

[[email protected] py_clamad]# cp /tmp/EICAR /tmp/NO_EICAR /data/www/
[[email protected] py_clamad]# ls /data/www/
EICAR  NO_EICAR

執行程式碼結果如下圖所示