核心功能: - 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
402 lines
18 KiB
HTML
402 lines
18 KiB
HTML
<!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>
|