# P2 合规能力包详细设计 > 本文档为 P2 阶段合规能力包的增强设计,基于 `tos_compliance_engine_design_v1_2026-03-18.md` 的 S4 合规引擎架构,扩展以满足 M-013~M-017 指标的自动化合规检查与报告需求。 --- ## 1. 概述与背景 ### 1.1 目的 P2 合规能力包旨在扩展现有 ToS 合规引擎的能力,实现: 1. **合规规则库扩展**:支持 M-013~M-016 指标的规则化定义与执行 2. **自动化合规检查**:将合规检查嵌入 CI/CD 流水线,实时检测违规事件 3. **合规报告生成**:自动生成符合 M-017 要求的依赖兼容审计四件套报告 ### 1.2 指标映射 | 指标ID | 指标名称 | 目标值 | 阻断阈值 | P2 能力要求 | |--------|----------|--------|----------|-------------| | M-013 | supplier_credential_exposure_events | 0 | >0 即 P0 | 凭证泄露检测规则 + 实时告警 | | M-014 | platform_credential_ingress_coverage_pct | 100% | <100% 即阻断 | 入站凭证校验 + 覆盖率统计 | | M-015 | direct_supplier_call_by_consumer_events | 0 | >0 即 P0 | 直连检测规则 + 阻断机制 | | M-016 | query_key_external_reject_rate_pct | 100% | <100% 即阻断 | 外部 query key 拒绝规则 | | M-017 | dependency_compatibility_audit | PASS | FAIL 即阻断 | SBOM + 锁文件 diff + 兼容矩阵 + 风险登记册 | ### 1.3 与现有设计的关系 ``` tos_compliance_engine_design_v1_2026-03-18.md (S4 设计) │ ▼ ┌─────────────────────────────────────────────┐ │ P2 合规能力包扩展 │ ├─────────────────────────────────────────────┤ │ 1. 合规规则库扩展(M-013~M-016 指标规则化) │ │ 2. 自动化合规检查(CI 流水线集成) │ │ 3. 合规报告生成(M-017 四件套) │ └─────────────────────────────────────────────┘ ``` --- ## 2. 合规规则库扩展 ### 2.1 M-013 凭证泄露检测规则 #### 2.1.1 规则定义 > **重要**:所有事件命名遵循 `audit_log_enhancement_design_v1_2026-04-02.md` 规范,格式为 `{Category}-{SubCategory}[-{Detail}]`,以确保与审计日志系统兼容。 | 规则ID | 事件名称 | 匹配条件 | 动作 | 严重级别 | |--------|----------|----------|------|----------| | R01 | CRED-EXPOSE-RESPONSE | 响应包含 `sk-`、`ak-`、`api_key` 等可复用凭证片段 | block + alert | P0 | | R02 | CRED-EXPOSE-LOG | 日志输出包含完整凭证格式 | block + alert | P0 | | R03 | CRED-EXPOSE-EXPORT | 导出功能返回可还原凭证 | block + alert | P0 | | R04 | CRED-EXPOSE-WEBHOOK | 回调请求携带供应商凭证 | block + alert | P0 | > **注**:原 `C013-R01~R04` 格式已废弃,统一使用 `CRED-EXPOSE-*` 格式与审计日志对齐。 #### 2.1.2 规则配置示例 ```yaml # compliance/rules/m013_credential_exposure.yaml rules: - id: "CRED-EXPOSE-RESPONSE" name: "响应体凭证泄露检测" description: "检测 API 响应中是否包含可复用的供应商凭证片段" severity: "P0" matchers: - type: "regex_match" pattern: "(sk-|ak-|api_key|secret|token).*[a-zA-Z0-9]{20,}" target: "response_body" scope: "all" action: primary: "block" secondary: "alert" notification: channels: ["slack", "email"] template: "credential_exposure_alert" audit: log_level: "critical" retention_days: 1825 # 5年 # 审计日志事件名称(与 audit_log_enhancement_design_v1_2026-04-02.md 对齐) event_name: "CRED-EXPOSE-RESPONSE" event_category: "CRED" event_sub_category: "EXPOSE" ``` #### 2.1.3 检测算法 ``` 凭证泄露检测算法 (CRED-EXPOSE-D01) 输入: HTTP 响应体内容 输出: 泄露检测结果 {is_leaked: bool, matches: []Match} 步骤: 1. 预编译凭证正则模式库 2. 对响应体进行多模式并行匹配 3. 过滤误报 (测试数据、示例数据) 4. 若匹配, 提取匹配片段并脱敏后记录审计日志 - 审计事件名称: CRED-EXPOSE-RESPONSE - 事件分类: CRED - 事件子分类: EXPOSE 5. 触发阻断或告警流程 ``` ### 2.2 M-014 入站凭证覆盖率规则 #### 2.2.1 规则定义 | 规则ID | 事件名称 | 匹配条件 | 动作 | 严重级别 | |--------|----------|----------|------|----------| | R01 | CRED-INGRESS-PLATFORM | 请求头不包含 `Authorization: Bearer ptk_*` | block + alert | P0 | | R02 | CRED-INGRESS-FORMAT | 平台凭证格式不符合规范 | block + alert | P1 | | R03 | CRED-INGRESS-EXPIRED | 平台凭证已过期或被吊销 | block | P0 | > **注**:原 `C014-R01~R03` 格式已废弃,统一使用 `CRED-INGRESS-*` 格式与审计日志对齐。 #### 2.2.2 覆盖率统计 ```yaml # compliance/rules/m014_ingress_coverage.yaml coverage_tracking: metric: "platform_credential_ingress_coverage_pct" calculation: "(使用有效平台凭证的请求数 / 总请求数) * 100" target: 100 blocking_threshold: 100 window: "rolling_1h" aggregation: "percentile" ``` ### 2.3 M-015 直连检测规则 #### 2.3.1 规则定义 | 规则ID | 事件名称 | 匹配条件 | 动作 | 严重级别 | |--------|----------|----------|------|----------| | R01 | CRED-DIRECT-SUPPLIER | 请求目标为已知供应商 IP/域名 | block + alert | P0 | | R02 | CRED-DIRECT-API | 请求路径匹配 `*/v1/chat/completions` 等上游端点 | block | P0 | | R03 | CRED-DIRECT-UNAUTH | 调用未经审批的供应商 | block + alert | P0 | > **注**:原 `C015-R01~R03` 格式已废弃,统一使用 `CRED-DIRECT-*` 格式与审计日志对齐。 #### 2.3.2 检测方法 M-015 直连检测通过以下多层检测机制实现: | 检测方法 | 描述 | 检测点 | |----------|------|--------| | **蜜罐检测** | 在 API Gateway 层部署蜜罐端点,检测是否有直接访问上游 API 的请求 | API Gateway | | **网络流量分析** | 监控出站连接,识别绕过平台代理的直接连接 | 出网防火墙 | | **API 日志分析** | 分析请求日志,检测异常的上游 API 调用模式 | 审计中间件 | | **DNS 解析监控** | 监控 DNS 解析,检测是否有应用直接解析供应商域名 | 网络层 | | **代理层检测** | 检查请求是否经过平台代理层,未经过则标记为直连 | 负载均衡器 | > **检测流程**:蜜罐触发 -> 网络流量分析 -> API 日志复核 -> 确认直连事件 #### 2.3.2 供应商白名单配置 ```yaml # compliance/config/allowed_suppliers.yaml allowed_suppliers: direct_access: # 禁止直连,全部通过平台代理 enabled: false approved_providers: - name: "openai" base_urls: - "api.openai.com" - "api.openai.azure.com" requires_approval: true - name: "anthropic" base_urls: - "api.anthropic.com" requires_approval: true - name: "minimax" base_urls: - "api.minimax.chat" requires_approval: false ``` ### 2.4 M-016 外部 Query Key 拒绝规则 #### 2.4.1 规则定义 | 规则ID | 事件名称 | 匹配条件 | 动作 | 严重级别 | |--------|----------|----------|------|----------| | R01 | AUTH-QUERY-KEY | 来自外部的 query key 请求进入平台北向入口 | reject (403) | P0 | | R02 | AUTH-QUERY-INJECT | 请求参数包含 `key=`、`api_key=`、`token=` 等外部 key | reject (403) | P0 | | R03 | AUTH-QUERY-AUDIT | 内部处理 query key 时记录全量审计 | alert | P1 | > **注**:原 `C016-R01~R03` 格式已废弃,统一使用 `AUTH-QUERY-*` 格式与审计日志对齐。 #### 2.4.2 拒绝模式配置 ```yaml # compliance/rules/m016_query_key_reject.yaml query_key_rejection: enabled: true default_action: "reject" patterns: # 拒绝所有包含以下模式的外部请求 reject_patterns: - "key=.*" - "api_key=.*" - "token=.*" - "bearer=.*" - "authorization=.*" # 允许内部白名单模式 allow_patterns: - "^internal-.*" - "^platform-.*" response: status_code: 403 message: "External query keys are not allowed" include_request_id: true ``` --- ## 3. 自动化合规检查 ### 3.1 架构设计 ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ 自动化合规检查系统 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │ │ │ 合规规则引擎 │───▶│ 实时检测器 │───▶│ 告警发送器 │ │ │ │ (Rule Engine) │ │ (Real-time) │ │ (Notifier) │ │ │ └────────────────┘ └────────────────┘ └────────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ 合规指标存储层 │ │ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ │ │ M-013 │ │ M-014 │ │ M-015 │ │ M-016 │ │ │ │ │ │ 泄露事件 │ │ 入站覆盖 │ │ 直连事件 │ │ 拒绝率 │ │ │ │ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ CI/CD 流水线集成 │ │ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ │ │ Pre-Commit │ │ Build │ │ Deploy │ │ Monitor │ │ │ │ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` ### 3.2 规则执行引擎 #### 3.2.1 核心组件 | 组件 | 职责 | 性能要求 | |------|------|----------| | **规则编译器** | 将 YAML 规则编译为可执行格式 | 启动时编译,不影响运行时 | | **规则匹配器** | 根据请求上下文匹配适用规则 | P95 < 2ms | | **策略执行器** | 执行 block/alert/reject 动作 | P95 < 1ms | | **审计记录器** | 记录所有合规决策 | 异步,不阻塞主流程 | #### 3.2.2 规则执行流程 ``` 规则执行流程 (CMP-FLOW-01) 1. 请求进入合规检查拦截点 │ ▼ 2. 提取请求上下文 - 请求头 (Authorization, X-Request-Id) - 请求路径 - 请求参数 - 源 IP │ ▼ 3. 并行匹配所有启用规则 │ ▼ 4. 聚合匹配结果 - 若存在 P0 匹配 → 立即阻断 - 若存在 P1 匹配 → 告警 + 继续 - 若仅 P2/P3 匹配 → 记录但不阻断 │ ▼ 5. 执行动作 - block: 返回错误响应 - alert: 发送告警通知 - reject: 返回 403 │ ▼ 6. 记录审计日志 - 规则 ID - 匹配结果 - 执行动作 - 时间戳 ``` ### 3.3 CI/CD 流水线集成 #### 3.3.1 集成点 | 阶段 | 检查项 | 阻断条件 | 超时时间 | |------|--------|----------|----------| | **Pre-Commit** | 本地凭证泄露扫描 | M-013 > 0 | 30s | | **Build** | 依赖兼容审计 (M-017) | 四件套任一 FAIL | 120s | | **Deploy-Staging** | M-013~M-016 实时检测 | 任一 P0 | N/A (实时) | | **Deploy-Production** | M-013~M-016 实时检测 | 任一 P0 | N/A (实时) | | **Monitor** | 7x24 指标监控 | 阈值突破 | N/A | #### 3.3.2 CI 脚本集成 ```bash # compliance/ci/compliance_gate.sh #!/bin/bash # 合规门禁 CI 脚本 set -e # 使用环境变量或相对路径,避免硬编码 COMPLIANCE_BASE="${COMPLIANCE_BASE:-$(cd "$(dirname "$0")/.." && pwd)}" RULES_DIR="${COMPLIANCE_BASE}/rules" REPORTS_DIR="${COMPLIANCE_BASE}/reports" # M-013: 凭证泄露扫描 echo "[COMPLIANCE] Running M-013 credential exposure scan..." if ! bash "${COMPLIANCE_BASE}/ci/m013_credential_scan.sh"; then echo "[COMPLIANCE] M-013 FAILED: Credential exposure detected" exit 1 fi # M-014: 入站覆盖率检查 echo "[COMPLIANCE] Running M-014 ingress coverage check..." if ! bash "${COMPLIANCE_BASE}/ci/m014_ingress_coverage.sh"; then echo "[COMPLIANCE] M-014 FAILED: Ingress coverage below 100%" exit 1 fi # M-015: 直连检测 echo "[COMPLIANCE] Running M-015 direct access check..." if ! bash "${COMPLIANCE_BASE}/ci/m015_direct_access_check.sh"; then echo "[COMPLIANCE] M-015 FAILED: Direct supplier access detected" exit 1 fi # M-016: Query Key 拒绝率 echo "[COMPLIANCE] Running M-016 query key rejection check..." if ! bash "${COMPLIANCE_BASE}/ci/m016_query_key_reject.sh"; then echo "[COMPLIANCE] M-016 FAILED: Query key rejection rate below 100%" exit 1 fi # M-017: 依赖兼容审计 echo "[COMPLIANCE] Running M-017 dependency audit..." if ! bash "${COMPLIANCE_BASE}/ci/m017_dependency_audit.sh"; then echo "[COMPLIANCE] M-017 FAILED: Dependency compatibility issue" exit 1 fi echo "[COMPLIANCE] All checks PASSED" ``` > **注意**:以下 CI 脚本处于**待实现**状态,依赖于 `compliance/` 目录的创建: > - `m013_credential_scan.sh` - 待实现 > - `m014_ingress_coverage.sh` - 待实现 > - `m015_direct_access_check.sh` - 待实现 > - `m016_query_key_reject.sh` - 待实现 > - `m017_dependency_audit.sh` - 待实现 ### 3.4 实时监控 #### 3.4.1 监控指标 | 指标 | 描述 | 告警阈值 | |------|------|----------| | m013_exposure_events_total | 凭证泄露事件总数 | > 0 | | m014_ingress_coverage_pct | 入站凭证覆盖率 | < 100 | | m015_direct_access_events_total | 直连事件总数 | > 0 | | m016_query_key_reject_rate_pct | query key 拒绝率 | < 100 | | compliance_rules_triggered_total | 规则触发总数 | N/A | #### 3.4.2 告警规则 ```yaml # compliance/monitoring/alerts.yaml alerts: - name: "m013_credential_exposure_p0" condition: "m013_exposure_events_total > 0" severity: "P0" channels: ["slack_critical", "pagerduty", "email"] message: "P0: Credential exposure event detected" - name: "m014_ingress_coverage_degraded" condition: "m014_ingress_coverage_pct < 100" severity: "P0" channels: ["slack_critical", "pagerduty"] message: "P0: Platform credential ingress coverage below 100%" - name: "m015_direct_access_detected" condition: "m015_direct_access_events_total > 0" severity: "P0" channels: ["slack_critical", "pagerduty", "email"] message: "P0: Direct supplier access detected" - name: "m016_reject_rate_degraded" condition: "m016_query_key_reject_rate_pct < 100" severity: "P1" channels: ["slack", "email"] message: "P1: Query key rejection rate below 100%" ``` --- ## 4. 合规报告生成 ### 4.1 M-017 依赖兼容审计四件套 根据 `supply_gate_command_playbook_v1_2026-03-25.md` 第7章要求,M-017 需生成以下四件套: | 报告 | 文件名模式 | 内容要求 | |------|------------|----------| | **SBOM** | `sbom_{date}.spdx.json` | 软件物料清单,SPDX 2.3 格式 | | **锁文件 Diff** | `lockfile_diff_{date}.md` | 依赖版本变更对比 | | **兼容矩阵** | `compat_matrix_{date}.md` | 组件版本兼容性矩阵 | | **风险登记册** | `risk_register_{date}.md` | 发现的安全与合规风险 | ### 4.2 四件套生成流程 ``` 依赖兼容审计流程 (M017-FLOW-01) 1. 执行时间: 每日 00:00 UTC (CI Build 阶段自动触发) │ ▼ 2. SBOM 生成 - 使用 syft/spdx-syft 生成项目 SPDX 2.3 SBOM - 覆盖语言: Go (go.mod), Node (package.json), Python (requirements.txt) │ ▼ 3. 锁文件 Diff 生成 - 对比当前 lock 文件与 baseline - 提取新增/升级/降级/删除依赖 - 变更影响评估 │ ▼ 4. 兼容矩阵生成 - 读取兼容矩阵模板 - 填充当前版本信息 - 标注已知不兼容项 │ ▼ 5. 风险登记册生成 - 汇总 CVSS >= 7.0 的漏洞 - 汇总许可证合规风险 - 汇总过期依赖风险 │ ▼ 6. 报告输出 - 生成日期标注的报告文件 - 更新趋势数据库 - 发送摘要邮件 ``` ### 4.3 四件套详细规格 #### 4.3.1 SBOM (软件物料清单) ```json { "spdxVersion": "SPDX-2.3", "dataLicense": "CC0-1.0", "SPDXID": "SPDXRef-DOCUMENT", "name": "llm-gateway", "documentNamespace": "https://llm-gateway.example.com/spdx/2026-04-02", "creationInfo": { "created": "2026-04-02T00:00:00Z", "creators": ["Tool: syft-0.100.0"] }, "packages": [ { "SPDXID": "SPDXRef-Package-go-github-com-openai", "name": "github.com/openai/openai-go", "versionInfo": "v0.2.0", "supplier": "Organization: OpenAI", "downloadLocation": "https://github.com/openai/openai-go", "licenseConcluded": "Apache-2.0" } ] } ``` #### 4.3.2 锁文件 Diff ```markdown # Lockfile Diff Report - 2026-04-02 ## Summary | 变更类型 | 数量 | |----------|------| | 新增依赖 | 3 | | 升级依赖 | 7 | | 降级依赖 | 0 | | 删除依赖 | 1 | ## New Dependencies | 名称 | 版本 | 用途 | 风险评估 | |------|------|------|----------| | github.com/acme/newpkg | v1.2.0 | 新功能 | LOW | ## Upgraded Dependencies | 名称 | 旧版本 | 新版本 | 风险评估 | |------|--------|--------|----------| | github.com/acme/existing | v1.0.0 | v1.1.0 | LOW | ## Deleted Dependencies | 名称 | 旧版本 | 原因 | |------|--------|------| | github.com/acme/unused | v0.9.0 | 功能下线 | ## Breaking Changes None detected. ``` #### 4.3.3 兼容矩阵 ```markdown # Dependency Compatibility Matrix - 2026-04-02 ## Go Dependencies | 组件 | 版本 | Go 1.21 | Go 1.22 | Go 1.23 | |------|------|----------|----------|----------| | github.com/acme/pkg | v1.2.0 | PASS | PASS | PASS | ## Known Incompatibilities None detected. ``` #### 4.3.4 风险登记册 ```markdown # Risk Register - 2026-04-02 ## Summary | 风险级别 | 数量 | |----------|------| | CRITICAL | 0 | | HIGH | 1 | | MEDIUM | 2 | | LOW | 5 | ## High Risk Items | ID | 描述 | CVSS | 组件 | 修复建议 | |----|------|------|------|----------| | RISK-001 | CVE-2024-XXXXX | 8.1 | github.com/acme/vuln-pkg | 升级到 v1.3.0 | ## Medium Risk Items | ID | 描述 | CVSS | 组件 | 修复建议 | |----|------|------|------|----------| | RISK-002 | License: GPL-3.0 conflict | N/A | github.com/acme/gpl-pkg | 评估许可证合规 | ## Mitigation Status | ID | 状态 | 负责人 | 截止日期 | |----|------|--------|----------| | RISK-001 | IN_PROGRESS | @security | 2026-04-05 | ``` ### 4.4 自动化报告生成脚本 ```bash #!/bin/bash # compliance/reports/m017_dependency_audit.sh #!/usr/bin/env bash set -e REPORT_DATE="${1:-$(date +%Y-%m-%d)}" # 使用环境变量或相对路径,避免硬编码 REPORT_DIR="${COMPLIANCE_REPORT_DIR:-${PROJECT_ROOT}/reports/dependency}" PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$(dirname "$0")/../.." && pwd)}" mkdir -p "${REPORT_DIR}" echo "[M017] Starting dependency audit for ${REPORT_DATE}" # 1. Generate SBOM echo "[M017] Generating SBOM..." if command -v syft >/dev/null 2>&1; then syft "${PROJECT_ROOT}" -o spdx-json > "${REPORT_DIR}/sbom_${REPORT_DATE}.spdx.json" # 验证 SBOM 包含有效包 if ! grep -q '"packages"' "${REPORT_DIR}/sbom_${REPORT_DATE}.spdx.json" || \ [ "$(grep -c '"SPDXRef' "${REPORT_DIR}/sbom_${REPORT_DATE}.spdx.json" || echo 0)" -eq 0 ]; then echo "[M017] FAIL: syft generated invalid SBOM (no packages found)" exit 1 fi echo "[M017] SBOM generated successfully with syft" else echo "[M017] ERROR: syft is required but not found. Please install syft first." echo "[M017] See: https://github.com/anchore/syft#installation" exit 1 fi # 2. Generate Lockfile Diff echo "[M017] Generating lockfile diff..." LOCKFILE_DIFF_SCRIPT="${PROJECT_ROOT}/scripts/ci/lockfile_diff.sh" if [ -x "$LOCKFILE_DIFF_SCRIPT" ]; then bash "$LOCKFILE_DIFF_SCRIPT" "${REPORT_DATE}" > "${REPORT_DIR}/lockfile_diff_${REPORT_DATE}.md" else echo "[M017] ERROR: lockfile_diff.sh not found or not executable at $LOCKFILE_DIFF_SCRIPT" exit 1 fi # 3. Generate Compatibility Matrix echo "[M017] Generating compatibility matrix..." COMPAT_MATRIX_SCRIPT="${PROJECT_ROOT}/scripts/ci/compat_matrix.sh" if [ -x "$COMPAT_MATRIX_SCRIPT" ]; then bash "$COMPAT_MATRIX_SCRIPT" "${REPORT_DATE}" > "${REPORT_DIR}/compat_matrix_${REPORT_DATE}.md" else echo "[M017] ERROR: compat_matrix.sh not found or not executable at $COMPAT_MATRIX_SCRIPT" exit 1 fi # 4. Generate Risk Register echo "[M017] Generating risk register..." RISK_REGISTER_SCRIPT="${PROJECT_ROOT}/scripts/ci/risk_register.sh" if [ -x "$RISK_REGISTER_SCRIPT" ]; then bash "$RISK_REGISTER_SCRIPT" "${REPORT_DATE}" > "${REPORT_DIR}/risk_register_${REPORT_DATE}.md" else echo "[M017] ERROR: risk_register.sh not found or not executable at $RISK_REGISTER_SCRIPT" exit 1 fi # 5. Validate all artifacts exist echo "[M017] Validating artifacts..." ARTIFACTS=( "sbom_${REPORT_DATE}.spdx.json" "lockfile_diff_${REPORT_DATE}.md" "compat_matrix_${REPORT_DATE}.md" "risk_register_${REPORT_DATE}.md" ) ALL_PASS=true for artifact in "${ARTIFACTS[@]}"; do if [ -f "${REPORT_DIR}/${artifact}" ] && [ -s "${REPORT_DIR}/${artifact}" ]; then echo "[M017] ${artifact}: OK" else echo "[M017] ${artifact}: MISSING OR EMPTY" ALL_PASS=false fi done # 6. Generate summary if [ "$ALL_PASS" = true ]; then echo "[M017] PASS: All 4 artifacts generated successfully" exit 0 else echo "[M017] FAIL: One or more artifacts missing" exit 1 fi ``` ### 4.5 四件套生成脚本详细设计 > **重要**:以下脚本均为**待实现**状态,需要在 P2-CMP-006 阶段完成开发。 #### 4.5.1 Lockfile Diff 生成脚本 ```bash #!/bin/bash # scripts/ci/lockfile_diff.sh # 功能:生成依赖版本变更对比报告 # 输入:REPORT_DATE (可选,默认为昨天) # 输出:lockfile_diff_{date}.md set -e REPORT_DATE="${1:-$(date -d '1 day ago' +%Y-%m-%d)}" PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$(dirname "$0")/../.." && pwd)}" echo "# Lockfile Diff Report - ${REPORT_DATE}" # 获取当前 lockfile LOCKFILE="${PROJECT_ROOT}/go.sum" BASELINE_DIR="${PROJECT_ROOT}/.compliance/baseline" # 对比逻辑 echo "## Summary" echo "| 变更类型 | 数量 |" echo "|----------|------|" echo "| 新增依赖 | TBD |" echo "| 升级依赖 | TBD |" echo "| 降级依赖 | TBD |" echo "| 删除依赖 | TBD |" # 待实现:实际的对比逻辑 ``` #### 4.5.2 兼容矩阵生成脚本 ```bash #!/bin/bash # scripts/ci/compat_matrix.sh # 功能:生成组件版本兼容性矩阵 # 输入:REPORT_DATE (可选) # 输出:compat_matrix_{date}.md set -e REPORT_DATE="${1:-$(date -d '1 day ago' +%Y-%m-%d)}" PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$(dirname "$0")/../.." && pwd)}" echo "# Dependency Compatibility Matrix - ${REPORT_DATE}" # 读取 Go 版本信息 GO_VERSION=$(go version 2>/dev/null | grep -oP 'go\d+\.\d+' || echo "unknown") echo "## Go Dependencies (${GO_VERSION})" echo "| 组件 | 版本 | 兼容性 |" echo "|------|------|--------|" echo "| TBD | TBD | TBD |" # 待实现:实际的兼容性检查逻辑 ``` #### 4.5.3 风险登记册生成脚本 ```bash #!/bin/bash # scripts/ci/risk_register.sh # 功能:生成安全与合规风险登记册 # 输入:REPORT_DATE (可选) # 输出:risk_register_{date}.md set -e REPORT_DATE="${1:-$(date -d '1 day ago' +%Y-%m-%d)}" PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$(dirname "$0")/../.." && pwd)}" echo "# Risk Register - ${REPORT_DATE}" echo "## Summary" echo "| 风险级别 | 数量 |" echo "|----------|------|" echo "| CRITICAL | 0 |" echo "| HIGH | 0 |" echo "| MEDIUM | 0 |" echo "| LOW | 0 |" echo "## High Risk Items" echo "| ID | 描述 | CVSS | 组件 | 修复建议 |" echo "|----|------|------|------|----------|" echo "| - | 无高风险项 | - | - | - |" # 待实现:实际的漏洞扫描和风险评估逻辑 # 建议集成:grype (漏洞扫描)、license-check (许可证检查) ``` --- ## 5. 与现有安全机制联动 ### 5.1 联动矩阵 | 源机制 | 目标机制 | 联动方式 | 触发条件 | |--------|----------|----------|----------| | ToS 合规引擎 | 告警系统 | 事件推送 | 违规事件触发 | | Token Runtime | 合规规则引擎 | 凭证验证 | Token 校验时 | | Rate Limit | 合规规则引擎 | 流量检测 | 限流触发时 | | Audit Middleware | 合规报告 | 日志聚合 | 审计事件写入 | | Secret Scanner | 合规规则引擎 | 凭证检测 | 扫描结果输出 | ### 5.2 联动设计 #### 5.2.1 告警系统联动 ``` 合规事件 ──┬──▶ 告警通道 (Slack/PagerDuty/Email) │ └──▶ 事件存储 (审计数据库) │ └──▶ 趋势分析 ──▶ M-013~M-016 指标更新 ``` #### 5.2.2 Token Runtime 联动 ``` Token 校验请求 │ ├──▶ CRED-INGRESS-PLATFORM: 验证平台凭证存在 │ ├──▶ CRED-INGRESS-FORMAT: 验证凭证格式 │ └──▶ CRED-INGRESS-EXPIRED: 验证凭证状态 (通过 Token Runtime) ``` #### 5.2.3 Audit Middleware 联动 ``` HTTP 请求 │ ├──▶ Audit Middleware (记录请求) │ ├──▶ 合规规则引擎 (执行检查) │ │ │ ├──▶ CRED-EXPOSE-* 凭证泄露检测 │ │ │ └──▶ CRED-DIRECT-* 直连检测 │ └──▶ 合规报告生成 (聚合日志) ``` --- ## 6. 目录结构 ``` compliance/ # [待创建] 合规能力包根目录 ├── rules/ # 合规规则定义 │ ├── m013_credential_exposure.yaml │ ├── m014_ingress_coverage.yaml │ ├── m015_direct_access.yaml │ └── m016_query_key_reject.yaml │ ├── config/ # 合规配置 │ ├── allowed_suppliers.yaml │ ├── alert_channels.yaml │ └── rule_sets.yaml │ ├── engine/ # 合规规则引擎 │ ├── compiler.go # 规则编译器 │ ├── matcher.go # 规则匹配器 │ ├── executor.go # 策略执行器 │ └── audit.go # 审计记录器 │ ├── reports/ # 合规报告 (M-017) │ ├── m017_dependency_audit.sh # [待实现] 四件套生成脚本 │ └── templates/ # 报告模板 │ ├── ci/ # CI 集成 │ ├── compliance_gate.sh # 合规门禁主脚本 │ ├── m013_credential_scan.sh # [待实现] │ ├── m014_ingress_coverage.sh # [待实现] │ ├── m015_direct_access_check.sh # [待实现] │ ├── m016_query_key_reject.sh # [待实现] │ └── m017_dependency_audit.sh # [待实现] │ ├── monitoring/ # 监控配置 │ ├── alerts.yaml # 告警规则 │ └── dashboards/ # 监控面板 │ └── docs/ # 文档 ├── compliance_capability_package_design_v1_2026-04-02.md └── compliance_rules_reference.md scripts/ci/ # [已存在] 现有 CI 脚本目录 ├── lockfile_diff.sh # [待实现] Lockfile Diff 生成 ├── compat_matrix.sh # [待实现] 兼容矩阵生成 └── risk_register.sh # [待实现] 风险登记册生成 ``` --- ## 7. 实施计划 ### 7.1 P2 阶段任务分解 > **工期修正说明**:根据评审意见,原设计工期(26d)低估了CI脚本实现工作量。实际工作量需要 **35-40d**,主要原因是: > 1. 所有 CI 脚本(m013~m017)均需新实现 > 2. M-017 四件套生成脚本需要独立开发 > 3. 与现有审计日志系统的集成需要额外协调 | 任务ID | 任务名称 | 依赖 | 设计工期 | 修正工期 | 交付物 | |--------|----------|------|---------|---------|--------| | P2-CMP-001 | 合规规则引擎核心开发 | - | 5d | 6d | engine/*.go | | P2-CMP-002 | M-013 凭证泄露规则实现 | P2-CMP-001 | 3d | 4d | rules/m013_*.yaml + ci/m013_*.sh | | P2-CMP-003 | M-014 入站覆盖规则实现 | P2-CMP-001 | 2d | 3d | rules/m014_*.yaml + ci/m014_*.sh | | P2-CMP-004 | M-015 直连检测规则实现 | P2-CMP-001 | 2d | 4d | rules/m015_*.yaml + ci/m015_*.sh + 蜜罐配置 | | P2-CMP-005 | M-016 Query Key 拒绝规则实现 | P2-CMP-001 | 2d | 3d | rules/m016_*.yaml + ci/m016_*.sh | | P2-CMP-006 | M-017 依赖审计四件套 | - | 3d | 6d | 四件套生成脚本 + 模板 | | P2-CMP-007 | CI 流水线集成 | P2-CMP-002~006 | 2d | 5d | ci/compliance_gate.sh | | P2-CMP-008 | 监控告警配置 | P2-CMP-001 | 2d | 3d | monitoring/alerts.yaml | | P2-CMP-009 | 安全机制联动实现 | P2-CMP-001 | 3d | 4d | 联动代码 | | P2-CMP-010 | 端到端测试与验证 | P2-CMP-007 | 2d | 4d | 测试报告 | | **总计** | | | **26d** | **38d** | | ### 7.2 里程碑 | 里程碑 | 完成条件 | 设计日期 | 修正日期 | |--------|----------|----------|----------| | **M1: 规则引擎完成** | P2-CMP-001 通过单元测试 | 2026-04-07 | 2026-04-08 | | **M2: 四大规则就绪** | P2-CMP-002~005 在 staging 通过 | 2026-04-11 | 2026-04-15 | | **M3: CI 集成完成** | P2-CMP-007 合规门禁在 CI 通过 | 2026-04-13 | 2026-04-20 | | **M4: 监控告警就绪** | P2-CMP-008 告警通道验证通过 | 2026-04-15 | 2026-04-22 | | **M5: P2 交付完成** | E2E 测试通过 + 文档完备 | 2026-04-17 | 2026-04-26 | --- ## 8. 验收标准 ### 8.1 M-013~M-016 验收 | 指标 | 验收条件 | 测试方法 | |------|----------|----------| | M-013 | 凭证泄露事件 = 0 | 自动化扫描 + 渗透测试 | | M-014 | 入站覆盖率 = 100% | 日志分析覆盖率 | | M-015 | 直连事件 = 0 | 蜜罐检测 + 日志分析 | | M-016 | 拒绝率 = 100% | 外部 query key 构造测试 | ### 8.2 M-017 验收 | 报告 | 验收条件 | |------|----------| | SBOM | SPDX 2.3 格式有效, 包含所有直接依赖 | | Lockfile Diff | 变更条目完整, 影响评估准确 | | 兼容矩阵 | 版本对应关系正确 | | 风险登记册 | CVSS >= 7.0 漏洞已收录 | ### 8.3 集成验收 | 场景 | 验收条件 | |------|----------| | CI 流水线 | 合规门禁在 build 阶段可执行 | | 告警通道 | 告警可实时送达 (延迟 < 30s) | | 报告生成 | 四件套在 CI 中自动生成 | | 规则热更新 | 规则变更无需重启服务 | --- ## 9. 附录 ### 9.1 参考文档 - `docs/tos_compliance_engine_design_v1_2026-03-18.md` - ToS 合规引擎设计 - `docs/llm_gateway_subapi_evolution_plan_v4_2_2026-03-24.md` - M-013~M-016 指标定义 - `docs/supply_gate_command_playbook_v1_2026-03-25.md` - M-017 依赖审计要求 ### 9.2 术语表 | 术语 | 定义 | |------|------| | SBOM | Software Bill of Materials, 软件物料清单 | | SPDX | Software Package Data Exchange, 软件包数据交换标准 | | CVSS | Common Vulnerability Scoring System, 通用漏洞评分系统 | | ToS | Terms of Service, 服务条款 | | CI | Continuous Integration, 持续集成 | --- **文档状态**: 已修订 **版本**: v1.1 **日期**: 2026-04-02 **关联任务**: P2 合规能力包设计 **修订说明**: - 统一事件命名格式与 audit_log_enhancement_design_v1_2026-04-02.md 对齐 - 修复硬编码路径问题,改为环境变量或相对路径 - 补充 M-015 直连检测方法(蜜罐、网络流量分析等) - 修复 syft 缺失时生成无效 SBOM 问题(改为必需检查) - 补充 M-017 四件套生成脚本详细设计(待实现状态) - 修正实施工期从 26d 到 38d