跳到主内容

CCPA 合规

合规与安全

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.135opt-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.135GPC 信号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 个月更新一次

相关文档