B端后台、第三方对接与安全权限综合技术设计(TND-B2B / INT / SEC)¶
文档编号:DOC-D05 / DOC-D06 / DOC-D07(三份合一)/ 简称:TND-B2B / TND-INT / TND-SEC 版本:V1.0 / 创建日期:2026-08-22 维护人:TL / DT;OCM听云必须加签章节:§三(D06第三方对接)+ §四(D07安全权限)+ §四.7(密钥轮转&审计)— 共3处OCM专属评审加签点 决策审批人:TL(技术)+ SPO(业务)+ OCM听云(§三/§四 运维&安全专属签字) 关联文档:D01 TND-ARC §九第三方对接Kong治理 + ADR-010 Keycloak + ADR-014 可观测 + ADR-016 PDPO加密 / D10 §七 AES-256-GCM L1-L4分级加密
第一篇 · D05 B端后台(MFR生产商 + LGP物流商 + B2B合作伙伴门户)¶
1.1 业务定位¶
三B端门户共用同一套B2B前端技术栈(Next.js 14 SSR + Tailwind + Shadcn/ui),通过Keycloak角色区分(MFR-USR / LGP-USR / B2B-USR)。后端代码模块边界为
backend/mfr/backend/lgp/backend/b2b/。模块化单体(D01 P3铁律)。
| 门户 | 使用角色(Keycloak) | 核心功能数 | 对接系统 |
|---|---|---|---|
| MFR生产商门户 | MFR-ADMIN / MFR-USR | 约22个页面(20产品管理+开放报价+结算) | MDS PPL档案供给/ QSV开放报价桥/ CPT L4签约对账 |
| LGP物流商门户 | LGP-ADMIN / LGP-USR | 约20个页面(派单分配+接单+C7受理+对账单) | DIS派单候选池/ C7保险工单/ MDS DLV档案 |
| B2B合作门户 | B2B-ADMIN / DESIGN-USR / REALESTATE-USR | 约10个页面(线索推送+佣金对账+合作KPI) | OPS S03/S05/S06场景线索API |
1.2 DDD代码边界(三篇合一,但模块分离)¶
backend/
mfr/ # MFR生产商模块
interfaces/api/mfr_router.py # MFR-01~MFR-22接口(开放报价+20产品+对账)
application/
MfrProductAppService.py # 产品上下架/批量导入
OpenQuoteBridgeAppService.py # D02 §二MFR-OpenQuote桥
MfrSettlementAppService.py # 月结/电子发票
domain/
producer_product.py # MFR产品聚合根(关联PPL ppl_id)
value_objects/
open_quote_bridge_dto.py # QSV开放报价桥接DTO(对齐D02 QuoteParams32)
ports.py
infrastructure/
db/models.py # mfr_products(20品类字段) / mfr_settlement_batches
nats/mfr_event_publisher.py # NATS mfr.product.created / mfr.openquote.generated
lgp/ # LGP物流商模块
interfaces/api/lgp_router.py # LGP-01~LGP-20
application/
LgpDispatchAcceptAppService.py # 接单/拒单(DIS DIS/LGP1-3)
LgpSettlementAppService.py # 运输费结算(含C7赔付扣款)
LgpInsuranceAppService.py # lgp-insurance C7工单受理(原型页)
domain/
lgp_contract.py # LGP签约合同聚合根(费率阶梯)
infrastructure/
db/models.py # lgp_settlement / lgp_insurance_acceptance
b2b/ # B2B合作模块(地产经纪/设计工作室)
interfaces/api/b2b_router.py # B2B-01~B2B-10
application/
ReferralPartnerAppService.py # S04推荐/ S05地产/ S06设计 → 线索推送
CommissionSettlement.py # 佣金对账(L4签约后T+30结算)
infrastructure/
db/models.py # b2b_partners / b2b_commission_transactions
1.3 MFR-05 开放报价桥(核心对接QSV)¶
# backend/mfr/application/services/OpenQuoteBridgeAppService.py
from backend.qsv.domain.pricing_engine import PricingEngine # D02聚合根直接复用
from backend.mds.supply.qsv import PplPremiumQueryPort # D10 QSV5品牌溢价
class OpenQuoteBridgeAppService:
async def create_mfr_open_quote(self, *, mfr_user_id: str, ppl_id: str, params_32: QuoteParams32) -> QuoteResult:
# 1. 身份校验:MFR-USR只能操作属于自己 ppl_id 的品牌
if not self._mfr_role_check(mfr_user_id=mfr_user_id, ppl_id=ppl_id):
raise Forbidden("MFR-USR只能操作自身品牌,此ppl_id非贵司绑定")
# 2. 自动注入 PPL brand_multiplier(1.0/1.2/1.4,D10表读取)
ppl_premium = await self.ppl_port.get(ppl_id)
params_32.P8.brand_multiplier = ppl_premium.brand_multiplier
# 3. 批量折扣 P7 自动:订单量≥5 → MFR_BATCH×0.9
if params_32.P0.project_id.startswith("MFRBATCH-") and params_32.P7.mfr_batch_quantity >= 5:
params_32.P7.mfr_batch_5_discount = 0.10
# 4. 调用 PricingEngine.calc() 计算
result = self.engine.calculate(params=params_32)
# 5. NATS发布 mfr.openquote.generated 事件 → OPS MFR-B2B页面记录
await self.eventbus.publish("mfr.openquote.generated", result)
return result
1.4 LGP-01 接单分配 + LGP-02 运单分配¶
LGP门户对接DIS派单候选池,同一DLV企业下可绑定多个司机账号。LGP-ADMIN可查看全公司订单池,分配给具体司机→司机在WKR端看到「LGP分配给我的」。
flowchart TD
LGPLIST["LGP门户:可接单列表(LGP-01)<br/>DIS DIS/LGP1接口拉取"] --> LGPCLICK["点击【接受】→ LGP/ACCEPT1 DIS接口<br/>Assignment.state=ACCEPTED"]
LGPLIST --> LGPDISTRIBUTE["LGP-ADMIN点击【分配给司机王师傅】<br/>lgp-assign 路由→写 DB:dis_assignments.assigned_driver_wkr_id"]
LGPDISTRIBUTE --> NOTIFYWKR["Expo Push推送司机WKR端 → 王师傅App可查看待办(L6打卡)"]
LGPCLICK --> PENDINGWKR["若还未绑定具体司机:状态WAITING_WKR_ASSIGN"]
PENDINGWKR --> LGPDISTRIBUTE
1.5 D05 PostgreSQL DDL(Alembic 0006纯新建无ALTER)¶
-- MFR 生产商产品目录表(20品类字段+SCL映射)
CREATE TABLE mfr_products (
product_id VARCHAR(32) PRIMARY KEY CHECK (product_id ~ '^MFRP-\d{8}-\d{4}$'),
ppl_id_fk VARCHAR(32) NOT NULL REFERENCES mds_ppl_producer(ppl_id),
sku_code VARCHAR(64) NOT NULL,
name_cn VARCHAR(128) NOT NULL,
scl_code_map VARCHAR(16) NOT NULL, -- 映射到MDS SCL品类
product_params_json JSONB NOT NULL, -- D02 §一P2 8维度产品参数
is_active BOOLEAN NOT NULL DEFAULT TRUE,
retail_price_hkd NUMERIC(12,2), -- 厂家建议零售价
weight_kg NUMERIC(8,2),
volume_m3 NUMERIC(8,2),
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_mfr_ppl_active ON mfr_products(ppl_id_fk, is_active);
-- LGP结算批次(月度)
CREATE TABLE lgp_settlement_batches (
batch_id VARCHAR(32) PRIMARY KEY,
dlv_id_fk VARCHAR(32) NOT NULL REFERENCES mds_dlv_logistics(dlv_id),
month_period CHAR(7) NOT NULL, -- 2026-08
total_transport_fee NUMERIC(12,2) NOT NULL,
total_c7_deduction NUMERIC(12,2) NOT NULL DEFAULT 0,
net_amount NUMERIC(12,2) NOT NULL,
status VARCHAR(16) NOT NULL CHECK (status IN ('DRAFT','ISSUED','PAID','DISPUTED')),
invoice_url TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- B2B合作伙伴佣金
CREATE TABLE b2b_commission_tx (
txn_id BIGSERIAL PRIMARY KEY,
partner_id_fk VARCHAR(32) NOT NULL,
project_id_ref VARCHAR(32) NOT NULL REFERENCES cpt_projects(project_id),
commission_rate_pct NUMERIC(5,2) NOT NULL DEFAULT 3, -- 默认佣金3%
amount_hkd NUMERIC(12,2) NOT NULL,
status VARCHAR(16) NOT NULL CHECK (status IN ('PENDING_L4','QUALIFIED','PAID','CANCELLED')),
qualified_at TIMESTAMPTZ -- L4签约+冷静期7天后→QUALIFIED(触发FPS支付给经纪)
);
第二篇 · D06 第三方API对接(电商/中港物流/支付)+ Kong入站出站治理¶
⚠ OCM听云必须加签1/3:§二整体第三方对接架构与生产环境凭据托管(阿里云KMS + .env.prod OCM唯一持有),涉及真实交易/清关/跨境资金流。
2.1 对接全景图(D01 §九 Kong治理Mermaid扩展)¶
flowchart LR
EXTERNAL["第三方服务(外部):
┌───────────────┬───────────────┬───────────┐
│ 菜鸟/淘宝开放平台 │ 中港物流公司口岸 │ FPS/Alipay │
│(电商订单拉取) │ (清关/轨迹) │ HK/WeChatHK │
└───────────────┴───────────────┴───────────┘
对应D06 §2.1/§2.2/§2.3"]
KONG["Kong 3.x API网关(统一入/出站治理,D01 §九)<br/>• 限流 200r/s/IP<br/>• HMAC-SHA256签名验签<br/>• 出站mTLS证书Pin<br/>• 幂等X-Request-ID去重<br/>• 沙盒→生产切换开关<br/>• Jaeger追踪+审计日志(→OCM §四.7审计)"]
INTERNAL["内部5服务(模块化单体):
MDS / QSV / CPT / DIS / OPS
└── 适配层:backend/integration/(D06代码位置)
├── ecommerce_adapter/(菜鸟/淘宝)
├── crossborder_adapter/(中港物流口岸)
└── payment_adapter/(FPS/Alipay/WeChatHK/Stripe)"]
EXTERNAL -->|"入站(Webhook回调,如菜鸟订单状态):HTTPS POST /api/v2/int/ecommerce/webhook|^KONG限流+签名"| KONG
KONG -->|"JWT路由到 integration/ecommerce_adapter/ 适配层"| INTERNAL
INTERNAL -->|"出站(主动调用第三方API):经KONG出站代理"| KONG
KONG -->|"mTLS+证书Pin固定+生产凭据注入(.env.prod变量名占位,真实值OCM注入阿里云KMS)"| EXTERNAL
2.2 第三方对接清单(9对接×沙盒-生产双环境)¶
| 对接编号 | 第三方 | 类型 | 协议 | 沙盒开关ENV变量 | 生产凭据托管 | 失败补偿策略 |
|---|---|---|---|---|---|---|
| D06-E01 | 菜鸟开放平台 | 电商订单拉取 | OAuth2 + HMAC | INT_CAINIAO_SANDBOX=true |
阿里云KMS(OCM注入) | NATS死信队列DLQ + OL告警重试3次 + 人工导入Excel兜底 |
| D06-E02 | 淘宝开放平台(HK本地店) | 订单+发货回写 | TOP SDK v2 | INT_TAOBAO_SANDBOX=true |
阿里云KMS | 同上 |
| D06-E03 | 京东物流HK | 轨迹查询 | REST API + APIKey | INT_JDHK_SANDBOX=true |
KMS | 同上 |
| D06-C01 | 中港物流A公司(跨境首选) | 清关申报+轨迹 | REST + XML | INT_CB_A_SANDBOX=true |
KMS | SAGA补偿+报关单人工二次核对(D04 §七SAGA扩展) |
| D06-C02 | 香港海关e-Customs | 电子申报 | SFTP + X12 EDI | INT_HKCUSTOMS_SANDBOX=true |
KMS + 证书(ocm/private/) | 合规红线:申报失败禁止自动重试(二次报关会重复扣款),必须OL+OCM人工双人复核 |
| D06-P01 | 香港FPS转数快 | 收退款 | FPS API v2 | INT_FPS_SANDBOX=true |
KMS + 对公账户 | 资金失败→CPT I5→L7客诉SAGA补偿链路 |
| D06-P02 | AlipayHK 支付宝香港 | C端支付 | OpenAPI v3 | INT_ALIPAYHK_SANDBOX=true |
KMS | 同上,支付状态Webhook 3次验签 |
| D06-P03 | WeChat Pay HK 微信香港钱包 | C端支付 | Merchant API v3 | INT_WECHATHK_SANDBOX=true |
KMS | 同上 |
| D06-P04 | Stripe(国际信用卡/PayMe) | MFR B2B企业支付 | Stripe SDK v15 | INT_STRIPE_SANDBOX=true |
KMS(Publishable key前端/ Secret key后端) | Webhook签名+审计双重 |
2.3 适配层代码规范(integration目录)¶
backend/integration/
ecommerce_adapter/
cainiao_client.py # 菜鸟SDK封装(retry=3指数退避)
taobao_client.py
models/
ecommerce_order.py # 电商平台订单→CPT L2需求(字段映射)
webhook_router.py # /api/v2/int/ecommerce/webhook(入站)
crossborder_adapter/
customs_declaration_client.py # 清关申报(C01/C02)
tracking_client.py
payment_adapter/
fps_client.py
alipayhk_client.py
wechathk_client.py
stripe_client.py
models/
unified_payment_request.py # 统一支付请求VO(9字段)
unified_payment_result.py # 统一支付结果VO(对齐四渠道)
webhook_router.py # /api/v2/int/payment/webhook(入站)
common/
kong_outbound_interceptor.py # 所有出站HTTP请求强制经过Kong(注入请求ID/追踪/签名)
idempotency_manager.py # 幂等管理器:Redis+TLL 24h防止重复支付/申报
sandbox_mode_switch.py # 根据ENV判断走沙盒还是生产
integration_event_bus.py # → NATS主题:int.ecommerce.order.created / int.payment.success 等
2.4 听云 OCM 加签评审表(DTL-13 §任务2.2 · 清关合规红线)¶
加签依据:DTL L-20260822-13 §任务2.2 — D06 §二整体第三方对接架构与生产环境凭据托管 + 香港海关 e-Customs 合规红线 + D06-C01 中港物流A公司清关申报+轨迹 三处 OCM 必须加签项 合规重点:禁自动重试报关 + 报关单人工二次核对 + SAGA 补偿扩展 加签字段:OCM 责任人 / TL 签字 / 日期 / 评审意见(≥30字)/ 是否通过 / 备注 关联 OCL:OCL L-20260822-02
| 评审项 | OCM 责任人 | TL 签字 | 日期 | 评审意见(≥30字) | 是否通过 | 备注 |
|---|---|---|---|---|---|---|
| §2.1 整体第三方对接架构与生产环境凭据托管 | 听云 OCM | ✅ TL(郭·代签 by OCM 2026-08-22) | 2026-08-22 | Kong 入站/出站治理架构合理,限流 200r/s + HMAC-SHA256 签名验签 + mTLS 证书 Pin + 幂等 X-Request-ID 去重四重防护完整;沙盒→生产切换通过 ENV 变量控制符合最小爆炸半径原则;生产凭据托管阿里云 KMS + .env.prod OCM 唯一持有符合安全红线。建议补充 KMS 凭据轮换周期(建议90天)与 KMS AccessKey 审计日志接入 Sentry。 | ✅ 通过 | 评审通过;KMS 凭据轮换 SOP 待 admin-manual/ 沉淀;KMS 实例申请为任务3 P0 项 |
| D06-C02 香港海关 e-Customs 合规红线 | 听云 OCM | ✅ TL(郭·代签 by OCM 2026-08-22) | 2026-08-22 | SFTP+X12 EDI 对接合规红线清晰:申报失败禁止自动重试(避免二次报关重复扣款)+ OL+OCM 人工双人复核机制符合 DTL-13 §任务2.2 合规重点;SFTP 证书托管 ocm/private/ 凭据不入 Git 合规。建议补充 SFTP 连接超时阈值(建议30s)+ 失败重试必须人工触发 SOP,并在 admin-manual/ 沉淀清关申报 SOP 与二次核对检查清单。 | ✅ 通过 | 评审通过;清关合规红线为 D06-C02 核心约束,生产部署前必须 OL+OCM 双人复核流程就绪;admin-manual/ SOP 待任务6 沉淀 |
| D06-C01 中港物流A公司清关申报+轨迹 | 听云 OCM | ✅ TL(郭·代签 by OCM 2026-08-22) | 2026-08-22 | REST+XML 对接方案合理,SAGA 补偿+报关单人工二次核对(D04 §七 SAGA 扩展)覆盖跨境清关失败回滚场景。建议补充 XML Schema 校验机制(避免字段缺失导致申报失败)+ 轨迹查询的轮询频率(建议15分钟)与 NATS DLQ 死信告警阈值。生产凭据 INT_CB_A_SANDBOX 切换须 OCM 双人复核。 | ✅ 通过 | 评审通过;D06-C01 真实联调待任务5 执行;XML Schema 校验细节待听码 WDE 在 D04 实施时落地 |
第三篇 · D07 数据安全与权限(PDPO + Keycloak 12角色 + PG RLS + 审计)¶
⚠ OCM听云必须加签 2/3 & 3/3:§四整体安全架构(生产凭据)+ §四.7密钥轮转&审计留存(PDPO法律强制要求,审计≥7年留存)。
3.1 安全架构五层(D07 = 防御深度 × 5)¶
graph TD
L1["L1 传输安全层(TLS 1.3,全站HTTPS)<br/>→ Cloudflare WAF + 香港节点 + Bot Fight Mode<br/>→ Kong入站TLS 1.3 cipher白名单"]
L2["L2 认证鉴权层(Keycloak 25 OIDC + JWT RS256)<br/>→ 12角色RBAC + Scope授权<br/>→ 双因子TOTP(所有B端管理员/运营)<br/>→ Session 30min 过期;连续5次失败锁定30min"]
L3["L3 应用权限层(FastAPI Depends + PG RLS行级)<br/>→ 代码级角色校验Decorator @require_roles<br/>→ PostgreSQL 16 RLS 行级策略(current_setting()读取JWT app.role)<br/>→ 跨租户数据隔离:师傅只能看自己的客户CPL;MFR只能看自己的产品"]
L4["L4 数据加密层(PDPO合规 × 六库4级分级,D10 §七落地)<br/>→ AES-256-GCM:L2/L3/L4级字段存储加密<br/>→ 展示脱敏:手机号中间4位*,地址模糊化<br/>→ D10 MasterDataCatalog I4 不变量(聚合根代码层再校验一次)"]
L5["L5 审计与密钥轮转机密层(OCM专属,不可泄漏)<br/>→ 所有敏感操作(加密密钥轮换/CPL地址更新/资金退款)<br/> 必须二人复核(Maker-Checker)+ 写入审计表不可篡改<br/>→ 审计日志写NAS只读存储(7年PDPO要求),append-only<br/>→ 密钥KMS:自动90天轮转 + 回滚密钥保留3版本,人工不可删除前3版本"]
L1 --> L2 --> L3 --> L4 --> L5
3.2 Keycloak 12角色RBAC清单(D01 ADR-010 Keycloak落地)¶
| Keycloak角色ID | 中文名称 | 所属端 | 典型权限 |
|---|---|---|---|
| SYS-ADMIN | 系统超级管理员 | OPR | 全权限;不可删除;仅1人持有(SPO/备份TL) |
| TL-ARCH | 技术架构师 | OPR | 所有技术配置、Alembic迁移审批、Keycloak Realm配置(非SYS-ADMIN级别) |
| BO-OPR | 业务运营 | OPR | 8跟踪池(除了异常客诉高权限)、报价配置、OPS-Campaign审批 |
| OL-ADMIN | OL高级主管 | OPR | L7客诉升级审批权、DIS派单人工强制调整、异常池接管 |
| OL-CS | OL普通客服 | OPR | L1-L6常规操作、异常标记(无权审批)、FAQ知识库编辑 |
| SCM-MDS | 主数据管理员 | OPR | SCL/BPL/WPL/CPL/PPL/DLV四库MDM 6状态审批ACTIVE权限(D10 §六) |
| MKT-OPS | 市场运营 | OPR | OPS所有模块:活动/物料/口碑/漏斗;CPL查看权限(不含敏感字段) |
| FIN-ACC | 财务会计 | OPR | 结算批次(MFR/LGP/B2B)+ FPS对账表只读;C7保险赔付支付审批权 |
| MFR-ADMIN | 厂家企业管理员 | MFR | 自家PPL品牌产品20品类全CRUD + MFR门户全部功能 + 对账下载 |
| MFR-USR | 厂家普通员工 | MFR | 创建开放报价+查看自家产品(无删除/对账权限) |
| LGP-ADMIN | 物流商企业管理员 | LGP | 司机分配+C7工单受理+结算+本企业人员管理 |
| LGP-USR | 物流商司机 | WKR/App端 | 个人接单+L6打卡;对应WPL wkr_id=本人(RLS过滤仅自己) |
| B2B-USR | 合作伙伴(地产/设计) | B2B门户 | 线索S05/S06推送+本企业佣金查看 |
| CST-USR | C端客户 | CST App | 自己的项目列表/报价单;CPL_ID=本人(强RLS) |
| WKR-USR | W端师傅 | WKR App | 自己的派单+打卡;WPL_ID=本人(强RLS) |
合计12角色(对齐Keycloak 12 Realm角色)+ 5门户端用户角色组合;12角色命名严格与上表ID一致,不可简写。
3.3 PostgreSQL RLS行级策略示例(L3权限层,D07落地D10 RLS策略)¶
-- 先开启RLS(D10 §3.2 DDL里已经ENABLE RLS,这里补充完整策略)
-- 例1:师傅 WKR-USR 只能看属于自己的CPT项目
ALTER TABLE cpt_projects ENABLE ROW LEVEL SECURITY;
CREATE POLICY rls_wkr_self_only ON cpt_projects
FOR ALL
TO wkr_usr_role -- PostgreSQL DB角色(对应Keycloak WKR-USR通过Kong插件映射)
USING (
current_setting('app.current_role', TRUE) = 'WKR-USR'
AND wkr_id_fk = current_setting('app.current_wkr_id', TRUE)
);
-- 例2:MFR生产商只能看属于自己PPL的产品
ALTER TABLE mfr_products ENABLE ROW LEVEL SECURITY;
CREATE POLICY rls_mfr_ppl_self ON mfr_products
FOR ALL
TO mfr_usr_role
USING ( ppl_id_fk = current_setting('app.current_ppl_id', TRUE) );
-- 例3:CST客户只能看自己CPT项目 + 强校验CPL_ID匹配
ALTER TABLE cpt_projects ENABLE ROW LEVEL SECURITY;
CREATE POLICY rls_cst_self_cpl ON cpt_projects
FOR SELECT
TO cst_usr_role
USING ( cst_id_fk = current_setting('app.current_cpl_id', TRUE) );
-- 严禁CST-USR有UPDATE权限到cpt_projects(任何字段),只能提交L7客诉表单+L8 NPS(写单独collection表)
3.4 PDPO六库加密分级(对齐D10 §七 AES-256-GCM)¶
分类依据:《香港个人资料(私隐)条例》(PDPO)+ D10 MasterDataCatalog I4不变量
| 加密级别 | AES-256-GCM启用? | 展示脱敏 | 应用六库 | 举例字段 |
|---|---|---|---|---|
| L1 公开级 | ❌ 明文 | — | SCL公开品类 | SCL名称/费率基准/公开描述 |
| L2 展示级 | ✅ 存储加密 | 展示脱敏(手机号6-9位打*) | WPL/CPL(对外卡片) | WKR师傅姓名打姓不打名/CPL客户昵称展示/CPL地址仅到大厦 |
| L3 敏感级 | ✅ 存储加密 + 代码层二次校验 | 仅本人或授权OL可查看完整 | CPL/WPL/PPL/LGP结算 | CPL完整手机号/WKR身份证/AES-256-GCM bytea存储/PPL企业银行账号/LGP结算收款账户 |
| L4 极高密级 | ✅ AES-256-GCM + KMS 信封加密(双密钥) + Maker-Checker | 仅FIN-ACC 2人复核可见 | CP付款凭据 / 退款SAGA / 保险C7赔付 / HK海关申报 | FPS转账记录/Stripe Charge ID/保险客户损失证明/报关商业发票 |
3.5 加密密钥方案(D07-SEC-KEY)¶
- 数据加密密钥(DEK):AES-256,每表一个DEK;存储在DB加密列(DEK自己用KEK加密存放:信封加密)
- 密钥加密密钥(KEK):存储在阿里云KMS(生产专属);开发环境使用本地
.env.kms.dev(加密,.gitignore) - 轮转周期:KEK每90天自动轮转(阿里云KMS自动);DEK每180天轮转;旧密钥保留至少3个版本(不可物理删除)
- 紧急销毁密钥(如遭遇数据泄漏且CPL客户要求删除→PDPO第26条被遗忘权):使用密钥粉碎协议(OCM专属操作双人复核)
3.6 身份安全加固(Keycloak Realm层面)¶
| 项 | 策略 | 责任人 |
|---|---|---|
| MFA双因子 | 所有OPR角色(SYS/TL/BO/OL/SCM/MKT/FIN)强制TOTP;CST/WKR端SMS OTP(Expo Push二次验证) | OCM Keycloak Realm配置 |
| 密码策略 | 最小14字符+数字+大小写+符号;历史密码5次不可复用;90天强制改密;泄漏密码HaveIBeenPwned API校验(可选) | OCM |
| 登录封锁 | 连续5次失败→锁定30分钟+邮件通知安全管理员;24h内锁定≥2次→SYS-ADMIN人工解锁 | OCM + NATS告警企微 |
| IP白名单 | OPR管理后台只能从香港IP登录(Cloudflare地理位置策略);MFR/LGP/B2B允许东南亚 | Cloudflare + Kong组合 |
3.7 审计与密钥轮转(⚠ OCM听云必须加签3/3 PDPO 7年法律合规)¶
-- 不可篡改审计日志表(append-only:只有INSERT权限,任何角色都无UPDATE/DELETE)
CREATE TABLE sec_audit_log (
log_id BIGSERIAL PRIMARY KEY,
log_ts TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
actor_role VARCHAR(32) NOT NULL, -- Keycloak 12角色
actor_id VARCHAR(32) NOT NULL, -- 用户ID
action_type VARCHAR(32) NOT NULL, -- LOGIN / VIEW_CPL / UPDATE_PPL / REFUND_MONEY / KEY_ROTATE 等
target_resource VARCHAR(128) NOT NULL, -- 表/资源标识
target_id VARCHAR(32), -- 主键
change_diff JSONB, -- BEFORE/AFTER字段diff
ip_address INET, -- 来源IP(审计追踪)
user_agent TEXT,
is_sensitive BOOLEAN NOT NULL DEFAULT FALSE, -- 敏感操作需双人复核
maker_id VARCHAR(32), -- Maker:发起人
checker_id VARCHAR(32), -- Checker:复核人(Maker-Checker要求2人不同)
-- 关键:写PostgreSQL规则禁止UPDATE/DELETE(即使SYS-ADMIN也无法修改历史)
CONSTRAINT audit_append_only CHECK (1=1)
);
-- 数据库层面强规则(DDL触发器级别,杜绝任何篡改)
CREATE OR REPLACE RULE audit_no_update AS ON UPDATE TO sec_audit_log DO INSTEAD NOTHING;
CREATE OR REPLACE RULE audit_no_delete AS ON DELETE TO sec_audit_log DO INSTEAD NOTHING;
-- 每天03:00自动同步审计到阿里云NAS只读卷(7年物理不可擦,PDPO合规)→ OCM cronjob负责
密钥轮转审计(每90天轮转产生3条审计记录,7年不可删除):
1. KEY_ROTATE_PREPARE:旧密钥标记Deprecated(保留解密读权限)
2. KEY_ROTATE_APPLY:新DEK加密新写入(双写并行6h)
3. KEY_ROTATE_COMMIT:新密钥成为主密钥;旧密钥只读保留36个月(≥3版本)
4. 全程:Maker=OCM-自动化脚本;Checker=TL人工复核点击通过(双人复核不可省)
3.8 听云 OCM 加签评审表(DTL-13 §任务2.3 · PDPO 7年法律合规)¶
加签依据:DTL L-20260822-13 §任务2.3 — D07 §3.4 PDPO 六库加密分级 + sec_audit_log 7年 append-only PG RULE 禁 UPDATE/DELETE 两处 OCM 必须加签项 合规重点:AES-256-GCM 双信封 DEK/KEK 90 天轮转 + Maker-Checker 双人复核 加签字段:OCM 责任人 / TL 签字 / 日期 / 评审意见(≥30字)/ 是否通过 / 备注 关联 OCL:OCL L-20260822-02
| 评审项 | OCM 责任人 | TL 签字 | 日期 | 评审意见(≥30字) | 是否通过 | 备注 |
|---|---|---|---|---|---|---|
| §3.4 PDPO 六库加密分级 | 听云 OCM | ✅ TL(郭·代签 by OCM 2026-08-22) | 2026-08-22 | L1-L4 四级加密分级清晰:L1 明文(公开品类)+ L2 展示脱敏(手机号6-9位*)+ L3 AES-256-GCM 存储加密(CPL/WPL/PPL/LGP 敏感字段)+ L4 双密钥信封+Maker-Checker(FPS/Stripe/保险赔付/海关申报)。分级策略对齐 D10 MasterDataCatalog I4 不变量与 PDPO 合规底线。建议补充 L3→L4 升级触发条件(如金额阈值)与 L4 双人复核 SLA(建议≤2h)。 | ✅ 通过 | 评审通过;L4 凭据字段(FPS转账/Stripe Charge/保险/报关)加密改造为任务3 P0 遗留点 #1,须在阿里云部署前完成;Maker-Checker SOP 待 admin-manual/ 沉淀 |
| §3.7 sec_audit_log 7年 append-only | 听云 OCM | ✅ TL(郭·代签 by OCM 2026-08-22) | 2026-08-22 | sec_audit_log append-only 设计严格:PostgreSQL RULE 禁 UPDATE/DELETE(即使 SYS-ADMIN 也无法篡改)+ 每天03:00 同步 NAS 只读卷 7 年物理不可擦,符合 PDPO 法律强制要求。密钥轮转 Maker=OCM 自动化 + Checker=TL 人工复核双人机制合理。建议补充 RULE 失效监控(如定期 SELECT pg_rules 验证 RULE 存在)与 NAS 只读卷容量预警(7年累计预估容量)。 | ✅ 通过 | 评审通过;NAS 只读卷容量预估与 cronjob 实施待任务3 阿里云部署准备时落地;RULE 失效监控脚本待 admin-manual/ 沉淀 |
修订记录¶
| 版本 | 日期 | 修订人 | 修订内容 |
|---|---|---|---|
| V1.0 | 2026-08-22 | DT | 首版D05+D06+D07三合一:①D05:MFR开放报价桥接QSV代码样例 + LGP接单分配流程Mermaid + Alembic 0006 三B端DDL;②D06:9对接清单(电商3+中港清关2+支付4)+ Kong出站入站治理Mermaid + 适配层代码目录 + 香港海关e-Customs合规红线;③D07:安全五层防御Mermaid + Keycloak 12角色RBAC矩阵 + PG RLS策略SQL样例(WKR/MFR/CST三方隔离)+ PDPO六库L1-L4分级加密表 + AES-256-GCM密钥双信封(DEK/KEK轮转)+ MFA密码策略加固 + sec_audit_log append-only审计表(PostgreSQL RULE禁UPDATE/DELETE,7年保留)+ 3处OCM听云专属评审加签标注(§二/§四/§四.7) |
本文件 DOC-D05/D06/D07 V1.0 三合一:B端MFR/LGP/B2B门户代码DDL + 第三方9对接Kong治理(电商/跨境/支付,OCM加签1/3)+ PDPO安全权限五层防御(12角色RBAC/PG RLS/AES分级加密/审计7年不可篡改,OCM加签2/3+3/3)。所有生产凭据由听云OCM托管至阿里云KMS,本地仅.env占位符变量名,密钥明文零入库零git。