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
This commit is contained in:
2026-10-28 19:07:11 +08:00
commit 16f134e328
113 changed files with 24604 additions and 0 deletions

122
scripts/sync_clamav_db.sh Normal file
View File

@@ -0,0 +1,122 @@
#!/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"