一个人守不住所有攻击面,只能先守住那些一破就回不来的入口。
这个系列解决什么问题
一个人做产品,安全清单总是排在功能后面:OWASP Top 10 有十项,ASVS 有两百多条,每一条都写着「应当」。做完不可能,不做又睡不踏实。
这个系列不讲「某个漏洞怎么利用」,也不复述安全专题里的技术细节。它讲的是取舍:14 个入口里,哪 5 个坏了不可逆;17 个密钥里,哪 4 个必须 90 天换一次;186 条依赖告警里,哪 23 条真的值得修;4 类限流配额定成多少;9 类事件记进审计日志;以及出事之后的 72 小时按什么顺序走。
它服务的是一个没有安全团队、没有 SIEM、也没有合规部门的人。 你能投入的不是一套安全平台,而是一张攻击面清单、一份密钥台账、四条边界规则和一条「72 小时内必须止血」的规则。
核心主张:五条口径
- 安全是排序题,不是覆盖题。 一年 53 小时的安全投入,只够做完 14 个入口里最贵的那几件事。
- 先按不可逆性排,再按可能性排。 域名、邮箱、云根账号、数据库与支付这 5 个入口破了,产品就没了。
- 密钥和依赖是别人放在你家的钥匙。 17 个密钥要能轮换,41 个直接依赖要能说清谁在维护。
- 限流是唯一能在十分钟内挡住滥用的手段。 它不优雅,但它是出事时唯一还能拉住的闸。
- 响应时间是设计出来的。 0–1 小时止血、1–24 小时评估、24–72 小时通知,每一步都要在事前写好。
10 篇速览
| # | 文章 | 核心内容 | 阶段 |
|---|---|---|---|
| 01 | 攻击面是一张清单:十四个入口与它们的坏结局 | 14 入口、5 不可逆、53 h/年、2.8% | 盘点 |
| 02 | 认证:密码、魔法链接、OAuth 与一次账号枚举 | 三种方式、12 个弱密码、响应差 <50 ms | 入口 |
| 03 | 会话与令牌:过期、撤销与一次没退出的登录 | 619 会话、30 天/14 天、撤销 0 秒 | 身份 |
| 04 | 密钥与配置:十七个密钥、三档与泄露后的三十分钟 | 4+7+6、轮换 7.13 h、30 分钟四步 | 钥匙 |
| 05 | 输入与输出:注入、XSS、SSRF 与文件上传的四条边界 | 4 边界、8 域名、6 种 MIME、294 MB | 边界 |
| 06 | 依赖与供应链:四十一个直接依赖、一百八十六条告警 | 41/380、23 条真修、14.3 h/年 | 供应链 |
| 07 | 限流与滥用:四个配额与一次被刷的导出 | 340 次/小时、4 类配额、2.67 h | 闸门 |
| 08 | 日志与审计:记九类、脱敏五列、留一百八十天 | 9 类、15.3 万条、184 MB | 证据 |
| 09 | 安全事件响应:发现漏洞后的七十二小时 | 三级、47 分钟止血、3.5 h 修复 | 响应 |
| 10 | 安全验收:二十项基线、四维评分与季度演练 | 20 项、权重 0.30/0.25/0.25/0.20、2.60→3.91 | 验收 |
三条阅读路径
路径 A:刚上线,除了 HTTPS 什么都没做。 先读 01 把 14 个入口列出来,再读 04 把 17 个密钥收到环境变量里,最后用 07 给登录与导出加上四条限流。这条路径的重点是「先关掉最贵的门」。
路径 B:有基本措施,但说不清自己的攻击面。 先读 02 与 03 把认证与会话的数字定下来,再读 05 把四条边界写成默认动作,最后用 08 把 9 类事件记进日志。这条路径的重点是「把依赖记忆的东西写成规则」。
路径 C:被扫过、被投毒过,或要接企业客户。 先读 06 把依赖告警分级处理,再读 09 把 72 小时响应写成三段,最后用 10 做一次 20 项评分与演练。这条路径的重点是「同样的洞不破第二次」。
与其它专题的边界
站内已有安全工程、隐私、多租户、资产韧性、运维与质量内容,但都不处理「一个人怎么给自己的产品排安全优先级」这条线。下表说明本组不重复什么。
| 既有内容 | 它讲什么 | 本组边界 |
|---|---|---|
| 信息安全与云安全专题 | OWASP Top 10、认证会话、供应链、文件上传、事件响应与加固基线 | 它给技术层与方法;本组给一个人 53 小时的取舍、排序与验收 |
| 一个人的多租户:组织、邀请、角色与数据隔离 | 角色矩阵、三层校验、租户隔离与审计日志 | 它管「谁能看什么」;本组管「谁能进来、钥匙在哪、边界怎么设」 |
| 一个人的隐私工程:数据地图、最小化与删除权 | 数据地图、合法性依据、删除权、保留期与泄露合规通知 | 它管「该不该收、要留多久」;本组管「收进来的东西怎么不被拿走」 |
| 独立开发者的资产韧性:一个人的账号、数据与恢复能力 | 自己的域名、邮箱、云账号、2FA、备份与交接 | 它管「你自己的账号别丢」;本组管「产品里的用户与数据别被破」 |
| 一个人把 API 做成产品:对外接口、开发者体验与支持 | 对外 API key、配额与计费、Webhook 签名 | 它管对外 API 的契约与商业配额;本组管服务端密钥与防滥用 |
| 一个人的运维:可用性、告警、事故与值班 | 可用性预算、探针、告警降噪、事故响应与复盘 | 它管「别挂」;本组管「别被破」 |
| 一个人的质量守门:验证预算、回归清单与发布门禁 | 关键路径、回归分层、发布门禁与缺陷分级 | 它管功能对不对;本组管攻击者能不能绕过它 |
| 一个人的架构:技术选型、模块边界与演进 | 41 个直接依赖的升级窗口、适配层与技术债 | 它管依赖怎么升级;本组管依赖里有没有已知漏洞 |
| 一个人给产品加 AI:判据、成本、护栏与验收 | 输入过滤、输出约束、速率与审计的 AI 滥用防线 | 它管 AI 场景的滥用;本组把同一套规则落到整个产品 |
| 一个人的计费系统:订阅状态机、按比例计费与失败重试 | 订阅状态、退款、拒付与对账 | 它管钱怎么算;本组把支付账号列为不可逆入口并给保护 |
| 一个人的公司:独立开发者的主体、税务与合规底座 | 主体、税务、合同、知识产权与年度合规 | 它是法务与税务口径;本组是技术控制 |
| 一个人把软件交付到用户手里 | macOS/Windows 签名公证、安装包、更新器与商店审核 | 它管分发链路的可信;本组管服务端与数据面 |
| 一个人的性能与账单:4.2 秒的首屏、一千二百次查询与每月 210 美元 | 4 项预算与 20 格、RUM 与慢查询、412→168 KB、1,200→3 次查询、0→86% 缓存、34 秒导出、7→4 个第三方、210→118 美元、3 次回归告警、10 项验收 | 那组管别慢到不能用;本组管别被破门——入口、密钥与边界 |
| 一个人的企业客户:九家询价、一百四十八道问卷与 134 天的第一单 | 9 家询价与 130 h、96 天采购、148 题问卷、7 个子处理者、SLA 43.2/216 分钟、26 h SSO、4 周试点、38 天到账、8 h 实施、10 项验收 | 那组讲怎么答问卷、怎么举证;本组讲入口、密钥、边界与 72 小时响应 |
| 一个人的开源产品:4,200 个 star、一百八十个付费与一年 612 小时的维护 | 4,200 star 与 1,949 美元、612 h 维护、214 依赖、48,600 行 78/22、1,180 个 issue、214 条告警、23 个赞助者、9 家双许可、17 位贡献者、10 项验收 | 那组讲依赖告警与安全公告;本组讲入口、密钥、边界与 72 小时响应 |
这十篇不教漏洞利用,不承诺「零事故」,也不评价任何厂商产品。可复算的部分全部用四则运算给出算式;不可复算的部分(协议行为、平台限制)明确指向官方文档。所有数字都是教学假设,代入前请换成自己的入口数、密钥数与依赖数。
本组统一口径
全组共用一组教学假设,各篇引用时不换分母:
产品:一人 SaaS 任务板,与既有组同一产品;账号 344,付费 120
工程:单体 + Postgres + 对象存储;直接依赖 41、间接依赖约 380
时间:一年 48 周 × 40 h = 1,920 h
攻击面 14 个:不可逆 5 + 高影响 5 + 中影响 4
14 入口 × 3 问(最坏情况/最低保护/当前状态)= 42 格
盘点 2.5 h × 4 季 = 10 h/年;年度安全投入合计约 53 h = 1,920 h 的 2.8%
打分 = 可能性 1–5 × 影响 1–5:≥15 分 5 个先做、8–14 分 6 个本季度、≤7 分 3 个记录接受
密钥 17 个:critical 4 + high 7 + low 6
critical 90 天:4 次 × 4 个 × 18 分钟 = 288 分钟
high 180 天:2 次 × 7 个 × 10 分钟 = 140 分钟;合计 428 分钟 = 7.13 h/年
认证:344 账号;弱密码规则命中 12 个 = 3.5%;强制改密 12 × 4 = 48 分钟
重置令牌 32 字节、30 分钟、一次性;三处响应时间差 < 50 ms
会话:绝对 30 天、空闲 14 天;344 × 1.8 设备 = 619 个会话 × 0.5 KB = 310 KB
共享电脑暴露 4 小时;服务端会话撤销 0 秒,无状态 JWT 最长 15 分钟
输入输出:4 条边界;0 处 SQL 拼接;3 处渲染上下文;出站白名单 8 个域名
上传 10 MB/文件、6 种 MIME、签名 URL 15 分钟;210 个/月 × 1.4 MB = 294 MB/月
SSRF 演练 8 个内网变体全部拦截
依赖告警 186 条 = 高危 11 + 中 47 + 低 128
修 11 高(25 分钟)+ 12 中(15 分钟)+ 记录 128(1 分钟)+ 登记 35 分钟 = 618 分钟 = 10.3 h
加每月审计 20 分钟 = 4 h/年,合计 14.3 h/年;一次供应链事件按 40 h 计(教学假设)
限流四类:注册 10 次/IP/小时 + 全站 200/天;登录 5 次/账号/15 分钟 + 20 次/IP/小时
导出 3 次/账号/天 + 并发 1;AI 免费 20/天、付费 500/天
一次导出被刷 340 次/小时、CPU 打满 47 分钟;四类规则 4 × 40 = 160 分钟 = 2.67 h(一次性)
日志 9 类 × 420 条/天 × 365 = 153,300 条/年 × 1.2 KB = 184 MB
脱敏 5 列:密码、令牌、卡号、邮箱(只留域名)、IP(截断末段)
留存 180 天(免费)/ 365 天(付费)
事件三级:P0 数据泄露或越权、P1 认证绕过或密钥泄露、P2 单点漏洞
响应三段:0–1 h 止血、1–24 h 取证与评估、24–72 h 通知与修复
演练:备份桶公开 → 47 分钟止血、影响 0 个客户、修复 3.5 h
验收 20 项,权重 0.30/0.25/0.25/0.20
现状 2.60 = 0.30×2.5 + 0.25×2.6 + 0.25×2.4 + 0.20×3.0
修后 3.91 = 0.30×4.0 + 0.25×4.0 + 0.25×3.8 + 0.20×3.8
演练 4 次 × 1.5 h = 6 h/年
53 小时是全年安全投入,不是某个项目。 它由一次性加固(限流 2.67 h、日志 5 h、边界 8 h)与年度动作(盘点 10 h、轮换 7.13 h、依赖 14.3 h、演练 6 h)相加而来。
14 个入口与 41 个依赖不是同一层。 依赖是入口之一;把依赖数当成攻击面总数,会漏掉域名、邮箱、云账号这些更贵的东西。
打分只用来排序,不用来算钱。 可能性与影响都是主观估计;它的价值在于强迫你把 14 个入口放在同一张表上比较。
使用说明
先把 5 个不可逆入口写下来。 域名、注册邮箱、云根账号、数据库、支付账号;这 5 个丢了,产品就不是「不安全」而是「不存在」。
密钥先进环境变量,再谈轮换。 硬编码在仓库里的密钥没有轮换周期,只有泄露时间。
限流配额定在能解释的数值上。 「10 次/小时」能说清为什么,比「1000 次/小时」更可能在出事时救你。
72 小时的三段要事先写。 出事时再想顺序,通常会把时间花在互相通知上。
本组的证据与使用方法
证据类型。 本组用的是「14 个入口的盘点表 + 17 个密钥台账 + 186 条依赖告警记录 + 4 类限流配额 + 9 类事件日志 + 1 次演练记录(47 分钟止血)」。没有「最佳实践」式的断言。
如何使用。 先用 01 把入口列全并打分,再用 04 建密钥台账,用 05 与 07 把边界和闸门设好,最后用 10 做一次 20 项评分。
如何复核。 取最近一次安全相关事件:看入口是否在清单上、密钥是否可轮换、限流是否生效、日志能否在 5 分钟内定位、止血是否在 1 小时内。五项都能对上,这套基线才适用。
系列导航
- 回到上级专题:独立开发者(Indie Developer)专题
- 上一组:一个人的质量守门:验证预算、回归清单与发布门禁
- 本组下一篇:攻击面是一张清单:十四个入口与它们的坏结局