CVE高危漏洞定期自动扫描服务器巡检自动化脚本
为什么你需要自动扫描CVE高危漏洞?
服务器上线后,CVE高危漏洞就像定时炸弹。
人工巡检效率低、容易遗漏,特别是面对几十台机器时,每月公告一出就得逐台检查。
用自动化脚本定期扫描并输出报告,才是运维正解。
本文面向零基础用户,手把手教你用Shell脚本实现CVE高危漏洞定期自动扫描,脚本部署后可以搭配cron定时运行,自动发送结果,真正做到服务器巡检自动化。
准备工作:环境与工具
开始之前,准备好以下基础环境:
- 操作系统:CentOS 7+ 或 Ubuntu 18.04+(其他发行版命令可能微调)
- 依赖工具:确保服务器已安装
curl、grep、awk、mail或mutt(发通知用) - 漏洞库源:推荐使用 CVE Binary Tool 或 Vulners API,但为了新手友好,本文演示基于
yum/apt的CVE信息查询方式(通过CVE-ID与本地包版本对比)
快速安装依赖(以CentOS为例)
sudo yum install -y curl gawk mailx
Ubuntu 下用 apt install -y curl gawk mailutils。
核心脚本编写:实现定期扫描与结果输出
下面脚本的思路:
- 从官方CVE列表获取最近新增的高危漏洞(CVE ID与受影响的包名)
- 遍历本地已安装的包,判断是否存在匹配的受影响版本
- 输出高危漏洞列表并发送邮件通知。
创建文件 /usr/local/bin/cve_scan.sh,写入以下内容:
#!/bin/bash
# CVE高危漏洞自动扫描脚本 - 服务器巡检自动化版
# 配置区
OUTPUT_FILE="/var/log/cve_scan_result_$(date +%Y%m%d).txt"
EMAIL_TO="admin@yourdomain.com" # 替换为你的邮箱
# 1. 获取最新高危CVE列表(模拟从NVD API获取)
# 实际生产环境建议用CVE Binary Tool或本地CVE数据库
# 这里仅演示思路,真实场景需调用NVD API(Rate Limit注意)
CVE_LIST=$(curl -s "https://services.nvd.nist.gov/rest/json/cves/2.0?cvssV3Severity=CRITICAL&resultsPerPage=20" \
| jq -r '.vulnerabilities[] | .cve.id + " " + .cve.descriptions[0].value' 2>/dev/null)
if [ -z "$CVE_LIST" ]; then
echo "$(date): 获取CVE列表失败,请检查网络或API可用性" >> $OUTPUT_FILE
exit 1
fi
# 2. 检查每个CVE是否影响当前系统
# 需要提前建立本地受影响包名对照表(示例仅做演示,实际需配合CVE详情中的affected packages)
# 这里使用一个简化方法:模拟检查openssl版本是否低于1.1.1k
echo "=== CVE高危漏洞扫描报告 $(date) ===" > $OUTPUT_FILE
# 示例:检查Apache Log4j漏洞(CVE-2021-44228)
# 实际使用时请根据CVE官方影响库进行扫描,切勿用静态关键词
if rpm -q log4j &>/dev/null; then
echo "[高危] CVE-2021-44228 (Log4j) - 受影响,请立即处理" >> $OUTPUT_FILE
else
echo "[安全] CVE-2021-44228 (Log4j) - 未安装相关包" >> $OUTPUT_FILE
fi
# 示例:检查OpenSSL版本
OPENSSL_VER=$(openssl version | awk '{print $2}')
if [[ "$OPENSSL_VER" < "1.1.1k" ]]; then
echo "[高危] OpenSSL版本低于1.1.1k,可能存在CVE-2022-0778等漏洞" >> $OUTPUT_FILE
fi
# 3. 发送邮件通知
if [ -s "$OUTPUT_FILE" ]; then
mail -s "服务器CVE高危漏洞扫描报告 $(date +%F)" "$EMAIL_TO" < $OUTPUT_FILE
fi
# 清理旧报告(保留最近30天)
find /var/log/ -name "cve_scan_result_*.txt" -mtime +30 -exec rm -f {} \;
echo "扫描完成,报告已发送至 $EMAIL_TO"
注意:上面的脚本仅为演示框架,实际生产中需要对接真实的CVE数据库(例如使用cve-bin-tool或yum-plugin-security),否则无法覆盖所有漏洞。新手可以先学会框架,再替换真实的扫描引擎。
设置定时任务
crontab -e
# 添加以下行:每天凌晨2点执行
0 2 * * * /bin/bash /usr/local/bin/cve_scan.sh
保存后重启cron服务:systemctl restart crond。
避坑指南:常见问题与解决方法
1. API请求被限流或超时
NVD官方API有速率限制,建议缓存结果或使用本地CVE数据库(如Red Hat OVAL V2)。
生产中推荐使用cve-bin-tool,它可离线扫描。
2. 系统包名与CVE影响包名不匹配
不同发行版对同一漏洞的包名可能不同(例如log4j在Debian下叫liblog4j2-java)。
建议使用发行版官方的安全公告查询工具:
- Red Hat/CentOS:
yum list-security或yum updateinfo list cves - Ubuntu:
apt-get changelog配合ubuntu-cve-tracker
3. 邮件发送失败
检查本地邮件传输代理是否配置(Postfix或Sendmail)。
测试邮件发送命令:echo "test" | mail -s "test" your@email.com。
如果不通,先解决邮件服务。
4. 脚本执行后无输出
手动运行脚本看标准错误输出:bash /usr/local/bin/cve_scan.sh 2>&1。
常见原因是curl未安装或网络不通。
效果验证:确认脚本正常运行
- 手动执行脚本:
sudo bash /usr/local/bin/cve_scan.sh - 检查输出文件:
cat /var/log/cve_scan_result_$(date +%Y%m%d).txt - 检查邮箱是否收到报告
- 查看cron日志:
tail -20 /var/log/cron(CentOS)确认任务执行记录
如果一切正常,你的服务器已经开始自动完成CVE高危漏洞的定期扫描,巡检自动化初步落地。
最后总结
本文从零开始编写并部署了一个CVE高危漏洞自动扫描脚本,实现了服务器巡检自动化的周期任务。
虽然示例脚本还需要根据真实环境替换正式的漏洞库,但核心框架已经跑通。
如果你正在处理服务器安全扫描,建议先把脚本部署测试,再根据自己系统特点微调CVE检测逻辑。
遇到异常记得先回看“避坑指南”部分。
后续可继续学习结合企业微信或钉钉机器人推送结果,让巡检更实时。
提示:本文仅介绍方法与框架,具体CVE信息请以官方公告为准。脚本示例需自行适配生产环境,不可直接用于生产。