GDPR 合规
通用数据保护条例(GDPR, General Data Protection Regulation,欧盟法规 2016/679)自 2018 年 5 月 25 日起在欧盟全面实施,是当前全球最严格、最具影响力的个人数据保护法律之一。它适用于在欧盟境内提供能源服务的运营商,以及向欧盟境内数据主体提供商品或服务、监控其行为(无论企业注册地)的所有处理者。违规者最高可被处以全球年营业额 4% 或 2000 万欧元(取较高者)的罚款。
在电力与能源场景下,用户用电行为数据、智能电表读数、客户账户信息、报修记录、缴费记录、负荷预测输入等均构成个人数据,受 GDPR 约束。EnerOS 提供数据主体权利(DSR, Data Subject Rights)API、处理活动记录(ROPA, Records of Processing Activities)与数据本地化能力,便于运营商履行合规义务。
数据主体权利映射
GDPR 第 12-22 条规定了数据主体享有的八项核心权利,EnerOS 为每项权利提供对应的 API 端点:
| GDPR 条款 | 权利 | EnerOS API | 默认响应时长 |
|---|---|---|---|
| Art. 13-14 | 知情权 | GET /dsr/notice/{subject_id} | 即时 |
| Art. 15 | 访问权 | GET /dsr/access/{subject_id} | ≤ 30 天 |
| Art. 16 | 更正权 | PATCH /dsr/correct/{subject_id} | ≤ 30 天 |
| Art. 17 | 删除权(被遗忘) | POST /dsr/erase/{subject_id} | ≤ 30 天 |
| Art. 18 | 限制处理权 | POST /dsr/restrict/{subject_id} | ≤ 30 天 |
| Art. 20 | 数据可携带 | GET /dsr/export/{subject_id}?format=json | ≤ 30 天 |
| Art. 21 | 反对权 | POST /dsr/object/{subject_id} | ≤ 30 天 |
| Art. 22 | 自动化决策反对权 | POST /dsr/no-automated/{subject_id} | ≤ 30 天 |
权利响应 SLA 配置
[dsr]
enabled = true
default_response_days = 30
extension_max_days = 60 # 复杂请求可延期
notify_subject_on_extension = true
auto_escalate_days = 25 # 临近超期自动升级
[dsr.endpoints]
notice = "/dsr/notice"
access = "/dsr/access"
correct = "/dsr/correct"
erase = "/dsr/erase"
restrict = "/dsr/restrict"
export = "/dsr/export"
object = "/dsr/object"
no_automated = "/dsr/no-automated"
数据处理原则
GDPR 第 5 条规定了六项数据处理核心原则,EnerOS 在工程实现中逐条对应:
| 原则 | 含义 | EnerOS 实现 |
|---|---|---|
| 合法性、公平性、透明性 | 处理须有合法依据并告知数据主体 | 合法性基础字段 + 透明通知 |
| 目的限制 | 不得为指定目的之外的目的处理 | purpose 标签强制校验 |
| 数据最小化 | 仅收集必要数据 | 字段最小化配置 |
| 准确性 | 数据须准确并及时更正 | 更正 API + 数据质量监控 |
| 存储限制 | 不得超过必要期限 | retention 字段 + 自动删除 |
| 完整性与机密性 | 适当安全措施保护数据 | AES-256-GCM + WORM 审计 |
合法性基础
GDPR 第 6 条规定了六种合法性基础,EnerOS 强制要求每个数据流声明其依据:
[data_flow.legality_basis]
allowed_values = [
"consent", # 同意(Art. 6(1)(a))
"contract", # 合同履行(Art. 6(1)(b))
"legal-obligation", # 法定义务(Art. 6(1)(c))
"vital-interest", # 重要利益(Art. 6(1)(d))
"public-task", # 公共任务(Art. 6(1)(e))
"legitimate-interest" # 正当利益(Art. 6(1)(f))
]
use eneros_privacy::dataflow::DataFlow;
let flow = DataFlow::builder()
.name("smart-meter-collection")
.purpose("load-forecasting")
.legality_basis("contract")
.retention_days(365 * 7)
.pii_fields(["customer_id", "meter_id", "consumption_kwh"])
.build()?;
flow.register().await?;
EnerOS 数据保护实施
1. 数据分类与标记
所有数据字段在 schema 中标注 PII 标记,便于实施差异化保护:
[data.classification]
enabled = true
[[data.fields]]
name = "customer_id"
pii = true
category = "direct-identifier"
encryption = "AES-256-GCM"
[[data.fields]]
name = "meter_id"
pii = true
category = "pseudo-identifier"
encryption = "AES-256-GCM"
pseudonymization = true
[[data.fields]]
name = "consumption_kwh"
pii = false
category = "operational"
retention_days = 2555
2. 字段级加密与列式访问控制
use eneros_tenant::encryption::FieldCipher;
let cipher = FieldCipher::new("AES-256-GCM")
.key_id("kms-key-customer-pii")
.aad(b"tenant=eu-west-1");
// 写入时自动加密
let encrypted = cipher.encrypt(customer_id.as_bytes())?;
db.insert("customers")
.set("customer_id", encrypted)
.set("meter_id", cipher.encrypt(meter_id)?)
.await?;
// 读取时按角色解密
let row = db.select("customers").where_eq("id", 42).fetch().await?;
let customer_id = if user.has_permission("pii:read") {
cipher.decrypt(row.get("customer_id"))?
} else {
"REDACTED".to_string()
};
3. 处理活动记录(ROPA)
GDPR 第 30 条要求维护处理活动记录,EnerOS 自动生成 ROPA 报告:
# 导出 ROPA
eneros-cli audit ropa --output ropa-2026Q2.json
# 导出 CSV 格式
eneros-cli audit ropa --format csv --output ropa-2026Q2.csv
# 导出 PDF(用于审计交付)
eneros-cli audit ropa --format pdf --output ropa-2026Q2.pdf
ROPA 报告包含以下字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| 处理活动名称 | 业务流程名称 | 智能电表数据采集 |
| 处理目的 | 业务目的 | 负荷预测 |
| 数据主体类别 | 数据主体类型 | 居民用户 |
| 个人数据类别 | 数据字段列表 | 客户 ID、电表读数 |
| 接收方 | 数据接收方 | 配电运营商 |
| 跨境传输 | 第三国接收方 | 无 |
| 保留期限 | 存储时长 | 7 年 |
| 安全措施 | 技术与组织措施 | AES-256-GCM + WORM |
| 合法性基础 | GDPR 第 6 条依据 | 合同履行 |
数据流转图
EnerOS 通过数据流图工具可视化展示个人数据的全链路流转,便于识别合规风险:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 智能电表终端 │────▶│ EnerOS Gateway │────▶│ 时序存储引擎 │
│ (PII: meter_id) │ │ mTLS + 加密 │ │ AES-256-GCM │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ DSR API 端点 │◀────│ 查询/导出/删除 │◀────│ 负荷预测 Agent │
│ /dsr/* │ │ RBAC + ABAC │ │ 脱敏后访问 │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ WORM 审计链 │
│ HMAC + 7 年保留 │
└─────────────────┘
数据流注册
[[data_flow]]
name = "smart-meter-collection"
source = "meter-device"
destination = "eneros-timeseries"
data_categories = ["meter_id", "consumption_kwh"]
purpose = "load-forecasting"
legality_basis = "contract"
retention_days = 2555
cross_border = false
[[data_flow]]
name = "billing-export"
source = "eneros-timeseries"
destination = "billing-system"
data_categories = ["customer_id", "amount_due"]
purpose = "billing"
legality_basis = "contract"
retention_days = 3650
cross_border = false
配置示例
eneros.toml 中的 GDPR 配置
[compliance]
standard = "gdpr"
version = "2016/679"
enforce = true
dpo_email = "dpo@eneros.io"
[gdpr]
enabled = true
data_residency = "eu" # 数据驻留区域
cross_border_policy = "adequacy-only" # 仅允许充分性认定国家
breach_notification_hours = 72 # 数据泄露通知 SLA
default_retention_years = 7
# 数据主体权利
[gdpr.dsr]
response_days = 30
extension_days = 60
auto_escalate_days = 25
# 处理活动记录
[gdpr.ropa]
auto_generate = true
schedule_cron = "0 0 1 * *" # 每月 1 日自动生成
retain_years = 7
# 字段加密
[gdpr.encryption]
algorithm = "AES-256-GCM"
key_management = "kms"
rotate_days = 365
aad_fields = ["tenant_id", "region"]
# 跨境传输
[gdpr.cross_border]
default_policy = "deny"
adequacy_countries = ["CH", "GB", "JP", "CA"]
explicit_consent_required = true
# 数据保留
[gdpr.retention]
default_days = 2555
auto_delete = true
notify_before_days = 30
DPIA 评估
数据保护影响评估(DPIA, Data Protection Impact Assessment)是 GDPR 第 35 条要求的强制性流程,适用于高风险处理活动。EnerOS 提供 DPIA 模板自动生成与评估工具。
DPIA 触发条件
以下场景必须开展 DPIA:
- 大规模系统性监控(如全网智能电表数据采集)
- 公共区域大规模数据处理
- 自动化决策与画像
- 敏感数据(健康、生物特征等)处理
- 跨境数据传输
DPIA 模板生成
# 生成 DPIA 评估模板
eneros-cli dpia init --project "smart-meter-rollout-2026" \
--output dpia-smart-meter-2026.md
# 自动填充部分字段
eneros-cli dpia autofill --input dpia-smart-meter-2026.md \
--data-flow smart-meter-collection
# 提交评审
eneros-cli dpia submit --input dpia-smart-meter-2026.md \
--reviewer dpo@eneros.io
DPIA 评估要素
| 评估要素 | 说明 | 输出 |
|---|---|---|
| 处理活动描述 | 目的、数据流、技术措施 | 处理描述表 |
| 必要性评估 | 是否为最小化处理 | 必要性结论 |
| 风险识别 | 对数据主体权利与自由的风险 | 风险清单 |
| 风险缓解 | 技术与组织措施 | 措施清单 |
| 残余风险 | 缓解后的风险 | 残余风险等级 |
| DPO 意见 | 数据保护官评审 | 评审意见 |
| 处置决定 | 是否继续处理 | 决定记录 |
DPIA 风险评估矩阵
| 风险等级 | 影响 | 发生概率 | 处置 |
|---|---|---|---|
| 极高 | 数据主体重大损害 | 高 | 禁止处理 |
| 高 | 数据主体显著损害 | 中 | 必须缓解后处理 |
| 中 | 数据主体一定损害 | 中 | 缓解后处理 |
| 低 | 数据主体轻微影响 | 低 | 可处理,监控 |
| 极低 | 几乎无影响 | 极低 | 直接处理 |
调用示例
// 处理访问权请求
let report = dsr.access("subject-42").await?;
// report 含全部相关时序点位、审计记录与第三方共享清单
// 处理删除权请求
let result = dsr.erase("subject-42")
.reason("user-request")
.approver("dpo@eneros.io")
.cascade(true) // 级联删除相关数据
.await?;
eneros-cli dsr erase subject-42 --reason "user-request" \
--approver dpo@eneros.io
# 数据可携带导出
eneros-cli dsr export subject-42 --format json \
--output subject-42-export.json
# 查看处理活动记录
eneros-cli audit ropa --tenant eu-west-1
# 数据泄露通知模拟
eneros-cli gdpr breach-notify --subject "smart-meter-leak-2026" \
--affected-subjects 1000 \
--authority "dpa-ireland" \
--within-hours 72
删除操作落入 WORM 审计链,证明已履行删除义务。
合规检查清单
部署前请逐项确认:
- 所有个人数据字段打上
pii=true标签 - 默认字段级加密(AES-256-GCM)+ 列式访问控制
- DSR 请求 30 天内响应,超时自动升级
- 处理活动记录(ROPA)可由
eneros-cli audit ropa导出 - 跨境传输仅允许至通过充分性认定的国家
- 数据保留期默认 7 年后自动删除(除非法定更长)
- 任命数据保护官(DPO)并公开联系方式
- 数据泄露 72 小时内上报监管机构
- 高风险处理活动开展 DPIA 评估并存档
- 数据主体同意可撤回且易于操作
- 自动化决策提供人工复核通道
- 数据处理者(Processor)签订 DPA 协议
- 隐私政策中清晰列出所有处理活动
- 任命数据保护联络人(EU 代表,如适用)
- 数据保护培训年度开展并归档