本文档风哥主要介绍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 -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登录
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地址
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 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 连接控制
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 安全连接
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 -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 二进制日志加密
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 错误日志
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 审计日志
— 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 慢查询日志
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 系统加固
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 配置加固
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 -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:提供多种数据库管理和安全工具
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
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
