Não é possível descartar usuário anônimo do mysql.user

15

Estou tentando derrubar os usuários anônimos do meu banco de dados mysql.users. No entanto, tenho tido um comportamento estranho. Quando insiro o comando:

DROP User ''@'WOPR';

Eu estava recebendo uma mensagem de erro genérica. Então, reiniciei minha máquina e tentei novamente. Desta vez eu recebi a resposta

Query OK, 0 rows affected.

Mas quando eu coloco

SELECT User, Host, Password FROM mysql.user WHERE User='';

O retorno é:

+------+------+----------+
| User | Host | Password |
+------+------+----------+
|      | WOPR |          |
+------+------+----------+

(WOPR é o meu nome de host)

Eu executo o comando

DROP User ''@'WOPR';

e obtenha o mesmo resultado.

Estou executando uma nova instalação do MySQL 5.5 no Arch Linux, versão 2.6.33 do kernel.

Alguém sabe o que pode causar esse comportamento?

SirTasty
fonte
Envie uma mensagem dessa natureza para o DBA StackExchange !!!
RolandoMySQLDBA

Respostas:

15
DELETE FROM mysql.user WHERE user='' AND host='WOPR';
FLUSH PRIVILEGES;

Isso deve fazer isso por você.

De uma chance !!!

EMBARGO

O MySQL possui alguns usuários pré-instalados no mysql.user. Além disso, o mysql.db vem com dois usuários que têm acesso anônimo e privilégios totais para testar bancos de dados.

Apenas faça isso

SELECT * FROM mysql.db \G

e você verá que qualquer pessoa que se conecte ao teste ou a qualquer banco de dados começando com test_ pode praticamente fazer tudo no banco de dados de teste. Isso é ruim, pois uma pessoa com acesso total a qualquer banco de dados de teste pode consumir um disco em questão de minutos.

Exemplo:

use test
CREATE TABLE junk (INT a) ENGINE=MyISAM;
INSERT INTO junk VALUES (1);

OK, grande coisa. Faz uma tabela com 4 bytes.

Agora, tentando executar esta instrução SQL 30 vezes:

INSERT INTO junk SELECT * FROM junk;

Ei, uma tabela instantânea com 1.073.741.824 linhas (4 GB + arquivo) !!! Imagens com direitos totais para um banco de dados de teste onde você pode causar esse tipo de destruição em um disco.

Meu conselho para você é executar isso para limpar o acesso do usuário de teste:

DELETE FROM mysql.db WHERE db LIKE 'tes%' AND user='';
FLUSH PRIVILEGES;

Para maiores esclarecimentos, veja meu post no MySQL: Por que existem entradas "test" no mysql.db?

Felicidades !!!

RolandoMySQLDBA
fonte
Oi Rolando, Isso fez o truque, obrigado! Atualmente, estou corrigindo meu acesso ao banco de dados de teste.
precisa saber é o seguinte
Não existe uma maneira de usar a drop usersintaxe em vez de modificar mysql.userdiretamente a tabela subjacente ?
Pacerier
11
@Pacerier Por favor, olhe a pergunta original. O verdadeiro problema é que a DROP USERsintaxe não funciona quando o campo do usuário está em branco (sequência vazia). Você deve fazer o que a resposta especifica.
RolandoMySQLDBA 4/14
@RolandoMySQLDBA, existem outras soluções além de hackear a mysql.usertabela?
Pacerier 4/04
@Pacerier Se você ler meu último link, perceberá que o MySQL (agora Oracle) coloca duas linhas diretamente na mysql.dbinstalação, permitindo que usuários anônimos acessem um banco de dados de teste. Curiosamente, me disseram que a instalação do Percona Server exclui essas linhas antes que a instalação seja concluída ( dba.stackexchange.com/questions/66584/… ). Como você está usando o MySQL, execute mysql_secure_installation ou exclua essas duas linhas.
RolandoMySQLDBA