Part01-基础概念与理论知识
1.1 MySQL安全组件概述
MySQL提供了丰富的安全组件和插件,用于增强数据库的安全性。这些组件包括认证插件、审计插件、防火墙插件等,可以根据实际需求进行配置和使用。风哥教程参考MySQL官方文档Security部分的安全组件相关内容。更多视频教程www.fgedu.net.cn
mysql> SHOW PLUGINS;
+—————————-+———-+——————–+———————-+———+
| Name | Status | Type | Library | License |
+—————————-+———-+——————–+———————-+———+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| caching_sha2_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| auth_socket | ACTIVE | AUTHENTICATION | auth_socket.so | GPL |
| auth_pam | ACTIVE | AUTHENTICATION | auth_pam.so | GPL |
| validate_password | ACTIVE | VALIDATE PASSWORD | validate_password.so | GPL |
| audit_log | ACTIVE | AUDIT | audit_log.so | GPL |
| mysql_firewall | ACTIVE | FIREWALL | mysql_firewall.so | GPL |
| mysql_firewall_users | ACTIVE | FIREWALL | mysql_firewall.so | GPL |
| mysql_firewall_whitelist | ACTIVE | FIREWALL | mysql_firewall.so | GPL |
+—————————-+———-+——————–+———————-+———+
11 rows in set (0.00 sec)
1.2 MySQL插件类型
MySQL插件可以分为多种类型,包括认证插件、存储引擎插件、全文搜索插件、审计插件、防火墙插件等。每种插件都有其特定的功能和用途。学习交流加群风哥微信: itpux-com
1.3 插件安装与管理
MySQL插件的安装和管理是数据库管理员的重要工作之一。插件可以动态加载和卸载,也可以在配置文件中设置为启动时加载。学习交流加群风哥QQ113257174
mysql> INSTALL PLUGIN validate_password SONAME ‘validate_password.so’;
Query OK, 0 rows affected (0.01 sec)
# 卸载插件
mysql> UNINSTALL PLUGIN validate_password;
Query OK, 0 rows affected (0.00 sec)
# 查看插件状态
mysql> SHOW PLUGINS LIKE ‘validate_password’;
Empty set (0.00 sec)
# 重新安装插件
mysql> INSTALL PLUGIN validate_password SONAME ‘validate_password.so’;
Query OK, 0 rows affected (0.01 sec)
Part02-生产环境规划与建议
2.1 安全插件选择
在生产环境中,选择合适的安全插件是确保数据库安全的重要步骤。应根据实际需求和安全级别选择相应的插件。风哥提示:生产环境中建议安装和启用认证插件、密码验证插件、审计插件和防火墙插件,以提高数据库的安全性。
2.2 插件配置最佳实践
正确配置安全插件是确保其有效运行的关键。不同的插件有不同的配置选项,需要根据实际情况进行调整。更多学习教程公众号风哥教程itpux_com
mysql> SET GLOBAL validate_password.policy = ‘STRONG’;
mysql> SET GLOBAL validate_password.length = 12;
mysql> SET GLOBAL validate_password.mixed_case_count = 2;
mysql> SET GLOBAL validate_password.number_count = 2;
mysql> SET GLOBAL validate_password.special_char_count = 2;
# 配置audit_log插件
# vi /etc/my.cnf
[mysqld]
audit_log=ON
audit_log_format=JSON
audit_log_file=/mysql/logs/audit.log
audit_log_policy=ALL
# 重启MySQL服务
# systemctl restart mysqld
2.3 插件性能影响评估
启用安全插件会对MySQL的性能产生一定影响,需要在安全性和性能之间取得平衡。在实施前需要评估插件对性能的影响,并采取相应的优化措施。from MySQL:www.itpux.com
# 启用前
# mysqlslap –user=fgedu_admin –password=StrongPassword123! –host=192.168.1.100 –port=3306 –concurrency=100 –iterations=10 –query=”SELECT * FROM fgedudb.fgedu_users LIMIT 100″
Benchmark
Average number of seconds to run all queries: 0.098 seconds
Minimum number of seconds to run all queries: 0.082 seconds
Maximum number of seconds to run all queries: 0.123 seconds
Number of clients running queries: 100
Average number of queries per client: 1
# 启用后
# mysqlslap –user=fgedu_admin –password=StrongPassword123! –host=192.168.1.100 –port=3306 –concurrency=100 –iterations=10 –query=”SELECT * FROM fgedudb.fgedu_users LIMIT 100″
Benchmark
Average number of seconds to run all queries: 0.112 seconds
Minimum number of seconds to run all queries: 0.095 seconds
Maximum number of seconds to run all queries: 0.138 seconds
Number of clients running queries: 100
Average number of queries per client: 1
Part03-生产环境项目实施方案
3.1 认证插件配置
认证插件是MySQL安全的第一道防线,用于验证用户的身份。以下是配置auth_pam插件的步骤。
# yum install -y pam-devel
# 编译安装auth_pam插件
# cd /usr/local/mysql-8.4.0/source/plugin/auth_pam
# cmake .
# make
# make install
# 安装auth_pam插件
mysql> INSTALL PLUGIN auth_pam SONAME ‘auth_pam.so’;
Query OK, 0 rows affected (0.01 sec)
# 创建PAM认证用户
mysql> CREATE USER ‘fgedu_pam’@’%’ IDENTIFIED WITH auth_pam AS ‘mysql’;
Query OK, 0 rows affected (0.01 sec)
# 授予权限
mysql> GRANT SELECT ON fgedudb.* TO ‘fgedu_pam’@’%’;
Query OK, 0 rows affected (0.00 sec)
3.2 安全审计插件配置
安全审计插件用于记录数据库的活动,帮助管理员监控和分析数据库操作,及时发现异常行为。
mysql> INSTALL PLUGIN audit_log SONAME ‘audit_log.so’;
Query OK, 0 rows affected (0.01 sec)
# 配置audit_log插件
# vi /etc/my.cnf
[mysqld]
audit_log=ON
audit_log_format=JSON
audit_log_file=/mysql/logs/audit.log
audit_log_policy=ALL
audit_log_rotate_on_size=104857600
# 重启MySQL服务
# systemctl restart mysqld
# 查看审计日志
# tail -f /mysql/logs/audit.log
{“timestamp”: “2026-04-01T09:30:00.123456Z”, “id”: 1, “class”: “general”, “event”: “user_login”, “connection_id”: 123, “user”: “fgedu_admin”, “host”: “192.168.1.200”, “ip”: “192.168.1.200”, “cmd”: “Connect”}
{“timestamp”: “2026-04-01T09:30:05.654321Z”, “id”: 2, “class”: “general”, “event”: “statement”, “connection_id”: 123, “user”: “fgedu_admin”, “host”: “192.168.1.200”, “ip”: “192.168.1.200”, “db”: “fgedudb”, “cmd”: “SELECT”, “query”: “SELECT * FROM fgedu_users LIMIT 10”}
3.3 防火墙插件配置
防火墙插件用于防止SQL注入攻击,通过分析SQL语句的模式,识别和阻止恶意SQL注入。
mysql> INSTALL PLUGIN mysql_firewall SONAME ‘mysql_firewall.so’;
Query OK, 0 rows affected (0.01 sec)
# 安装mysql_firewall_users插件
mysql> INSTALL PLUGIN mysql_firewall_users SONAME ‘mysql_firewall.so’;
Query OK, 0 rows affected (0.01 sec)
# 安装mysql_firewall_whitelist插件
mysql> INSTALL PLUGIN mysql_firewall_whitelist SONAME ‘mysql_firewall.so’;
Query OK, 0 rows affected (0.01 sec)
# 配置防火墙插件
mysql> CALL mysql.firewall_register_user(‘fgedu_admin’);
Query OK, 0 rows affected (0.00 sec)
mysql> CALL mysql.firewall_start_learning(‘fgedu_admin’);
Query OK, 0 rows affected (0.00 sec)
# 执行一些正常的SQL语句,让防火墙学习
mysql> SELECT * FROM fgedudb.fgedu_users WHERE id = 1;
mysql> UPDATE fgedudb.fgedu_users SET name = ‘test’ WHERE id = 1;
mysql> DELETE FROM fgedudb.fgedu_users WHERE id = 100;
# 结束学习模式
mysql> CALL mysql.firewall_stop_learning(‘fgedu_admin’);
Query OK, 0 rows affected (0.00 sec)
# 启用防火墙保护
mysql> CALL mysql.firewall_enable_protection(‘fgedu_admin’);
Query OK, 0 rows affected (0.00 sec)
Part04-生产案例与实战讲解
4.1 安装与配置auth_pam插件
auth_pam插件允许MySQL使用系统PAM(Pluggable Authentication Modules)进行用户认证,实现与系统用户的集成。
# vi /etc/pam.d/mysql
auth required pam_unix.so
account required pam_unix.so
# 测试PAM认证
# mysql -u fgedu_pam -p
Enter password: [输入系统用户密码]
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 124
Server version: 8.4.0 MySQL Community Server – GPL
mysql> SELECT user();
+———————+
| user() |
+———————+
| fgedu_pam@localhost |
+———————+
1 row in set (0.00 sec)
4.2 配置审计插件
审计插件可以记录数据库的所有活动,包括登录、查询、修改等操作,帮助管理员监控数据库的使用情况。
mysql> SHOW VARIABLES LIKE ‘audit_log%’;
+—————————–+——————————-+
| Variable_name | Value |
+—————————–+——————————-+
| audit_log | ON |
| audit_log_buffer_size | 1048576 |
| audit_log_file | /mysql/logs/audit.log |
| audit_log_flush | OFF |
| audit_log_format | JSON |
| audit_log_policy | ALL |
| audit_log_rotate_on_size | 104857600 |
| audit_log_rotations | 0 |
| audit_log_strategy | ASYNCHRONOUS |
+—————————–+——————————-+
9 rows in set (0.00 sec)
# 查看审计日志内容
# cat /mysql/logs/audit.log | jq .
{
“timestamp”: “2026-04-01T09:40:00.123456Z”,
“id”: 1,
“class”: “general”,
“event”: “user_login”,
“connection_id”: 125,
“user”: “fgedu_admin”,
“host”: “192.168.1.200”,
“ip”: “192.168.1.200”,
“cmd”: “Connect”
}
{
“timestamp”: “2026-04-01T09:40:05.654321Z”,
“id”: 2,
“class”: “general”,
“event”: “statement”,
“connection_id”: 125,
“user”: “fgedu_admin”,
“host”: “192.168.1.200”,
“ip”: “192.168.1.200”,
“db”: “fgedudb”,
“cmd”: “SELECT”,
“query”: “SELECT * FROM fgedu_users”
}
4.3 配置防火墙插件
防火墙插件可以防止SQL注入攻击,通过学习正常的SQL语句模式,识别和阻止异常的SQL注入尝试。
# 尝试执行正常的SQL语句
mysql> SELECT * FROM fgedudb.fgedu_users WHERE id = 1;
+—-+——+———–+
| id | name | email |
+—-+——+———–+
| 1 | test | test@test.com |
+—-+——+———–+
1 row in set (0.00 sec)
# 尝试执行可能的SQL注入攻击
mysql> SELECT * FROM fgedudb.fgedu_users WHERE id = 1 OR 1=1;
ERROR 1141 (42000): Anonymous user cannot execute this command
# 查看防火墙状态
mysql> SELECT * FROM mysql.firewall_users;
+————+—————+————-+————-+
| user_host | host | status | rule_count |
+————+—————+————-+————-+
| fgedu_admin | % | PROTECTING | 3 |
+————+—————+————-+————-+
1 row in set (0.00 sec)
# 查看防火墙规则
mysql> SELECT * FROM mysql.firewall_whitelist_rules;
+————+—————+———————————————+
| user_host | host | rule |
+————+—————+———————————————+
| fgedu_admin | % | SELECT * FROM fgedudb.fgedu_users WHERE id = ? |
| fgedu_admin | % | UPDATE fgedudb.fgedu_users SET name = ? WHERE id = ? |
| fgedu_admin | % | DELETE FROM fgedudb.fgedu_users WHERE id = ? |
+————+—————+———————————————+
3 rows in set (0.00 sec)
Part05-风哥经验总结与分享
通过多年的MySQL数据库管理经验,我总结了以下关于MySQL安全组件与插件的关键点:
1. 插件选择:根据实际需求和安全级别选择合适的插件,如认证插件、审计插件、防火墙插件等。
2. 配置最佳实践:正确配置插件参数,确保插件能够有效运行,同时避免对性能产生过大影响。
3. 性能优化:合理设置插件的参数,如审计日志的大小、防火墙的学习模式等,以减少对数据库性能的影响。
4. 监控与维护:定期检查插件的运行状态,查看审计日志,更新防火墙规则,确保插件能够持续有效地保护数据库。
5. 安全更新:及时更新MySQL版本和插件,以获取最新的安全修复和功能改进。
6. 故障排查:掌握常见插件故障的排查方法,快速解决问题,确保数据库的安全和稳定运行。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
