摘要
数据安全合规是企业数字化转型的底线要求。在《数据安全法》《个人信息保护法》等法规驱动下,数据库安全已从可选项变为必选项。本文以 TiDB 为基础,系统设计覆盖传输加密(TLS)、存储加密(TDE)、基于角色的访问控制(RBAC)、全量审计追踪的数据库安全合规方案,并针对等保三级(信息系统安全等级保护三级)要求提供完整合规落地方案。
本文适合谁:负责数据库安全的 CISO/安全工程师/DBA 及合规负责人。
一、安全合规框架
1.1 合规驱动与法规要求
| 法规/标准 | 核心要求 | 适用行业 |
|---|---|---|
| 等保三级(GB/T 22239-2019) | 身份鉴别、访问控制、安全审计、数据加密、入侵防范 | 所有关键信息系统 |
| 《数据安全法》 | 数据分类分级、数据安全保护、数据风险评估 | 所有数据处理者 |
| 《个人信息保护法》 | 最小必要原则、同意机制、数据出境安全评估 | 涉及个人数据处理 |
| GDPR | 数据主体权利、数据处理合法性、跨境传输保护 | 涉及欧盟数据主体 |
| PCI DSS | 网络分段、加密存储、访问控制、日志审计 | 金融支付 |
1.2 数据库安全分层模型
┌──────────────────────────────────────────┐
│ 应用层安全 │ OAuth2.0 / API Gateway / WAF
├──────────────────────────────────────────┤
│ 网络层安全 │ VPC / 安全组 / TLS / mTLS
├──────────────────────────────────────────┤
│ 数据库层安全 │ RBAC / TDE / 审计 / 脱敏
├──────────────────────────────────────────┤
│ 数据层安全 │ 分类分级 / 加密 / 销毁 / 备份
├──────────────────────────────────────────┤
│ 运维层安全 │ 操作审计 / 变更审批 / 自动化运维
└──────────────────────────────────────────┘
二、TiDB 安全特性总览
2.1 内置安全能力
| 安全领域 | TiDB 特性 | 等保三级对应要求 |
|---|---|---|
| 身份鉴别 | MySQL 协议认证 + TLS 双向认证 | 身份标识与鉴别 |
| 访问控制 | RBAC(角色/权限/视图) | 访问控制 |
| 传输加密 | TLS 1.2+ 加密客户端-服务器通信 | 通信完整性 |
| 存储加密 | TDE 透明数据加密 | 数据保密性 |
| 审计追踪 | TiDB Audit Log(全量 SQL 审计) | 安全审计 |
| 数据脱敏 | 动态脱敏 / 视图列权限 | 数据保密性 |
| 高可用 | Raft 多副本 + 自动故障转移 | 容错与恢复 |
三、等保三级合规设计
3.1 等保三级数据库控制点映射
| 等保控制项 | 要求描述 | TiDB 实现方案 |
|---|---|---|
| 身份鉴别 | 唯一标识 + 口令复杂度 + 登录失败处理 | MySQL 认证 + 密码策略 + 连接数限制 |
| 访问控制 | 最小权限原则 + 权限分离 | RBAC + 角色分离(DBA/开发/只读) |
| 安全审计 | 审计记录完整性 + 保留 6 个月 | Audit Log → Kafka → Elasticsearch |
| 通信安全 | 传输加密 + 完整性校验 | TLS 1.2+ / mTLS |
| 数据完整性 | 数据防篡改 | Raft 共识 + 校验和 |
| 数据保密性 | 存储加密 + 敏感数据保护 | TDE + 视图脱敏 |
| 入侵防范 | 异常访问检测 | 慢查询监控 + 异常登录告警 |
| 备份恢复 | 定期备份 + 异地存储 | BR 备份 → 加密对象存储 |
3.2 身份鉴别配置
-- 创建用户并设置密码策略
CREATE USER 'app_user'@'10.0.0.%' IDENTIFIED BY 'Str0ng!Pass#2024';
-- 密码过期策略
ALTER USER 'app_user'@'10.0.0.%' PASSWORD EXPIRE INTERVAL 90 DAY;
-- 登录失败锁定
SET GLOBAL tidb_max_failed_login_attempts = 5;
SET GLOBAL tidb_failed_login_lockout_time = 1800;
-- 连接数限制
ALTER USER 'app_user'@'10.0.0.%' WITH MAX_CONNECTIONS_PER_HOUR 1000;
3.3 RBAC 访问控制
-- 创建角色并授权(最小权限原则)
CREATE ROLE 'app_readonly';
CREATE ROLE 'app_readwrite';
CREATE ROLE 'app_admin';
CREATE ROLE 'audit_viewer';
-- 只读角色:仅允许 SELECT
GRANT SELECT ON app_db.* TO 'app_readonly';
-- 读写角色:允许 SELECT/INSERT/UPDATE
GRANT SELECT, INSERT, UPDATE ON app_db.* TO 'app_readwrite';
-- 管理员角色:包含 DDL 权限
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX
ON app_db.* TO 'app_admin';
-- 审计查看角色
GRANT SELECT ON mysql.* TO 'audit_viewer';
-- 将角色分配给用户
GRANT 'app_readonly' TO 'analyst'@'10.0.0.%';
GRANT 'app_readwrite' TO 'app_service'@'10.0.0.%';
-- 激活角色
SET DEFAULT ROLE ALL TO 'analyst'@'10.0.0.%';
权限矩阵:
| 角色 | SELECT | INSERT | UPDATE | DELETE | CREATE | ALTER | DROP |
|---|---|---|---|---|---|---|---|
| app_readonly | ✓ | ||||||
| app_readwrite | ✓ | ✓ | ✓ | ||||
| app_admin | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| audit_viewer | ✓(审计表) |
四、数据加密方案
4.1 传输加密(TLS)
# TiDB Server TLS 配置(tidb-server.yaml)
security:
ssl-ca: /etc/tidb/ssl/ca.pem
ssl-cert: /etc/tidb/ssl/server-cert.pem
ssl-key: /etc/tidb/ssl/server-key.pem
# 要求客户端证书(mTLS 双向认证)
require-secure-transport: true
# 客户端通过 TLS 连接
mysql -u app_user -p -h tidb-server --ssl-ca=/etc/tidb/ssl/ca.pem \
--ssl-cert=/etc/tidb/ssl/client-cert.pem \
--ssl-key=/etc/tidb/ssl/client-key.pem
# 验证 TLS 连接
mysql> SHOW VARIABLES LIKE '%ssl%';
+---------------------+------------------------------+
| Variable_name | Value |
+---------------------+------------------------------+
| have_ssl | YES |
| ssl_ca | /etc/tidb/ssl/ca.pem |
| require_secure_transport | ON |
+---------------------+------------------------------+
4.2 存储加密(TDE)
TiDB 支持透明数据加密(TDE),加密过程对应用完全透明:
| 加密层级 | 加密范围 | 密钥管理 | 性能影响 |
|---|---|---|---|
| TiKV TDE | SST 文件加密 | KMS 外部密钥管理 | < 5% 写入开销 |
| TiDB TDE | 数据传输层加密 | 内部密钥轮换 | 极低 |
# TiKV TDE 配置(tikv.toml)
[security]
[security.encryption]
data-encryption-method = "aes128-ctr"
[security.encryption.master-key]
type = "kms"
kms-region = "cn-north-1"
kms-endpoint = "https://kms.cn-north-1.amazonaws.com"
kms-key-id = "arn:aws:kms:cn-north-1:xxx:key/xxx"
4.3 敏感数据脱敏
-- 方案一:通过视图脱敏
CREATE VIEW user_profile_safe AS
SELECT
user_id,
CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)) AS phone_masked,
CONCAT(LEFT(id_card, 4), '********', RIGHT(id_card, 4)) AS id_card_masked,
SHA2(real_name, 256) AS name_hash
FROM user_profile;
-- 方案二:应用层动态脱敏(推荐框架集成)
-- 在应用层通过 MyBatis 拦截器或 ORM 插件实现
-- 脱敏规则:
-- - 手机号:中间4位替换为 ****
-- - 身份证:保留前4后4位
-- - 银行卡:保留前4后4位
-- - 姓名:仅保留姓,名替换为 *
五、审计追踪
5.1 TiDB Audit Log 配置
# TiDB 审计日志配置
[audit-log]
enable = true
# 审计事件类型
# ALL:记录所有事件
# DML:记录数据操作
# DDL:记录结构操作
# GENERAL:记录常规查询
record-general-queries = true
# 审计输出方式
[audit-log]
# 输出到文件
file-path = "/var/log/tidb/audit.log"
max-file-size = 1024 # MB
max-log-days = 180 # 保留6个月(等保三级要求)
5.2 审计数据流转
TiDB Audit Log → Filebeat → Kafka → Logstash → Elasticsearch
↓
Kibana 审计仪表盘
↓
告警规则(异常操作检测)
5.3 审计分析规则
# 审计告警规则
audit_alerts:
- name: "批量数据导出"
condition: "SELECT COUNT(*) > 10000 AND audit_user NOT IN ('etl_user', 'report_user')"
severity: "warning"
action: "通知安全团队"
- name: "非授权 DDL 操作"
condition: "audit_event IN ('DROP', 'TRUNCATE', 'ALTER') AND audit_user NOT IN ('db_admin')"
severity: "critical"
action: "立即通知安全负责人并记录工单"
- name: "异常登录"
condition: "audit_event = 'FAILED_LOGIN' AND count > 5 within 10min"
severity: "critical"
action: "触发账户锁定,通知安全管理员"
- name: "敏感数据访问"
condition: "table_name IN ('user_profile', 'payment_info') AND audit_user NOT IN ('app_service')"
severity: "warning"
action: "记录审计日志并通知数据安全负责人"
5.4 审计日志格式
TiDB 审计日志结构化输出,包含以下字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| TIME | 操作时间 | 2024-01-15 10:30:00.123 |
| USER | 操作用户 | app_user@10.0.1.5 |
| HOST | 客户端 IP | 10.0.1.5 |
| DB | 目标数据库 | app_db |
| TABLE | 目标表 | user_profile |
| SQL | 执行的 SQL(脱敏) | SELECT * FROM user_profile WHERE ... |
| CONNECTION_ID | 连接 ID | 12345 |
| TIME_MS | 执行耗时(ms) | 15 |
六、等保三级落地检查清单
6.1 检查项
| 序号 | 检查项 | 要求 | 验证方法 |
|---|---|---|---|
| 1 | 密码复杂度策略 | ≥8位,含大小写+数字+特殊字符 | `SHOW VARIABLES LIKE 'validate_password%'` |
| 2 | 登录失败锁定 | 5次失败锁定30分钟 | 连续登录测试 |
| 3 | TLS 传输加密 | 强制启用 TLS 1.2+ | `SHOW VARIABLES LIKE '%ssl%'` |
| 4 | 最小权限授权 | 用户仅持有必要权限 | `SHOW GRANTS FOR user` |
| 5 | TDE 存储加密 | 敏感数据表启用 TDE | 检查 TiKV 加密配置 |
| 6 | 审计日志启用 | 全量 SQL 审计已开启 | 检查 audit-log 配置 |
| 7 | 审计日志保留 | ≥ 6 个月 | 检查日志存储策略 |
| 8 | 备份加密 | 备份文件已加密 | 检查 BR 备份配置 |
| 9 | 网络隔离 | 数据库仅在 VPC 内可访问 | 检查安全组规则 |
| 10 | 高可用容灾 | 多副本 + 自动故障转移 | 检查 TiKV 副本数 |
七、FAQ
Q1:TiDB TDE 对性能有多大影响?
实测数据显示,TiDB TDE(AES-128-CTR)对写入性能的影响约 3-5%,对读取性能的影响小于 2%。主要开销来自加密引擎的初始化与密钥轮换,正常读写场景下几乎无感知。建议在 POC 阶段用实际负载验证。
Q2:审计日志会占用多少存储空间?
审计日志大小取决于业务 QPS 和 SQL 长度。以中等规模(5000 QPS,平均 SQL 200 字节)估算,日均审计日志约 80-100GB,6 个月约 15-18TB。建议使用 Elasticsearch 集群存储,配合冷热数据分层降低成本。
Q3:等保三级认证需要 TiDB 单独过检吗?
等保三级认证以"信息系统"为单位,而非单个组件。TiDB 作为数据库组件需满足等保三级中关于数据库安全的控制项要求。建议在等保测评前,按照本文检查清单逐项验证,确保 TiDB 配置符合要求。
Q4:如何实现密钥的自动轮换?
TiDB TDE 支持 KMS 外部密钥管理。通过云厂商 KMS(如阿里云 KMS、AWS KMS)可实现:1) 密钥自动轮换(通常每年一次);2) 密钥权限分离(数据库加密使用密钥,但无法导出密钥明文);3) 密钥使用审计。
八、总结
数据库安全合规需要从身份鉴别、访问控制、传输加密、存储加密、审计追踪五个维度系统建设。TiDB 提供了满足等保三级要求的内置安全能力,关键落地要点:
- TLS 强制加密:所有客户端连接启用 TLS 1.2+,敏感场景使用 mTLS
- RBAC 最小权限:按角色分离权限,避免超级用户滥用
- TDE 存储加密:敏感数据加密存储,密钥由 KMS 外部管理
- 全量审计追踪:SQL 级审计日志保留 6 个月以上,支持异常检测告警
九、下一步行动
- 获取 TiDB 安全合规白皮书:下载完整的安全架构设计与等保三级落地方案 → 安全合规则解决方案
- 咨询 TiDB 安全团队:获取针对您行业的安全合规定制建议 → 联系 PingCAP
- 试用 TiDB Cloud 安全功能:体验 TLS/TDE/Audit 等安全特性 → TiDB Cloud 免费试用
- 阅读 TiDB 安全管理文档:获取详细的安全配置指南 → TiDB 文档概览