CVE高危漏洞定期自动扫描服务器巡检自动化脚本

为什么你需要自动扫描CVE高危漏洞?

服务器上线后,CVE高危漏洞就像定时炸弹。
人工巡检效率低、容易遗漏,特别是面对几十台机器时,每月公告一出就得逐台检查。
用自动化脚本定期扫描并输出报告,才是运维正解。
本文面向零基础用户,手把手教你用Shell脚本实现CVE高危漏洞定期自动扫描,脚本部署后可以搭配cron定时运行,自动发送结果,真正做到服务器巡检自动化。

准备工作:环境与工具

开始之前,准备好以下基础环境:

  • 操作系统:CentOS 7+ 或 Ubuntu 18.04+(其他发行版命令可能微调)
  • 依赖工具:确保服务器已安装 curlgrepawkmailmutt(发通知用)
  • 漏洞库源:推荐使用 CVE Binary ToolVulners API,但为了新手友好,本文演示基于 yum/aptCVE 信息查询方式(通过CVE-ID与本地包版本对比)

快速安装依赖(以CentOS为例)

sudo yum install -y curl gawk mailx

Ubuntu 下用 apt install -y curl gawk mailutils

核心脚本编写:实现定期扫描与结果输出

下面脚本的思路:

  1. 从官方CVE列表获取最近新增的高危漏洞(CVE ID与受影响的包名)
  2. 遍历本地已安装的包,判断是否存在匹配的受影响版本
  3. 输出高危漏洞列表并发送邮件通知。

创建文件 /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-toolyum-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-securityyum 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未安装或网络不通。

效果验证:确认脚本正常运行

  1. 手动执行脚本:sudo bash /usr/local/bin/cve_scan.sh
  2. 检查输出文件:cat /var/log/cve_scan_result_$(date +%Y%m%d).txt
  3. 检查邮箱是否收到报告
  4. 查看cron日志:tail -20 /var/log/cron(CentOS)确认任务执行记录

如果一切正常,你的服务器已经开始自动完成CVE高危漏洞的定期扫描,巡检自动化初步落地。

最后总结

本文从零开始编写并部署了一个CVE高危漏洞自动扫描脚本,实现了服务器巡检自动化的周期任务。
虽然示例脚本还需要根据真实环境替换正式的漏洞库,但核心框架已经跑通。
如果你正在处理服务器安全扫描,建议先把脚本部署测试,再根据自己系统特点微调CVE检测逻辑。
遇到异常记得先回看“避坑指南”部分。
后续可继续学习结合企业微信或钉钉机器人推送结果,让巡检更实时。

提示:本文仅介绍方法与框架,具体CVE信息请以官方公告为准。脚本示例需自行适配生产环境,不可直接用于生产。
分享到:
上一篇
Ollama离线模型包无网络住宅主机完整部署教程
下一篇
swap分区一键扩容脚本缓解服务器频繁OOM报错问题
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意