MySQL防火墙

2023-11-01 16:33:42 浏览数 (1)

上一篇文章中介绍了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”。通过调用存储过程来设置:

代码语言:javascript复制
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”实现,例如:

代码语言:javascript复制
CALL mysql.sp_set_firewall_mode('user@host','PROTECTING')
CALL mysql.sp_set_firewall_mode('user@host','OFF')

防火墙开启后,白名单中存在的语句将允许正常执行,如果白名单中不存在该语句,则该SQL语句被阻挡并返回错误,并在错误日志中记录相关信息。如果管理员希望重置白名单,可以使用如下语句:

代码语言:javascript复制
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语句数量等状态。例如,

代码语言:javascript复制
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防火墙的简单介绍,如需了解详情,请访问官网手册。

0 人点赞