Skip to content

PostgreSQL 合规性要求

主要合规性标准

GDPR(通用数据保护条例)

GDPR是欧盟的通用数据保护条例,旨在保护个人数据和隐私。PostgreSQL数据库需要满足以下GDPR要求:

  1. 数据访问权:允许用户访问自己的数据
  2. 数据删除权:支持"被遗忘权",能够删除用户数据
  3. 数据可携带性:允许用户导出自己的数据
  4. 数据处理合法性:确保数据处理有合法依据
  5. 数据保护影响评估:对高风险数据处理活动进行评估
sql
-- 数据访问请求处理:实现用户数据访问功能
CREATE OR REPLACE FUNCTION get_user_data(p_user_id INTEGER)
RETURNS JSONB AS $$
DECLARE
    v_user_data JSONB;
BEGIN
    SELECT to_jsonb(users) INTO v_user_data
    FROM users WHERE id = p_user_id;
    RETURN v_user_data;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

-- 数据删除功能:实现用户数据删除,支持"被遗忘权"
CREATE OR REPLACE FUNCTION delete_user_data(p_user_id INTEGER)
RETURNS BOOLEAN AS $$
BEGIN
    DELETE FROM users WHERE id = p_user_id;
    -- 可以根据需要添加级联删除其他相关表的数据
    RETURN TRUE;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

PCI-DSS(支付卡行业数据安全标准)

PCI-DSS是支付卡行业数据安全标准,旨在保护支付卡信息。PostgreSQL数据库需要满足以下PCI-DSS要求:

  1. 数据加密:加密存储和传输的敏感支付卡数据
  2. 访问控制:严格限制对敏感数据的访问
  3. 审计日志:记录所有对敏感数据的访问和操作
  4. 漏洞管理:定期进行漏洞扫描和修复
  5. 安全策略:制定和实施安全策略
sql
-- 加密敏感数据:使用pgcrypto扩展加密支付卡数据
CREATE EXTENSION IF NOT EXISTS pgcrypto;

CREATE OR REPLACE FUNCTION encrypt_card_number(card_number TEXT)
RETURNS BYTEA AS $$
BEGIN
    -- 使用配置的密钥加密信用卡号
    RETURN pgp_sym_encrypt(card_number, current_setting('app.card_key'));
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

-- 审计日志:记录敏感数据操作
CREATE TABLE audit_log (
    id BIGSERIAL PRIMARY KEY,
    operation VARCHAR(50) NOT NULL,       -- 操作类型:INSERT/UPDATE/DELETE
    user_id INTEGER,                      -- 操作用户ID
    card_mask VARCHAR(20),                -- 卡掩码,只显示最后4位
    timestamp TIMESTAMP DEFAULT NOW()     -- 操作时间
);

SOX(萨班斯-奥克斯利法案)

SOX是美国的萨班斯-奥克斯利法案,旨在保护投资者免受公司财务欺诈。PostgreSQL数据库需要满足以下SOX要求:

  1. 内部控制:建立和维护有效的内部控制
  2. 审计跟踪:完整记录所有财务数据的变更
  3. 访问控制:限制对财务数据的访问
  4. 数据完整性:确保数据的完整性和准确性
  5. 合规性报告:定期生成合规性报告

合规性实施方法

1. 数据加密

  • 传输加密:使用SSL/TLS加密数据库连接
  • 存储加密:使用透明数据加密(TDE)或pgcrypto扩展加密敏感数据
  • 备份加密:加密数据库备份

2. 访问控制

  • 最小权限原则:只授予用户必要的最小权限
  • 角色分离:将不同职责分配给不同角色
  • 强密码策略:实施强密码要求和定期更换
  • 双因素认证:对敏感操作实施双因素认证

3. 审计日志

  • 启用详细日志:配置PostgreSQL记录所有重要操作
  • 集中日志管理:将日志发送到集中日志管理系统
  • 日志保留:根据法规要求保留日志
  • 日志审计:定期审计日志,检测异常活动

合规性检查

1. 权限检查

sql
-- 检查用户权限:查看所有用户及其权限
SELECT usename, usesuper, usecreatedb, createrole 
FROM pg_user;

-- 检查表权限:查看所有表的权限分配
SELECT grantee, table_schema, table_name, privilege_type 
FROM information_schema.table_privileges
WHERE table_schema NOT IN ('pg_catalog', 'information_schema');

2. 审计配置检查

sql
-- 检查审计配置:查看日志相关配置
SHOW log_statement;          -- 日志记录的语句类型
SHOW log_connections;        -- 是否记录连接日志
SHOW log_disconnections;     -- 是否记录断开连接日志
SHOW log_duration;           -- 是否记录语句执行时间

3. 加密配置检查

sql
-- 检查SSL配置:查看是否启用SSL
SHOW ssl;
SHOW ssl_cert_file;
SHOW ssl_key_file;

常见问题(FAQ)

Q1: 如何满足GDPR的数据访问请求?

A1: 可以通过以下方式满足:

  • 实现数据导出功能,允许用户导出自己的完整数据
  • 使用本文中的get_user_data函数查询用户数据
  • 确保数据导出格式易于理解和使用
  • 设定合理的数据访问响应时间

Q2: PCI-DSS对密码有什么具体要求?

A2: PCI-DSS对密码的要求包括:

  • 密码长度至少为8个字符
  • 包含大小写字母、数字和特殊字符
  • 定期更换密码(至少每90天)
  • 禁止使用弱密码和常见密码
  • 密码必须加密存储

Q3: 合规性审计多久进行一次?

A3: 建议根据不同标准和组织规模进行:

  • 全面合规性审计:每年至少一次
  • 定期内部检查:每季度或每月一次
  • 专项审计:根据需要进行(如系统变更后)
  • 外部审计:根据法规要求进行

Q4: 如何确保PostgreSQL日志满足合规要求?

A4: 可以通过以下配置实现:

  • 设置log_statement = 'all'记录所有语句
  • 设置log_connections = on记录连接信息
  • 设置log_disconnections = on记录断开连接信息
  • 设置log_duration = on记录语句执行时间
  • 将日志发送到集中日志管理系统
  • 配置日志保留策略

Q5: 如何处理敏感数据的备份?

A5: 敏感数据备份处理方法:

  • 使用加密备份工具(如pg_dump配合pgcrypto)
  • 加密备份存储介质
  • 限制备份访问权限
  • 定期测试备份恢复
  • 按照法规要求管理备份保留期限