Skip to content

MariaDB 数据加密

数据加密概述

数据加密是保护敏感数据的重要措施,通过加密可以确保数据在存储和传输过程中的安全性。MariaDB 提供了多种数据加密机制,包括:

  • 透明数据加密 (TDE):加密数据文件和日志文件,对应用程序透明
  • 加密插件:提供静态数据加密和动态数据加密功能
  • 加密连接:通过 SSL/TLS 加密客户端和服务器之间的数据传输
  • 加密函数:提供内置的加密和解密函数,用于应用层数据加密

MariaDB 加密支持

版本支持

加密特性支持版本说明
透明数据加密 (TDE)MariaDB 10.1.3+加密数据文件和日志文件
加密插件MariaDB 10.1.3+提供多种加密算法和密钥管理
加密连接MariaDB 5.5+通过 SSL/TLS 加密数据传输
加密函数MariaDB 5.1+内置加密和解密函数

加密插件类型

MariaDB 提供了多种加密插件:

  • file_key_management:使用文件存储加密密钥
  • aws_key_management:使用 AWS KMS 管理加密密钥
  • hashicorp_key_management:使用 HashiCorp Vault 管理加密密钥
  • keyring_vault:使用 HashiCorp Vault 管理密钥环
  • keyring_file:使用文件管理密钥环

透明数据加密 (TDE)

概述

透明数据加密 (TDE) 是一种静态数据加密技术,用于加密数据库的数据文件和日志文件。TDE 对应用程序透明,不需要修改应用程序代码。

工作原理

  1. 密钥层次结构

    • 主密钥 (Master Key):用于加密数据加密密钥
    • 数据加密密钥 (Data Encryption Key):用于加密数据文件和日志文件
  2. 加密过程

    • MariaDB 使用主密钥加密数据加密密钥
    • 数据加密密钥存储在加密的密钥文件中
    • 每次启动 MariaDB 时,需要加载主密钥来解密数据加密密钥
    • 使用数据加密密钥加密和解密数据文件和日志文件

配置 TDE

1. 安装加密插件

sql
-- 安装 file_key_management 插件
INSTALL SONAME 'file_key_management';

2. 生成加密密钥

bash
# 生成随机密钥文件
openssl rand -hex 32 > /etc/mysql/encryption/keyfile.enc
# 设置文件权限
chmod 600 /etc/mysql/encryption/keyfile.enc
chown mysql:mysql /etc/mysql/encryption/keyfile.enc

3. 配置加密插件

my.cnfmy.ini 文件中添加以下配置:

ini
[mysqld]
# 加密插件配置
plugin-load-add = file_key_management.so
file_key_management_filename = /etc/mysql/encryption/keyfile.enc
file_key_management_filekey = FILE:/etc/mysql/encryption/filekey.pem
file_key_management_encryption_algorithm = AES_CTR

# 启用 TDE
encrypt-tables = ON
encrypt-binlog = ON
encrypt-log = ON
encrypt-tmp-tables = ON
encrypt-tmp-files = ON

4. 重启 MariaDB 服务

bash
# Linux
systemctl restart mariadb

# Windows
net stop MariaDB
net start MariaDB

5. 验证 TDE 配置

sql
-- 查看加密插件状态
SHOW PLUGINS LIKE 'file_key_management';

-- 查看加密配置
SHOW VARIABLES LIKE '%encrypt%';

-- 查看加密密钥状态
SHOW GLOBAL STATUS LIKE 'File_key_management%';

加密插件配置

file_key_management 插件

配置参数

参数名描述默认值
file_key_management_filename加密密钥文件路径
file_key_management_filekey加密密钥文件的密码,可以是明文或文件路径
file_key_management_encryption_algorithm加密算法AES_CTR
file_key_management_rotates_key是否自动轮换密钥OFF
file_key_management_rotate_key_at_startup是否在启动时轮换密钥OFF

密钥文件格式

密钥文件是一个文本文件,每行包含一个密钥 ID 和密钥值,格式如下:

1;3e83d7a4f2c9b1e0a3d5f7b9d1c3e5a7f9b1d3c5e7a9f1b3d5f7b9d1c3e5a7
2;f8e6d4c2b0a9f7e5d3c1b9a7f5e3d1c9b7a5f3e1d9c7b5a3f1e9d7c5b3a1

aws_key_management 插件

配置示例

ini
[mysqld]
plugin-load-add = aws_key_management.so
aws_key_management_region = us-west-2
aws_key_management_access_key_id = YOUR_ACCESS_KEY
aws_key_management_secret_access_key = YOUR_SECRET_KEY
aws_key_management_encryption_algorithm = AES_CBC

hashicorp_key_management 插件

配置示例

ini
[mysqld]
plugin-load-add = hashicorp_key_management.so
hashicorp_key_management_host = vault.example.com
hashicorp_key_management_port = 8200
hashicorp_key_management_token = YOUR_VAULT_TOKEN
hashicorp_key_management_encryption_algorithm = AES_GCM

加密函数

内置加密函数

MariaDB 提供了多种内置加密函数,用于应用层数据加密:

  • AES_ENCRYPT() / AES_DECRYPT():使用 AES 算法加密和解密数据
  • DES_ENCRYPT() / DES_DECRYPT():使用 DES 算法加密和解密数据
  • MD5():计算 MD5 哈希值
  • SHA1() / SHA2():计算 SHA 哈希值
  • PASSWORD():生成密码哈希
  • ENCODE() / DECODE():使用简单算法加密和解密数据

示例

sql
-- 使用 AES 加密数据
SELECT AES_ENCRYPT('sensitive data', 'encryption_key');

-- 使用 AES 解密数据
SELECT AES_DECRYPT(AES_ENCRYPT('sensitive data', 'encryption_key'), 'encryption_key');

-- 计算 MD5 哈希值
SELECT MD5('password');

-- 计算 SHA256 哈希值
SELECT SHA2('password', 256);

加密连接

加密连接通过 SSL/TLS 协议加密客户端和服务器之间的数据传输,具体配置请参考 MariaDB SSL/TLS 配置 文档。

密钥管理

密钥管理最佳实践

  1. 使用安全的密钥存储

    • 生产环境中建议使用密钥管理服务 (KMS),如 AWS KMS、HashiCorp Vault 等
    • 避免将密钥存储在数据库服务器上
    • 定期轮换密钥
  2. 密钥访问控制

    • 限制密钥的访问权限
    • 使用最小权限原则
    • 记录密钥访问日志
  3. 密钥备份和恢复

    • 定期备份密钥
    • 测试密钥恢复流程
    • 确保密钥备份的安全性
  4. 密钥轮换

    • 定期轮换加密密钥
    • 制定密钥轮换策略
    • 测试密钥轮换流程

密钥轮换

手动密钥轮换

sql
-- 生成新密钥
SET GLOBAL file_key_management_rotates_key = ON;

-- 查看密钥状态
SHOW GLOBAL STATUS LIKE 'File_key_management%';

自动密钥轮换

my.cnfmy.ini 文件中添加以下配置:

ini
[mysqld]
file_key_management_rotates_key = ON
file_key_management_rotate_key_at_startup = ON

加密最佳实践

1. 分层加密策略

  • 传输层:使用 SSL/TLS 加密客户端和服务器之间的数据传输
  • 存储层:使用 TDE 加密数据文件和日志文件
  • 应用层:使用内置加密函数加密敏感数据字段

2. 选择合适的加密算法

  • 使用强加密算法,如 AES-256-GCM、ChaCha20-Poly1305 等
  • 避免使用弱加密算法,如 DES、3DES 等
  • 定期更新加密算法,以应对新的安全威胁

3. 合理配置加密选项

  • 生产环境中建议启用 TDE
  • 加密敏感数据字段
  • 加密备份文件
  • 加密临时表和临时文件

4. 安全管理密钥

  • 使用密钥管理服务 (KMS) 管理密钥
  • 定期轮换密钥
  • 限制密钥的访问权限
  • 备份和测试密钥恢复流程

5. 监控和审计

  • 监控加密相关的日志
  • 审计密钥访问情况
  • 定期检查加密配置
  • 测试加密功能的有效性

常见问题

如何查看 MariaDB 是否已启用 TDE?

sql
SHOW VARIABLES LIKE '%encrypt%';

如果返回的结果中 encrypt-tablesencrypt-binlogencrypt-log 等参数值为 ON,表示 TDE 已启用。

配置 TDE 后无法启动 MariaDB?

解决方法

  1. 检查加密插件是否已正确安装
  2. 检查密钥文件路径和权限是否正确
  3. 检查密钥文件格式是否正确
  4. 查看错误日志,了解具体失败原因
  5. 确保主密钥正确,能够解密数据加密密钥

TDE 会影响性能吗?

  • TDE 会增加一定的 CPU 开销,主要用于加密和解密数据
  • 影响程度取决于加密算法、密钥长度和服务器性能
  • 可以通过以下方式降低性能影响:
    • 使用硬件加速(如 AES-NI)
    • 选择高效的加密算法(如 AES-CTR、AES-GCM)
    • 只加密敏感数据和表

如何备份和恢复加密的 MariaDB 数据库?

  1. 备份

    • 使用 mariabackupmysqldump 备份数据库
    • 确保备份文件也被加密
    • 备份加密密钥和主密钥
  2. 恢复

    • 确保恢复环境已配置相同的加密插件和密钥
    • 恢复加密密钥和主密钥
    • 使用备份工具恢复数据库

如何迁移加密的 MariaDB 数据库?

  1. 确保目标服务器已配置相同的加密插件和密钥
  2. 迁移加密密钥和主密钥到目标服务器
  3. 使用备份工具或复制工具迁移数据库
  4. 验证迁移后的数据库可以正常访问

故障排除

加密插件加载失败

症状:启动 MariaDB 时提示加密插件加载失败

解决方法

  1. 检查插件文件是否存在
  2. 检查插件文件权限是否正确
  3. 查看错误日志,了解具体失败原因
  4. 确保 MariaDB 版本支持该加密插件

密钥文件无法访问

症状:启动 MariaDB 时提示无法访问密钥文件

解决方法

  1. 检查密钥文件路径是否正确
  2. 检查密钥文件权限是否正确(mysql 用户可访问)
  3. 确保密钥文件存在且格式正确

主密钥错误

症状:启动 MariaDB 时提示主密钥错误,无法解密数据

解决方法

  1. 检查主密钥是否正确
  2. 确保使用了正确的密钥文件
  3. 检查密钥文件格式是否正确
  4. 从备份中恢复正确的密钥文件

结论

数据加密是保护 MariaDB 数据库安全的重要措施,通过实施分层加密策略,可以确保数据在传输、存储和应用层的安全性。MariaDB 提供了多种加密机制,包括透明数据加密 (TDE)、加密插件、加密连接和加密函数等。

在实施数据加密时,建议使用强加密算法,合理配置加密选项,安全管理密钥,并定期监控和审计加密功能。通过实施这些最佳实践,可以显著提高 MariaDB 数据库的安全性,保护企业敏感数据免受未授权访问和泄露。