Rocky9.5安装ClamAV杀毒软件并使用s-nail发送邮件通知

前言

ClamAV(Clam AntiVirus)是一个开源的防病毒工具,广泛应用于网络安全领域。它的主要功能包括病毒扫描、恶意软件检测、以及电子邮件网关的病毒防护。ClamAV以其高效的性能和灵活的配置选项,成为网络安全从业人员的重要工具。

1、ClamAV简介

ClamAV是由Tomasz Kojm于2001年创建的一个开源项目。该项目最初的目的是提供一个可以在Unix平台上使用的免费防病毒软件。随着时间的推移,ClamAV的功能不断扩展,并且现在已经支持多个操作系统,包括Linux、Windows和macOS。官网:https://www.clamav.net

1、 ClamAV的主要组件

ClamAV主要由以下几个组件组成:

● clamscan:一个命令行扫描工具,用于扫描文件和目录。

● freshclam:一个自动更新工具,用于更新病毒数据库。

● clamd:一个多线程的守护进程,用于高效的文件扫描。

● 开源免费:ClamAV是一个完全开源和免费的防病毒软件,这使得它在预算有限的环境中非常有吸引力。

● 跨平台支持:ClamAV支持多个操作系统,包括Linux、Windows和macOS,这使得它在各种环境中都能使用。

● 高效扫描:ClamAV的clamd守护进程支持多线程扫描,提高了扫描速度和效率。

● 自动更新:ClamAV通过freshclam工具自动更新病毒数据库,确保始终拥有最新的病毒特征库。

2、ClamAV的安装与配置

官网下载rpm包,官网下载地址:https://www.clamav.net/downloads

wget https://www.clamav.net/downloads/production/clamav-1.4.2.linux.x86_64.rpm

1、安装

rpm -ivh clamav-1.4.2.linux.x86_64.rpm

配置SELinux(注:如果服务器已经禁用selinux,可跳过这步)

# 配置ClamAV权限
setsebool -P antivirus_can_scan_system 1 
setsebool -P clamd_use_jit 1 

# 查看设置结果
# getsebool -a | grep antivirus 
antivirus_can_scan_system --> on 
antivirus_use_jit --> on 

clamav 有两个命令:clamdscan、clamscan:

  • clamscan 命令:通用,不依赖服务,命令参数较多,执行速度稍慢
  • clamdscan 命令:是一个搭配clamd常驻服务的扫毒工具,功能非常类似clamscan,执行效率较高,但是可用的参数较少(因为部分功能是由 clamd 控制的)。不用带 -r ,默认会递归扫描子目录

2、创建目录

#创建病毒数据库和日志目录
mkdir -p /data/clamav/db
mkdir -p /data/clamav/logs
#创建日志文件
touch /data/clamav/logs/clamd.log
touch /data/clamav/logs/freshclam.log

#权限设置
groupadd clamav
useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav
chown -R clamav:clamav /data/clamav/logs/freshclam.log
chown -R clamav:clamav /data/clamav/db

3、配置文件修改

cd /usr/local/etc
cp clamd.conf.sample clamd.conf
cp freshclam.conf.sample freshclam.conf
vim clamd.conf
#Example  注释掉
#下方内容添加至conf中
LogFile /data/clamav/logs/clamd.log
PidFile /data/clamav/clamd.pid
DatabaseDirectory /data/clamav/db
LogRotate yes
TCPSocket 23310
TCPAddr 0.0.0.0


主要配置参数含义:
- LogFile:指定日志文件的位置。
- LogTime:在日志中记录时间戳。
- LogClean:记录干净文件的扫描结果。
- LogVerbose:记录详细日志。
- LocalSocket:指定本地套接字文件的位置。
- FixStaleSocket:自动修复陈旧的套接字文件。
- User:指定运行ClamAV的用户。
vim freshclam.conf
#Example  注释掉
#下方内容添加至conf
DatabaseDirectory /data/clamav/db
UpdateLogFile /data/clamav/logs/freshclam.log
PidFile /data/clamav/db/freshclam.pid
LogRotate yes


主要配置参数含义:
- DatabaseDirectory:指定病毒库文件的存储位置。
- UpdateLogFile:指定更新日志文件的位置。
- LogTime:在日志中记录时间戳。
- LogVerbose:记录详细日志。
- Checks:指定每天检查更新的次数。
- DatabaseOwner:指定病毒库文件的所有者。

4、下载病毒库

完成安装后,必须更新 Cla­mAV 的病毒数据库。

freshclam  # 自动更新(可能因网络较慢)
# 或手动下载病毒库文件(推荐国内用户):
wget http://db.cn.clamav.net/daily.cvd
wget http://db.cn.clamav.net/main.cvd
wget http://db.cn.clamav.net/bytecode.cvd
cp .cvd /data/clamav/db/

病毒库保存位置:
/data/clamav/db/daily.cvd 
/data/clamav/db/main.cvd 


下载地址或者是:
http://database.clamav.net/main.cvd
http://database.clamav.net/daily.cvd
http://database.clamav.net/bytecode.cvd

5、启动Clamd服务

vim /etc/systemd/system/clamd.service
[Unit]
Description=Clam AntiVirus Daemon
After=network.target

[Service]
Type=forking
ExecStart=clamd
ExecReload=kill -HUP $MAINPID
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
systemctl enable clamd.service
systemctl start clamd.service
systemctl status clamd.service

6、设置定时更细病毒库和扫描任务

crontab -e
#让服务器每天晚上定时更新和杀毒,保存杀毒日志,crontab文件如下:
0 2 * * * /usr/local/bin/freshclam --quiet
30 2 * * *  /usr/local/bin/clamscan -r -i /home --max-dir-recursion=5 --remove -l /data/clamav/logs/clamav_home_daily_scan.log
0 3  * * *  /usr/local/bin/clamscan -r -i /etc --max-dir-recursion=5 --remove -l /data/clamav/logs/clamav_etc_daily_scan.log
30 3 * * *  /usr/local/bin/clamscan -r -i /bin --max-dir-recursion=5 --remove -l /data/clamav/logs/clamav_bin_daily_scan.log
0 4  * * *  /usr/local/bin/clamscan -r -i /usr --max-dir-recursion=5 --remove -l /data/clamav/logs/clamav_usr_daily_scan.log
30 4 * * *  /usr/local/bin/clamscan -r -i /var --max-dir-recursion=5 --remove -l /data/clamav/logs/clamav_var_daily_scan.log
crontab -e (可选)
00 01,13 * * * /usr/local/bin/freshclam --quiet

# 添加freshclam为系统服务
# vim /etc/systemd/system/freshclam.service
[Unit]
Description = freshclam scanner
After = network.target
  
[Service]
Type = forking
ExecStart = /usr/local/bin/freshclam -d -c 2   #一天更新两次
Restart = on-failure
PrivateTmp = true
  
[Install]
WantedBy=multi-user.target
  
systemctl enable freshclam.service
systemctl start freshclam.service
systemctl status freshclam.service

7、使用

# 扫描单个文件
clamscan /path/to/your/file

# 扫描整个目录
clamscan -r /path/to/directory

# 自动删除检测到的病毒
clamscan --remove -r /path/to/directory

# 为扫描结果生成报告
clamscan -r /path/to/directory > scanreport.txt

# 在扫描时显示病毒被发现的信息
clamscan -r --bell -i /path/to/directory

#对/data/目录扫描,并将扫描的日志放到该文件中,有病毒则自动删除
clamscan -i -r /data/ --remove=yes -l ./clamav.log

手动重点扫描目录

clamscan -r  -i /etc --max-dir-recursion=5 -l /data/clamav/logs/clamav-etc.log
clamscan -r  -i /bin --max-dir-recursion=5 -l /data/clamav/logs/clamav-bin.log
clamscan -r  -i /usr --max-dir-recursion=5 -l /data/clamav/logs/clamav-usr.log
clamscan -r  -i /var --max-dir-recursion=5 -l /data/clamav/logs/clamav-var.log

扫描参数:

  • -r/--recursive[=yes/no] #递归扫描目录
  • --log=FILE/-l FILE #增加扫描报告,指定记录日志文件
  • --move [路径] #移动病毒文件
  • --remove [路径] #删除病毒文件
  • --quiet #只输出错误消息
  • --infected/-i #只输出感染文件
  • --suppress-ok-results/-o #跳过扫描OK的文件
  • --bell #扫描到病毒文件发出警报声音
  • --unzip(unrar) #解压压缩文件扫描

8、查看病毒文件

cat /data/clamav/logs/clamav_home_daily_scan.log | grep "FOUND" 

3、配置发邮件功能

在1987年发布的Unix版本上出现了Berkeley Mail的衍生版本mailx,该程序使用命令mailx

由于Unix长期处于闭源状态,Linux用户无法使用Unix的mailx程序,于是出现了基于Berkeley Mail的开源版本nail,后改名为Heirloom mailx。Heirloom mailx与Berkeley Mail一样使用mail命令,并扩展了很多功能,如内置的POP3、IMAP、SMTP支持。Heirloom mailx尽可能保持与mailx的使用体验一致,所以也添加了mailx命令,但它只是mail的符号链接。

以前各Linux发行版上的mailx软件包基本都是打包自Heirloom mailx。

Heirloom mailx的更新后来逐渐停滞,又出现了Heirloom mailx的分支s-nail。目前各发行版已经用s-nail取代了Heirloom mailx,包名一般是s-nail,提供mailmailx命令,使用体验与Heirloom mailx基本一致。

s-nail将来的v15版本将做出不向后兼容的巨大改变,且s-nail欲更名为s-mailx。

mailx->nail(Heirloom mailx)->s-nail->s-mailx

1、安装s-nail并配置进行测试

参考文档:Rocky 9使用 s-nail 发送邮件功能

2、新建脚本文件 scan.sh 并添加到定时任务中

脚本的内容为更新病毒库、扫描病毒,如果扫到病毒,给您发送邮件。脚本末尾的“a@qq.com b@qq.com c@qq.com”请修改为您自己的邮箱。

#!/bin/bash

# 病毒库更新
/usr/local/bin/freshclam

# 获取当前时间(用于创建、读取日志文件)
date=`date +%Y%m%d_%H%M%S`

# *填写扫描路径(可根据自己的情况来自定义,默认为/根目录)
clpath="/data"

# *填写要存储日志的路径(可根据自己的情况来自定义,默认为/home/clamav/log/)
clamav_log="/data/clamav/logs"

# 判断是否有存储日志的目录,如果没有则先创建,为了下面的存放日志而创建
if [ -e $clamav_log ];then
    echo "有这个目录" > /dev/null
else
    echo "没有这个目录" > /dev/null
    mkdir -p $clamav_log
fi

# 扫描指定目录 结果打印到$clamav_log/clamav.$date.log
/usr/bin/touch $clamav_log/clamav.$date.log
/usr/local/bin/clamscan -r -i $clpath -l $clamav_log/clamav.$date.log

:<<!
clamscan -r -i /tmp -l /home/chamav/log/clamav.$date.log
参数介绍:
-r 扫描目录;
/tmp 设置扫描路径为“/tmp”,可改成其他路径比如根目录“/”;
–i 只显示被感染的文件;
-l 保存日志文件的位置;
上述命令即对/tmp路径扫描一次病毒。
注意:上述命令仅扫描病毒,不会对病毒文件进行删除,需手动删除。
!

# 删除第一行到第三行的内容(空白行和虚线行)
sed -i '1,3d' $clamav_log/clamav.$date.log

# 删除WARING开头的内容
sed -i  '/^WARNING/d' $clamav_log/clamav.$date.log

#获取当前服务器ip
ip=`hostname -I | awk -F " " '{print $1}'`
# 另一种写法
# ip=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/,"\\1", "g", $2)}')

data_log=""
while read line
do
	data_log+=$line"<br>"
done < $clamav_log/clamav.$date.log

# 获取高危病毒的个数
infected_files=`echo $data_log | sed 's/.*\(Infected files:\(.*\)<br>Data scanned.*\?\)/\2/'`

# 获取执行时的时间
scan_time=`echo $data_log | sed 's/.*\(Start Date:\(.*\)<br>End Date.*\?\)/\2/'`

data_log=${data_log/SCAN SUMMARY/扫描结果}
data_log=${data_log/Known viruses/病毒库数量}
data_log=${data_log/Engine version/引擎版本}
data_log=${data_log/Scanned directories/已扫描目录}
data_log=${data_log/Scanned files/已扫描文件}
data_log=${data_log/Infected files/已发现病毒文件}
data_log=${data_log/Total errors/错误文件}
data_log=${data_log/Data scanned/已扫描数据}
data_log=${data_log/Data read/读取数据}
data_log=${data_log/Time/扫描时长}
data_log=${data_log/Start Date/开始时间}
data_log=${data_log/End Date/结束时间}

body="杀毒软件 ClamAV 在 $scan_time 对您的服务器 $ip 进行了扫描,扫描的路径为: $clpath ,扫描结果:暂未发现病毒!"
body2="杀毒软件 ClamAV 在 $scan_time 对您的服务器 $ip 进行了扫描,扫描的路径为: $clpath ,扫描结果:发现有 $infected_files 个高危病毒;请立即登录服务器处理!详情可见附件!"
log2="杀毒软件 ClamAV 在 $scan_time 对您的服务器 $ip 进行了扫描,扫描的路径为: $clpath ,扫描结果:发现有 $infected_files 个高危病毒;病毒为: $data_log 请立即登录服务器处理!!!"


# 发送给多人可以再添加抄送参数
if [ "$infected_files" -eq "0" ];then
	echo $body | mail -s "$(echo -e "$ip 服务器病毒处理通知-无病毒")"  a@qq.com b@qq.com c@qq.com  # 同时给多人发送邮件,邮箱地址中间用空格分开
elif [ "$infected_files" -gt "0" ];then
    echo -e "$log2" > ./${ip}_clamav.txt
	echo $body2 | mail -a ./${ip}_clamav.txt -s "$(echo -e "$ip 服务器病毒处理通知-有 $infected_files 个高危病毒")"  a@qq.com b@qq.com c@qq.com
else
	echo $body2 | mail -s "$ip :此次查询失败,请检查日志!" a@qq.com b@qq.com c@qq.com
fi
# 每天8点,以用户root身份定时执行脚本。
crontb -e
0  8 * * * /bin/bash  /home/clamav/scan.sh > /dev/null 2>&1

4、常见警告

1、iconv错误的警告

LibClamAV Warning: cli_codepage_to_utf8: iconv error: An invalid multibyte sequence has been encountered in the input.

提示在输入(扫描的内容)中遇到了一个无效的多字节字符序列。

iconv()是用于转换文本的字符编码的函数。clamav通过iconv函数转换扫描内容(比如html文件)的字符集,这样统一化字符集后,可以容易检测出用非UTF8的多字节字符集(比如CJK,MBCS之类)去隐藏的恶意代码。

这个提示是iconv()的转换过程碰到了处理不了的多字节字符序列,向用户示意可能会有隐藏得更加深的恶意代码没有被 clamscan 检查出来。

如果对涉及的文件没有疑问,直接忽略这个提示便可。但如果确实可疑,应将涉及的文件单独进行检查,比如通过 virustotal.com 这一在线检查工具对可疑文件作深入检查。

iconv相关还有其它一些告警信息,道理都是相似的。

2、不完整的媒体文件的警告

LibClamAV Warning: PNG: Unexpected early end-of-file.

图片文件(比如PNG)虽然不是可以执行的文件,但由于处理图片的函数库可能存在缺陷,使得图片文件也是恶意代码的可能载体。

clamscan 对图片文件进行结构解析和检查是否存在恶意代码。如果图片文件结构不完整,就会给出这样的提示。

处理的方式同上,如果可疑,就扔到 virustotal.com 作进一步的深入检查。

另外,也可以通过 --alert-broken-media=no 参数关闭告警。类似的参数可以通过 clamscan --help 观察获得。

3、压缩文件过大的告警

LibClamAV Warning: cli_scanxz: decompress file size exceeds limits - only scanning 27262976 bytes

clamscan 支持对压缩文件解压查杀,但由于解压查杀对计算机的性能可能会产生极大影响拖累,所以 clamscan 默认只解压26MB的数据,这对于大多数情况是足够了,但使用者的系统内还是会有大压缩包存在的,所以就给出告警提示。

可以通过 --max-scansize=#n 去设定不同的大小限制,类似的最大限制参数还有其它一些,可以自行观察。

4、文件读不到数据的告警

LibClamAV Warning: fmap_readpage: pread fail: asked for 4073 bytes @offset 23, got 0

这种情况是因为扫描了比如 /sys 这种特殊的文件系统位置。因此必须指定 clamscan 的扫描目标,不应该闭上眼从根开始扫。

posted @ 2025-04-06 15:44  哈喽哈喽111111  阅读(398)  评论(0)    收藏  举报