audit and harden workspace

This commit is contained in:
2026-08-10 11:42:45 +08:00
parent c883cc52a2
commit 1a1fa521c0
140 changed files with 640 additions and 475 deletions

9
wiki/README.md Normal file
View File

@@ -0,0 +1,9 @@
# BSM Infra Full Wiki
| 文档 | 内容 |
| --- | --- |
| [系统架构](architecture.md) | 模块边界、聚合入口、请求分流和依赖注入 |
| [开发与运维](operations.md) | 配置、启动、验证、构建、发布和排障 |
| [审计报告](audit-2026-08-10.md) | 已修复问题、剩余风险和后续优先级 |
修改模块入口、配置结构、聚合协议或发布方式时,应同步更新本目录和根 README。

38
wiki/architecture.md Normal file
View File

@@ -0,0 +1,38 @@
# 系统架构
## 模块边界
仓库包含 20 个 Go modulemodule 下 19 个业务模块可独立运行all 聚合其中 15 个 base、ec、finance 服务social 三个模块暂未聚合。
典型模块目录职责:
| 目录 | 职责 |
| --- | --- |
| cmd/main | 进程入口、配置和生命周期 |
| internal/config | 模块配置 |
| internal/impl | DB、Redis、etcd、内存缓存 |
| internal/logic | 业务逻辑 |
| internal/server | 服务构造与注册 |
| service | 对 all 公开的 Expose API |
| pb | protobuf 生成代码 |
| etc | 配置样例 |
独立入口初始化自己的基础设施。聚合调用 Expose 时不重复初始化,而是注入 all 创建的共享对象。
## all 启动流程
1. 校验 --workspace 并读取 etc/<workspace>_<runtime>.yaml。
2. 初始化共享 DB、Redis、etcd 和内存缓存。
3. 创建统一 gRPC、grpc-gateway 和 Gin server。
4. 按 Services 或 BSM_SERVICES 调用模块 Expose。
5. 在一个 h2c 端口启动,并响应退出信号。
请求先按 gRPC Content-Type 分流;普通请求先进入 grpc-gatewaygateway 返回 404 时回退到 Gin。
## 依赖注入
ExposeOptions.Dependencies 可接收 RedisClient、etcd Client、gorm DB 和 Cache。参数非 nil 时覆盖模块 internal/impl 对象。address、market、order、mgt 的业务数据库访问已统一使用 internal/impl.DBService。
## 生命周期
统一 HTTP server 设置请求头读取超时、空闲超时和最大请求头。关闭时先执行 gRPC GracefulStop超过 context 截止时间后强制 Stop再关闭 HTTP server。

53
wiki/audit-2026-08-10.md Normal file
View File

@@ -0,0 +1,53 @@
# 代码审计报告2026-08-10
## 范围
覆盖根 workspace、all、19 个业务模块、配置样例和维护脚本。执行结构盘点、敏感信息扫描、TODO/异常退出扫描和全部 module 测试。
## 已修复
| 优先级 | 问题 | 处理 |
| --- | --- | --- |
| P0 | 19 个 go.mod 绑定 D:/work/bsm-sdk/core | 移除绝对路径 replace20 个 module 测试仍通过 |
| P0 | 样例含公网地址、固定 secret 和开发机私钥路径 | 改为 localhost 或 CHANGE_ME |
| P1 | workspace 直接参与路径构造 | 限制字符和长度、转小写、增加测试 |
| P1 | 聚合入口缺少连接防护 | 增加 ReadHeaderTimeout、IdleTimeout、MaxHeaderBytes |
| P1 | gRPC GracefulStop 可能无限等待 | 受 context 约束,超时强制 Stop |
| P2 | 缺少统一验证入口 | 新增 PowerShell 和 Bash 验证脚本 |
| P2 | README 乱码且过时 | 重写 README 并建立 wiki |
## 尚存风险
### P0默认管理员密码
module/base/mgt/internal/models/init_db.go 仍包含 root 默认密码 123456。建议改为必填环境变量或一次性随机密码未提供安全凭据时拒绝初始化。
### P1弱密码哈希
market、mall 等部分逻辑仍使用 MD5 加盐。应迁移至 bcrypt、scrypt 或 Argon2id并采用登录时升级旧哈希的兼容策略。
### P1reflection 与明文 h2c
all 默认启用 gRPC reflection自身不终止 TLS。生产环境应在可信网络运行由网关终止 TLS并将 reflection 改为配置控制。
### P1未实现接口
social、wallet、mall、cms 等仍有模板 TODO。编译成功不代表功能完整未实现 RPC 应明确返回 Unimplemented。
### P2测试覆盖不足
多数 package 没有测试。应优先覆盖认证、权限、支付、订单状态机、迁移和 all 请求分流。
### P2迁移与启动耦合
多个 models.New 会自动迁移或 seed。建议拆分连接、迁移、seed支持蓝绿发布、只读实例和回滚。
## 建议路线
1. 消除默认管理员密码并迁移弱密码哈希。
2. 配置化 reflection、初始化行为和 TLS 信任边界。
3. 为 auth、mgt、order、wallet 建立核心路径测试。
4. 将数据库迁移和 seed 从进程启动拆出。
5. CI 增加 workspace 验证、凭据扫描、proto 一致性和依赖漏洞扫描。
审计基线:全部 20 个 workspace module 的 go test ./... 通过;不包含真实基础设施集成测试。

45
wiki/operations.md Normal file
View File

@@ -0,0 +1,45 @@
# 开发与运维
## 配置
配置路径规则为:
<BSM_Prefix>/etc/<serviceKey>_<BSM_RuntimeMode>.yaml
all 的 serviceKey 来自 --workspace默认 default。BSM_RuntimeMode 默认 devBSM_SERVICES 可覆盖聚合服务列表。
## 验证
Windows
./scripts/verify-workspace.ps1
Linux/macOS
./scripts/verify-workspace.sh
脚本对每个 module 执行 go vet 和 go test并检查 gofmt。依赖真实服务的测试应使用 integration tag。
## 构建
scripts/build-all-linux.sh 构建 module 下独立服务到 .builds。all 可单独构建:
cd all
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -o ../.builds/all ./cmd/main
## 发布检查
1. workspace 验证通过。
2. git diff --check 通过。
3. 配置不存在 CHANGE_ME。
4. 数据库迁移已在预发布验证。
5. Services 仅包含计划发布服务。
6. TLS、访问控制、日志脱敏和监控已配置。
7. 已准备二进制及数据库回滚方案。
## 排障
- 配置不存在检查工作目录、BSM_Prefix、BSM_RuntimeMode 和 workspace 文件名。
- 服务未注册:检查 Services 与 BSM_SERVICES。
- 启动失败检查端口、DSN、Redis、etcd 和迁移权限。
- gateway 404确认 proto gateway 注册Gin 只在 gateway 404 后接管。