从零搭建CVE高危漏洞定期自动扫描服务器巡检脚本
为什么要定期扫描CVE高危漏洞
CVE(通用漏洞披露)收录了全球软件包中已知的安全缺陷。
如果服务器长期不扫描,这些高危漏洞可能被攻击者利用,导致数据泄露或权限被控。
本文推荐使用轻量级工具 Trivy,配合 crontab 定时任务,实现每周一次的自动巡检。
整个方案占用资源少、配置简单,适合单台或少量服务器。
操作前的准备工作
确保你的服务器是 Linux 系统(CentOS 7+ / Ubuntu 18.04+),并且拥有 root 或 sudo 权限。
安装 Trivy 只需要一条命令,不需要复杂的数据库依赖。
# Ubuntu / Debian
sudo apt-get install -y wget apt-transport-https gnupg
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update && sudo apt-get install -y trivy
# CentOS / RHEL
sudo rpm -ivh https://github.com/aquasecurity/trivy/releases/latest/download/trivy_$(uname -m).rpm
安装完成后运行 trivy --version 确认成功。
首次扫描前 Trivy 会自动下载漏洞库,需要服务器能访问 GitHub 或使用代理。
编写自动扫描脚本
创建一个脚本文件 /usr/local/bin/cve-scan.sh,内容如下:
#!/bin/bash
# CVE 高危漏洞定期扫描脚本
LOG_DIR="/var/log/cve-scan"
REPORT_FILE="$LOG_DIR/scan-$(date +%Y%m%d-%H%M).log"
# 确保日志目录存在
mkdir -p $LOG_DIR
# 使用 Trivy 扫描系统文件系统(只显示高危和严重级别)
trivy filesystem --severity HIGH,CRITICAL / --no-progress 2>&1 | tee $REPORT_FILE
# 可选:如果有发信需求,可在此添加 curl 或 mail 命令
# echo "CVE scan finished at $(date)" | mail -s "Weekly CVE Report" your@email.com
赋予执行权限:
sudo chmod +x /usr/local/bin/cve-scan.sh
脚本中使用 --severity HIGH,CRITICAL 过滤掉中低危漏洞,减少噪音。/var/log/cve-scan/ 会按时间保存每次的扫描日志。
设置定时任务
使用 crontab 让脚本每周运行一次。
编辑 root 用户的任务表(推荐用 root 执行,避免权限不足):
sudo crontab -e
添加一行(例如每周一凌晨 3 点):
0 3 * * 1 /usr/local/bin/cve-scan.sh
保存后,用 sudo crontab -l 确认任务已添加。
如果你希望每天扫描,可以将 1 改为 *,但建议至少每周一次,减少对服务器性能的影响。
常见问题与避坑
1. 扫描特别慢怎么办?
第一次扫描会下载完整的 CVE 数据库(约几百 MB),后续更新增量即可。如果网络差,可以设置代理:export HTTP_PROXY=http://your-proxy:port 再运行脚本。
2. 日志文件越来越大怎么办?
可以在脚本中加入清理逻辑:删除 30 天前的日志。例如:
find $LOG_DIR -type f -name "*.log" -mtime +30 -exec rm {} \;
3. 脚本执行后没有任何输出?
先手动运行脚本检查报错。可能原因:Trivy 未安装、权限不足、文件系统扫描被 SELinux 阻断。用 audit2allow 或临时关闭 SELinux 测试。
4. 只扫描高危,中低危被忽略,会不会遗漏?
高频巡检建议优先处理高危和严重漏洞。中低危可以结合季度复查或人工评估。本文脚本专注解决最紧急的风险。
验证扫描是否生效
手动执行一次脚本:
sudo /usr/local/bin/cve-scan.sh
查看日志文件:
cat /var/log/cve-scan/scan-*.log
如果输出类似:
2024-01-15T03:00:00.000Z INFO Vulnerability scanning is enabled
...
libcurl4 (CVE-2024-XXXXX) (HIGH)
openssl (CVE-2023-XXXXX) (CRITICAL)
说明扫描正常。
你可以尝试安装一个含有测试漏洞的包(如 gnutls26 旧版)来验证是否能被检出。
确认没问题后,crontab 会在指定时间自动运行,之后定期查看日志即可。
如果你希望收到通知,可以在脚本末尾加入钉钉/企业微信 webhook 推送,或者直接发送邮件。
这样即使不看服务器,也能第一时间掌握 CVE 高危漏洞情况。