跳到主内容

v0.27.0 版本说明

EnerOS v0.27.0 版本说明

发布日期:2025-10-26 版本代号:Comply Git Tag:v0.27.0 支持状态:稳定(Stable) Crate 总数:71(新增 4 个) 测试用例数:9050+(新增 500+)

概述

EnerOS v0.27.0「Comply」是合规框架专项版本,为 EnerOS 在受监管的电力行业落地提供合规基座。电力行业是关键信息基础设施,数据处理与系统运行受到严格的法律与监管约束:欧盟《通用数据保护条例》(GDPR)约束个人数据处理,中国《个人信息保护法》(PIPL)规范个人信息流转,各国电力监管机构对数据留存与审计追溯有明确要求。v0.27.0 将合规要求内建为内核框架,使 EnerOS 在设计层面即满足合规。

本版本引入了五大核心能力:合规框架(Compliance Framework)、GDPR 合规(GDPR Compliance)、PIPL 合规(PIPL Compliance)、数据留存策略(Data Retention Policy)、审计日志(Audit Log)。所有数据处理操作均经过合规策略校验,所有关键操作均生成不可篡改的审计记录。

设计哲学上,v0.27.0 坚持「合规即代码」——合规要求以可执行策略形式定义,而非依赖人工流程;「默认保护」——个人数据默认脱敏存储,需显式授权方可访问明文;「不可篡改」——审计日志采用追加写入 + 哈希链结构,任何篡改均可检测。

关键数据

指标数值说明
合规策略数120+内置策略
审计日志吞吐8 万条/秒单节点
审计日志校验< 5ms单条哈希链
数据脱敏类型15 种手机/身份证/姓名等
新增 Crate4合规相关
新增测试500+含合规测试

新特性

1. 合规框架

引入 eneros-comply Crate,提供统一的合规框架。合规策略以规则形式定义,所有数据处理操作均经过策略引擎校验。

策略定义

use eneros_comply::{ComplianceFramework, Policy, PolicyEngine};

let framework = ComplianceFramework::new()
    .engine(PolicyEngine::strict())
    .load_policies("policies/");

// 注册策略
framework.register_policy(Policy::new("gdpr-art-6")
    .rule(Rule::require_consent(
        DataCategory::Personal,
        Purpose::Marketing,
    )))?;

framework.register_policy(Policy::new("pipl-art-13")
    .rule(Rule::require_notice(
        DataCategory::Personal,
        Action::Collect,
    )))?;

合规校验

// 数据处理前自动校验
let action = DataAction::new()
    .data(DataCategory::Personal)
    .purpose(Purpose::Analytics)
    .subject(user_id);

match framework.check(&action).await {
    Ok(_) => process_data(action).await?,
    Err(violations) => {
        for v in violations {
            log::error!("合规违反: {} - {}", v.policy, v.reason);
        }
    }
}

合规标准覆盖

标准地区主要要求覆盖状态
GDPR欧盟个人数据保护完整
PIPL中国个人信息保护完整
CCPA加州消费者隐私部分
NERC CIP北美电力网络安全部分
等保 2.0中国网络安全等级保护完整
ISO 27001全球信息安全部分

2. GDPR 合规

引入 eneros-comply-gdpr Crate,提供 GDPR 合规能力。涵盖数据主体权利、数据处理合法性基础、数据保护影响评估等要求。

数据主体权利

use eneros_comply_gdpr::{GdprEngine, SubjectRight};

let gdpr = GdprEngine::new(&framework);

// 数据访问权(Article 15)
let data = gdpr.handle_request(SubjectRight::Access {
    subject_id: user_id,
}).await?;
// 返回该用户的所有个人数据副本

// 数据删除权(Article 17)
gdpr.handle_request(SubjectRight::Erasure {
    subject_id: user_id,
    reason: "用户主动注销",
}).await?;
// 删除所有个人数据,保留法定留存部分

// 数据可携带权(Article 20)
let portable = gdpr.handle_request(SubjectRight::Portability {
    subject_id: user_id,
    format: ExportFormat::Json,
}).await?;

同意管理

// 记录用户同意
gdpr.record_consent(Consent::new()
    .subject(user_id)
    .purpose(Purpose::LoadProfiling)
    .lawful_basis(LawfulBasis::Consent)
    .timestamp(now())
    .expiry(Duration::days(365)))?;

// 撤回同意后自动删除相关数据
gdpr.withdraw_consent(user_id, Purpose::LoadProfiling).await?;

GDPR 条款覆盖

条款要求实现方式
Art. 6合法性基础同意管理
Art. 7同意条件显式同意记录
Art. 15访问权数据导出
Art. 17删除权数据擦除
Art. 20可携带权结构化导出
Art. 25隐私设计默认脱敏
Art. 30处理记录处理日志
Art. 33数据泄露通知通知机制

3. PIPL 合规

引入 eneros-comply-pipl Crate,提供中国《个人信息保护法》合规能力。

个人信息分类

use eneros_comply_pipl::{PiplEngine, InfoCategory};

let pipl = PiplEngine::new(&framework);

// 数据分类
let category = pipl.classify(&data)?;
match category {
    InfoCategory::General => { /* 一般个人信息 */ }
    InfoCategory::Sensitive => {
        // 敏感个人信息(身份证、生物特征等)
        // 需要单独同意
        pipl.require_separate_consent(&data)?;
    }
    InfoCategory::NonPersonal => { /* 非个人信息 */ }
}

跨境传输

// 个人信息出境合规
let transfer = CrossBorderTransfer::new()
    .data(&personal_data)
    .destination("US")
    .purpose("技术支持");

match pipl.check_cross_border(transfer).await {
    Ok(approval) => {
        // 通过安全评估或已获认证
        pipl.execute_transfer(approval).await?;
    }
    Err(reason) => {
        log::warn!("跨境传输被拒: {}", reason);
    }
}

PIPL 条款覆盖

条款要求实现方式
第13条处理依据合法性基础
第17条告知义务隐私通知
第28条敏感信息单独同意
第38条跨境传输安全评估
第47条留存期限留存策略

4. 数据留存策略

引入 eneros-comply-retention Crate,提供数据留存策略管理。不同类型数据有不同法定留存期限,超期数据自动归档或删除。

留存策略

use eneros_comply_retention::{RetentionEngine, RetentionPolicy};

let engine = RetentionEngine::new()
    .policy(RetentionPolicy::new("scada-data")
        .category(DataCategory::Operational)
        .retain_for(Duration::years(2))
        .action_after(RetentionAction::Archive))
    .policy(RetentionPolicy::new("audit-log")
        .category(DataCategory::Audit)
        .retain_for(Duration::years(6))  // 等保2.0要求
        .action_after(RetentionAction::Keep))
    .policy(RetentionPolicy::new("user-personal")
        .category(DataCategory::Personal)
        .retain_for(Duration::years(1))
        .action_after(RetentionAction::Delete)));

// 自动执行留存策略
engine.schedule_daily().await?;

数据生命周期

// 标记数据生命周期
let data = DataRecord::new("load-profile-2025")
    .category(DataCategory::Operational)
    .created_at(now())
    .retention(Duration::years(2));

engine.track(data).await?;

// 查询数据状态
let status = engine.status("load-profile-2025").await?;
match status {
    LifecycleStatus::Active => { /* 正常使用 */ }
    LifecycleStatus::Archived => { /* 已归档 */ }
    LifecycleStatus::PendingDeletion => { /* 待删除 */ }
}

留存期限表

数据类型留存期限依据到期动作
SCADA 遥测2 年行业规范归档
告警记录3 年等保 2.0归档
审计日志6 年等保 2.0保留
操作票5 年电力规程归档
个人信息1 年PIPL删除
故障录波1 年行业规范删除

5. 审计日志

引入 eneros-comply-audit Crate,提供不可篡改的审计日志。采用哈希链结构,任何篡改均可检测。

审计记录

use eneros_comply_audit::{AuditLog, AuditEvent};

let audit = AuditLog::new("audit.log")
    .hash_chain(HashChain::Sha256)
    .rotation(Rotation::daily());

// 记录审计事件
audit.record(AuditEvent::new()
    .actor(Actor::Agent("dispatch-1"))
    .action(Action::Execute(Command::OpenSwitch { id: 42 }))
    .resource(Resource::Switch(42))
    .result(Result::Success)
    .timestamp(now())
    .ip("10.0.1.5")).await?;

日志校验

// 校验日志完整性
let verification = audit.verify_chain(
    Range::from("2025-10-01").to("2025-10-26"),
).await?;

if verification.tampered_records.is_empty() {
    println!("审计日志完整,无篡改");
} else {
    for r in verification.tampered_records {
        println!("篡改记录: {} 预期哈希 {} 实际 {}",
            r.id, r.expected_hash, r.actual_hash);
    }
}

审计事件类型

事件类型说明记录内容
认证事件登录/登出用户、IP、时间
授权事件权限变更主体、权限、操作者
操作事件系统操作命令、参数、结果
数据事件数据访问数据、操作、主体
配置事件配置变更旧值、新值、操作者

改进

  • 审计性能:审计日志写入从同步改为批量异步,吞吐提升 5 倍
  • 策略缓存:合规策略校验结果按指纹缓存,重复校验从 2ms 降至 0.1ms
  • 脱敏算法:新增 Format-Preserving Encryption(FPE),脱敏后保持格式
  • 审计查询:支持 SQL 风格的审计日志查询,便于合规报告生成

Bug 修复

  • 修复 eneros-comply-gdpr 数据删除时未级联清理时序数据的问题(#2708)
  • 修复 eneros-comply-pipl 敏感信息分类遗漏生物特征的问题(#2713)
  • 修复 eneros-comply-retention 在跨年时留存期限计算错误的问题(#2718)
  • 修复 eneros-comply-audit 哈希链在日志轮转时断裂的问题(#2723)

破坏性变更

  • DataAction::new:新增 purpose: Purpose 必填字段
  • AuditEvent:字段 user 重命名为 actor,支持更广主体类型

升级指南

  1. 执行 cargo update -p eneros-comply
  2. 为所有 DataAction 调用添加 purpose 字段
  3. AuditEvent.user 字段访问更新为 actor
  4. 参考 docs/migration/v0.27.0.md 获取详细迁移步骤