• 通过python构建集中式的病毒扫描机制


     

    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}
    ".format(cd.contscan_file(self.file))
    27         elif self.scan_type=="multiscan_file":
    28           self.scanresult="{0}
    ".format(cd.multiscan_file(self.file))
    29         elif self.scan_type=="scan_file":
    30           self.scanresult="{0}
    ".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[4PZX54(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测试字符串,即生成具有病毒特征的字符串,便于测试。

  • 相关阅读:
    日区 Apple ID共享
    强大的视频跨平台视频处理软件
    百度网盘无限速
    App Store看片神器,请收好
    bootstrap 中这段代码 使bundles 失败
    C# EF中调用 存储过程并调回参数
    mvc 默认访问 Area 下控制器方法
    怎样用SQL语句查看查询的性能指标
    slice 定义和用法
    C# Regex类用法
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/5045591.html
Copyright © 2020-2023  润新知