1. 首页 > MySQL教程 > 正文

MySQL教程FG039-MySQL安全配置与优化

本文档风哥主要介绍MySQL 8.4的安全配置与优化,包括安全概述、基本配置、权限管理、网络安全、数据安全、日志安全、安全加固和安全工具等内容。风哥教程参考MySQL官方文档安全部分。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 安全概述

MySQL是许多应用程序的核心数据存储,其安全性直接影响到整个应用系统的安全。加强MySQL的安全配置,可以防止未授权访问、数据泄露和恶意攻击,保护敏感数据的安全。学习交流加群风哥微信: itpux-com

1.2 安全威胁

MySQL数据库面临的主要安全威胁包括:

  • 未授权访问:攻击者获取数据库访问权限
  • 数据泄露:敏感数据被窃取
  • SQL注入:恶意SQL语句被执行
  • 拒绝服务攻击:数据库服务被中断
  • 权限提升:攻击者获取更高权限

Part02-生产环境规划与建议

2.1 安全策略制定

在生产环境中,制定合理的安全策略是确保MySQL安全的基础:

  • 风险评估:识别潜在的安全风险
  • 访问控制:制定严格的访问控制策略
  • 加密策略:确定数据加密的范围和方法
  • 审计策略:制定日志审计和监控策略

2.2 安全架构设计

设计安全的MySQL架构需要考虑以下方面:

  • 网络隔离:将数据库服务器放在专用网络中
  • 分层防护:采用多层安全防护机制
  • 高可用性:确保安全配置不影响系统可用性
  • 灾难恢复:制定安全的灾难恢复计划

Part03-生产环境项目实施方案

3.1 基本安全配置

3.1.1 密码策略

# 连接MySQL服务器
mysql -u root -p
Enter password: Fgedu123!

— 查看密码策略
SHOW VARIABLES LIKE ‘validate_password%’;
+————————————–+——–+
| Variable_name | Value |
+————————————–+——–+
| validate_password_check_user_name | ON |
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+————————————–+——–+

— 修改密码策略为强策略
SET GLOBAL validate_password_policy = ‘STRONG’;
SET GLOBAL validate_password_length = 12;
SET GLOBAL validate_password_mixed_case_count = 2;
SET GLOBAL validate_password_number_count = 2;
SET GLOBAL validate_password_special_char_count = 2;

3.1.2 移除匿名用户

— 查看匿名用户
SELECT user, host FROM mysql.user WHERE User = ”;
+——+———–+
| user | host |
+——+———–+
| | localhost |
| | ::1 |
+——+———–+

— 移除匿名用户
DELETE FROM mysql.user WHERE User = ”;
FLUSH PRIVILEGES;

— 验证匿名用户已移除
SELECT user, host FROM mysql.user WHERE User = ”;
Empty set (0.00 sec)

3.1.3 禁用远程root登录

— 查看root用户
SELECT user, host FROM mysql.user WHERE user = ‘root’;
+——+———–+
| user | host |
+——+———–+
| root | localhost |
| root | ::1 |
+——+———–+

— 移除远程root登录(仅保留localhost)
DELETE FROM mysql.user WHERE user = ‘root’ AND host != ‘localhost’;
FLUSH PRIVILEGES;

— 验证远程root登录已禁用
SELECT user, host FROM mysql.user WHERE user = ‘root’;
+——+———–+
| user | host |
+——+———–+
| root | localhost |
+——+———–+

3.1.4 移除测试数据库

— 查看测试数据库
SHOW DATABASES LIKE ‘test%’;
+——————+
| Database (test%) |
+——————+
| test |
+——————+

— 移除测试数据库
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db = ‘test’ OR Db = ‘test\_%’;
FLUSH PRIVILEGES;

— 验证测试数据库已移除
SHOW DATABASES LIKE ‘test%’;
Empty set (0.00 sec)

3.2 权限管理

3.2.1 最小权限原则

遵循最小权限原则,只授予用户完成任务所需的最小权限,避免权限过大导致的安全风险。学习交流加群风哥微信: itpux-com

3.2.2 用户管理

— 创建应用数据库
CREATE DATABASE IF NOT EXISTS app_db;

— 创建应用用户
CREATE USER ‘app_user’@’localhost’ IDENTIFIED BY ‘Fgedu123!’;

— 授予最小必要权限
GRANT SELECT, INSERT, UPDATE ON app_db.* TO ‘app_user’@’localhost’;

— 查看用户权限
SHOW GRANTS FOR ‘app_user’@’localhost’;
+———————————————————+
| Grants for app_user@localhost |
+———————————————————+
| GRANT USAGE ON *.* TO `app_user`@`localhost` |
| GRANT SELECT, INSERT, UPDATE ON `app_db`.* TO `app_user`@`localhost` |
+———————————————————+

— 撤销不需要的权限
REVOKE UPDATE ON app_db.* FROM ‘app_user’@’localhost’;

— 删除用户
— DROP USER ‘app_user’@’localhost’;

3.2.3 角色管理

— 创建只读角色
CREATE ROLE ‘read_only’;

— 授予权限给角色
GRANT SELECT ON *.* TO ‘read_only’;

— 创建用户并分配角色
CREATE USER ‘report_user’@’localhost’ IDENTIFIED BY ‘Fgedu123!’;
GRANT ‘read_only’ TO ‘report_user’@’localhost’;

— 激活角色
SET DEFAULT ROLE ‘read_only’ FOR ‘report_user’@’localhost’;

— 验证角色权限
SHOW GRANTS FOR ‘report_user’@’localhost’;
+———————————————————+
| Grants for report_user@localhost |
+———————————————————+
| GRANT USAGE ON *.* TO `report_user`@`localhost` |
| GRANT `read_only`@`%` TO `report_user`@`localhost` |
+———————————————————+

3.2.4 权限审计

— 查看所有用户
SELECT user, host FROM mysql.user;
+——————+———–+
| user | host |
+——————+———–+
| app_user | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| report_user | localhost |
| root | localhost |
+——————+———–+

— 查看用户权限详情
SELECT grantee, privilege_type, table_name
FROM information_schema.user_privileges
WHERE grantee LIKE ‘%app_user%’;

— 查看角色权限
SELECT * FROM mysql.role_edges;
+——————+———–+——————+———–+———-+
| FROM_HOST | FROM_USER | TO_HOST | TO_USER | WITH_ADMIN_OPTION |
+——————+———–+——————+———–+———-+
| % | read_only | localhost | report_user | N |
+——————+———–+——————+———–+———-+

3.3 网络安全

3.3.1 绑定IP地址

# 编辑MySQL配置文件
vi /etc/my.cnf
[mysqld]
# 绑定到本地回环地址(仅允许本地访问)
bind-address = 127.0.0.1

# 或绑定到特定网络接口
# bind-address = 192.168.1.100

# 重启MySQL服务
systemctl restart mysqld

3.3.2 防火墙设置

# 使用ufw配置防火墙(Ubuntu/Debian)
ufw allow from 192.168.1.0/24 to any port 3306 proto tcp
ufw status
Status: active

To Action From
— —— —-
3306/tcp ALLOW 192.168.1.0/24

# 或使用iptables配置防火墙(CentOS/RHEL)
iptables -A INPUT -p tcp –dport 3306 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp –dport 3306 -j DROP
service iptables save

3.3.3 连接控制

# 编辑MySQL配置文件
vi /etc/my.cnf
[mysqld]
# 最大连接数
max_connections = 100

# 连接超时(非交互式)
wait_timeout = 300

# 连接超时(交互式)
interactive_timeout = 28800

# 重启MySQL服务
systemctl restart mysqld

# 验证配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘%connection%’ OR LIKE ‘%timeout%’;”
Enter password: Fgedu123!
+————————–+———-+
| Variable_name | Value |
+————————–+———-+
| character_set_connection | utf8mb4 |
| collation_connection | utf8mb4_0900_ai_ci |
| max_connections | 100 |
| wait_timeout | 300 |
| interactive_timeout | 28800 |
+————————–+———-+

3.3.4 安全连接

# 编辑MySQL配置文件
vi /etc/my.cnf
[mysqld]
# 启用SSL
ssl=ON
ssl_ca=/etc/mysql/ssl/ca.pem
ssl_cert=/etc/mysql/ssl/server-cert.pem
ssl_key=/etc/mysql/ssl/server-key.pem

# 重启MySQL服务
systemctl restart mysqld

# 验证SSL配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘%ssl%’;”
Enter password: Fgedu123!
+—————+—————–+
| Variable_name | Value |
+—————+—————–+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/mysql/ssl/ca.pem |
| ssl_cert | /etc/mysql/ssl/server-cert.pem |
| ssl_key | /etc/mysql/ssl/server-key.pem |
+—————+—————–+

3.4 数据安全

3.4.1 数据加密

# 连接MySQL服务器
mysql -u root -p
Enter password: Fgedu123!

— 使用AES加密函数加密敏感数据
SELECT AES_ENCRYPT(‘敏感数据’, ‘加密密钥’) AS encrypted_data;
+—————————-+
| encrypted_data |
+—————————-+
| xxxxxxxxxxxxxxxxxxxxxxxxxx |
+—————————-+

— 解密数据
SELECT AES_DECRYPT(encrypted_data, ‘加密密钥’) AS decrypted_data
FROM (SELECT AES_ENCRYPT(‘敏感数据’, ‘加密密钥’) AS encrypted_data) AS t;
+—————-+
| decrypted_data |
+—————-+
| 敏感数据 |
+—————-+

— 使用SHA2哈希函数
SELECT SHA2(‘密码123456’, 256) AS hashed_password;
+——————————————————————+
| hashed_password |
+——————————————————————+
| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+——————————————————————+

3.4.2 二进制日志加密

# 编辑MySQL配置文件
vi /etc/my.cnf
[mysqld]
# 启用二进制日志加密
binlog_encryption = ON

# 重启MySQL服务
systemctl restart mysqld

# 验证二进制日志加密配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘binlog_encryption’;”
Enter password: Fgedu123!
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| binlog_encryption | ON |
+—————–+——-+

3.4.3 表空间加密

— 创建测试表
CREATE TABLE app_db.sensitive_data (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
ssn VARCHAR(20),
salary DECIMAL(10,2)
);

— 启用表空间加密
ALTER TABLE app_db.sensitive_data ENCRYPTION=’Y’;

— 查看表加密状态
SELECT table_schema, table_name, create_options
FROM information_schema.tables
WHERE table_schema = ‘app_db’;
+————–+—————-+——————————–+—————-+———-+
| table_schema | table_name | create_options | engine | version |
+————–+—————-+——————————–+—————-+———-+
| app_db | sensitive_data | ENCRYPTION=”Y” AUTO_INCREMENT=1 | InnoDB | 10 |
+————–+—————-+——————————–+—————-+———-+

Part04-生产案例与实战讲解

4.1 日志安全配置

4.1.1 错误日志

# 编辑MySQL配置文件
vi /etc/my.cnf
[mysqld]
# 错误日志配置
log_error = /var/log/mysql/error.log
# 日志详细程度(1:错误, 2:警告, 3:信息)
error_log_verbosity = 3

# 重启MySQL服务
systemctl restart mysqld

# 查看错误日志
cat /var/log/mysql/error.log | tail -20

4.1.2 审计日志

# 安装审计插件(Enterprise版本)
— INSTALL PLUGIN audit_log SONAME ‘audit_log.so’;

# 配置审计日志
vi /etc/my.cnf
[mysqld]
# 启用审计日志
audit_log = ON
audit_log_file = /var/log/mysql/audit.log
audit_log_format = JSON

# 重启MySQL服务
systemctl restart mysqld

# 查看审计日志
cat /var/log/mysql/audit.log | tail -10

4.1.3 慢查询日志

# 编辑MySQL配置文件
vi /etc/my.cnf
[mysqld]
# 慢查询日志配置
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow-query.log
# 慢查询阈值(秒)
long_query_time = 2
# 记录没有使用索引的查询
log_queries_not_using_indexes = ON

# 重启MySQL服务
systemctl restart mysqld

# 查看慢查询日志
mysqldumpslow /var/log/mysql/slow-query.log

4.2 安全加固实战

4.2.1 系统加固

# 限制MySQL配置文件权限
chmod 600 /etc/my.cnf
chown mysql:mysql /etc/my.cnf

# 检查MySQL进程用户
ps aux | grep mysqld | grep -v grep
mysql 1234 0.0 0.1 123456 7890 ? Ssl 10:00 0:00 /usr/sbin/mysqld

# 检查MySQL版本
mysql -V
mysql Ver 8.4.0 for Linux on x86_64 (MySQL Community Server – GPL)

# 列出已启用的插件
mysql -u root -p -e “SHOW PLUGINS;”
Enter password: Fgedu123!

4.2.2 配置加固

# 编辑MySQL配置文件
vi /etc/my.cnf
[mysqld]
# 禁用本地文件访问
local_infile = 0

# 禁用符号链接
symbolic-links = 0

# 禁用DNS解析(提高性能和安全性)
skip-name-resolve = 1

# 限制最大包大小
max_allowed_packet = 16M

# 禁用不必要的功能
# skip-networking = 1 # 如需远程访问则注释掉

# 重启MySQL服务
systemctl restart mysqld

# 验证配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘local_infile’ OR LIKE ‘symbolic_links’ OR LIKE ‘skip_name_resolve’
OR LIKE ‘max_allowed_packet’;”
Enter password: Fgedu123!
+——————+——-+
| Variable_name | Value |
+——————+——-+
| local_infile | OFF |
| max_allowed_packet | 16777216 |
| skip_name_resolve | ON |
| symbolic_links | 0 |
+——————+——-+

4.2.3 定期安全检查

# 连接MySQL服务器
mysql -u root -p
Enter password: Fgedu123!

— 检查用户权限
SELECT user, host, plugin FROM mysql.user;
+——————+———–+———————–+
| user | host | plugin |
+——————+———–+———————–+
| app_user | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| report_user | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+——————+———–+———————–+

— 检查密码过期情况
SELECT user, host, password_expired FROM mysql.user;
+——————+———–+——————+
| user | host | password_expired |
+——————+———–+——————+
| app_user | localhost | N |
| mysql.infoschema | localhost | N |
| mysql.session | localhost | N |
| mysql.sys | localhost | N |
| report_user | localhost | N |
| root | localhost | N |
+——————+———–+——————+

— 检查未使用的用户(需要安装performance_schema)
SELECT user, host, MAX(event_time) AS last_login
FROM performance_schema.events_statements_summary_by_user_by_event_name
WHERE event_name LIKE ‘%login%’
GROUP BY user, host;

4.3 安全工具使用

4.3.1 MySQL Enterprise Security

MySQL Enterprise Security提供高级安全功能,包括:

  • 透明数据加密(TDE):加密数据文件,保护静态数据
  • 审计日志:详细记录数据库活动,满足合规要求
  • 数据屏蔽:保护敏感数据,防止未授权访问
  • 密码验证插件:增强密码安全性,防止弱密码

4.3.2 第三方安全工具

常用的第三方MySQL安全工具包括:

  • MySQLTuner:检查MySQL配置和性能,提供优化建议
  • MariaDB Audit Plugin:提供开源审计功能,记录数据库活动
  • ProxySQL:数据库代理,提供高级访问控制和负载均衡
  • Percona Toolkit:提供多种数据库管理和安全工具
# 安装和使用MySQLTuner
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
chmod +x mysqltuner.pl
./mysqltuner.pl –user root –pass Fgedu123!

# 安装MariaDB Audit Plugin
INSTALL PLUGIN server_audit SONAME ‘server_audit.so’;
SET GLOBAL server_audit_logging = ON;

Part05-风哥经验总结与分享

5.1 安全最佳实践

5.1.1 生产环境安全配置建议

在生产环境中,建议遵循以下安全配置最佳实践:

  • 使用强密码:设置复杂的密码策略,定期更换密码
  • 定期备份:确保数据安全,定期测试恢复流程
  • 限制网络访问:只允许必要的IP访问,使用防火墙控制
  • 启用SSL:加密数据传输,保护敏感信息
  • 定期更新:及时更新MySQL版本,修复安全漏洞
  • 审计日志:记录数据库活动,便于安全分析
  • 最小权限:遵循最小权限原则,避免权限过大

5.1.2 安全配置示例

# 生产环境安全配置示例
vi /etc/my.cnf
[mysqld]
# 基本安全配置
bind-address = 192.168.1.100 # 绑定到特定IP

# 密码策略配置
validate_password_policy = STRONG
validate_password_length = 12
validate_password_mixed_case_count = 2
validate_password_number_count = 2
validate_password_special_char_count = 2

# 连接控制配置
max_connections = 100
wait_timeout = 300
interactive_timeout = 28800

# SSL配置
ssl=ON
ssl_ca=/etc/mysql/ssl/ca.pem
ssl_cert=/etc/mysql/ssl/server-cert.pem
ssl_key=/etc/mysql/ssl/server-key.pem

# 日志配置
log_error = /var/log/mysql/error.log
error_log_verbosity = 3
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2

# 其他安全设置
local_infile = 0
symbolic-links = 0
skip-name-resolve = 1
max_allowed_packet = 16M

5.2 安全审计与维护

定期进行安全审计和维护是确保MySQL安全的重要措施:

  • 定期检查用户权限:确保权限设置正确,移除不必要的权限
  • 检查日志:分析异常活动,及时发现安全问题
  • 漏洞扫描:定期进行安全扫描,发现潜在漏洞
  • 渗透测试:测试系统安全性,发现安全弱点
  • 安全培训:对数据库管理员进行安全培训,提高安全意识

总结

MySQL的安全配置与优化是确保数据库安全的重要措施。通过合理的安全配置,可以防止未授权访问、数据泄露和恶意攻击,保护敏感数据的安全。学习交流加群风哥微信: itpux-com

在实际生产环境中,建议遵循最小权限原则,使用强密码策略,限制网络访问,启用SSL,定期备份,及时更新MySQL版本,并进行定期安全审计,以提高系统的安全性。同时,要根据具体的应用场景和安全需求,制定合适的安全策略,确保数据库的安全运行。更多视频教程www.fgedu.net.cn

风哥提示:数据库安全是一个持续的过程,需要定期检查和更新安全配置,保持警惕,及时应对新的安全威胁。
GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息