Skip to content

MySQL 透明数据加密

什么是透明数据加密

透明数据加密(Transparent Data Encryption,TDE)是一种数据库安全技术,用于加密存储在磁盘上的数据,包括数据文件、日志文件和临时文件。TDE对应用程序透明,不需要修改应用代码,即可实现数据的加密保护。

TDE 原理

TDE通过以下层次的密钥管理实现数据加密:

  1. 主密钥(Master Key):存储在密钥库中,用于加密表空间密钥
  2. 表空间密钥(Tablespace Key):用于加密表空间数据
  3. 加密算法:支持AES-128、AES-192和AES-256等加密算法

TDE 支持版本

  • MySQL Enterprise Edition 5.7.11及以上版本支持TDE
  • MariaDB 10.1及以上版本支持TDE
  • Percona Server 8.0及以上版本支持TDE

配置 TDE

1. 配置密钥库

MySQL TDE使用密钥库来存储主密钥。支持的密钥库类型包括:

  • 文件密钥库(默认)
  • 硬件安全模块(HSM)

配置文件密钥库

bash
# 在my.cnf中添加以下配置
[mysqld]
# 启用TDE
early-plugin-load=keyring_file.so

# 配置密钥库文件路径
keyring_file_data=/var/lib/mysql-keyring/keyring_file

初始化密钥库

sql
-- 安装keyring_file插件
INSTALL PLUGIN keyring_file SONAME 'keyring_file.so';

-- 检查插件是否安装成功
SHOW PLUGINS LIKE 'keyring_file';

2. 启用表空间加密

加密现有表空间

sql
-- 加密现有表空间
ALTER TABLE table_name ENCRYPTION='Y';

-- 加密现有数据库的所有表
SELECT CONCAT('ALTER TABLE ', table_schema, '.', table_name, ' ENCRYPTION=''Y'';') 
FROM information_schema.tables 
WHERE table_schema = 'your_database' AND engine = 'InnoDB';

创建加密表

sql
-- 创建加密表
CREATE TABLE encrypted_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    data VARCHAR(255)
) ENGINE=InnoDB ENCRYPTION='Y';

加密表空间

sql
-- 加密整个表空间
ALTER TABLESPACE innodb_system ENCRYPTION='Y';

-- 加密临时表空间
ALTER TABLESPACE innodb_temp ENCRYPTION='Y';

-- 加密undo表空间
ALTER TABLESPACE innodb_undo_001 ENCRYPTION='Y';
ALTER TABLESPACE innodb_undo_002 ENCRYPTION='Y';

3. 验证加密状态

sql
-- 查看表的加密状态
SELECT table_name, encryption FROM information_schema.tables WHERE table_schema = 'your_database';

-- 查看表空间的加密状态
SELECT tablespace_name, encryption FROM information_schema.innodb_tablespaces WHERE encryption IS NOT NULL;

管理 TDE

1. 备份和恢复密钥库

备份密钥库

bash
# 备份密钥库文件
cp /var/lib/mysql-keyring/keyring_file /backup/keyring_file_$(date +%Y%m%d)

恢复密钥库

bash
# 恢复密钥库文件
cp /backup/keyring_file_latest /var/lib/mysql-keyring/keyring_file
chown mysql:mysql /var/lib/mysql-keyring/keyring_file
chmod 600 /var/lib/mysql-keyring/keyring_file

2. 更换主密钥

sql
-- 生成新的主密钥
ALTER INSTANCE ROTATE INNODB MASTER KEY;

3. 禁用 TDE

sql
-- 禁用表加密
ALTER TABLE encrypted_table ENCRYPTION='N';

-- 卸载keyring插件
UNINSTALL PLUGIN keyring_file;

TDE 最佳实践

1. 密钥管理

  • 定期更换主密钥
  • 安全备份密钥库
  • 限制密钥库访问权限
  • 考虑使用硬件安全模块(HSM)存储主密钥

2. 性能考虑

  • TDE会带来一定的性能开销(通常为5%-10%)
  • 使用SSD存储可以减轻TDE的性能影响
  • 考虑只加密敏感数据,而非所有数据

3. 备份和恢复

  • 确保备份包含密钥库
  • 测试恢复流程,包括密钥库的恢复
  • 考虑使用加密备份工具,如MySQL Enterprise Backup

4. 监控和审计

  • 监控密钥库访问
  • 审计主密钥更换操作
  • 监控加密状态

TDE 与其他加密方式的比较

加密方式优点缺点适用场景
TDE对应用透明,不需要修改代码仅加密静态数据,不加密传输中的数据保护静态数据安全
应用层加密可以加密传输中的数据需要修改应用代码保护端到端数据安全
列级加密可以只加密敏感列需要修改应用代码,性能开销大保护特定敏感数据
SSL/TLS加密传输中的数据不加密静态数据保护传输中的数据安全

常见问题(FAQ)

Q1: TDE 会影响性能吗?

A1: TDE会带来一定的性能开销,通常为5%-10%。性能影响主要取决于:

  • 加密算法和密钥长度
  • 存储设备类型(SSD比HDD性能影响小)
  • 工作负载类型(写密集型工作负载影响较大)

Q2: TDE 加密哪些数据?

A2: TDE加密以下数据:

  • 数据文件
  • 重做日志文件
  • 撤销日志文件
  • 临时表空间文件
  • 二进制日志文件(需要额外配置)

Q3: 如何备份 TDE 密钥?

A3: 可以通过以下方式备份TDE密钥:

  • 备份密钥库文件
  • 使用MySQL Enterprise Backup工具备份
  • 定期导出密钥

Q4: 可以只加密特定表吗?

A4: 可以,TDE支持表级加密,可以选择只加密敏感表。

Q5: TDE 与其他安全措施冲突吗?

A5: TDE与其他安全措施(如SSL/TLS、访问控制等)可以结合使用,提供多层次的安全保护。

Q6: 如何迁移加密数据到新服务器?

A6: 迁移加密数据到新服务器需要:

  1. 在新服务器上配置相同的密钥库
  2. 复制密钥库文件到新服务器
  3. 复制数据文件到新服务器
  4. 启动MySQL服务

Q7: TDE 支持哪些加密算法?

A7: TDE支持以下加密算法:

  • AES-128
  • AES-192
  • AES-256

Q8: 如何检查表是否已加密?

A8: 可以使用以下命令检查表是否已加密:

sql
SELECT table_name, encryption FROM information_schema.tables WHERE table_schema = 'your_database';