基於Python的病毒掃描機制


構建集中式病毒掃描機制(ClamAV)

  Clam AntiVirus(ClamAV)是一款免費而且開源的防毒軟件,軟件與病毒庫的更新皆有社區免費發布,官網地址:http://www.clamav.net/lang/en/。目前ClamAV主要為Linux、Unix系統提供病毒掃描、查殺服務等。pyClamad((http://xael.org/norman/python/pyclamd/)是一個Python第三方模塊,可讓Python直接使用ClamAV病毒掃描守護進程clamd,來實現一個搞笑的病毒檢測功能,另外,pyClamad模塊也非常容易整合到我們已有的平台中,下面詳細進行說明。

 

pyClamad模塊安裝方法:

  1.客戶端(病毒掃描源)安裝步驟

# yum install -y clamav clamd clamav-update #安裝clamavp相關程序包
# chkconfig --levels 235 clamd on # 添加掃描守護進程clamd系統服務
# /usr/bin/freshclam	# 更新病毒庫,建議配置到crontab中定期更新
# setenforce 0 #關閉 SELinux,避免遠程掃描時提示無權限問題

  2. 主控端部署 pyClamad環境步驟

# wget http://xael.org/norman/python/pyclamd/pyClamd-0.3.4.tar.gz
# tar -zxvf pyClamd-0.3.4.tar.gz
# cd pyClamd-0.3.4
# python setup.py install

  

塊常用方法說明:

  pyClamad提供了兩個關鍵類,一個為 ClamdNetworkSocket()類,實現使用網絡套接字操作clamd; 另一個為 ClamdUnixSocket()類,實現使用Unix套接字類操作clamd,兩個類定義的方法完全一樣,本節以 ClamdNetworkSocket()類說明

__init__(self,host='127.0.0.1',port=3310,timeout=None)方法,是 clamdNetworkSocket()類的初始化方法,參數host為連接主機IP,參數port為連接端口,默認為3310,與/etc/clamd.conf配置文件中的TCPSocket參數要保持一致;timeout為連接的超時時間。

contscan_file(self,file)方法,實現掃描指定的文件或目錄,在掃描時發生錯誤或發行病毒將不終止,參數 file(string類型)為指定的文或目錄的絕對路徑

multiscan_file(self,file)方法,實現多線程掃描指定的文件或目錄,多核環境速度更快,在掃描發生錯誤或發現將不終止,參數 file(string類型)為指定的文件或目錄的絕對路徑。

scan_file(self,file)方法,實現掃描指定文件或目錄,在掃描時發生錯誤或發現病毒將終止,參數 file(string類型)為指定的文件或目錄的絕對路徑

shutdown(self)方法,實現強制關閉clamd進程並退出。 

stats(self)方法,獲取Clamscan的當前狀態。

reload(self)方法,強制重載clamd病毒特征庫,掃描前建議做reload操作

ELCAR(self)方法,返回ELCAR測試字符串,即生成有病毒特征的字符串,便於測試

 

實踐:實現集中式的病毒掃描

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

  

#!/usr/bin/python
# -*- coding: utf-8 -*- 
import time
import pyclamd
from threading import Thread
class Scan(Thread)
	def __init__(self,IP,scan_type,file):
		"""構造方法,參數初始化"""
		Thread.__init__(self)
		self.IP = IP
		self.scan_type = scan_fype
		self.file = file
		self.connstr = ""
		self.scanresult = ""
	def run(self):
		"""多線程 run 方法 """
		try:
			cd = pyClamad.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:
				seif.connstr=self.IP+ "ping error,exit"
				return
		except Exception,e:
			self.connstr=self.IP+" "+str(e)
Ips=['192.168.1.21,192.168.1.22']		# 掃描主機列表
scantype="multiscan_file"		#指定掃描模式,支持multiscan_file、contscan_file、sca
scanfile="/date/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 take in scanlist:
			take.start()		# 啟動線程
		for take in scanlist:
			take.join()			#等待所有子線程退出,並輸出掃描結果
			print take.connstr 		#打印服務器連接信息
			print take.scanresult 		#打印掃描結果
		scanlist = []
	i+=1
	#通過EICAR()方法生成一個帶有病毒特征的文件/tmp/EICAR,代碼如下:
	
	void = open('/tmp/EICAR','W').write(cd.EICAR()) 

  

  最后,啟動掃描程序,在本次實踐過程中啟用兩個線程,可以根據目標主機隨意修改,代碼運行結果如下,其中192.168.1.21主機沒有發現病毒,192.168.1.22主機中發現了病毒測試文件EICAR。

  

# python simple1.py
192.168.1.21 connection [OK]
None

192.168.1.22 connection [OK]
{u'/data/www/Lwebadmin/EICAR': ('FOUND', 'Eicar-Test-signature')}

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM