按周工交付的 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),不做归一化以免整树摘要失效。
5.1 KiB
5.1 KiB
安全策略
本仓库含业务源码、接口设计与部署细节,密级为内部。以下内容针对"敏感信息如何避免进入仓库、以及进来之后怎么办"。
一、报告安全问题
发现凭据泄露、越权、注入等问题,不要开公开议题、不要贴截图到群里。直接联系:
- 项目负责人(陈工),或
- 邮箱
aomin@aomin.cn
报告中不要复述口令原文,只说明"哪个文件、哪一行、是哪一类凭据"。凭据原文一旦进入聊天记录或截图,处置成本立刻从"改一个文件"变成"换一套口令 + 重跑全部证据"。
二、绝不能提交的内容
口令、token、AK/SK、私钥与证书、.env 与 *.local.yml、含口令的截图、真实的第三方服务密钥。
完整清单与目录约定见 CONTRIBUTING.md 第三节。
三、发现泄露后的处置顺序
顺序不能反。先轮换,再清理,最后记录。
- 立即轮换该凭据。假定它已经泄露,不要先花时间判断"有没有人看到"。
- 评估影响面:这把凭据能访问什么?如果它出现在一个曾经外发的包里,接收方副本无法回收,轮换是唯一有效手段。
- 清理当前工作副本,并重新扫描全树(含二进制、含压缩包解压后)。
- 如实登记:什么时候、哪个文件、哪类凭据、是否已轮换。不写"已处理"了事。
不要做的事
- 不要只删文件就认为解决了。 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 时补做一次扫描 | 提交人 | 按第三节顺序处置 |
仓库托管侧的安全事项(访问控制、证书、备份)不在本文件范围。