跳转至

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字)/ 是否通过 / 备注 关联 OCLOCL 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)

  1. 数据加密密钥(DEK):AES-256,每表一个DEK;存储在DB加密列(DEK自己用KEK加密存放:信封加密)
  2. 密钥加密密钥(KEK):存储在阿里云KMS(生产专属);开发环境使用本地 .env.kms.dev(加密,.gitignore)
  3. 轮转周期:KEK每90天自动轮转(阿里云KMS自动);DEK每180天轮转;旧密钥保留至少3个版本(不可物理删除)
  4. 紧急销毁密钥(如遭遇数据泄漏且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字)/ 是否通过 / 备注 关联 OCLOCL 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。