我理解用户必须具有FILE
权限*.*
才能使用LOAD DATA INFILE
命令而不使用LOCAL
- 通过客户端发送文件数据 - 但是当GRANT
将FILE
权限授予 MySQL 用户时,如何限制用户可以从中加载数据的目录(类似于secure_file_priv
,但特定于用户)?
在这方面的最佳实践是什么?简单地强制用户使用关键字LOCAL
并牺牲一点性能来换取安全性,还是FILE
向数据库用户授予特权?
答案1
首先我要说的是,这FILE
是迄今为止您可以授予应用程序的最危险的权限。 FILE
比 危险得多,GRANT
因为在 mysql 的 sql 注入中,您无法堆叠查询,因此您无法将 转换SELECT
为GRANT
语句,因此此权限对于 sql 注入完全无用。相比之下,FILE
权限是通常被漏洞利用来上传后门。
例如,下面是使用 SQL 注入的示例into outfile
select name from user where id=1 union select "<?php eval($_GET[e])?>" into outfile "/var/www/backdoor.php"
如果您在 Ubuntu 系统上尝试此查询,它将失败。这是因为 AppArmor 拒绝 MySQL 对 /var/www/ 的写访问。您可以修改 AppArmor 的规则以拒绝对您选择的任何文件夹的读/写访问。AppArmor 的配置非常简单,您可以在此处修改它:/etc/apparmor.d/usr.sbin.mysqld
。
如果您使用的发行版不支持 AppArmor,您仍然可以使用内置的 Linux 文件权限,请记住这些文件 io 功能将由执行 MySQL 的用户帐户运行chown user -R /some/dir && chmod 700 -R /some/dir
。
答案2
首先我们需要确保用户具有必要的权限:
GRANT FILE ON *.* TO 'mysql_user'@'hostname';
1. 如果您有 Ubuntu,您可以简单地禁用 AppAprmor。
sudo /etc/init.d/apparmor kill
sudo update-rc.d -f apparmor remove
2.但这并不是解决问题的最好办法。 最好为mysql设置一个AppArmor配置文件。
您只需在 AppAprmor 配置文件中添加一行即可在所需目录中启用读写。例如:
/var/www/mysite/** rw,
然后通过此 cmd 重新启动 AppArmor:
/etc/init.d/apparmor stop
/etc/init.d/apparmor start
3.解决此问题的第三种方法 - 禁用 MySQL AppArmor 配置文件:
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
这对我适用于 Ubuntu Server 12.04 LTS。