标签:#MySQL #数据安全 #TDE #动态脱敏 #等保三级 #信创 #数据库加固
一、一个典型困境:客户说"你们的数据库明文存身份证,不过等保"
去年,我们给一家三甲医院部署 HIS 系统,后端用的是 MySQL 5.7 社区版。上线前做等保测评,测评老师指出两个问题:
- 敏感字段明文存储 :患者身份证、手机号在
patients表中直接可见; - 备份文件无加密 :
.sql和.ibd文件拷出来就能读。
"必须做到:静态数据加密 + 敏感信息脱敏,否则等保不通过。"
但现实很骨感:
- 我们用的是 MySQL 社区版,不支持企业版的 TDE;
- 应用已上线,不能大规模改代码做字段加密;
- 客户 IT 能力有限,无法自行部署复杂安全组件。
怎么办?
二、为什么原生 MySQL 能力不够?
| 需求 | MySQL 原生支持情况 |
|---|---|
| 静态数据加密(防脱库) | ❌ 仅企业版支持 TDE,社区版无 |
| 动态脱敏(控权限) | ⚠️ 8.0+ 支持,但 DBA 或 SELECT * 可绕过 |
| 国密算法支持 | ❌ 仅支持 AES,不满足密评要求 |
| 信创环境适配 | ⚠️ 社区版可在麒麟运行,但无 SM4 加密能力 |
🧩 核心矛盾 :
等保要求"加密+脱敏",但社区版 MySQL 两项都做不到。
三、破局思路:外挂式安全引擎 ------ TDE + DBG 双防护
既然数据库自身能力不足,那就在它外面加两层"盔甲":
[应用]
↓
[DBG:动态脱敏网关] ←─ 控"谁能看到明文"
↓
[MySQL 实例]
↓
[TDE:透明加密驱动] ←─ 控"数据是否可读"
↓
[磁盘:.ibd / .sql 全为密文]
这套组合拳,我们称之为 "TDE + DBG 双引擎加固",已在多个政企项目中落地。

四、TDE:让数据文件即使被拿走也打不开
4.1 原理
- 在操作系统 I/O 层对 MySQL 数据目录(如
/var/lib/mysql)进行实时加密; - 使用 国密 SM4 算法,符合《GM/T 0002-2012》;
- 加密范围包括:
.ibd(InnoDB 表空间).frm(表结构).sql(mysqldump 备份)- binlog(可选)
4.2 效果
-
即使攻击者拔走硬盘,在其他机器上执行:
bashmysql -u root -p < patients.ibd返回乱码或报错;
-
无需修改 MySQL 配置,应用无感知。
4.3 信创适配
- 支持 麒麟 V10(ARM64) 、统信 UOS;
- 提供 RPM/DEB 包,一键安装;
- 兼容飞腾、鲲鹏 CPU。
五、DBG:让不该看的人看不到敏感字段
5.1 原理
- 应用不再直连
3306,而是连接 DBG 代理端口(如 3307); - DBG 自动识别 SQL 中的敏感字段(如
id_card,phone); - 根据用户身份返回脱敏结果。
5.2 脱敏规则示例(JSON)
json
{
"database": "his_db",
"tables": {
"patients": {
"columns": {
"id_card": { "type": "id_card", "roles": ["doctor"] },
"phone": { "type": "mobile", "roles": ["nurse", "doctor"] }
}
}
}
}
5.3 效果对比
| 用户角色 | 查询 SELECT id_card FROM patients 返回结果 |
|---|---|
| doctor | 110101199003071234(明文) |
| nurse | 110***********1234(脱敏) |
| dev | ***************1234(强脱敏) |
🔒 关键优势 :
连 DBA 执行SELECT *也无法绕过------因为请求先经过 DBG 过滤。
六、ISV 如何快速集成到交付包?
作为软件开发商,我们只做了三件事:
1. 修改连接地址
yaml
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3307/his_db # ← 改为 DBG 端口
2. 打包安当组件
bash
your-installer/
├── app/
├── andang-dbg/ # 动态脱敏网关
├── andang-tde/ # 透明加密驱动
└── install.sh # 自动部署脚本
3. 配置策略文件
- TDE:指定加密目录(
/var/lib/mysql); - DBG:定义脱敏规则 + 用户角色映射。
✅ 全程无需改业务代码,1 小时完成集成。
七、合规收益:一次加固,多份回报
| 合规要求 | 实现方式 |
|---|---|
| 等保2.0 8.1.4.3 | TDE 实现"重要数据存储保密性" |
| 等保2.0 8.1.5.2 | DBG 实现"最小权限访问控制" |
| 密评(GM/T 0115) | SM4 加密 + SM3 日志签名 |
| 《个保法》第51条 | 身份证、手机号去标识化处理 |
📊 在某省级医保平台项目中,该方案作为"数据库安全加固"证据,一次性通过等保三级和密评。
八、适用场景不止医疗
| 行业 | 系统类型 | 敏感字段 | 加固效果 |
|---|---|---|---|
| 政务 | 人口库 | 身份证、住址 | 备份加密 + 外包人员脱敏 |
| 金融 | 信贷系统 | 银行卡、收入 | 防内部越权 + 防脱库 |
| 教育 | 学籍系统 | 家长电话、家庭信息 | 测试环境自动脱敏 |
共同点 :
✅ 使用 MySQL 社区版
✅ 有等保/密评要求
✅ 无法大规模改造应用
九、给开发者的建议
- 不要等出事才加固------等保是底线,不是上限;
- 优先选择支持国密和信创的方案,避免后期返工;
- 从新项目开始试点 TDE+DBG,逐步覆盖存量系统。
真正的数据安全,是让防护能力"外挂化、可插拔、无感集成"。
互动话题 :
你们的 MySQL 是怎么保护敏感字段的?
有没有因为明文存储被等保卡住?
欢迎评论区交流!
参考资料(技术向):
- 《GM/T 0115-2021 信息系统密码应用基本要求》
- MySQL 8.0 Dynamic Data Masking 官方文档
- 等保2.0 第三级安全计算环境解读