Files
MeshSate/scripts/sync_clamav_db.sh
zhaolei 16f134e328 feat: MeshSafe 文件摆渡安全卫士 v1.0 初始提交
核心功能:
- 6 层检测管线: L0 结构分析 → L1 ClamAV → L2 文档深度检测 → L3 关键词匹配 → L4 YARA → L5 PE/二进制
- FastAPI + PostgreSQL + Redis + Docker Compose 架构
- 客户端 HMAC-SHA256 签名鉴权 + 限流 + 幂等性
- 控制台 UI (登录/Dashboard/诊断中心/策略管理/任务列表/测试中心/产品介绍页)
- 三层诊断定时器 (error_scan 30s / db_aggregate 30s / container_check 5min)

并发与稳定性修复:
- 诊断定时器 Redis 时间槽位锁 (多 worker 同一槽位只有一个执行)
- JSONL 存储 fcntl 跨进程排他锁 + 容错解码 + 原子重写
- 移除 SQLite fallback, 统一 PostgreSQL
- API_CLIENTS 脱敏为环境变量, .env 已 .gitignore
2026-10-28 19:07:11 +08:00

123 lines
3.9 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# =============================================================================
# ClamAV 病毒库离线同步脚本(外网侧执行)
# =============================================================================
#
# 场景:内网 MeshSafe 部署在光闸之后,无法访问外网签名服务器。
# 在外网机器上运行本脚本拉取最新 CVD 文件 → 打包 → 光闸摆渡 → 内网导入
#
# 用法:
# bash scripts/sync_clamav_db.sh
#
# 输出:
# clamav-db-YYYYMMDD.tar.gz # 包含 main.cvd / daily.cvd / bytecode.cvd
# # 和一个 import_clamav_db.sh 脚本(在光闸内侧执行)
#
# 完整流程:
# 1) 外网:bash scripts/sync_clamav_db.sh → 生成 tar.gz
# 2) 光闸:将 clamav-db-*.tar.gz 摆渡到内网
# 3) 内网:bash import_clamav_db.sh clamav-db-*.tar.gz
#
# 维护节奏:每周一次(官方每天更新,内网环境 7-14 天更新可接受)
# =============================================================================
set -euo pipefail
WORKDIR=$(mktemp -d)
cleanup() { rm -rf "$WORKDIR"; }
trap cleanup EXIT
OUTDIR="$(pwd)/dist"
mkdir -p "$OUTDIR"
VERSION="$(date +%Y%m%d)"
OUTFILE="clamav-db-${VERSION}.tar.gz"
echo "=== MeshSafe ClamAV 离线同步 ==="
echo "输出文件:$OUTDIR/$OUTFILE"
echo
# --- 方式 A:用 Docker 拉取(需要 Docker 环境)---
if command -v docker &>/dev/null; then
echo "[1/2] 通过 Docker freshclam 拉取签名库..."
docker run --rm \
-v "$WORKDIR":/var/lib/clamav \
clamav/clamav:latest \
freshclam --stdout
echo " ✓ 签名库已下载到 $WORKDIR"
else
# --- 方式 B:系统已安装 ClamAV ---
echo "[1/2] 系统内 freshclam 拉取..."
if ! command -v freshclam &>/dev/null; then
echo "✗ 未找到 docker 或 freshclam,退出"
exit 1
fi
freshclam --datadir="$WORKDIR"
echo " ✓ 签名库已下载到 $WORKDIR"
fi
echo
echo "[2/2] 打包..."
ls -la "$WORKDIR"/*.cvd 2>/dev/null || ls -la "$WORKDIR"/*.cld 2>/dev/null || {
echo "✗ 未找到 .cvd/.cld 文件,freshclam 可能失败"
exit 1
}
tar -czf "$OUTDIR/$OUTFILE" -C "$WORKDIR" .
# 附带 import 脚本模板
cat > "$WORKDIR/import_clamav_db.sh" << 'EOF'
#!/usr/bin/env bash
# =============================================================================
# ClamAV 病毒库离线导入脚本(内网侧执行)
# =============================================================================
#
# 用法:bash import_clamav_db.sh clamav-db-*.tar.gz
#
# 要求:docker compose 已经启动 meshsafe-clamav 容器
# =============================================================================
set -euo pipefail
TARBALL="${1:?用法: bash import_clamav_db.sh clamav-db-*.tar.gz}"
if [ ! -f "$TARBALL" ]; then
echo "✗ 文件不存在: $TARBALL"
exit 1
fi
echo "=== MeshSafe ClamAV 离线导入 ==="
echo "输入:$TARBALL"
echo
# 解压到临时目录
TMPDIR=$(mktemp -d)
trap "rm -rf $TMPDIR" EXIT
tar -xzf "$TARBALL" -C "$TMPDIR"
echo "[1/3] 停止 clamd(如果在运行)..."
docker compose -f docker-compose.yml exec -T clamav supervisorctl stop clamd 2>/dev/null || true
sleep 2
echo "[2/3] 覆盖签名库文件..."
docker compose -f docker-compose.yml cp "$TMPDIR"/. clamav:/var/lib/clamav/
echo "[3/3] 重启 clamd..."
docker compose -f docker-compose.yml restart clamav
echo
echo "✓ 导入完成。验证:"
echo " docker compose logs --tail 20 clamav"
echo " 或 curl http://localhost:8443/api/v1/health 看 clamav signature 字段"
EOF
chmod +x "$WORKDIR/import_clamav_db.sh"
# 重新打包包含 import 脚本
tar -czf "$OUTDIR/$OUTFILE" -C "$WORKDIR" .
echo
echo "✓ 完成:$OUTDIR/$OUTFILE"
echo " 大小:$(du -h "$OUTDIR/$OUTFILE" | cut -f1)"
echo
echo "后续步骤(内网侧):"
echo " 1. 将 $OUTFILE 从光闸摆渡到内网"
echo " 2. docker compose up -d"
echo " 3. bash import_clamav_db.sh $OUTFILE"