6.3.6 数据加密与安全审计配置
本节聚焦 MySQL 传输加密、静态加密与审计配置的可落地实践,确保敏感数据“传输不明文、落地不明文、操作可追溯”。以下给出原理图、完整安装/配置步骤、排错要点与练习。
1) 传输加密 TLS/SSL#
安装与证书生成(示例:使用 MySQL 自带脚本)
# 1. 进入 MySQL 安装目录的 bin
cd /usr/local/mysql/bin
# 2. 生成 CA 与服务端/客户端证书(会在 data 目录生成 *.pem)
./mysql_ssl_rsa_setup --datadir=/data/mysql
# 3. 校验证书是否生成
ls -l /data/mysql/*.pem
服务端配置(my.cnf)
[mysqld]
require_secure_transport=ON
ssl_ca=/data/mysql/ca.pem
ssl_cert=/data/mysql/server-cert.pem
ssl_key=/data/mysql/server-key.pem
账户强制加密
-- 强制该用户必须 TLS
ALTER USER 'app_user'@'10.%' REQUIRE SSL;
-- 更严格:要求 X509 客户端证书
ALTER USER 'ops_user'@'10.%' REQUIRE X509;
客户端连接示例
mysql -h 10.0.0.10 -u app_user -p \
--ssl-ca=/data/mysql/ca.pem \
--ssl-cert=/data/mysql/client-cert.pem \
--ssl-key=/data/mysql/client-key.pem
验证加密是否生效
SHOW STATUS LIKE 'Ssl%';
-- Ssl_cipher 不为空表示已启用加密
常见排错
- SSL connection error: 检查证书路径、权限与证书是否过期。
- require_secure_transport=ON 后无法连接:客户端未加 --ssl-* 参数或驱动不支持。
- Ssl_cipher 为空:确认 mysqld 已加载 ssl_* 配置并重启。
2) 静态数据加密(InnoDB TDE)#
安装 keyring_file 插件
-- 1. 安装插件(需要先在 my.cnf 配置 keyring 文件路径)
INSTALL PLUGIN keyring_file SONAME 'keyring_file.so';
SHOW PLUGINS;
my.cnf 配置示例
[mysqld]
# keyring 文件建议放在独立目录并严格权限
keyring_file_data=/data/mysql-keyring/keyring
启用表空间加密
-- 创建加密表
CREATE TABLE t_secret (
id INT PRIMARY KEY,
secret VARCHAR(128)
) ENCRYPTION='Y';
-- 查看表加密状态
SELECT TABLE_SCHEMA,TABLE_NAME,CREATE_OPTIONS
FROM information_schema.TABLES
WHERE TABLE_NAME='t_secret';
字段级加密示例(应用层或函数加密)
INSERT INTO t_secret VALUES (1, AES_ENCRYPT('p@ssw0rd','MyKey123'));
SELECT AES_DECRYPT(secret,'MyKey123') FROM t_secret WHERE id=1;
备份与密钥安全
- 备份时同时备份 keyring 文件,否则无法解密。
- 生产环境建议使用 keyring_encrypted_file 或外部 KMS。
常见排错
- Plugin 'keyring_file' is not loaded: 检查插件是否安装、路径是否正确。
- 启用 ENCRYPTION 失败:确认 InnoDB 表空间启用加密且 keyring 正常。
3) 安全审计配置(社区版插件示例)#
安装审计插件(以 Percona Audit Log 为例)
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
SHOW VARIABLES LIKE 'audit_log%';
my.cnf 审计配置示例
[mysqld]
audit_log_format=JSON
audit_log_policy=ALL
audit_log_file=/data/mysql-audit/audit.log
重启并验证
systemctl restart mysqld
tail -f /data/mysql-audit/audit.log
审计范围建议
- 重点记录:登录、失败登录、DDL、权限变更、敏感表访问。
- 性能敏感:限定 audit_log_policy=LOGINS 或 QUERIES。
常见排错
- 日志不生成:检查目录权限与 audit_log_policy 是否为 NONE。
- 日志过大:配置日志轮转或只记录关键事件。
4) 安全加固检查清单(命令版)#
-- 检查是否强制 TLS
SHOW VARIABLES LIKE 'require_secure_transport';
-- 检查账户是否要求 SSL
SELECT user,host,ssl_type FROM mysql.user;
-- 检查 keyring 插件
SHOW PLUGINS LIKE 'keyring%';
-- 检查审计插件与策略
SHOW PLUGINS LIKE 'audit%';
SHOW VARIABLES LIKE 'audit_log%';
5) 练习与实战任务#
-
TLS 实战
- 生成证书,开启require_secure_transport=ON。
- 创建用户secure_user并REQUIRE SSL,验证明文连接失败。 -
TDE 实战
- 配置 keyring_file,创建 ENCRYPTION='Y' 表。
- 模拟删除 keyring 文件,尝试启动 MySQL,观察报错并恢复。 -
审计实战
- 启用 JSON 审计日志。
- 执行登录、DDL、权限变更操作,验证日志字段包含user/host/query。
通过以上配置,你应能在生产环境实现“传输加密 + 静态加密 + 审计追踪”的闭环安全能力。