我知道用户必须具有*.* FILE权限才能使用LOAD DATA INFILE命令而不使用LOCAL它通过客户端发送文件数据),但是如果要将某个MySQL用户授予FILE权限,如何限制用户可以从中加载数据的目录(类似于secure_file_priv ,但是用户特定的)?
这方面的最佳做法是什么? 要简单地强制用户使用LOCAL关键字并牺牲一点安全性能,或者将FILE权限授予数据库用户?
我会先说FILE是你可以给应用程序的最危险的特权。 FILE比GRANT更危险,因为在sql注入mysql你不能堆栈quires,因此你不能把一个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的规则来拒绝对您select的任何文件夹的读/写访问。 AppArmor的configuration非常简单,您可以在这里修改它: /etc/apparmor.d/usr.sbin.mysqld 。
如果您的发行版不支持AppArmor,则仍然可以使用内置的Linux文件权限,请记住,这些文件io函数将由执行MySQL的用户帐户运行。 chown user -R /some/dir && chmod 700 -R /some/dir 。
首先,我们需要确保用户具有必要的权限:
GRANT FILE ON *.* TO 'mysql_user'@'hostname';
1.如果你有Ubuntu,你可以简单地禁用AppAprmor。
sudo /etc/init.d/apparmor kill sudo update-rc.d -f apparmor remove
但这不是解决问题的最好方法。 最好为mysql设置一个AppArmorconfiguration文件。
您只需要将一行添加到AppAprmorconfiguration文件,以便在所需的目录中进行读写操作。 例如:
/var/www/mysite/** rw,
然后通过这个cmd重新启动AppArmor:
/etc/init.d/apparmor stop /etc/init.d/apparmor start
3.解决这个问题的第三种方法 – 禁用MySQL AppArmorconfiguration文件:
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上适用于我。