Files
hepu/SECURITY.md
T
aomin a7605ef8b8 chore(repo): 导入 M-Z 业务底座 V1.9 基线并建立仓库规范
按周工交付的 SEC-Z-01 清理后源码建立 M-Z 主干,并按 Git 仓库惯例重排目录。

- aomin-gateway/  后端工程 87 文件,原样保留,路径与构建命令未变
- demo/           演示前端与设备模拟器 9 文件(原 02_前端与设备端),非正式三端
- docs/handover/  交付与安全清理材料 6 份,内容未改
- docs/contract/  J-00 规格、OpenAPI、内部五接口、状态机、Mock 样例
- docs/reference/ 指纹与校验清单,含 84 个源码文件的 sha256 清单

目录重排只动位置不动内容:源码树 84 文件哈希与交付一致,逐文件自校验通过;
12 条 Flyway 迁移与交付包内镜像逐字节一致。

未纳入:迁移镜像目录(与工程内一套重复,改留指纹)、target/、证据 raw、
应急恢复脚本、评审用虚构台账数据。

安全:SEC-Z-01 15 处明文已清零,导入前重新扫描无新增命中,本仓库无历史污染。
行尾按交付字节原样保存(.gitattributes 设 * -text),不做归一化以免整树摘要失效。
2026-11-13 17:32:37 +08:00

81 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 安全策略
本仓库含业务源码、接口设计与部署细节,密级为**内部**。以下内容针对"敏感信息如何避免进入仓库、以及进来之后怎么办"。
## 一、报告安全问题
发现凭据泄露、越权、注入等问题,**不要开公开议题、不要贴截图到群里**。直接联系:
- 项目负责人(陈工),或
- 邮箱 `aomin@aomin.cn`
报告中不要复述口令原文,只说明"哪个文件、哪一行、是哪一类凭据"。凭据原文一旦进入聊天记录或截图,处置成本立刻从"改一个文件"变成"换一套口令 + 重跑全部证据"。
## 二、绝不能提交的内容
口令、token、AK/SK、私钥与证书、`.env` 与 `*.local.yml`、含口令的截图、真实的第三方服务密钥。
完整清单与目录约定见 [`CONTRIBUTING.md`](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` 第十节)。
## 五、扫描怎么做
交付时用过的方法,任何人可原样复跑。要点三条:文本与字节分开扫、压缩包解开再扫、换成你要找的凭据值。
```bash
# 文本层(排除构建产物与 .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 时补做一次扫描 | 提交人 | 按第三节顺序处置 |
---
*仓库托管侧的安全事项(访问控制、证书、备份)不在本文件范围。*