一、背景
Clam AntiVirus(Clam AV)是一个免费而且开放源码的防毒软件,软件与病毒库的更新由开源社区免费发布,目前ClamdAV主要为Linux、Uinux系统提供病毒扫描查杀pyClamad是一个python的第三方模块,可让python直接使用ClamAV病毒扫描守护进程clamd来实现一个高效的病毒检测功能。
二、工作原理
管理服务器通过python发出多线程指令连接业务服务器的3310端口,执行病毒扫描,然后返回结果给管理服务器。 业务服务器必须安装clamd相关程序包,并启动服务监听在3310端口才能正常收到指令;可以针对不同业务环境定制相应的扫描策略,比如扫描对象、描述模式、扫描路径、调试频率等。
三、clamav+pyClamad安装以及脚本编写
3.1 机器准备
检测机器
10.32.176.80
被检测机器
10.32.176.86
3.2 被检测机器操作
创建clamav组,创建clamav用户并加入clamav组
groupadd clamav
useradd -g clamav clamav
安装源码编译工具和clamav dependencies
yum install -y \
gcc gcc-c++ make python3 python3-pip valgrind \
bzip2-devel check-devel json-c-devel libcurl-devel libxml2-devel \
ncurses-devel openssl-devel pcre2-devel sendmail-devel zlib-devel
下载clamav的源码包:
wget https://www.clamav.net/downloads/production/clamav-0.103.3.tar.gz
编译安装clamav
tar -zxvf clamav-0.103.3.tar.gz (解压)
cd clamav-0.103.3 (进入目录)
./configure --prefix=/usr/local/clamav
make
make install (编译并安装 )
启动clamav
创建目录
mkdir /usr/local/clamav/logs (日志存放目录)
mkdir /usr/local/clamav/updata (clanav 病毒库目录)
修改配置文件
cp /usr/local/clamav/etc/clamd.conf.sample /usr/local/clamav/etc/clamd.conf
cp /usr/local/clamav/etc/freshclam.conf.sample /usr/local/clamav/etc/freshclam.conf
vim /usr/local/clamav/etc/clamd.conf
#Example 注释掉这一行. 第8 行
LogFile /usr/local/clamav/logs/clamd.log 删掉前面的注释目录改为logs下面 第14行
PidFile /usr/local/clamav/updata/clamd.pid 删掉前面的注释路径改一下 第57行
DatabaseDirectory /usr/local/clamav/updata 同上 第65行
vi /usr/local/clamav/etc/freshclam.conf
#Example 注释掉这一行. 第8 行
DatabaseDirectory /usr/local/clamav/updata
UpdateLogFile /usr/local/clamav/logs/freshclam.log
PidFile /usr/local/clamav/updata/freshclam.pid
创建日志文件并授权
touch /usr/local/clamav/logs/freshclam.log
chown clamav:clamav /usr/local/clamav/logs/freshclam.log
touch /usr/local/clamav/logs/clamd.log
chown clamav:clamav /usr/local/clamav/logs/clamd.log
chown clamav:clamav /usr/local/clamav/updata
离线安装病毒库
#cd /usr/local/clamav/updata
提前下载以下病毒库并上传到机器:
#wget http://database.clamav.net/main.cvd
#wget http://database.clamav.net/daily.cvd
#wget http://database.clamav.net/bytecode.cvd
在线更新病毒库
/usr/local/clamav/bin/freshclam (升级病毒库) 确保LINUX可以正常上网。
开放监听端口,启动服务
sed -i -e '/^TCPAddr/{ s/127.0.0.1/0.0.0.0/;}' /usr/local/clamav/etc/clamd.conf
取消掉TCPSocket的注释,开放监听端口,开放端口为3310
sed -i 's/^#TCPSocket.*/TCPSocket 3310/g' /usr/local/clamav/etc/clamd.conf
/usr/local/clamv/sbin/clamd start 启动lsof -i:3310 检测是否监听
如果监听成功则在检测机器上运行脚本即可。。。
3.3 检测机器操作
安装pyClamad的环境
wget https://xael.org/pages/pyClamd-0.4.0.tar.gz
解压安装
tar -zxvf pyClamd-0.4.0.tar.gzpython setup.py install
验证在python中能否调用clamav
# pyhton
>>> import pyclamd
>>> cd = pyclamd.ClamdAgnostic()
>>> cd.ping()
>True
返回true即为ok
编写检测脚本
vim simplel.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import pyclamd
from threading import Thread
class Scan(Thread): #继承多线程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]"
"""重载clamd病毒特征库"""
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,e:
self.connstr=self.IP+" "+str(e)
IPs=['10.32.176.86','xx.xx.xx.xx'] #扫描主机的列表
scantype="multiscan_file" #指定扫描模式,支持 multiscan_file、contscan_file、scan_file
scanfile="/usr/local/bin" #指定扫描路径
i=1
threadnum=2 #指定启动的线程数
scanlist = [] #存储Scan类线程对象列表
for ip in IPs:
"""将数据值带入类中,实例化对象"""
currp = Scan(ip,scantype,scanfile)
scanlist.append(currp) #追加对象到列表
"""当达到指定的线程数或IP列表数后启动线程"""
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
四、病毒特征文件生成
- 在已安装clamav的被控端安装pyclamd模块后,通过EICAR()方法生成一个带有病毒特征的文件/tmp/EICAR
# python
>>> 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*
五、执行结果对比
被检测机器本地执行检测:
/usr/local/clamav/bin/clamdscan -i /tmp -l /root/clamscan.log
检测机器执行py脚本:
python simplel.py
大功告成。。。