Files
MeshSate/app/templates/about.html
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

402 lines
18 KiB
HTML
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.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<link rel="icon" href="/static/logo.png">
<title>关于 MeshSafe</title>
<style>
* { box-sizing: border-box; }
body { font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
margin: 0; background: #f4f6fa; color: #1e293b; }
{% include "_nav_style.html" %}
main { padding: 0 24px 56px; max-width: 1180px; margin: 0 auto; }
/* ===== Hero ===== */
.hero {
position: relative; margin: 0 -24px 0; padding: 64px 24px 56px;
background:
radial-gradient(1100px 420px at 12% -10%, rgba(59,130,246,.20), transparent 62%),
radial-gradient(900px 380px at 88% 0%, rgba(139,92,246,.16), transparent 60%),
linear-gradient(180deg, #f8fafc 0%, #eef2f8 100%);
border-bottom: 1px solid #e2e8f0;
overflow: hidden;
}
.hero-inner { max-width: 1180px; margin: 0 auto; position: relative; }
.hero .eyebrow {
display: inline-flex; align-items: center; gap: 7px;
font-size: 12px; letter-spacing: 1.4px; text-transform: uppercase;
color: #3b82f6; font-weight: 600; margin-bottom: 16px;
}
.hero .eyebrow::before {
content: ""; width: 22px; height: 2px; border-radius: 2px;
background: linear-gradient(90deg, #3b82f6, #8b5cf6);
}
.hero h1 {
margin: 0 0 10px; font-size: 42px; line-height: 1.16; font-weight: 800;
letter-spacing: -1px; color: #0f172a;
}
.hero h1 .grad {
background: linear-gradient(100deg, #2563eb 0%, #7c3aed 55%, #0891b2 100%);
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.hero .lead {
margin: 0 0 22px; font-size: 16.5px; line-height: 1.85; color: #475569; max-width: 760px;
}
.hero .lead b { color: #1e293b; font-weight: 600; }
.hero .tags { display: flex; flex-wrap: wrap; gap: 9px; }
.hero .tags span {
font-size: 12.5px; color: #475569; background: rgba(255,255,255,.78);
border: 1px solid #e2e8f0; border-radius: 999px; padding: 5px 14px;
backdrop-filter: blur(6px);
}
/* ===== 章节通用 ===== */
section { margin-top: 52px; }
.sec-head { margin-bottom: 22px; }
.sec-head .kicker {
font-size: 11.5px; letter-spacing: 1.2px; text-transform: uppercase;
color: #94a3b8; font-weight: 600; margin-bottom: 7px;
}
.sec-head h2 {
margin: 0 0 8px; font-size: 23px; font-weight: 700; color: #0f172a; letter-spacing: -.3px;
}
.sec-head p { margin: 0; font-size: 14px; color: #64748b; line-height: 1.75; max-width: 820px; }
/* ===== 痛点叙事 ===== */
.story {
background: #fff; border: 1px solid #eef2f7; border-radius: 14px;
padding: 34px 38px; box-shadow: 0 1px 3px rgba(15,23,42,.05), 0 8px 26px rgba(15,23,42,.04);
}
.story p { margin: 0 0 15px; font-size: 14.5px; line-height: 1.95; color: #475569; }
.story p:last-child { margin-bottom: 0; }
.story .hl {
display: block; margin: 24px 0; padding: 20px 24px;
background: linear-gradient(100deg, #eff6ff 0%, #f5f3ff 100%);
border-left: 3px solid #3b82f6; border-radius: 8px;
font-size: 16px; font-weight: 650; color: #1e3a8a; line-height: 1.7;
}
.story .risk { color: #b91c1c; font-weight: 600; }
.story .fine { color: #64748b; font-weight: 400; }
/* ===== 能力大卡 ===== */
.cap-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 18px; }
.cap {
background: #fff; border: 1px solid #eef2f7; border-radius: 14px; padding: 26px 28px;
box-shadow: 0 1px 3px rgba(15,23,42,.05), 0 8px 26px rgba(15,23,42,.035);
position: relative; overflow: hidden; transition: transform .2s, box-shadow .2s, border-color .2s;
}
.cap::after {
content: ""; position: absolute; inset: 0 0 auto 0; height: 3px;
background: linear-gradient(90deg, var(--c1), var(--c2));
opacity: .85;
}
.cap:hover {
transform: translateY(-3px);
box-shadow: 0 6px 14px rgba(15,23,42,.08), 0 18px 40px rgba(15,23,42,.07);
border-color: #dbe3ee;
}
.cap .ic {
width: 44px; height: 44px; border-radius: 12px; margin-bottom: 15px;
display: flex; align-items: center; justify-content: center; font-size: 21px;
background: var(--bg); color: var(--c1);
box-shadow: inset 0 0 0 1px rgba(15,23,42,.045);
}
.cap h3 { margin: 0 0 4px; font-size: 16.5px; font-weight: 700; color: #0f172a; }
.cap .cap-sub { margin: 0 0 12px; font-size: 12.5px; color: #94a3b8; letter-spacing: .2px; }
.cap p { margin: 0 0 14px; font-size: 14px; line-height: 1.85; color: #475569; }
.cap .detail {
margin: 0; padding-top: 13px; border-top: 1px dashed #e2e8f0;
font-size: 12.5px; line-height: 1.8; color: #64748b;
}
.cap .detail b { color: #334155; font-weight: 600; }
.cap .detail code {
background: #f1f5f9; padding: 1px 5px; border-radius: 4px;
font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 11.5px; color: #b45309;
}
/* ===== 能力矩阵(引擎分层) ===== */
.layers { display: grid; gap: 10px; }
.layer {
display: flex; align-items: flex-start; gap: 16px;
background: #fff; border: 1px solid #eef2f7; border-radius: 11px; padding: 16px 20px;
box-shadow: 0 1px 2px rgba(15,23,42,.04);
}
.layer .lv {
flex-shrink: 0; width: 34px; height: 34px; border-radius: 9px;
display: flex; align-items: center; justify-content: center;
font-size: 12.5px; font-weight: 700; font-family: ui-monospace, Menlo, Consolas, monospace;
background: #f1f5f9; color: #475569;
}
.layer .lt { min-width: 118px; flex-shrink: 0; }
.layer .lt b { display: block; font-size: 14px; color: #1e293b; font-weight: 650; }
.layer .lt span { font-size: 11.5px; color: #94a3b8; }
.layer .ld { font-size: 13.5px; line-height: 1.75; color: #475569; }
.layer .ld b { color: #1e293b; font-weight: 600; }
/* ===== 架构小卡 ===== */
.arch-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.arch {
background: #fff; border: 1px solid #eef2f7; border-radius: 12px; padding: 22px 24px;
box-shadow: 0 1px 3px rgba(15,23,42,.05);
transition: transform .18s, box-shadow .18s;
}
.arch:hover { transform: translateY(-2px); box-shadow: 0 6px 18px rgba(15,23,42,.08); }
.arch .ai { font-size: 20px; margin-bottom: 10px; }
.arch h4 { margin: 0 0 7px; font-size: 14.5px; font-weight: 650; color: #0f172a; }
.arch p { margin: 0; font-size: 12.8px; line-height: 1.8; color: #64748b; }
.arch p b { color: #334155; font-weight: 600; }
/* ===== 底部信息条 ===== */
.foot {
margin-top: 52px; padding: 22px 28px; border-radius: 12px;
background: linear-gradient(100deg, #0f172a 0%, #1e3a5f 100%);
color: rgba(255,255,255,.78); font-size: 13px; line-height: 1.9;
display: flex; flex-wrap: wrap; gap: 10px 40px; align-items: center;
}
.foot .brand { color: #fff; font-weight: 650; font-size: 14px; }
.foot .dot { color: rgba(255,255,255,.32); }
.foot b { color: #7dd3fc; font-weight: 600; }
@media (max-width: 900px) {
.cap-grid, .arch-grid { grid-template-columns: 1fr; }
.hero h1 { font-size: 32px; }
.layer { flex-direction: column; gap: 10px; }
.layer .lt { min-width: 0; }
}
</style>
</head>
<body>
{% set nav_active = 'about' %}
{% include "_nav.html" %}
<div class="hero">
<div class="hero-inner">
<div class="eyebrow">文件摆渡安全卫士</div>
<h1>MeshSafe <span class="grad">· 文件摆渡安全卫士</span></h1>
<p class="lead">
为内外网文件摆渡提供<b>零信任检测</b>能力。每一份传入的文件,在进入内部网络之前
都要经过 6 层引擎的交叉验证 —— 从文件结构完整性到病毒特征、从文档行为到二进制指令,
任何一层发现威胁,整份文件即刻终止通行。
</p>
<div class="tags">
<span>6 层引擎交叉检测</span>
<span>零容忍规则优先响应</span>
<span>真实文件类型识别</span>
<span>全链路审计追溯</span>
<span>完全离线可用</span>
<span>毫秒级响应</span>
</div>
</div>
</div>
<main>
<!-- ===== 用户痛点 ===== -->
<section>
<div class="sec-head">
<div class="kicker">The Challenge</div>
<h2>文件摆渡时,你真正担心的是什么?</h2>
<p>不是"这个文件有没有被杀毒软件报过毒"这么简单。真正让安全负责人睡不着的,往往是下面这些场景。</p>
</div>
<div class="story">
<p>
一份 ISO 镜像刚传入内网,里面藏着的木马就开始在机器上监听端口、拖走数据;
一份看似无害的 Word 文档,员工的电脑双击之后,VBA 宏悄悄把内网信息外发到公网;
一份压缩包里套着另一个压缩包,解压到第 5 层才露出真正的恶意载荷。
</p>
<p>
传统杀毒软件查不到这些 —— 它只认<span class="risk">已被收录的病毒特征</span>。
而真正针对关键基础设施的攻击早已越过这条线:把恶意程序伪装成 <code style="font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px;color:#b45309;">.txt.exe</code> 用双扩展名蒙混过关;
利用 USB 介质摆渡的 <code style="font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px;color:#b45309;">.lnk</code> 快捷方式劫持来劫持凭证;
在 PDF 里嵌入 JavaScript 打开远程恶意链接;在 Office 宏里做字符混淆绕过关键字检测。
</p>
<p>
更棘手的是<span class="fine">它不一定会触发任何告警</span>。文件顺利躺在内网服务器的某个目录里,
直到有一天有人双击了它。
</p>
<span class="hl">
MeshSafe 把风险挡在网络边界这一层 —— 让每一个传入的文件,先过一遍安全审判。
</span>
<p>
每一份文件都要依次通过结构完整性检测、病毒特征扫描、文档深度行为分析、
关键词匹配、YARA 规则匹配、PE/二进制分析 —— <b>6 层引擎交叉验证</b>。
命中"零容忍"特征的,<b>直接终止,不打分、不商量</b>。
即使是完全离线的内网环境,病毒特征库也能通过文件摆渡的方式持续更新,保持检测能力不衰减。
</p>
</div>
</section>
<!-- ===== 核心能力 ===== -->
<section>
<div class="sec-head">
<div class="kicker">Core Capabilities</div>
<h2>四个核心能力</h2>
<p>不是把功能点罗列一遍,而是回答四个你在实际运维中真正会问的问题。</p>
</div>
<div class="cap-grid">
<div class="cap" style="--c1:#3b82f6; --c2:#06b6d4; --bg:#eff6ff;">
<div class="ic">🛡️</div>
<h3>6 层引擎交叉检测</h3>
<p class="cap-sub">多层独立引擎 · 单引擎故障不中断整体扫描</p>
<p>
六个引擎各管一摊,横向覆盖不同威胁面。任何一个引擎抛出异常都被安全捕获,
<b>不会因为病毒库没加载或某个解析器出错而让整份扫描失败</b>,更不会因此把文件误放行。
</p>
<p class="detail">
<b>关键设计:</b>引擎异常时任务结论标记为 <code>error</code> 并按<b>拒绝</b>处理 —— 失败即拦截,绝不失败即放行。
</p>
</div>
<div class="cap" style="--c1:#ef4444; --c2:#f97316; --bg:#fef2f2;">
<div class="ic">⚡</div>
<h3>零容忍优先响应</h3>
<p class="cap-sub">20+ 条硬威胁规则 · 命中即拒</p>
<p>
有些特征不需要再算风险分 —— PDF 内嵌可执行 JavaScript、VBA 宏自动执行、
Linux ELF 可执行文件、LNK 快捷方式劫持、ISO 镜像内含可执行文件、路径穿越攻击,
命中任何一条,文件<b>当场终止</b>。
</p>
<p class="detail">
<b>与普通检测的区别:</b>零容忍规则绕过评分机制,不存在"分数高一点就放行"的情况。
</p>
</div>
<div class="cap" style="--c1:#8b5cf6; --c2:#d946ef; --bg:#f5f3ff;">
<div class="ic">🔍</div>
<h3>真实文件类型识别</h3>
<p class="cap-sub">不认扩展名 · 只看文件头魔数</p>
<p>
攻击者最容易钻的空子就是文件名 —— 把 <code style="font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px;color:#b45309;">payload.exe</code>
改名成 <code style="font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px;color:#b45309;">readme.txt</code>。
MeshSafe 直接读取文件头字节判断真实类型,与扩展名不符、双扩展名伪装、
危险可执行扩展名,统统识别出来。
</p>
<p class="detail">
<b>还覆盖:</b>压缩包结构安全预检、嵌套深度限制、解压总量上限(zip bomb 防护),
藏在压缩包里的第二层、第三层载荷同样会被拆开检测。
</p>
</div>
<div class="cap" style="--c1:#10b981; --c2:#14b8a6; --bg:#ecfdf5;">
<div class="ic">📝</div>
<h3>全链路审计追溯</h3>
<p class="cap-sub">哈希链防篡改 · 合规审计可查</p>
<p>
每次扫描的输入文件哈希、判定结论、命中规则明细、时间戳、来源渠道全部落库,
形成完整审计链。审计记录采用<b>哈希链</b>结构串联,任何一条被事后修改,
后续链路的校验立刻失效。
</p>
<p class="detail">
<b>合规价值:</b>等保测评、审计问询时"某个文件当时为什么被拦截",
可以直接调出完整判定过程,而不是靠回忆。
</p>
</div>
</div>
</section>
<!-- ===== 引擎分层 ===== -->
<section>
<div class="sec-head">
<div class="kicker">Detection Pipeline</div>
<h2>6 层检测管线</h2>
<p>每一层解决一类问题,层层递进不重复。</p>
</div>
<div class="layers">
<div class="layer">
<div class="lv">L0</div>
<div class="lt"><b>结构与完整性</b><span>Structure</span></div>
<div class="ld">识别真实文件类型、检出扩展名伪装与双扩展名、判定危险可执行扩展名、对压缩包做结构安全预检,拦截路径穿越与 zip bomb。</div>
</div>
<div class="layer">
<div class="lv">L1</div>
<div class="lt"><b>病毒特征</b><span>ClamAV</span></div>
<div class="ld">对接 ClamAV 病毒引擎做特征匹配,命中已知恶意样本直接判定恶意。病毒库可离线更新,完全不依赖外网。</div>
</div>
<div class="layer">
<div class="lv">L2</div>
<div class="lt"><b>文档深度分析</b><span>Document</span></div>
<div class="ld">解析 Office 宏、PDF 动作、OLE 嵌入对象、邮件附件等结构化内容,判断文档是否包含自动执行或外联行为。</div>
</div>
<div class="layer">
<div class="lv">L3</div>
<div class="lt"><b>关键词匹配</b><span>Keywords</span></div>
<div class="ld">在文本与脚本内容中匹配反弹 Shell、远程下载执行、凭据外传等高危行为模式,识别"无病毒但有恶意意图"的内容。</div>
</div>
<div class="layer">
<div class="lv">L4</div>
<div class="lt"><b>YARA 规则</b><span>YARA</span></div>
<div class="ld">加载自定义规则集匹配已知家族与自定义特征,规则可由安全团队随业务需要持续扩充,无需改代码。</div>
</div>
<div class="layer">
<div class="lv">L5</div>
<div class="lt"><b>PE/二进制分析</b><span>Binary</span></div>
<div class="ld">对可执行文件做指令级特征分析,识别加壳、混淆、可疑导入组合等静态分析可疑点,覆盖无签名但行为异常的程序。</div>
</div>
</div>
</section>
<!-- ===== 架构 ===== -->
<section>
<div class="sec-head">
<div class="kicker">Security Architecture</div>
<h2>为生产环境而生的架构</h2>
<p>安全能力不是叠加出来的,是从接入层到存储层贯穿设计的。</p>
</div>
<div class="arch-grid">
<div class="arch">
<div class="ai">🔐</div>
<h4>签名认证接入</h4>
<p>
每个调用方分配独立 <b>client_id + client_secret</b>,请求必须携带
<b>HMAC-SHA256 签名</b>。服务端用 HKDF 派生请求/响应双向独立密钥,
时间戳窗口 + 一次性 nonce 双重防重放,伪造请求进不来。
</p>
</div>
<div class="arch">
<div class="ai">🚦</div>
<h4>分层限流保护</h4>
<p>
扫描接口与非扫描接口<b>分别限流</b>,按调用方维度在 Redis 中滑动窗口计数,
多实例部署下计数依然准确。超限返回 429 与重试提示,不拖垮后端。
</p>
</div>
<div class="arch">
<div class="ai">🏗️</div>
<h4>高可用部署</h4>
<p>
多 worker 进程 + 数据库连接池 + 常驻病毒扫描守护进程,
并发扫描不阻塞事件循环。相同文件重复提交直接命中缓存秒级返回,不重复消耗算力。
</p>
</div>
</div>
</section>
<!-- ===== 底部信息 ===== -->
<section>
<div class="foot">
<span class="brand">MeshSafe</span>
<span>文件摆渡安全卫士</span>
<span class="dot">|</span>
<span>版本 <b>v1.0</b></span>
<span class="dot">|</span>
<span>完全离线部署可用</span>
<span class="dot">|</span>
<span>扫描结论与响应全程可验签</span>
</div>
</section>
</main>
</body>
</html>