feat(store-accounts): 财务专用按需密码读取、审计与安全状态 #17

Merged
WuYongJie merged 1 commits from codex/wuyongjie-store-accounts-finance-reveal into codex/xuxiake-mainline 2026-09-08 06:21:57 +08:00
Owner

店铺只读视图目前没有密码能力。本 PR 为财务后端提供单账号按需读取接口,复用已有 AES-256-GCM 加密数据,不向只读视图或普通数据库账号暴露密码。

实现:

  • POST /internal/store-accounts/{id}/password/reveal,仅专用财务服务身份调用;独立 TLS 网关凭据防止伪造转发头。
  • 严格单账号 DTO、用途/请求人校验、no-store、统一 403/404/429/503 脱敏响应。
  • PostgreSQL 持久限流与白名单访问审计同事务;审计失败不返回密码;无密码日志/缓存。
  • 新增审计表;保留原视图查询与 ACL,在末尾追加 passwordConfigured boolean。无现有密码数据或加密密钥迁移。
  • 接入 JSON、环境变量、额度/超时、密钥轮换、TLS与日志上线门禁、生产备份/回滚及只读验收 SQL 均已提供:furniture-3d-system/docs/integrations/finance-store-account-password-reveal.md。

验证:

  • 6 个套件 51 项通过,包括真实隔离 PostgreSQL、HTTP handler、加解密、并发/跨实例/24小时限流、审计持久化失败及只读权限拒绝。
  • 测试视图保留原字段/筛选,COUNT=958、DISTINCT id=958;末尾字段 boolean,true/false/null=957/1/0。
  • 应用日志、审计记录、SQL请求及开启语句日志的真实本地 PostgreSQL 日志中均未检出随机测试密码;仅输出布尔判定。
  • Type-check、Prisma validate、范围内 ESLint 通过。全仓库主数据巡检仍有 6 项既有违规,均在未修改模块;未将其报告为全仓库通过。

生产状态:

  • 仅只读核验 furniture3d_prod:现有视图 COUNT=958、DISTINCT id=958;957 条非空密码可解密、1 条为空、失败=0;普通只读账号不能读密码列/基表。
  • 未执行生产结构变更、密钥迁移、真实账号密码接口调用或生产发布;未合入共享主线/main。生产新字段和新接口尚未验收。
  • 上线前须批准并完成备份、逐跳 HTTPS、可信网关头覆盖/独立凭据/入口限流/禁止正文采集,再迁移、部署和验收。详见文档具体影响与回滚步骤。

这是自审,不是独立复审;结论 passed with warnings。架构保持 Route → Service → Repository;无 UI 修改;复用真实密码存储完成读取能力。原工作区 WIP 保留。本任务提交后尝试 npm run progress:sync,但最新共享开发主线没有该 script,已停止同步,不影响本 PR。

店铺只读视图目前没有密码能力。本 PR 为财务后端提供单账号按需读取接口,复用已有 AES-256-GCM 加密数据,不向只读视图或普通数据库账号暴露密码。 实现: - POST /internal/store-accounts/{id}/password/reveal,仅专用财务服务身份调用;独立 TLS 网关凭据防止伪造转发头。 - 严格单账号 DTO、用途/请求人校验、no-store、统一 403/404/429/503 脱敏响应。 - PostgreSQL 持久限流与白名单访问审计同事务;审计失败不返回密码;无密码日志/缓存。 - 新增审计表;保留原视图查询与 ACL,在末尾追加 passwordConfigured boolean。无现有密码数据或加密密钥迁移。 - 接入 JSON、环境变量、额度/超时、密钥轮换、TLS与日志上线门禁、生产备份/回滚及只读验收 SQL 均已提供:furniture-3d-system/docs/integrations/finance-store-account-password-reveal.md。 验证: - 6 个套件 51 项通过,包括真实隔离 PostgreSQL、HTTP handler、加解密、并发/跨实例/24小时限流、审计持久化失败及只读权限拒绝。 - 测试视图保留原字段/筛选,COUNT=958、DISTINCT id=958;末尾字段 boolean,true/false/null=957/1/0。 - 应用日志、审计记录、SQL请求及开启语句日志的真实本地 PostgreSQL 日志中均未检出随机测试密码;仅输出布尔判定。 - Type-check、Prisma validate、范围内 ESLint 通过。全仓库主数据巡检仍有 6 项既有违规,均在未修改模块;未将其报告为全仓库通过。 生产状态: - 仅只读核验 furniture3d_prod:现有视图 COUNT=958、DISTINCT id=958;957 条非空密码可解密、1 条为空、失败=0;普通只读账号不能读密码列/基表。 - 未执行生产结构变更、密钥迁移、真实账号密码接口调用或生产发布;未合入共享主线/main。生产新字段和新接口尚未验收。 - 上线前须批准并完成备份、逐跳 HTTPS、可信网关头覆盖/独立凭据/入口限流/禁止正文采集,再迁移、部署和验收。详见文档具体影响与回滚步骤。 这是自审,不是独立复审;结论 passed with warnings。架构保持 Route → Service → Repository;无 UI 修改;复用真实密码存储完成读取能力。原工作区 WIP 保留。本任务提交后尝试 npm run progress:sync,但最新共享开发主线没有该 script,已停止同步,不影响本 PR。
WuYongJie added 1 commit 2026-09-08 06:00:15 +08:00
WuYongJie merged commit c1dd4e666e into codex/xuxiake-mainline 2026-09-08 06:21:57 +08:00
Author
Owner

已按用户授权合并并上线,以下结果替代 PR 描述中“尚未部署”的阶段性状态。

  • PR #17 已合入 codex/xuxiake-mainline(c1dd4e666ed62212c7d0ff626a509d01b0b9a6b6),再合并 main;远端 main、本地 origin/main、生产 REVISION 一致为 22cede9ed0c508aa752eba5c0750669fa9b403e4。
  • 使用 scripts/deploy-yydd-prod-from-git.ps1 从 origin/main 部署;构建完成,PM2 online、端口 3001 和 /api/health 正常。发布合并相对旧生产只包含本次 14 个任务文件,未覆盖 main 的既有功能。
  • 已备份目标库、视图 DDL/ACL/所有者及原环境配置。数据库备份为 171907363 字节,SHA-256 95191baed5549080cbd625bc3762363e3f0389920c775276042c56acf3141168,pg_restore --list 校验通过。恢复位置保存在受限生产备份目录的 manifest。
  • 应用账号无外部视图 DDL 权限,因此 DBA 执行精确迁移并用 Prisma migrate resolve 登记,再由标准 deploy 确认无待执行迁移。新增审计表归应用账号所有,原视图所有者/ACL和原字段逐行内容在事务内校验未变;没有扩大普通只读账号权限。
  • 生产视图实测 COUNT=958、DISTINCT id=958,passwordConfigured 为末尾 boolean,true/false/null=957/1/0。以实际 SET ROLE store_account_reader 查询:可读视图,基表/密码列/审计表均返回权限拒绝。
  • 专用公开路径已启用:POST https://cp.jiansun.vip/internal/store-accounts/{id}/password/reveal。公网 HTTPS 入口通过验证证书的独立 TLS 1.3 上游穿过 FRP;上游端口仅允许入口机回环访问,原页面转发链路未改。HTTP 请求直接 403/no-store,不重定向。
  • 网关注入独立边界凭据,财务系统仅持有专用服务令牌。入口限流为平均 60 次/分钟、允许 5 次瞬时突发;应用层滚动限额仍为服务 30/分钟及 300/24小时、人员 10/分钟、账号 5/分钟。
  • 生产仅使用新建虚构账号验收:403、404、伪造 HTTPS 头 403、5 次授权查看/复制 200、超限 429;密码与随机测试值相符,均 no-store,9 条审计记录已持久化。该虚构账号已删除,原有账号行内容和 958/958 基线恢复并验证。
  • 测试密码未进入审计、响应头、应用日志、PostgreSQL 日志或网关日志;生产验收期间应用及 PG 日志无新增内容,网关日志扫描 9 行/1834 字节无测试密码。此前本地开启 PostgreSQL statement 日志的集成测试亦通过。
  • 6 套件 51 项测试、类型检查、Prisma validate 和定向 lint 已通过;仍有 6 项未修改模块的既有全仓库主数据巡检问题。progress:sync 在基线中缺失,未混入其他工作区的未提交脚本。

服务令牌已通过 Git 忽略、仅当前 Windows 用户及 SYSTEM 可读的本地环境文件交接;本评论不包含密码、密文或密钥。原工作区 WIP 保留。

运行配置:入口 /etc/nginx/conf.d/cp.jiansun.vip.conf;受限认证与 CA 文件 /etc/nginx/private/store-password-reveal/;源端 TLS /opt/furniture-3d-system-prod/shared/private/store-password-reveal-tls/;独立 frpc-furniture-store-reveal.service;入口端口守卫 furniture-store-reveal-port-guard.service。内部叶证书有效至 2027-09-07 22:19:48 UTC,轮换时继续验证私有 CA 链。

回滚先撤销专用服务令牌、恢复备份的 cp 网关配置并 nginx -t/reload,再切回原应用发布目录;新增状态列和无密码审计可保留,避免删除审计。若撤销专用隧道,先停源端 tunnel,再���销仅属于该端口的守卫。完整视图结构回退须使用已备份 DDL/ACL,不能 DROP CASCADE 或手工删除迁移历史。

这是自审,不是独立复审;结论 passed with warnings(既有全仓库检查项)。

已按用户授权合并并上线,以下结果替代 PR 描述中“尚未部署”的阶段性状态。 - PR #17 已合入 codex/xuxiake-mainline(c1dd4e666ed62212c7d0ff626a509d01b0b9a6b6),再合并 main;远端 main、本地 origin/main、生产 REVISION 一致为 22cede9ed0c508aa752eba5c0750669fa9b403e4。 - 使用 scripts/deploy-yydd-prod-from-git.ps1 从 origin/main 部署;构建完成,PM2 online、端口 3001 和 /api/health 正常。发布合并相对旧生产只包含本次 14 个任务文件,未覆盖 main 的既有功能。 - 已备份目标库、视图 DDL/ACL/所有者及原环境配置。数据库备份为 171907363 字节,SHA-256 95191baed5549080cbd625bc3762363e3f0389920c775276042c56acf3141168,pg_restore --list 校验通过。恢复位置保存在受限生产备份目录的 manifest。 - 应用账号无外部视图 DDL 权限,因此 DBA 执行精确迁移并用 Prisma migrate resolve 登记,再由标准 deploy 确认无待执行迁移。新增审计表归应用账号所有,原视图所有者/ACL和原字段逐行内容在事务内校验未变;没有扩大普通只读账号权限。 - 生产视图实测 COUNT=958、DISTINCT id=958,passwordConfigured 为末尾 boolean,true/false/null=957/1/0。以实际 SET ROLE store_account_reader 查询:可读视图,基表/密码列/审计表均返回权限拒绝。 - 专用公开路径已启用:POST https://cp.jiansun.vip/internal/store-accounts/{id}/password/reveal。公网 HTTPS 入口通过验证证书的独立 TLS 1.3 上游穿过 FRP;上游端口仅允许入口机回环访问,原页面转发链路未改。HTTP 请求直接 403/no-store,不重定向。 - 网关注入独立边界凭据,财务系统仅持有专用服务令牌。入口限流为平均 60 次/分钟、允许 5 次瞬时突发;应用层滚动限额仍为服务 30/分钟及 300/24小时、人员 10/分钟、账号 5/分钟。 - 生产仅使用新建虚构账号验收:403、404、伪造 HTTPS 头 403、5 次授权查看/复制 200、超限 429;密码与随机测试值相符,均 no-store,9 条审计记录已持久化。该虚构账号已删除,原有账号行内容和 958/958 基线恢复并验证。 - 测试密码未进入审计、响应头、应用日志、PostgreSQL 日志或网关日志;生产验收期间应用及 PG 日志无新增内容,网关日志扫描 9 行/1834 字节无测试密码。此前本地开启 PostgreSQL statement 日志的集成测试亦通过。 - 6 套件 51 项测试、类型检查、Prisma validate 和定向 lint 已通过;仍有 6 项未修改模块的既有全仓库主数据巡检问题。progress:sync 在基线中缺失,未混入其他工作区的未提交脚本。 服务令牌已通过 Git 忽略、仅当前 Windows 用户及 SYSTEM 可读的本地环境文件交接;本评论不包含密码、密文或密钥。原工作区 WIP 保留。 运行配置:入口 /etc/nginx/conf.d/cp.jiansun.vip.conf;受限认证与 CA 文件 /etc/nginx/private/store-password-reveal/;源端 TLS /opt/furniture-3d-system-prod/shared/private/store-password-reveal-tls/;独立 frpc-furniture-store-reveal.service;入口端口守卫 furniture-store-reveal-port-guard.service。内部叶证书有效至 2027-09-07 22:19:48 UTC,轮换时继续验证私有 CA 链。 回滚先撤销专用服务令牌、恢复备份的 cp 网关配置并 nginx -t/reload,再切回原应用发布目录;新增状态列和无密码审计可保留,避免删除审计。若撤销专用隧道,先停源端 tunnel,再���销仅属于该端口的守卫。完整视图结构回退须使用已备份 DDL/ACL,不能 DROP CASCADE 或手工删除迁移历史。 这是自审,不是独立复审;结论 passed with warnings(既有全仓库检查项)。
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WuYongJie/furniture-3d-system-Wu#17
No description provided.