lcolon231/nodelink-security-scanner
GitHub: lcolon231/nodelink-security-scanner
面向中小企业的轻量级外部安全态势扫描器,通过九项被动检查生成量化评分和品牌化 PDF 报告,帮助 MSP 将安全服务转化为可理解的商业成果。
Stars: 0 | Forks: 0
# NodeLink SMB 安全态势扫描器
为 NodeLink Technologies LLC 打造的旗舰项目。生产就绪的 Next.js、TypeScript 和 pdf-lib。

## 为什么会有这个项目
大多数托管服务提供商 (MSP) 向小型企业销售云和安全服务,但小企业主往往很难理解他们真正需要什么。这个工具将“你应该加强安全防护”转化为一个具体的成果:一个 0-100 的分数和一份带有品牌标识的 PDF 报告,潜在客户只需五分钟就能看懂。
对于 NodeLink 来说,这是一个潜在客户开发工具。潜在客户运行一次扫描,得分低于 75 分,就有了一个具体的理由来安排一次电话沟通。对于作品集审查者来说,它展示了对 DNS、TLS 和网络编程的真实运用,以及对目标用户及其需求的产品化思考。
## 演示流程
1. 潜在客户输入他们的域名
2. 扫描器并行运行九项被动外部检查(约 15-30 秒)
3. 结果页面展示分数、按严重程度排序的发现以及修复建议
4. 潜在客户下载一份带有品牌标识的 PDF 报告


## 功能
- 九项被动外部检查:SPF、DKIM、DMARC、MX、DNS 卫生 (NS、CAA)、TLS 证书健康状况和协议、HTTP 安全标头、HTTPS 重定向、暴露的常用端口。
- 确定性的 0-100 风险评分,具有可解释的基于严重程度的扣分机制。
- 为非技术所有者(而非安全工程师)编写的通俗易懂的修复建议。
- 包含 Logo、评分卡、执行摘要和各项发现修复框的定制品牌 PDF 报告。
- 扫描历史仪表盘。
- 基于 IP 的速率限制。
- 开发环境使用 SQLite,只需更改一个环境变量即可切换为 PostgreSQL。
## 安全边界
该工具仅对公共基础设施执行**被动或低影响检查**:只读 DNS 查询、TLS 握手检查、常用端口上的 TCP 连接探测,以及用于读取响应标头的 HTTP 抓取。它不会利用漏洞、尝试身份验证、对输入进行模糊测试、执行 SYN 扫描或对目标进行压力测试。
请仅对您被授权评估的域名使用此工具(您自己的域名,或已同意进行自我评估的潜在客户的域名)。
## 技术栈
- Next.js 15 (App Router) + TypeScript
- Tailwind CSS
- Prisma 5 + SQLite (开发环境) / PostgreSQL (生产环境)
- pdf-lib 用于 PDF 生成(无 Chromium 依赖)
- Zod 用于输入验证
- LRU 缓存用于内存速率限制
## 快速开始
需要 Node.js 18.17+(推荐 20+ 版本)。
```
npm install
cp .env.example .env
npx prisma generate
npx prisma db push
npm run dev
```
打开 http://localhost:3000 并扫描您拥有或有权评估的域名。
## 项目结构
```
.
├── prisma/ Prisma schema and dev SQLite database
├── public/ Logo embedded into PDF
├── samples/ Example scan output JSON
├── docs/screenshots/ README screenshots
└── src/
├── app/ Next.js routes (pages and API)
│ ├── api/scan/ POST /api/scan, GET /api/scan/[id], /pdf
│ ├── scan/[id]/ Results page
│ └── scans/ History dashboard
├── components/ ScanForm, ScoreGauge, FindingCard, SeverityBadge
├── lib/ db, validation, rate limit, logger
├── pdf/ pdf-lib report generator
└── scanner/ Orchestrator + 9 check modules + scoring
```
## 评分模型
## 评分模型
初始分数为 100。每次未通过的检查会根据其严重程度进行扣分。通过和信息性发现不扣分。
| 严重程度 | 扣分 |
|----------|-----------|
| Critical | 25 |
| High | 15 |
| Medium | 8 |
| Low | 3 |
| Info | 0 |
严重程度是每项检查固有的,而非根据上下文推导得出。这保证了评分的确定性和可解释性。
| 分数 | 等级 |
|-------|------------|
| 90-100 | Strong (强) |
| 75-89 | Good (良好) |
| 60-74 | Needs Work (待改进) |
| 40-59 | Weak (较弱) |
| 0-39 | Critical (危急) |
## 扫描输出示例
查看 [`samples/scan-output.json`](./samples/scan-output.json) 获取由 `GET /api/scan/[id]` 返回的 JSON 示例。
## 生产部署的安全建议
该 MVP 适用于个人演示和授权的自我评估。在部署用于付费或多租户用途之前:
1. **身份验证。** 添加 NextAuth 或 Clerk 并将扫描范围限定到具体用户。
2. **更强的速率限制。** 将内存中的 LRU 替换为 Upstash Redis 或 Vercel KV,使限制在重启后依然有效,并能在无服务器实例间正常工作。同时根据 IP 和账户进行限制。
3. **自动发送电子邮件报告前的域名所有权验证。** 在生成包含请求者信息的品牌 PDF 之前,要求提供 TXT 验证记录。
4. **后台作业。** 将扫描任务移至队列 (Inngest、BullMQ 或 Vercel Cron + 轮询状态端点),以获得更好的用户体验和超时安全性 (特别是在无服务器环境下)。
5. **出站网络出口。** 确保您的托管服务提供商允许到常用端口 (22、25、3389 等) 的出站 TCP 连接。
6. **审计日志。** 扩展数据库结构以包含 IP、user-agent 和已验证的用户 ID。
7. **滥用防范。** 维护一份敏感域名 (政府、银行、您未获授权评估的医疗机构等) 的拒绝名单。
## 路线图
### MVP (当前代码库)
- [x] 域名输入 + 验证
- [x] 九项被动外部检查
- [x] 具有可解释严重性的风险评分
- [x] 带有评分仪表盘和发现的结果页面
- [x] 品牌化 PDF 报告
- [x] 扫描历史仪表盘
- [x] 基于 IP 的速率限制
### v1
- [ ] 用户账户 (NextAuth)
- [ ] 生产环境使用 Postgres
- [ ] 带有状态轮询的异步扫描
- [ ] PDF 报告的电子邮件发送 (包含域名所有权验证)
- [ ] 定期重新扫描
- [ ] 扫描间的差异比对 ("自上周以来新增 3 个问题")
- [ ] 每个工作区的 Logo 上传 (面向 MSP 合作伙伴的白标服务)
- [ ] 导出为 CSV / JSON
### 高级版
- [ ] 通过证书透明度和被动 DNS 进行子域名枚举
- [ ] 从公共元数据提供云资源配置错误提示
- [ ] 在获得收件箱访问授权的情况下,进行邮箱级别的 DKIM/DMARC 对齐检查
- [ ] PDF 中的 HIPAA / SOC 2 控制映射
- [ ] 评分下降时的 Slack/Teams 告警
- [ ] 用于 MSP 集成的 API 访问
- [ ] 供应商风险模块 (批量评估供应商)
## 许可证
MIT — 查看 [LICENSE](./LICENSE)。
## 免责声明
此工具基于对公共域名基础设施的被动检查提供轻量级的外部评估。它不是一次渗透测试,也不是全面的安全审计,并且不保证不存在漏洞。各项发现仅供参考。请仅对您拥有或已获得明确授权评估的域名使用。
标签:B2B安全服务, DKIM检查, DMARC验证, DNS安全检测, GNU通用公共许可证, HTTPS重定向验证, HTTP安全头检测, MSP工具, MX记录解析, Next.js 15, Node.js, pdf-lib, PDF报告生成, PostgreSQL, React, SaaS安全工具, SPF记录检查, SQLite, Syscalls, TLS证书健康检查, TypeScript, 中小企业安全, 合规检测, 品牌定制报告, 外部安全态势扫描, 安全合规, 安全意识宣贯, 安全插件, 测试用例, 潜在客户生成, 端口暴露扫描, 网络代理, 网络安全评估, 自动化攻击, 获客工具, 风险评估打分