Clam AntiVirus(Clam AV)是一个免费而且开放源码的防毒软件,软件与病毒库的更新由开源社区免费发布,目前ClamdAV主要为Linux、Uinux系统提供病毒扫描查杀pyClamad是一个python的第三方模块,可让python直接使用ClamAV病毒扫描守护进程clamd来实现一个高效的病毒检测功能。

一、实现集中式的病毒扫描

1、客户端(病毒扫描源)安装clamavp clamd 服务的相关程序包

# yum install clamav clamd clamav-update -y

# chkconfig clamd on

更新病毒库

# /usr/bin/freshclam

更改配置文件修改监听地址到所有网络,启动服务

# sed -i -e '/^TCPAddr/{ s/127.0.0.1/0.0.0.0/;}' /etc/clamd.conf

# /etc/init.d/clamd start

2、主控端安装pyClamd模块     参考:http://xael.org/pages/pyclamd-en.html

# pip  install pyclamd

验证安装结果:

>>> import pyclamd
>>> cd = pyclamd.ClamdAgnostic()
>>> cd.ping()
True

工作原理:管理服务器通过python发出多线程指令连接业务服务器的3310端口,执行病毒扫描,然后返回结果给管理服务器。 业务服务器必须安装clamd相关程序包,并启动服务监听在3310端口才能正常收到指令;可以针对不同业务环境定制相应的扫描策略,比如扫描对象、描述模式、扫描路径、调试频率等。

实现代码:simplel.py

 1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 import time
4 import pyclamd
5 from threading import Thread
6 class Scan(Thread): #继承多线程Thread类
7 def __init__ (self,IP,scan_type,file):
8 """构造方法"""
9 Thread.__init__(self)
10 self.IP = IP
11 self.scan_type=scan_type
12 self.file = file
13 self.connstr=""
14 self.scanresult=""
15 def run(self):
16 """多进程run方法"""
17 try:
18 cd = pyclamd.ClamdNetworkSocket(self.IP,3310)
19 """探测连通性"""
20 if cd.ping():
21 self.connstr=self.IP+" connection [OK]"
22 """重载clamd病毒特征库"""
23 cd.reload()
24 """判断扫描模式"""
25 if self.scan_type=="contscan_file":
26 self.scanresult="{0}\n".format(cd.contscan_file(self.file))
27 elif self.scan_type=="multiscan_file":
28 self.scanresult="{0}\n".format(cd.multiscan_file(self.file))
29 elif self.scan_type=="scan_file":
30 self.scanresult="{0}\n".format(cd.scan_file(self.file))
31 time.sleep(1)
32 else:
33 self.connstr=self.IP+" ping error,exit"
34 return
35 except Exception,e:
36 self.connstr=self.IP+" "+str(e)
37 IPs=['172.16.65.201','172.16.65.202'] #扫描主机的列表
38 scantype="multiscan_file" #指定扫描模式,支持 multiscan_file、contscan_file、scan_file
39 scanfile="/usr/local/bin" #指定扫描路径
40 i=1
41 threadnum=2 #指定启动的线程数
42 scanlist = [] #存储Scan类线程对象列表
43 for ip in IPs:
44 """将数据值带入类中,实例化对象"""
45 currp = Scan(ip,scantype,scanfile)
46 scanlist.append(currp) #追加对象到列表
47 """当达到指定的线程数或IP列表数后启动线程"""
48 if i%threadnum==0 or i==len(IPs):
49 for task in scanlist:
50 task.start() #启动线程
51 for task in scanlist:
52 task.join() #等待所有子线程退出,并输出扫描结果
53 print task.connstr #打印服务器连接信息
54 print task.scanresult #打印结果信息
55 scanlist = []
56 i+=1

在已安装clamav的被控端安装pyclamd模块后,通过EICAR()方法生成一个带有病毒特征的文件/tmp/EICAR,代码如下: (或者复制下面现有蓝色代码)

>>> import pyclamd

>>> cd = pyclamd.ClamdAgnostic()

>>> void = open('/tmp/EICAR','w').write(cd.EICAR())

生成带有病毒特征的字符串内容如下,复制文件/tmp/EICAR到目标主机的扫描目录当中,以便进行测试。
# cat /tmp/EICAR
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

最后,启动扫描程序,在本次实践过程中启用两个线程,可以根据目标主机数据随意修改,代码运行结果如下所示:
[root@localhost pyclamd]# python simplel.py
172.16.65.200 connection [OK]
{u'/usr/local/bin/EICAR': ('FOUND', 'Eicar-Test-Signature')

参考资料:http://www.tuicool.com/articles/uQZzyqA

------------------------------------------------------------------

pyclamd模块常用方法说明:

pyclamd提供了两个关键类,一个为ClamdNetworkSocket()类,实现使用网络套接字操作clamd;另一个为ClamdUnixSocket()类,实现使用Unix套接字类操作clamd.两个类定义的方法完全一样,本节以ClamdNetworkSocket()类进行说明。

__init__(self,host='127.0.0.1',port=3310,timeout=None)方法,是ClamdNetworkSocket类的初始化方法,与/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操作。

EICAR(self)方法,返回EICAR测试字符串,即生成具有病毒特征的字符串,便于测试。

通过python构建集中式的病毒扫描机制的更多相关文章

  1. HDFS集中式的缓存管理原理与代码剖析--转载

    原文地址:http://yanbohappy.sinaapp.com/?p=468 Hadoop 2.3.0已经发布了,其中最大的亮点就是集中式的缓存管理(HDFS centralized cache ...

  2. HDFS集中式的缓存管理原理与代码剖析

    转载自:http://www.infoq.com/cn/articles/hdfs-centralized-cache/ HDFS集中式的缓存管理原理与代码剖析 Hadoop 2.3.0已经发布了,其 ...

  3. 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具

    老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...

  4. ELK+Filebeat 集中式日志解决方案详解

    链接:https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html?ca=drs- ELK Stack ...

  5. elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统

    前言 刚从事开发那段时间不习惯输出日志,认为那是无用功,徒增代码量,总认为自己的代码无懈可击:老大的叮嘱.强调也都视为耳旁风,最终导致的结果是我加班排查问题,花的时间还挺长的,要复现问题.排查问题等, ...

  6. [水煮 ASP.NET Web API2 方法论](3-1)集中式路由

    问题 怎样集中的定义路由 解决方案 通过调用 HttpRouteCollectionExtension 类中的 MapHttpRoute 扩展方法在 HttpRouteCollection 中定义路由 ...

  7. Git学习系列之集中式版本控制系统vs分布式版本控制系统

    不多说,直接上干货! Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 先说集中式版本控制系统,版本库是集中存放在中央 ...

  8. springCloud学习1(集中式配置管理)

    springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33 一.前言   在开发普通的 web 应用中,我们通常是将配置项写在单 ...

  9. 集中式日志分析平台 - ELK Stack - 安全解决方案 X-Pack

    大数据之心 关注  0.6 2017.02.22 15:36* 字数 2158 阅读 16457评论 7喜欢 9 简介 X-Pack 已经作为 Elastic 公司单独的产品线,前身是 Shield, ...

随机推荐

  1. oracle单表选择率(selectivity)——计算执行计划的基数

    CBO优化器是基于对当前经过特定测试的数据集中预期的行比率估计来计算基数的.此处的行数之比是一个数值,称为选择率(selectivity).得到选择率之后,将其与输入行数进行简单相乘既可得到基数. 在 ...

  2. Nginx 下部署 HTTPS 与安全调优

    什么是 HTTPS?# HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的 ...

  3. vscode中使用Experimental Decorators报错

    在vscode中使用es7的新语法decorator会报错,如图: 这是错误来自与vscode的JS support,只要在项目根目录下创建一个jsconfig.json文件,添加如下内容: { &q ...

  4. BEGIN-4_蓝桥杯_Fibonacci数列

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-+Fn-,其中F1=F2=. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n. 输 ...

  5. jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题

    https://github.com/douglascrockford/JSON-js使用其中的 json2.js 作为兼容.这个JS中的函数将JSON对象转换成JSON字符串,解决 IE6.7.8. ...

  6. RDD之六:Action算子

    本质上在Actions算子中通过SparkContext执行提交作业的runJob操作,触发了RDD DAG的执行. 根据Action算子的输出空间将Action算子进行分类:无输出. HDFS. S ...

  7. JavaScript-Tool:Numeral.js

    ylbtech-JavaScript-Tool:Numeral.js A javascript library for formatting and manipulating numbers. 1. ...

  8. MySQL 报错记录

    #--------------------------------------------------------------------------------------------------- ...

  9. [UE4]添加射击的准心

    其实就是创建一个UI Widget,在UI Widget中添加一个准心图片(png)格式,准心图片设置为屏幕居中对齐,然后在自定义的GameMode中把这个UI Widget添加到视图中.

  10. .Net2.0部署在IIS8.5上的问题

     请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理. 到"应用程序池"里找网站对应的应用程序池(右击网站-> 高级设置),双击程序池, 看程序池是否也网站的net ...