Files
hepu/SECURITY.md
aomin 983191628e docs(config): 补 .env.example 并修正 .gitignore 误伤模板
.gitignore 的 `.env.*` 会把 `.env.example` 一起排除,等于把变量清单挡在仓库外,
接手的人只能翻 application.yml 逐个猜要配什么。加 `!.env.example`(含
`.sample`、`.template`)例外,规则顺序放在忽略之后。

同时补 .env.example:从 application.yml 与代码里实际提取 20 个变量,分组注明
默认值与是否必须替换。三个必改项(DB_PASS 无默认、GATEWAY_TOKEN 占位、
BIZ_TOKEN_SECRET 与 BIZ_PII_KEY 为 dev-only)单独标出。

本文件只放占位值;真实的 .env 仍不入库。另注明工程不自动读 .env
(未引入 dotenv),必须由启动脚本加载或 docker compose --env-file 注入——
这一条不说清,会有人建了 .env 直接启动然后发现 DB_PASS 还是缺。
2026-11-13 17:38:08 +08:00

5.3 KiB
Raw Permalink Blame History

安全策略

本仓库含业务源码、接口设计与部署细节,密级为内部。以下内容针对"敏感信息如何避免进入仓库、以及进来之后怎么办"。

一、报告安全问题

发现凭据泄露、越权、注入等问题,不要开公开议题、不要贴截图到群里。直接联系:

  • 项目负责人(陈工),或
  • 邮箱 aomin@aomin.cn

报告中不要复述口令原文,只说明"哪个文件、哪一行、是哪一类凭据"。凭据原文一旦进入聊天记录或截图,处置成本立刻从"改一个文件"变成"换一套口令 + 重跑全部证据"。

二、绝不能提交的内容

口令、token、AK/SK、私钥与证书、.env 与 *.local.yml、含口令的截图、真实的第三方服务密钥。

模板文件 .env.example 是例外:它只含变量名与占位值,必须入库,否则接手的人不知道要配哪些变量。往模板里填真实值就不再是模板了。

完整清单与目录约定见 CONTRIBUTING.md 第三节。

三、发现泄露后的处置顺序

顺序不能反。先轮换,再清理,最后记录。

  1. 立即轮换该凭据。假定它已经泄露,不要先花时间判断"有没有人看到"。
  2. 评估影响面:这把凭据能访问什么?如果它出现在一个曾经外发的包里,接收方副本无法回收,轮换是唯一有效手段。
  3. 清理当前工作副本,并重新扫描全树(含二进制、含压缩包解压后)。
  4. 如实登记:什么时候、哪个文件、哪类凭据、是否已轮换。不写"已处理"了事。

不要做的事

  • 不要只删文件就认为解决了。 Git 记录每一版,删掉后历史里那份仍然存在,git log -p 照样能翻出来。
  • 不要手改历史(filter-repo)来"洗掉"凭据后又当没发生过。重写历史会让所有人的本地副本失效,必须全员重新克隆,属于需要提前通知的操作。这种情况下轮换凭据的成本永远低于重写历史。
  • 不要对 zip / jar 直接做字节搜索。 成员内容被压缩过,字节搜索必然返回"无命中",是假阴性。必须解开逐成员扫。

四、当前安全状态

项 状态
明文口令 SEC-Z-01 清理后 0 处(原 15 处),扫描 0 命中
Git 历史污染 无。本仓库为首次提交,交付包内不含 .git,属干净起点
application.yml 数据库口令 仅从 ${DB_PASS} 取,无默认值;未设置时启动即退出(退出码 1),不会带空口令连库
数据库口令轮换 未轮换,登记为待确认项。该口令是评审机本地演示库的 root 口令,仅监听 127.0.0.1;但它进过 6 个历史包,若曾外发则等同已离开本机。判据见 docs/handover/02_SEC-Z-01_敏感信息扫描报告.md 第四节
内部接口签名 auth.enabled 默认 false,共享密钥默认占位值 change-me-in-production。上线前必须从环境变量注入真实值并打开,否则 /internal/** 只靠来源网络闸防护
来源网络闸 networkGuardEnabled 默认 true,独立于签名开关。这个默认值是对的:签名可以晚点开,网络闸必须一开始就有
百度地图 AK 已替换为运行时占位符 __BAIDU_AK__,仓库内无真实 AK
天地图密钥 已替换为占位符 __WB_TMAP_SECRET__ / __WB_HTTP_PORT__,仓库内无真实值

一个已知例外

demo/web/family/index.html 保留演示账号提示 13800000000 / 123456。这是 BIZ_DEMO_ENABLED=true 时由程序向数据库播种的演示数据,不是系统凭据,也不是任何环境的管理员账号。仅在开启演示模式且库里已播种的库上有效。

但它是明文。 处置方式不是删掉这行,而是保证 BIZ_DEMO_ENABLED 只在演示环境开启(生产严禁开启,见 aomin-gateway/README.md 第十节)。

五、扫描怎么做

交付时用过的方法,任何人可原样复跑。要点三条:文本与字节分开扫、压缩包解开再扫、换成你要找的凭据值。

# 文本层(排除构建产物与 .git)
grep -rn --binary-files=without-match -iE '(password|passwd|secret|token|access-?key)[[:space:]]*[:=][[:space:]]*["'\'']?[A-Za-z0-9@#$%^&*._-]{6,}' \
  --include='*.java' --include='*.yml' --include='*.yaml' --include='*.xml' \
  --include='*.py' --include='*.html' --include='*.js' --include='*.sql' --include='*.md' \
  --exclude-dir=.git --exclude-dir=target .

命中不一定是问题(String token = ... 也会命中),但每一条都要能说清为什么不是问题。说不出,就按泄露处理。

二进制与压缩包按 docs/handover/02_SEC-Z-01_敏感信息扫描报告.md 第二节的 Python 脚本逐成员扫。

六、待办

项 责任方 判据
演示库 root 口令是否轮换 项目负责人 确认 6 个历史包是否曾外发;若曾外发则轮换并重跑 155 条(约 13 分钟)
auth.enabled 上线前打开并注入真实密钥 部署方 /internal/** 无签名请求被拒
新增 token、AK/SK 时补做一次扫描 提交人 按第三节顺序处置

仓库托管侧的安全事项(访问控制、证书、备份)不在本文件范围。