4.1 构建集中式的病毒扫描机制 pyclamd

4.1 构建集中式的病毒扫描机制 pyclamd

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

pyClamd模块安装:
1.被检测机器操作(客户端)

[root@mankel py] yum -y install clamav clamd clamav-update #安装clamavp相关程序包
[root@mankel py] pip3 install pyClamd  #直接pip安装
[root@mankel py] /usr/bin/freshclam  #更新病毒库,建议配置到crontab中定期更新
[root@mankel py] setenforce 0   #关闭SELinux,避免远程扫描时提示无权限的问题

#更新守护进程监听IP配置文件,根据不同环境自行修改监听的IP,"0.0.0.0"为监听所有主机IP

[root@mankel py] sed -i -e '/^TCPAddr/{ s/127.0.0.1/0.0.0.0/;}' /etc/clamd.d/scan.conf
#取消掉TCPSocket的注释,开放监听端口,开放端口为3310
[root@mankel py] sed -i 's/^#TCPSocket.*/TCPSocket 3310/g' /etc/clamd.d/scan.conf
[root@mankel py] /usr/sbin/clamd  start #启动扫描守护进程
[root@mankel py] ss -ntulp |grep 3310  #查看是否启动成功
tcp    LISTEN     0      200       *:3310                  *:*                   users:(("clamd",pid=22698,fd=5))

2.检测机器操作(主控端),部署pyClamad

[root@mankel py] pip3 install pyClamd
Successfully installed pyClamd-0.4.0
[root@mankel py] python3
>>> import pyclamd
>>> cd = pyclamd.ClamdAgnostic()
>>> cd.ping()
True  #返回true即为安装OK

4.1.1 模块常用方法说明

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

1).init(self,host=‘127.0.0.1’,port=3310,timeout=None)方法,是ClamdNetworkSocket类的初始方法,参数host为连接主机IP;参数port为连接的端口,默认为3310,与/etc/clamd.d/scan.conf配置文件中的TCPSocket参数要保持一致;timeout为连接的超时时间
2).contscan_file(self.file)方法,实现扫描指定的文件或目录,在扫描时发生错误或发现病毒将不终止,参数file(string类型)为指定的文件或目录的绝对路径
3).multiscan_file(self.file)方法,实现多线程扫描指定的文件或目录,多核环境速度更快,在扫描时发生错误或发现病毒将不终止,参数file(string类型)为指定的文件或目录的绝对路径
4).scan_file(self,file)方法,实现扫描指定的文件或目录,在扫描时发生错误或发现病毒将终止,参数file(string类型)为指定的文件或目录的绝对路径
5).shutdown(self)方法,实现强制关闭clamd进程并退出 6).stats(self)方法,获取Clamscan的当前状态
7).reload(self)方法,强制重载clamd病毒特征库,扫描前建议做reload操作
8).EICAR(self)方法,返回EICAR测试字符串,即生成具有病毒特征的字符串,便于测试

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

1.本次实践通过ClamdNetworkSocket()方法实现与业务服务器建立扫描socket连接,再通过启动不同扫描方式实施病毒扫描并返回结果,实现代码如下:

[root@mankel py] vim test.py 
#!/usr/bin/python3
# -*- 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_type
                self.file = file
                self.connstr = ""
                self.scanresult = ""

        def run(self):
                "多线程run方法"
                try:
                        cd = pyclamd.ClamdNetworkSocket(self.IP,3310)
                        if cd.ping():
                                self.connstr = self.IP+" connection [OK]"
                                cd.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)
                        else:
                                self.connstr = self.IP+" ping error,exit"
                                return
                except Exception as e:
                        self.connstr=self.IP+" "+str(e)

IPs=['192.168.0.99','x.x.x.x']
scantype = "multiscan_file"
scanfile = "/data/www"
i = 1

threadnum = 2
scanlist = []

for ip in IPs:
        print(ip)
        currp = Scan(ip,scantype,scanfile)
        scanlist.append(currp)

        if i%threadnum == 0 or i == len(IPs):
                for task in scanlist:
                        task.start()

                for task in scanlist:
                        task.join()
                        print(task.connstr)
                        print(task.scanresult)
                scanlist = []
        i+=1

2.执行结果:

[root@mankel py] python3 test.py 
192.168.0.99 connection [OK]
None

3.生成病毒特征文件:
通过EICAR()方法生成一个带有病毒特征的文件/tmp/EICAR:代码如下

[root@mankel py] python3.
>>> import pyclamd
>>> cd = pyclamd.ClamdAgnostic()
>>> void = open('/tmp/EICAR','wb').write(cd.EICAR())

4.查看病毒特征文件
生成带有病毒特征的字符串内容如下,复制文件到目标主机的扫描目录当中,以便进行测试

[root@mankel py] cat /tmp/EICAR 
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
[root@mankel py] cp /tmp/EICAR /data/www/

5.启动扫描程序,感受区别
在本次实践过程中启用两个线程,可以根据目标主机数量,随意修改,代码运行结果如下:

[root@mankel py] python3 test.py 
192.168.0.99 connection [OK]
{'/data/www/EICAR': ('FOUND', 'Win.Test.EICAR_HDB-1')}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值