容器镜像漏洞定期扫描安全巡检自动化脚本
容器镜像漏洞定期扫描与安全巡检自动化脚本实操指南
为什么要做容器镜像安全巡检?
在生产环境中,使用带漏洞的基础镜像部署容器是常见的安全隐患。
手动扫描费时费力,还容易遗漏。
通过编写自动化脚本配合系统定时任务(cron),可以实现镜像漏洞定期扫描与安全巡检,并在发现高危漏洞时及时告警。
本文使用开源工具 Trivy(由 Aqua Security 维护),讲解从安装到落地的完整流程。
准备条件
- 一台运行 Linux 的服务器(CentOS 7+ 或 Ubuntu 18.04+),具备 root 或 sudo 权限。
- 已安装 Docker(用于拉取和运行测试镜像)。
- 能正常访问网络,以便下载 Trivy 和更新漏洞数据库。
- 建议先了解基本的 Shell 脚本和 crontab 编辑操作。
第一步:安装 Trivy 并测试基础扫描
Trivy 支持多种安装方式,这里推荐使用官方脚本安装(自动适配系统):
sudo curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin
安装后验证版本:
trivy --version
用本地已有的一个镜像测试扫描:
trivy image nginx:latest
首次运行会自动下载漏洞数据库(约几百 MB),之后会缓存。
如果看到漏洞列表,说明安装成功。
第二步:编写自动化巡检脚本
创建一个脚本文件,比如 /usr/local/bin/scan_images.sh,内容如下(注意替换告警邮箱等参数):
#!/bin/bash
# 容器镜像安全巡检脚本
# 功能:拉取镜像列表,逐个扫描,输出日志,发现高危/严重漏洞发送邮件告警
LOG_DIR="/var/log/trivy_scan"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="${LOG_DIR}/scan_${TIMESTAMP}.log"
ALERT_EMAIL="admin@example.com"
# 确保日志目录存在
mkdir -p "$LOG_DIR"
# 获取所有本地镜像名称(不含标签重复)
IMAGES=$(docker images --format "{{.Repository}}:{{.Tag}}" | sort -u)
# 遍历扫描
for IMG in $IMAGES; do
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 扫描镜像: $IMG" >> "$LOG_FILE"
trivy image --severity HIGH,CRITICAL --quiet "$IMG" >> "$LOG_FILE" 2>&1
echo "" >> "$LOG_FILE"
done
# 检查日志中是否包含高危漏洞关键字
if grep -q "CRITICAL\|HIGH" "$LOG_FILE"; then
# 发送邮件告警(需系统已配置 mail 命令,如 mailx)
mail -s "容器镜像安全高危告警 - $(date '+%F %T')" "$ALERT_EMAIL" < "$LOG_FILE"
echo "[$(date)] 已发送高危告警邮件" >> "$LOG_FILE"
else
echo "[$(date)] 未发现高危/严重漏洞,巡检正常" >> "$LOG_FILE"
fi
给脚本执行权限:
sudo chmod +x /usr/local/bin/scan_images.sh
手动运行一次,测试脚本是否正常工作:
sudo bash /usr/local/bin/scan_images.sh
查看日志目录下生成的文件,确认扫描结果和告警动作(如果系统未配置 mail,可先注释邮件相关行,只保留日志)。
第三步:配置定时任务实现定期扫描
使用 crontab 编辑计划任务(以 root 用户,确保有权限拉取/扫描镜像):
sudo crontab -e
添加以下规则,例如每天凌晨 2 点执行一次:
0 2 * * * /usr/local/bin/scan_images.sh
保存后重启 crond(如果使用 systemd):
sudo systemctl restart crond
验证定时任务是否生效:
sudo crontab -l
常见问题与避坑
1. Trivy 数据库更新失败
Trivy 默认从 GitHub Releases 下载数据库,若网络受限可配置使用镜像源或代理。
在脚本前添加 export TRIVY_DB_REPOSITORY=ghcr.io/aquasecurity/trivy-db 试试。
2. 镜像列表含重复项或旧标签
docker images 可能包含相同镜像不同标签,使用 sort -u 去重。
若想只扫描活跃容器使用的镜像,可以将命令改为 docker ps --format "{{.Image}}"。
3. 邮件发送失败
大多数系统未自带 mail 命令,需安装 mailx 并配置 SMTP(如 sendmail 或外部中继)。
临时可将告警改为写入另一个文件或通过 Webhook 通知。
4. 扫描大量镜像超时
如果镜像数量多,建议在脚本中增加超时控制 timeout 600 trivy image ...,避免单个镜像卡住整个任务。
效果验证
定时任务执行后,查看日志目录:
ls -lt /var/log/trivy_scan/
选择最新日志查看是否有高危漏洞:
cat /var/log/trivy_scan/scan_最新时间.log
如果配置了邮件,检查收件箱。
另外可以故意拉取一个包含已知漏洞的镜像(如 vulhub/nginx:1.15.12)测试告警是否触发。
结语
通过本文的脚本和定时任务配置,你已实现容器镜像漏洞定期扫描与安全巡检自动化。
后续可以根据业务需求扩展,比如集成到 CI/CD 流水线、对接企业微信/钉钉机器人告警,或生成可视化报表。
记住定期更新 Trivy 数据库和脚本逻辑,确保扫描有效性。