Recentemente, postei uma resposta para uma pergunta sobre o mysql.db .
Então, comecei a pensar que deveria fazer a todos esta pergunta:
Eu notei há anos que, após a instalação do MySQL 5.0+, mysql.db
é preenchida com duas entradas que permitem que os bancos de dados de teste sejam acessados por usuários anônimos.
Você pode vê-lo executando esta consulta:
mysql> select * from mysql.db where SUBSTR(db,1,4) = 'test'\G
*************************** 1. row ***************************
Host: %
Db: test
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
*************************** 2. row ***************************
Host: %
Db: test\_%
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
2 rows in set (0.00 sec)
Essas entradas representam mysql.db
um risco de segurança e, em caso afirmativo, por que são adicionadas por padrão a uma nova instalação?
UPDATE 2013-06-14 10:13 EDT
Hoje de manhã alguém votou na minha pergunta, o que eu realmente não entendo. À luz deste evento, eis o motivo pelo qual dediquei um tempo para fazer uma refutação:
Eu instalei o MySQL 5.6.12 para um cliente esta semana no Cluster de armazenamento temporário. Decidi verificar se este ainda era um problema contínuo:
mysql> select version();
+------------+
| version() |
+------------+
| 5.6.12-log |
+------------+
1 row in set (0.00 sec)
mysql> select db,user,host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db | user | host |
+---------+------+------+
| test | | % |
| test\_% | | % |
+---------+------+------+
2 rows in set (0.10 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2013-06-14 10:10:13 |
+---------------------+
1 row in set (0.00 sec)
mysql>
Adivinha? Ainda é um problema até hoje !!!
MORAL DA HISTÓRIA: Verifique seu mysql.db
imediatamente após a instalação, remova logons anônimos e apague essas entradas de teste mysql.db
sem demora.
mysql_secure_installation
uma instalação nova, que remove os usuários anônimos.Respostas:
Observe o Guia de Estudo da Certificação MySQL 5.0
digamos em seus tópicos no parágrafo 6º:
Para se livrar dessas entradas incorretas, execute isso por favor:
Como o @DTest mencionado em seu comentário à pergunta, você também pode executar o mysql_secure_installation para você.
Se um usuário anônimo puder acessar o MySQL remotamente, um simples ataque de disco poderá ser iniciado para prejudicar a instalação do mysql. Aqui está um exemplo:
Execute a inserção 30 vezes e você obterá uma tabela de 7 GB
mysql.db
A seriedade de proteger a instalação do mysql não foi totalmente documentada pela MySQL AB, e não acho que a Oracle esteja interessada em fazê-lo hoje.
UPDATE 2012-02-18 16:45 EDT
Foi sugerido pelo comentário de @ atxdba que apenas executando 'DROP DATABASE test;' deve ser o método preferido em vez de tocar em mysql.db. A eliminação do banco de dados nomeado
test
simplesmente remove o banco de dados que abre um canal para uma possível falha de segurança.Observe esta consulta:
Com base nisso, os seguintes bancos de dados podem ser acessados totalmente por usuários anônimos :
Embora os seguintes bancos de dados não possam ser acessados completamente por usuários anônimos:
Test
é diferente dostest
sistemas baseados em Linux, mas ainda é um problema para o MySQL em execução no Windows)Você precisará se lembrar desta regra sutil com base na
mysql.db
tabela. Se você não se lembrar disso, a criação de um banco de dados de teste chamadotest
ou um nome de banco de dados cujos 5 primeiros caracteres sejamtest_
reabrirá o mesmo tipo de falha de segurança.A maneira mais segura de se lembrar dessas coisas é executar essas linhas após uma instalação inicial:
qualquer banco de dados com qualquer nome pode ter uma configuração de autenticação adequada. Você ainda pode executar essas duas linhas a qualquer momento.
ATUALIZAÇÃO 24/02/2012 15:20 EDT
Para demonstrar abertamente o perigo de ter usuários anônimos
mysql.db
, gostaria de criar um usuário que tenha apenas o privilégio de uso.Vou usar o MySQL 5.5.12 na minha área de trabalho
Primeiro, veja o mysql.db
De acordo com isso, qualquer Joe anônimo pode acessar esses bancos de dados.
Vou criar um banco de dados test_mysqldb
Vamos criar um usuário simples de baunilha chamado vanilla @ localhost (sem senha)
Em seguida, na linha de comando do DOS, vamos nos conectar ao esquema mysql
OK ótimo. Era o que eu esperava.
Em seguida, na linha de comando do DOS, vamos nos conectar ao esquema test_mysqldb, criar uma tabela e carregá-la com números
Você viu aquilo? Um usuário com
USAGE
privilégio pode criar uma tabela em um banco de dados de teste e preenchê-la com dados. Este é um perigo claro e presente . É por isso que recomendo excluir essas entradas de teste do mysql.db para impedir que usuários anônimos cheguem a bancos de dados de teste ou acessem bancos de dados de teste recém-criados (criando uma subpasta como padrãodatadir
).Como lembrete, é assim que você faz:
UPDATE 2013-09-14 20:05 EDT
Para demonstrar que
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
realmente funciona, executei isso no MySQL 5.6.13 hoje:Assim como um anúncio de serviço público, execute
ou apenas execute o mysql-secure-installation e coloque esse perigo em potencial.
fonte
DELETE from mysql.db WHERE Db LIKE 'test%';
anotação de que a capitalização do nome do campo é importante. Portanto, se o nome do seu campo forDb
e nãodb
, a consulta acima não funcionará.