ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

CentOS 7服务器安装ClamAV杀毒软件完整指南:病毒库更新与扫描配置

CentOS 7服务器安装ClamAV杀毒软件完整指南:病毒库更新与扫描配置 说实话刚接手第一批CentOS 7服务器的时候我也觉得在Linux上装杀毒软件多少有点形式主义。权限收敛、端口管控、补丁更新这些常规动作都做了难道还怕Windows病毒跑上来真正改变我这个想法的是后来的一次排查站点临时目录里出现了一批定时修改文件的畸形PHP脚本如果当时有一个能进目录扫特征码的扫描器问题根本不用拖到隔天。这篇文章就按我实际部署的过程记录CentOS 7上从零安装ClamAV、配置病毒库更新、使用命令行扫描和常驻扫描服务的完整步骤也会把权限、SELinux、定时任务这些容易卡住的地方单独拿出来说。内容适合正在维护存量CentOS 7服务器、或准备给内网共享目录加一层文件检测的同学参考。文章不会太讲理论重点是把命令和配置贴出来附带为什么这么配的解释尽量让你照着做就能跑通。1. 为什么CentOS 7服务器要装杀毒软件选型又为什么落在ClamAV1.1 服务器上的文件威胁并不是“Windows专属”很多运维对Linux杀毒软件的第一反应是“没必要”这个观念得改一下。Linux服务器上的威胁从来不只是传统意义上的可执行文件病毒更多的是WebShell、恶意脚本、带宏的Office文档、勒索病毒附件这类东西。它们不一定具备执行权限也不需要你双击运行只要Web应用出现文件上传漏洞、目录穿越漏洞攻击者就能把文件丢到服务器的某个目录里。这类文件最大的特点是不在常规的端口扫描、漏洞扫描范围内也不会凭空触发系统的报警。它们就安静地躺在上传目录、临时目录、备份目录里等攻击者回连。如果没有文件特征扫描这种手段等发现的时候往往已经过了很久。我在实际排查中见过最极端的情况是一台CentOS 7服务器上某个上传目录里躺着十几条WebShell记录时间跨度超过半年就是因为站点日志保留周期短根本追不回最初的入口。所以给服务器装杀毒软件本质上是给文件层加一道检测兜底和防火墙、入侵检测不是替代关系。1.2 ClamAV的开源定位与部署优势ClamAV是开源社区里应用最广的杀毒引擎之一GPL协议可以免费商用也能随意定制。它最核心的能力是病毒特征匹配支持检测多种文件格式包括常规的ELF可执行文件、PHP脚本、邮件附件、压缩包内文件、PDF里的恶意对象等等。很多邮件网关、网盘、对象存储系统都是靠它做附件检测的。选型的时候对比过几款商业Linux杀软主要有几个考虑商业产品在图形管理、集中管控上有优势但价格不便宜而且管控端一般需要单独的服务端部署成本高。ClamAV的优势在于轻量CentOS 7上只需要装几个RPM包配置文件改一改就能跑起来病毒库更新免费也支持命令行、服务接口两种调用方式后续做脚本化、程序化接入都方便。它的弱点也很明显特征码检出率比商业杀软略低没有主动防御和行为分析能力但作为服务器文件层检测工具已经足够。2. 安装前的EPEL仓库准备和核心组件选择2.1 先确认系统镜像与仓库状态CentOS 7默认的base仓库里不带ClamAV必须先启用EPELExtra Packages for Enterprise Linux这个扩展仓库。动手之前先确认系统版本和现有仓库情况cat /etc/centos-release yum repolist如果系统是CentOS 7.x输出通常会显示类似“CentOS Linux release 7.9.2009”的信息。然后看repolist里有没有epel仓库如果已经装过EPEL后面直接搜索包名就行。如果之前配置过第三方yum源还要注意仓库之间的包冲突尤其不要同时启用多个来源不同的EPEL镜像免得出现依赖解析问题。一个容易被忽略的点是确认系统时间。freshclam更新病毒库时会对更新源做校验系统时间和真实时间偏差太大会出现证书校验失败或下载内容校验不过的情况。如果服务器时间不准先同步一下yum install -y ntpdate ntpdate -u ntp.aliyun.com同步完再继续不然后面排查更新失败会很痛苦。2.2 安装EPEL与ClamAV相关包确认仓库没问题后先装EPELyum install -y epel-release yum makecache然后搜索一下ClamAV相关包名验证仓库里是否已经有可用的版本yum list available | grep -i clamavCentOS 7 EPEL里ClamAV相关的包主要有这几个它们各自的定位区别需要说清楚clamav提供clamscan、freshclam等命令行工具。clamav-update提供freshclam的配置文件负责病毒库更新。clamav-server提供clamd常驻扫描服务以及对应的systemd unit。clamav-data病毒库数据包更新前的基础数据也包含在里面。实际安装时如果只想跑定时扫描装clamav和clamav-update就够如果需要常驻服务接收高频扫描请求再把clamav-server一起装上yum install -y clamav clamav-update yum install -y clamav-server如果你图省事直接yum install -y clamav*也不是不行但会把很多用不到的依赖拉进来。我在最小化安装的机器上试过全部安装会多出不少库文件后续升级时依赖关系也更复杂。建议按需安装保持系统干净。3. freshclam病毒库更新配置、权限与并发问题3.1 不注释Example就永远跑不起来的freshclam装完包之后直接执行freshclam大概率会报错退出原因不是网络问题而是配置文件里默认带了一行示例标记。CentOS 7 EPEL打包的配置文件和官方默认配置一样开头有一行Example意思是“这是示例配置你需要删除或注释掉才能真正生效”。先看一下当前生效的配置项grep -E ^(Example|DatabaseMirror|DatabaseDirectory|UpdateLogFile) /etc/freshclam.conf正常会看到Example这一行是启用的。用sed把它注释掉sed -i s/^Example/#Example/ /etc/freshclam.conf然后编辑/etc/freshclam.conf确认这几个核心参数DatabaseMirror db.ac.clamav.net DatabaseDirectory /var/lib/clamav UpdateLogFile /var/log/clamav/freshclam.log LogTime yes这几项分别是更新源地址、病毒库存放目录、更新日志路径、日志里显示时间。DatabaseMirror可以写多行表示多个备用更新源默认配置里的注释里已经给出了一些示例。还有一个关键参数是DatabaseOwner如果安装时系统创建了clamscan用户建议显式指定病毒库目录的所有者DatabaseOwner clamscan这样后面用clamd服务读取病毒库时不会遇到权限问题。改完配置后先创建日志目录和病毒库目录并设置属主mkdir -p /var/lib/clamav /var/log/clamav chown -R clamscan:clamscan /var/lib/clamav /var/log/clamav这里有个容易踩的坑如果你是用root直接跑freshclam更新过程中生成的临时文件属主是root而clamd扫描服务通常以clamscan用户运行如果目录权限没有处理好clamd启动后读不到病毒库扫描就会直接报错。3.2 手动更新、定时更新和常见的更新失败配置没问题后手动跑一次更新freshclam -v第一次更新时输出会比较长会看到Downloading main.cvd、Downloading daily.cvd、Downloading bytecode.cvd这类信息其中main是基础库daily是每日增量库bytecode是字节码签名库。三个库都下载完日志末尾出现类似“Database updated”的提示就说明更新成功了。验证病毒库版本号clamscan --version输出的信息里会带上ClamAV版本和病毒库日期日期是当天说明更新成功。定时更新建议用cron频率不用太高我一般设置每两小时一次crontab -e加入这一行30 */2 * * * /usr/bin/freshclam --quiet这里有个需要特别注意的坑如果系统里同时存在systemd timer和cron任务调度freshclam两个进程同时运行时会出现freshclam.log is locked by another process的报错。CentOS 7 EPEL默认可能不会自动启用timer但有些第三方运维脚本会创建所以每次排查看日志前先用ps aux | grep freshclam确认是不是有多个更新进程在跑。更新失败的常见原因有几个服务器无法访问外网更新源需要在出口防火墙上放行对db.ac.clamav.net的TCP 443/80访问。内网环境只能访问企业内部镜像源这时把DatabaseMirror改成内网地址即可。系统时间偏差太大导致校验失败先把时间同步问题解决。磁盘空间不足特别是/var/lib/clamav所在分区被打满下载会中途失败这个在长期运行的老服务器上很常见。4. clamscan命令行扫描的基本用法与脚本化思路4.1 完整扫描命令与参数说明clamscan是ClamAV最基础的一次性扫描工具每次执行都会重新加载病毒库再扫描目标目录适合低频的定时扫描。病毒库加载时会占用一定CPU和内存扫描大目录时资源消耗会更明显这些都属于正常表现。基础扫描命令clamscan -r -i /tmp其中-r表示递归扫描子目录-i表示只显示检测到感染文件的输出。如果不加-iclamscan会把扫描过的每个文件都打印出来日志量会非常大排查问题时很不方便。常用参数可以组合使用clamscan -r -i /home /var/www /tmp \ --exclude/proc --exclude/sys --exclude/dev \ --exclude/var/www/cache \ --log/var/log/clamav/scan.log参数含义说明参数作用-r递归扫描指定目录-i仅输出检测到感染的文件--exclude排除指定路径或目录模式--log将扫描日志写入指定文件--move将感染文件移动到隔离目录--remove直接删除感染文件慎用--max-filesize限制单个文件扫描大小--max-scansize限制单个压缩包可展开扫描的大小第一次做全盘扫描前建议先扫一个自己熟悉的目录比如/tmp确认命令能正常跑通、病毒库能正常加载再扩大到整个业务目录。4.2 结合退出码做增量扫描脚本clamscan的退出码在脚本化时非常重要很多人只把它当普通命令用忽略了返回值。默认情况下0没有发现病毒扫描正常结束。1发现病毒。2扫描过程中发生错误。这三类返回值在定时任务里可以作为判断依据写成脚本后可以实现“发现病毒自动隔离并告警”。参考脚本#!/bin/bash LOG_FILE/var/log/clamav/incr_scan.log QUARANTINE_DIR/data/quarantine mkdir -p $QUARANTINE_DIR clamscan -r -i /data/upload \ --exclude/data/upload/tmp \ --move$QUARANTINE_DIR \ --log$LOG_FILE SCAN_CODE$? if [ $SCAN_CODE -eq 1 ]; then echo [$(date %F %T)] malware found, moved to $QUARANTINE_DIR $LOG_FILE elif [ $SCAN_CODE -eq 2 ]; then echo [$(date %F %T)] scan error, check clamscan config or disk $LOG_FILE fi这里有两个细节值得注意。第一隔离目录一定不要放在扫描目录里否则隔离后文件会被clamscan再次扫到形成反复扫描的死循环。第二--move只会处理clamscan能识别的感染文件真实场景里有些文件是损坏的或者被加密的不会触发病毒特征这类文件不会进入隔离目录需要靠业务层处理。隔离目录里的文件不要一直堆积建议每天定时清理或者手动确认后删除。我在实际生产环境里遇到过隔离目录吃满磁盘的情况就是因为只做了自动隔离没有配套生命周期清理策略。5. 用clamd常驻服务替代重复加载病毒库5.1 clamscan和clamdscan的定位差异clamscan每次执行都要重新加载病毒库这个加载过程在病毒库几十MB到上百MB的情况下并不轻松CPU会瞬间冲高即使扫描一个很小的文件也要等几秒钟。如果业务场景是Web上传接口扫描、邮件附件扫描这种高频调用每秒可能就有好几个文件需要检测用clamscan的模式完全扛不住所以需要引入clamd常驻服务。clamd启动后常驻内存病毒库只加载一次后续收到的扫描请求直接复用这个内存数据。clamdscan是它的客户端工具通过本地socket或TCP端口跟clamd通信扫描时不需要额外加载病毒库响应速度快很多。从资源占用来看clamd大概会常驻几百MB内存具体取决于病毒库大小和并发连接数。如果一台机器上只做低频定时扫描没必要开clamd如果要做实时检测或高频扫描clamd基本是必须的。5.2 clamd配置与systemd启动全过程clamd的配置文件在安装clamav-server后位于/etc/clamd.d/scan.conf。同样默认配置里也有一行Example不注释掉无法启动。执行sed -i s/^Example/#Example/ /etc/clamd.d/scan.conf然后编辑配置文件重点确认这几个参数LocalSocket /var/run/clamd.sock/clamd.sock LocalSocketGroup clamscan LocalSocketMode 660 FixStaleSocket true User clamscan其中FixStaleSocket true这个参数很常用如果clamd异常退出后socket文件残留下次启动时会自动清理掉避免出现“地址已被占用”的假报错。启动前记得让socket目录存在并设置好属主mkdir -p /var/run/clamd.sock chown clamscan:clamscan /var/run/clamd.sock然后用systemd管理systemctl enable clamdscan systemctl start clamdscan这里的scan对应的是/etc/clamd.d/scan.conf这个配置文件的名称CentOS 7里打包的服务unit是clamd.service后面跟的参数就是配置文件实例名。查看状态systemctl status clamdscan如果启动失败可以看日志journalctl -u clamdscan -n 50CentOS 7默认开启SELinux常驻服务访问文件时可能被SELinux拦截。可以先查看相关布尔值getsebool -a | grep antivirus如果确实是被拦截酌情开启下面两个布尔值setsebool -P antivirus_can_scan_system on setsebool -P antivirus_use_jit onantivirus_can_scan_system这个布尔值的含义是允许杀毒引擎读取系统上的常规文件开了之后扫描范围更广但也意味着进程权限更大非必要不要乱开。启动成功后可以用clamdscan测试clamdscan -i /tmp如果返回结果正常说明clamd已经接管扫描任务。5.3 接进业务系统的方向clamd除了支持clamdscan命令还支持通过本地socket或TCP端口直接发扫描指令。在scan.conf里可以设置TCPSocket 3310 TCPAddr 127.0.0.1这样本机上的Java、Python程序可以直接连到3310端口发送SCAN /path/to/file指令然后读取返回结果。Java集成ClamAV时很多开源库就是基于这个协议封装的。需要注意一点TCPAddr一定要绑定内网出口或回环地址不要让3310端口暴露到公网否则等于把扫描服务变成了别人探测你系统的入口。集成方向大致有两种一种是把文件先落到一个临时目录调用扫描再决定是否放行另一种是直接把文件内容通过流式协议传给clamd避免落盘。第一种实现简单、稳定性高第二种对代码侵入性低但复杂度更高。我的建议是优先用临时目录方案等跑通之后再优化细节。6. 部署维护中最容易忽略的几件事6.1 扫描目录规划与资源控制安装完杀毒软件最容易犯的错就是直接对整个根目录跑一次全盘扫描。这在中小型服务器上可能没什么问题但在目录文件和压缩包很多、容量几个TB的机器上一次全盘扫描能跑几个小时期间CPU、磁盘IO都被占用业务请求会被明显拖慢。合理做法是按业务重要性拆开扫描。比如先扫Web目录和用户上传目录再扫/tmp这种容易被利用的临时目录最后才考虑/home等用户目录。用cron把不同目录的扫描时间错开比如凌晨2点扫业务目录凌晨3点半扫临时目录避免多个扫描任务并发。扫描资源的控制可以在cron命令里加在扫描命令前面nice -n 10 ionice -c3 clamscan -r -i /data --exclude/proc --exclude/sys --log/var/log/clamav/data_scan.lognice -n 10降低CPU优先级ionice -c3让磁盘IO以idle级别运行这两个参数组合后能明显减少对业务的影响。6.2 日志轮转、数据库更新频率与排错速查ClamAV运行时间长了会产生扫描日志、更新日志、隔离文件这几个主要数据源。扫描日志如果不做轮转几个月就能攒到几个GB。CentOS 7上可以写一个logrotate配置cat /etc/logrotate.d/clamav EOF /var/log/clamav/*.log { weekly rotate 4 compress missingok notifempty su clamscan clamscan create 0640 clamscan clamscan } EOF这个配置的意思是每周轮转一次保留最近4份旧日志压缩保存。若不是rootlogrotate需要设置su参数才能保证创建的新日志文件属主正确。数据库更新频率我在前面建议过是两小时一次这个频率对大多数场景都足够。日志里如果出现“WARNING: ClamAV version X is outdated”之类的提示说明系统装的ClamAV版本比病毒库要求的版本旧需要考虑升级EPEL源里的软件包。在CentOS 7上这问题挺常见毕竟系统自带的软件源更新节奏偏保守。可以定期用yum update clamav保持主程序版本同时每天保持病毒库更新。最后把排错场景整理成速查表实际运维时可以直接对着查现象可能原因处理方式freshclam提示log locked前一次更新进程未结束用ps检测freshclam进程kill后重试clamd启动失败socket异常socket目录不存在或权限不对创建/var/run/clamd.sockchown给clamscan扫描提示can not open daily.cvd病毒库文件属主不对chown -R clamscan:clamscan /var/lib/clamavfreshclam下载失败无法访问更新源或系统时间不准确认网络连通时间同步再执行一次clamd服务SELinux拦截布尔值未开启按需开启antivirus相关sebool全盘扫描耗时长扫描范围太大或文件太多拆分目录扫描增加max-scansize限制我在实际部署中最大的体会是ClamAV本身只是工具重点在于把扫描逻辑嵌进业务流程里。单纯全盘扫描容易漏掉持续生成的临时文件最好根据业务目录设计多个扫描任务和不同的隔离策略。最后再提醒一个常被忽略的细节CentOS 7上杀毒软件跑完之后记得看一眼/var/log/clamav/目录的磁盘占用日志文件不清理会慢慢变成新的存储隐患。
返回列表