CCPA 合规
加州消费者隐私法(CCPA, California Consumer Privacy Act)于 2020 年 1 月 1 日起生效,是美国第一部全面的个人数据保护法律。2023 年起,其修订版 CPRA(California Privacy Rights Act)正式生效,进一步强化了消费者权利与企业义务。CCPA 适用于年营收超过 2500 万美元、处理 10 万名以上消费者数据、或 50% 以上营收来自数据销售的企业,违规者每次故意违规可被处以 7500 美元罚款。
对于在加州提供能源服务的零售商,用户用电数据、客户账户信息、能效服务数据等均构成受 CCPA 保护的个人信息。EnerOS 提供 opt-out 信号机、消费者权利 API 与销售活动记录能力,便于能源零售商履行合规义务。
法案概述
CCPA/CPRA 由以下核心部分组成:
| 章节 | 主题 | 关键要求 |
|---|---|---|
| § 1798.100 | 一般消费者权利 | 知情、删除、拒绝出售 |
| § 1798.105 | 删除权 | 消费者可要求删除个人信息 |
| § 1798.106 | 知情权 | 知晓收集的类别与目的 |
| § 1798.110 | 类别知情权 | 收集的具体数据类别 |
| § 1798.115 | 来源知情权 | 数据来源类别 |
| § 1798.120 | 拒绝出售权 | opt-out 数据销售 |
| § 1798.121 | 撤回同意权 | opt-in 重新同意 |
| § 1798.125 | 不歧视权 | opt-out 不影响服务等级 |
| § 1798.130 | 通知义务 | 隐私政策与通知 |
| § 1798.135 | opt-out 信号 | 接受 GPC 等通用 opt-out 信号 |
| § 1798.140 | 定义 | 个人信息、销售等术语 |
| § 1798.150 | 数据泄露诉讼 | 私人诉权 |
| § 1798.155 | 行政罚款 | 总检察长执法 |
个人信息定义
CCPA 对”个人信息”采用宽泛定义,涵盖可直接或间接识别消费者或家庭的信息:
| 类别 | 示例 | 电力场景示例 |
|---|---|---|
| 标识符 | 姓名、邮箱、IP、账号 | 客户账号、邮箱 |
| 商业信息 | 交易记录、消费历史 | 用电记录、缴费历史 |
| 网络活动 | 浏览历史、搜索历史 | 网页访问日志 |
| 地理位置数据 | GPS、Wi-Fi 定位 | 节点地理位置 |
| 专业信息 | 职业、雇主 | 工商业用户信息 |
| 推断数据 | 画像、偏好 | 用电行为画像 |
| 敏感个人信息(CPRA) | 健康、生物特征、精确地理位置 | 财务账户 |
消费者权利映射
EnerOS 为 CCPA 每项权利提供对应的 API 端点与处理流程:
| CCPA 条款 | 权利 | EnerOS API | 默认响应时长 |
|---|---|---|---|
| § 1798.100 | 知情权 | GET /ccpa/notice/{consumer_id} | 即时 |
| § 1798.105 | 删除权 | POST /ccpa/delete/{consumer_id} | ≤ 45 天 |
| § 1798.110 | 类别知情权 | GET /ccpa/categories/{consumer_id} | ≤ 45 天 |
| § 1798.115 | 来源知情权 | GET /ccpa/sources/{consumer_id} | ≤ 45 天 |
| § 1798.120 | 拒绝出售权 | POST /ccpa/opt-out/{consumer_id} | ≤ 15 天 |
| § 1798.121 | 撤回同意 | POST /ccpa/opt-in/{consumer_id} | ≤ 15 天 |
| § 1798.125 | 不歧视权 | GET /ccpa/service-level/{consumer_id} | 即时 |
| § 1798.135 | GPC 信号 | POST /ccpa/gpc | 即时 |
企业义务
1. 通知义务
CCPA 要求企业在收集消费者个人信息前明确告知:
- 收集的个人信息类别
- 收集目的
- 是否销售或共享
- 消费者享有的权利
- opt-out 链接(“Do Not Sell My Personal Information”)
2. opt-out 信号义务
CPRA § 1798.135 要求企业必须接受通用 opt-out 信号(GPC, Global Privacy Control),并视为有效 opt-out 请求。
3. 服务商与承包商义务
企业与第三方服务商、承包商须签订数据协议(CDPA, CCPA Data Processing Agreement)。
4. 数据最小化义务(CPRA)
CPRA 引入数据最小化原则,要求企业收集、处理、保留的信息须与收集目的合理相关且必要。
EnerOS 合规实施
1. opt-out 信号处理
use eneros_privacy::ccpa::{GpcSignal, OptOutManager};
// 解析 GPC 头
let gpc = request.headers()
.get("Sec-GPC")
.map(|v| v == "1")
.unwrap_or(false);
if gpc {
let manager = OptOutManager::new();
let record = manager.set_opt_out(
consumer_id,
OptOutSource::Gpc,
OptOutScope::All,
).await?;
println!("已记录 GPC opt-out: {:?}", record);
}
2. 数据销售活动记录
[ccpa.sales_tracking]
enabled = true
auto_log = true # 自动记录销售活动
retention_years = 7 # 保留 7 年
[[ccpa.sales_channels]]
name = "third-party-marketer"
category = "marketing-analytics"
opt_out_respected = true
data_categories = ["identifiers", "consumption-pattern"]
revenue_share = false
[[ccpa.sales_channels]]
name = "energy-research-institute"
category = "research"
opt_out_respected = true
data_categories = ["aggregated-consumption"]
revenue_share = true
3. 删除请求处理
use eneros_privacy::ccpa::DeletionRequest;
let request = DeletionRequest::builder()
.consumer_id("consumer-99")
.reason("user-request")
.scope(DeletionScope::All)
.cascade_backups(true) # 级联删除备份
.cascade_logs(true) # 级联删除日志(按保留策略)
.approver("privacy-officer@eneros.io")
.build()?;
let result = request.execute().await?;
println!("已删除 {} 条记录", result.deleted_count);
println!("备份将在 {} 天后覆盖", result.backup_overwrite_days);
4. 不歧视保护
// opt-out 消费者服务等级不变
let service_level = ServiceLevel::for_consumer("consumer-99").await?;
assert_eq!(service_level.tier, ServiceTier::Standard);
assert_eq!(service_level.response_time_ms, 100);
// 即使 opt-out,服务等级也不降级
数据处理配置
eneros.toml 完整 CCPA 配置
[compliance]
standard = "ccpa"
version = "CPRA-2023"
enforce = true
privacy_officer = "privacy@eneros.io"
[ccpa]
enabled = true
data_minimization = true # 数据最小化原则
default_retention_years = 7
breach_notification_days = 30 # 数据泄露通知
sensitive_data_opt_in_required = true # 敏感数据须 opt-in
# opt-out 信号
[ccpa.opt_out]
accept_gpc = true # 接受 GPC 信号
treat_as_valid = true # 视为有效 opt-out
default_scope = "all" # 全部数据销售
response_days = 15
# 消费者权利
[ccpa.rights]
response_days = 45
extension_days = 45 # 可延期 45 天
extension_notify = true # 延期需书面告知
verify_request = true # 验证请求者身份
# 销售活动跟踪
[ccpa.sales]
track_all = true
auto_log = true
retention_years = 7
monthly_report = true
# 未成年人保护
[ccpa.minors]
under_13_opt_in_required = true # 13 岁以下须 opt-in
under_16_opt_in_required = true # 16 岁以下须 opt-in
parental_consent = true
# 数据最小化
[ccpa.minimization]
review_frequency_days = 90 # 季度审查
auto_purge_expired = true # 自动清除过期数据
purpose_limitation = true # 目的限制
数据类别声明
[ccpa.data_categories]
declared = true
[[ccpa.data_categories.items]]
name = "identifiers"
collected = true
purpose = "account-management"
sold = false
shared = false
retention_days = 2555
[[ccpa.data_categories.items]]
name = "consumption-records"
collected = true
purpose = "billing-and-forecasting"
sold = true # 出售给研究机构
shared = true
retention_days = 2555
[[ccpa.data_categories.items]]
name = "geolocation"
collected = true
purpose = "outage-detection"
sold = false
shared = false
retention_days = 365
sensitive = true # 精确位置属于敏感信息
调用示例
opt-out 信号处理
// 解析 GPC 头
let gpc = request.headers().get("Sec-GPC").map(|v| v == "1").unwrap_or(false);
if gpc {
privacy.set_opt_out(consumer_id, Source::Gpc).await?;
}
命令行操作
# opt-out 消费者
eneros-cli ccpa opt-out consumer-99 --source gpc
# opt-in 重新同意
eneros-cli ccpa opt-in consumer-99 --approver consumer-99
# 处理删除请求
eneros-cli ccpa delete consumer-99 \
--reason "user-request" \
--approver privacy@eneros.io
# 导出年度销售报告
eneros-cli ccpa report --year 2026 --output ccpa-2026.csv
# 查询消费者数据类别
eneros-cli ccpa categories consumer-99 --output categories.json
# 接收 GPC 信号
eneros-cli ccpa gpc --consumer consumer-99 --signal 1
销售活动按月导出,作为合规佐证。
消费者通知生成
# 生成隐私政策
eneros-cli ccpa notice generate --template ccpa-notice.html \
--output privacy-policy.html
# 更新"Do Not Sell My Personal Information"链接
eneros-cli ccpa opt-out-link update --url "/ccpa/opt-out"
# 验证通知合规性
eneros-cli ccpa notice verify --input privacy-policy.html
合规检查清单
部署前请逐项确认:
- 首页与服务条款提供”Do Not Sell My Personal Information”链接
- 接入 Global Privacy Control(GPC)信号并视为有效 opt-out
- 消费者请求 45 天内响应,可延期 45 天并书面告知
- 删除请求覆盖时序数据、日志与备份(按保留策略)
- opt-out 消费者不进入任何数据销售管道
- 12 岁以下未成年人数据须明确 opt-in
- 任命数据处理负责人,公开联系方式
- 每两年开展数据保护审计
- 数据类别清单在隐私政策中清晰列出
- 收集目的、保留期限、销售对象明确声明
- 服务商与承包商签订 CCPA 数据协议
- opt-out 不影响服务等级(不歧视)
- 敏感个人信息须 opt-in 同意
- 16 岁以下消费者出售数据须 opt-in
- 数据泄露 30 天内通知受影响消费者
- 年度开展数据最小化审查
- 销售活动按月导出并归档
- 消费者请求身份验证机制到位
- 隐私政策至少每 12 个月更新一次