跳转至

安全

生态系统的所有平台都建立在同一条安全基线之上。本页定义这条基线——新增平台 时,请把以下各项视为要求,而不是可选项

纵深防御

按照「任何单一层次都不足以自保」的原则逐层叠加:

层次 防护
Edge(nginx) TLS、HSTS、限流、请求体大小限制
应用(HTTP) 安全响应头、CORS 白名单、CSRF、超时
应用(逻辑) RBAC、权限校验、输入校验
数据库 RLS、参数化查询
审计 哈希链式审计日志

令牌不会进入客户端 JS

BFF(Backend-for-Frontend)模式是前端安全的根基。

浏览器从不直接访问后端——只与同域下的 Next.js 路由通信,再由后者在服务端侧 代理到后端。令牌存放在 httpOnly cookie 中。

结果是:XSS 不再是窃取令牌的途径。 即便攻击者成功执行了 JavaScript, 也拿不到令牌。

在此之上还有双重 CSRF 防护:自定义请求头加 origin 校验。

安全响应头

在所有响应中:

响应头 作用
Content-Security-Policy 封堵 XSS 的执行途径
Strict-Transport-Security 强制 HTTPS(HSTS)
Cross-Origin-Opener-Policy 隔离跨窗口攻击
Cross-Origin-Embedder-Policy 管控外部资源
Cross-Origin-Resource-Policy 限制资源被外部使用

CORS 一律走白名单——绝不使用 *

Postgres 行级安全(RLS)

机构与用户数据的隔离在数据库层面强制执行,而不是靠应用代码里的 WHERE 条件。

原因:应用代码里只要漏掉一处 WHERE user_id = ?,数据就会泄露。RLS 会把这项 校验施加到每一条查询上,与代码是否写错无关。

启动时的可执行性守卫

应用启动时会校验 RLS 是否真的生效。若缺少 policy,或连接所用的用户 拥有绕过 RLS 的权限,应用会拒绝启动

因为 RLS 悄无声息地失效是最危险的情形——表面上一切都像在正常运行。

SQL

  • 参数化查询——不做字符串拼接。
  • 不使用 ORM——基于 pgx 手写 SQL。每一条查询都清晰可见。

限流与超时

防护 位置
登录认证限流(严格) /login/oauth/auth/api/auth 等路径
应用整体限流(宽松) 其余路径
API 限流 /v1/* 之类的公开 API
HTTP 服务端超时 read · write · idle · header——均已配置
请求体大小限制 在 edge 层

严格限流只用于认证路径

若把严格的认证限流施加到所有路径,Next.js 的 RSC prefetch 就会突破 限额并返回 503。因此严格限额只加在认证路径上,其余路径使用宽松限额。

机密管理

  • 令牌加密——第三方 OAuth 令牌(Google Drive、Dropbox 等)以 AES-256-GCM 加密存储。
  • 密码学密钥——存放于 HSM;本地 HSM 与云端 HSM 互为故障转移。
  • 应用机密配置——通过环境变量提供,绝不进入 git。

切勿把机密写进仓库

服务器凭据、API key、client secret、HSM PIN——这些绝不写入任何仓库、 脚本或文档。部署脚本通过环境变量接收机密。

一旦机密意外泄露:(1) 立即轮换;(2) 检查访问日志; (3) 迁移到机密管理系统中。

生产环境中关闭的 endpoint

/metrics/swagger 会暴露内部结构与 endpoint 清单。在生产环境中它们 由 bearer token 保护

审计日志

哈希链式、仅追加的日志。每条记录都包含前一条的哈希值。

其含义是:中间的任何一条记录都无法删除或篡改——链条会断裂,完整性校验 随之失败。仅管理员可读;另有单独的操作用于校验完整性。

签名与不可否认性

具有法律后果的行为要求 PIN2 签名——仅有登录认证(PIN1)并不足够。 详见认证与授权页面。

签名私钥以 2-of-2 门限 ECDSA 拆分——任何一方都无法单独完成签名。

测试

  • 单元测试——业务逻辑与权限校验。
  • testcontainers 集成测试——对接真实的 PostgreSQL/Redis,真刀真枪地 校验 RLS。
  • golden vector 测试——密码学协议层兼容性。

安全检查清单

新平台上生产之前:

  • [ ] TLS + HSTS 已启用,证书自动续期
  • [ ] 安全响应头全部配置(CSP · HSTS · COOP · COEP · CORP)
  • [ ] CORS 白名单——不含 *
  • [ ] 限流:认证从严,其余从宽
  • [ ] HTTP 服务端各项超时全部配置
  • [ ] RLS 已启用,启动守卫正常工作
  • [ ] 所有查询均为参数化
  • [ ] 令牌存于 httpOnly cookie,不进入客户端 JS
  • [ ] 双重 CSRF 防护
  • [ ] /metrics/swagger 已关闭
  • [ ] 审计日志正常写入,完整性可校验
  • [ ] 机密配置经环境变量提供,仓库中不存在
  • [ ] 集成测试确实在校验 RLS