Configurações de privilégios de usuário LOAD DATA INFILE do MySQL

1

Entendo que os usuários devem ter privilégio FILE em *.* para usar o comando LOAD DATA INFILE sem usar LOCAL , que envia os dados do arquivo por meio do cliente, mas quando GRANT ing FILE privilégio para um usuário MySQL, como você pode restringir os diretórios dos quais um usuário pode carregar dados (semelhante a secure_file_priv , mas específico do usuário)?

Qual é a melhor prática a esse respeito? Para forçar os usuários a usar a palavra-chave LOCAL e sacrificar um pouco o desempenho pela segurança, ou conceder privilégio FILE aos usuários do banco de dados?

    
por Lèse majesté 22.06.2010 / 21:58

2 respostas

3

Vou começar dizendo que FILE é de longe os privilégios mais perigosos que você pode dar a um aplicativo. FILE é muito mais perigoso que GRANT porque em sql injection para mysql você não pode empilhar quires, assim você não pode transformar um SELECT em uma instrução GRANT e lá este privilégio é completamente inútil para injeção de sql. Por contraste, FILE privileges são comumente usados por exploits para fazer o upload de um backdoor.

Por exemplo, aqui está um exemplo de injeção de SQL usando into outfile select name from user where id=1 union select "<?php eval($_GET[e])?>" into outfile "/var/www/backdoor.php"

Se você tentar esta consulta em um sistema Ubuntu, ela falhará. Isso ocorre porque o AppArmor está negando o acesso de gravação do MySQL ao / var / www /. Você pode modificar as regras do AppArmor para negar o acesso de leitura / gravação a qualquer pasta escolhida. A configuração do AppArmor é bastante simples e você pode modificá-lo aqui: /etc/apparmor.d/usr.sbin.mysqld .

Se você estiver em uma distro que não suporte o AppArmor, você ainda pode usar as permissões de arquivo do Linux, tenha em mente que essas funções do arquivo io serão executadas pela conta do usuário que está executando o MySQL. chown user -R /some/dir && chmod 700 -R /some/dir .

    
por 29.06.2010 / 23:06
1

Primeiro, precisamos garantir que o usuário tenha as permissões necessárias:

GRANT FILE ON *.* TO 'mysql_user'@'hostname';

1. Se você tem o Ubuntu, você pode simplesmente desativar o AppAprmor.

sudo /etc/init.d/apparmor kill
sudo update-rc.d -f apparmor remove

2. Mas esta não é a melhor maneira de resolver o problema. É melhor configurar um perfil do AppArmor para o mysql.

Você só precisa adicionar uma linha ao perfil AppAprmor para ativar leitura de escrita no diretório requerido. Por exemplo:

/var/www/mysite/** rw,

Em seguida, reinicie o AppArmor por este cmd:

/etc/init.d/apparmor stop
/etc/init.d/apparmor start

3. Terceira maneira de resolver este problema - desabilitando o perfil do 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

Isso funciona para mim no Ubuntu Server 12.04 LTS.

    
por 16.01.2013 / 09:36