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 种 | 手机/身份证/姓名等 |
| 新增 Crate | 4 | 合规相关 |
| 新增测试 | 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,支持更广主体类型
升级指南
- 执行
cargo update -p eneros-comply - 为所有
DataAction调用添加purpose字段 - 将
AuditEvent.user字段访问更新为actor - 参考
docs/migration/v0.27.0.md获取详细迁移步骤