上一篇文章中介绍了SQL注入攻击,避免MySQL遭受SQL注入攻击的方法之一是使用防火墙。
简介
MySQL的防火墙是应用程序级别的防火墙,通过插件实现,包含在企业版中,它可以允许/拒绝每个注册账户的SQL语句执行。防火墙包含四种模式,“RECORDING”、“PROTECTING”、“DETECTING”,及“OFF”。
防火墙功能由三个插件提供功能,分别是MYSQL_FIREWALL、MYSQL_FIREWALL_USERS,及MYSQL_FIREWALL_WHRITELIST,它们包含在"firewall.so"中,该文件保存在"lib/plugin"路径下面。三个插件分别用于校验缓存中的SQL语句,及实现包含缓存信息的INFROMATION_SCHEMA中的表。
此外,防火墙功能还包含一系列组件:
-
“sp_set_firewall_mode()”存储过程用于设定防火墙的模式。
-
mysql系统库中还包含“firewall_users”表,及“firewall_whitelist”表,用于保存注册用户及SQL语句的白名单。
-
内部使用的函数,包括“set_firewall_mode()”、“normalize_statement()”、“read_firewall_whitelist()”,“read_firewall_users()”。
安装
安装防火墙时,根据操作系统的不同,选择安装脚本“linux_install_firewall.sql”或“win_install_firewall.sql”。安装脚本将进行安装防火墙插件、创建配置防火墙的存储过程及系统表等工作。
注册用户
注册一个用户并设置它的初始防火墙模式。用户的格式为完整的“user@host”,防火墙的初始模式包含“OFF”,及“RECORDING”。通过调用存储过程来设置:
CALL mysql.sp_set_friewall_mode('user'@'host','OFF')
注意,防火墙的初始模式不能设置为“PROTECTING”,此时白名单为空,将无法执行SQL语句。
训练防火墙
-
使用“RECORDING”模式注册用户
-
防火墙为每个注册用户创建规范化的摘要语句,并将其缓存
-
切换防火墙的模式为“PROTECTING”或“OFF”保存白名单。
注意,如果在“RECORDING”模式下重启mysql服务器,重启后防火墙将不会保存任何白名单内容,因此需要切换为“PROTECTING”或“OFF”保存白名单的内容。当用户希望再次修改白名单的内容时,需要将模式改为“RECORDING”,此时白名单中之前的内容不会消失。
摘要语句
白名单中的SQL语句使用摘要语句保存,摘要语句将压缩空格、删除注释,用占位符替换文字的值,因此用户无需担心应用程序传递过来不同的变量值对SQL语句执行的影响。
开启/关闭防火墙
开启/关闭防火墙通过调用存储过程“sp_set_firewall_mode”实现,例如:
CALL mysql.sp_set_firewall_mode('user@host','PROTECTING')
CALL mysql.sp_set_firewall_mode('user@host','OFF')
防火墙开启后,白名单中存在的语句将允许正常执行,如果白名单中不存在该语句,则该SQL语句被阻挡并返回错误,并在错误日志中记录相关信息。如果管理员希望重置白名单,可以使用如下语句:
CALL mysql.sp_set_firewall_mode('user@host','RESET')
监视防火墙
防火墙的使用状态可以通过状态变量进行监测,状态变量包括“Firewall_access_denied ”、“Firewall_access_granted”、“Firewall_access_suspicious”,及“Firewall_cached_entries”。通过执行“SHOW GLOBAL STATUS LIKE 'Firewall%';”语句可以观察到,拒绝执行的SQL语句数量等状态。例如,
mysql> SHOW GLOBAL STATUS LIKE 'Firewall%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Firewall_access_denied | 3 |
| Firewall_access_granted | 4 |
| Firewall_access_suspicious | 1 |
| Firewall_cached_entries | 4 |
+----------------------------+-------+
以上内容是关于MySQL防火墙的简单介绍,如需了解详情,请访问官网手册。
感谢关注“MySQL解决方案工程师”!