# 安全策略 本仓库含业务源码、接口设计与部署细节,密级为**内部**。以下内容针对"敏感信息如何避免进入仓库、以及进来之后怎么办"。 ## 一、报告安全问题 发现凭据泄露、越权、注入等问题,**不要开公开议题、不要贴截图到群里**。直接联系: - 项目负责人(陈工),或 - 邮箱 `aomin@aomin.cn` 报告中不要复述口令原文,只说明"哪个文件、哪一行、是哪一类凭据"。凭据原文一旦进入聊天记录或截图,处置成本立刻从"改一个文件"变成"换一套口令 + 重跑全部证据"。 ## 二、绝不能提交的内容 口令、token、AK/SK、私钥与证书、`.env` 与 `*.local.yml`、含口令的截图、真实的第三方服务密钥。 **模板文件 `.env.example` 是例外**:它只含变量名与占位值,必须入库,否则接手的人不知道要配哪些变量。往模板里填真实值就不再是模板了。 完整清单与目录约定见 [`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 时补做一次扫描 | 提交人 | 按第三节顺序处置 | --- *仓库托管侧的安全事项(访问控制、证书、备份)不在本文件范围。*