MySQL LOAD DATA INFILE 用户权限设置

MySQL LOAD DATA INFILE 用户权限设置

我理解用户必须具有FILE权限*.*才能使用LOAD DATA INFILE命令而不使用LOCAL- 通过客户端发送文件数据 - 但是当GRANTFILE权限授予 MySQL 用户时,如何限制用户可以从中加载数据的目录(类似于secure_file_priv,但特定于用户)?

在这方面的最佳实践是什么?简单地强制用户使用关键字LOCAL并牺牲一点性能来换取安全性,还是FILE向数据库用户授予特权?

答案1

首先我要说的是,这FILE是迄今为止您可以授予应用程序的最危险的权限。 FILE比 危险得多,GRANT 因为在 mysql 的 sql 注入中,您无法堆叠查询,因此您无法将 转换SELECTGRANT语句,因此此权限对于 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。

相关内容