批量扫描 Linux 漏洞的核心在于“只读扫描”与“集中报告”,而非盲目自动修复。本文提供一套完整的 Shell 脚本方案,支持单机深度扫描与多机批量执行,最终生成可审计的安全报告。
先说结论:安全扫描脚本应仅限于信息收集,自动修复风险极高,建议生成报告后人工审核。
- 先判断:确认服务器业务重要性,避免扫描工具占用资源影响线上服务。
- 优先做:使用系统自带包管理器检查安全更新,配合轻量级审计工具收集配置信息。
- 再验证:修复前备份关键配置,修复后检查服务状态和日志确保业务正常。
单机扫描脚本示例
以下脚本兼容 CentOS 与 Ubuntu 系列,自动识别包管理器,将漏洞信息输出到本地文件。
#!/bin/bash
# 安全扫描脚本 scan_security.sh
# 用途:收集安全更新信息与基础配置审计,不执行自动修复
REPORT_DIR="/tmp/security_scan"
mkdir -p $REPORT_DIR
REPORT_FILE="$REPORT_DIR/scan_$(hostname)_$(date +%F).txt"
echo "=== 扫描开始:$(date) ===" > $REPORT_FILE
echo "主机名:$(hostname)" >> $REPORT_FILE
echo "内核版本:$(uname -r)" >> $REPORT_FILE
# 检查 CentOS/RHEL 安全更新
if command -v yum &>/dev/null; then
echo "--- Yum 安全更新 ---" >> $REPORT_FILE
yum updateinfo list security >> $REPORT_FILE 2>&1
fi
# 检查 Ubuntu/Debian 安全更新
if command -v apt &>/dev/null; then
echo "--- Apt 安全更新 ---" >> $REPORT_FILE
apt list `--upgradable` 2>/dev/null | grep -i security >> $REPORT_FILE
fi
# 可选:Lynis 审计(需提前安装)
if command -v lynis &>/dev/null; then
echo "--- Lynis 审计摘要 ---" >> $REPORT_FILE
lynis audit system `--quiet` >> $REPORT_FILE 2>&1
fi
echo "=== 扫描结束 ===" >> $REPORT_FILE
echo "报告生成位置:$REPORT_FILE"
批量执行与报告收集
针对多台服务器,可通过 SSH 循环分发脚本并回收报告。建议建立专门的 reports 目录存储结果。
# 本地创建报告收集目录
mkdir -p ./reports
# 服务器列表
HOSTS="192.168.1.10 192.168.1.11"
for IP in $HOSTS; do
echo "处理服务器:$IP"
# 1. 分发脚本
scp scan_security.sh root@$IP:/tmp/
# 2. 远程执行
ssh root@$IP "bash /tmp/scan_security.sh"
# 3. 回收报告 (假设报告在 /tmp/security_scan/ 下)
# 注意:实际路径需根据脚本逻辑调整,此处示例为抓取最新报告
scp root@$IP:/tmp/security_scan/scan_*.txt ./reports/
done
# 合并所有报告
cat ./reports/*.txt > ./reports/all_servers_scan.txt
验证与排查
扫描完成后,需验证报告有效性及后续修复效果。
- 验证报告内容:检查生成的 txt 文件是否包含具体的包名和版本信息,避免为空。
- 验证修复生效:执行更新后,使用
rpm -qa或dpkg -l检查关键软件版本号是否变更。 - 查看日志:检查
/var/log/yum.log或/var/log/dpkg.log确认安装记录。 - 业务验证:重启相关服务后,通过 curl 或浏览器访问业务端口,确认服务响应正常且无报错。
常见坑与风险
- 命令语法错误:apt 命令参数不应包含反引号,直接复制脚本时需检查特殊符号。
- 内网源配置:内网服务器无法连接更新源,需提前配置本地 yum/apt 源,否则扫描结果为空。
- 内核未重启:内核更新后未重启,导致漏洞修复未生效,需检查
uname -r版本。 - 审计工具误报:Lynis 等工具可能产生误报,需结合业务实际情况判断,不要盲目修改所有建议项。
- 权限控制:批量脚本建议使用只读权限扫描,修复操作由人工执行,避免权限过大导致误操作。