CVE漏洞定期自动扫描服务器巡检脚本制作教程
很多站长和运维人员都会有这样的需求:定期检查服务器是否存在已知CVE漏洞,但每次手动扫描既繁琐又容易遗忘。
本文教你编写一个简单的Shell脚本,配合crontab定时任务,实现CVE漏洞定期自动扫描并记录结果。
整个过程完全免费,使用Nmap的漏洞检测脚本即可完成,零基础也能跟着操作。
第一步:安装Nmap和漏洞检测脚本
Nmap本身不包含全部CVE检测脚本,需要额外安装nmap-vulscan或使用内置的--script vuln参数。
推荐安装nmap-vulscan,覆盖CVE更全。
Debian/Ubuntu系统
sudo apt update
sudo apt install nmap
sudo git clone https://github.com/scipag/vulscan /usr/share/nmap/scripts/vulscan
CentOS/RHEL系统
sudo yum install nmap
sudo git clone https://github.com/scipag/vulscan /usr/share/nmap/scripts/vulscan
安装后在终端执行 nmap --script-updatedb 更新漏洞指纹库。
验证安装是否成功:
nmap -sV --script vulscan localhost | head -20
如果出现漏洞扫描结果相关的输出,说明工具就绪。
第二步:编写自动扫描脚本
创建一个shell脚本文件,比如cve_scan.sh,内容分三部分:扫描目标、结果存储、清理旧日志。
#!/bin/bash
# CVE漏洞定期自动扫描脚本 - 请按实际修改
# 扫描目标:可以是IP或域名,多个用空格分隔
TARGETS="your.server.ip 127.0.0.1"
# 结果存放目录
OUTPUT_DIR="/var/log/cve_scans"
mkdir -p "$OUTPUT_DIR"
# 生成日期标签
DATE_TAG=$(date +%Y%m%d_%H%M%S)
OUTPUT_FILE="$OUTPUT_DIR/scan_$DATE_TAG.txt"
# 执行扫描(仅常见端口,可通过参数调整)
nmap -sV --script vulscan -p 80,443,22,3306,21,8080 $TARGETS > "$OUTPUT_FILE" 2>&1
# 清理超过30天的旧日志
find "$OUTPUT_DIR" -name "scan_*.txt" -mtime +30 -delete
echo "扫描完成,结果保存在 $OUTPUT_FILE"
保存后执行 chmod +x cve_scan.sh 赋予执行权限。
可以先手动运行一次测试:
./cve_scan.sh
确认没有报错,并检查生成的日志文件内容是否包含类似 CVE- 的信息。
第三步:设置crontab定时任务
使用crontab -e编辑当前用户的计划任务,添加以下行实现每周日凌晨3点自动扫描:
0 3 * * 0 /path/to/cve_scan.sh
0 3 * * 0表示每周日凌晨3点- 路径建议写绝对路径,例如
/home/admin/cve_scan.sh
添加后检查格式:crontab -l 应显示刚才添加的行。
重启cron服务(sudo systemctl restart cron 或 sudo systemctl restart crond)。
避坑指南:四个常见问题
- 扫描时间过长:如果扫描全网端口,单台服务器也可能耗时数小时。建议只扫描Web常用端口(80,443等),或使用
-T4提高速度。在脚本中调整-p参数即可。 - 权限不足:Nmap扫描需要root权限才能发送原始包。如果使用普通用户,要么用sudo执行(脚本前加sudo),要么将用户加入nmap组(不推荐)。建议直接以root身份执行任务或设置sudo免密。
- 脚本路径错误:crontab中的命令路径必须用绝对路径,否则可能找不到脚本。
- 结果文件过大:长时间积累会占用磁盘,脚本中已包含
-mtime +30 -delete自动清理30天前的记录,可根据需求调整天数。
效果验证:如何确认扫描正常
- 执行
crontab -l确认任务存在。 - 等待计划时间或手动执行脚本,检查
/var/log/cve_scans/下是否生成以scan_开头的文件。 - 打开最新日志文件,搜索
CVE-关键字,确认出现漏洞条目。 - 如果需要接收邮件通知,可以在脚本末尾添加
mail -s "CVE扫描结果" admin@example.com < "$OUTPUT_FILE"(需安装mailutils)。
常见问题解答
Q:扫描结果没有发现任何CVE漏洞,是配置错了吗?
A:新系统或经过加固的服务器确实可能无明显漏洞。可以先扫描一个已知有风险的IP(比如测试靶机)验证工具本身是否正常工作。
Q:扫描过程中卡住很久怎么办?
A:通常是因为Nmap正在处理慢速端口。可以按下Ctrl+C终止,然后调整脚本中的 --host-timeout 600s 限制每个主机最多扫描10分钟。
Q:不想用Nmap,有更轻量的方案吗?
A:也可以使用 dism(Debian)或 yum security updates 检查系统补丁,但无法覆盖应用层的CVE。建议将本脚本作为定期安全巡检的补充。
如果你正在搭建自己的CVE漏洞自动扫描巡检系统,建议先在小规模环境测试本脚本,确认扫描策略和输出格式符合需求后再部署到生产服务器。
根据实际节点数量调整定时频率和端口范围,避免因扫描压力影响业务。
遇到其他问题欢迎留言交流。