Recentemente, postei uma resposta a uma pergunta sobre mysql.db .
Então, comecei a pensar que deveria fazer a todos esta pergunta:
Tenho notado há anos que, após a instalação do MySQL 5.0+, mysql.db
é preenchido 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 mysql.db
representam um risco de segurança e, em caso afirmativo, por que são adicionadas por padrão a uma nova instalação?
ATUALIZAÇÃO 2013-06-14 10:13 EDT
Esta manhã, alguém votou negativamente na minha pergunta, o que eu realmente não entendo. À luz desse evento, aqui está o motivo pelo qual dediquei um tempo para fazer uma refutação:
Eu instalei o MySQL 5.6.12 para um cliente esta semana em seu Staging Cluster. Decidi verificar se esse 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? Isso ainda é um problema até hoje !!!
MORAL DA HISTÓRIA: Verifique mysql.db
imediatamente após a instalação e remova os logins anônimos e apague essas entradas de teste mysql.db
sem demora.
Por favor, observe o Guia de estudo de certificação do MySQL 5.0
dizer em seus marcadores na página 498 Parágrafo 6:
Para se livrar dessas entradas ruins, execute isto, por favor:
Como @DTest mencionou em seu comentário à pergunta, você também pode executar mysql_secure_installation para isso para você.
Se um usuário anônimo puder acessar o MySQL remotamente, um simples ataque de disco pode ser iniciado para prejudicar a instalação do mysql. Aqui está um exemplo:
Execute a inserção 30 vezes e você obtém 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 fazer isso hoje.
ATUALIZAÇÃO 2012-02-18 16:45 EDT
Foi sugerido pelo comentário de @atxdba que apenas executar 'DROP DATABASE test;' deve ser o método preferencial sobre tocar mysql.db. Eliminar o banco de dados nomeado
test
simplesmente remove o banco de dados que abre um canal para uma falha de segurança em potencial.Por favor, tome nota desta 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 totalmente por usuários anônimos:
Test
é diferente dostest
sistemas baseados em Linux, mas ainda é um problema para o MySQL rodando no Windows)Você terá que se lembrar dessa regra sutil baseada na
mysql.db
tabela. Se você não se lembra disso, criar um banco de dados de teste nomeadotest
ou um nome de banco de dados cujos primeiros 5 caracteres sejamtest_
reabrirá o mesmo tipo de falha de segurança.A maneira mais segura de lembrar dessas coisas é executar essas linhas após uma instalação inicial:
então qualquer banco de dados com qualquer nome pode ter uma configuração de autenticação apropriada. Você ainda pode executar essas duas linhas a qualquer momento.
ATUALIZAÇÃO 2012-02-24 15:20 EDT
Para demonstrar abertamente o perigo de ter usuários anônimos no
mysql.db
, gostaria de criar um usuário que tenha apenas o privilégio de uso.Eu estarei usando o MySQL 5.5.12 na minha área de trabalho
Primeiro, olhe para 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 chamado vanilla@localhost (sem senha)
Em seguida, na linha de comando do DOS, vamos nos conectar ao esquema mysql
OK ótimo. Isso é 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 eu recomendo fortemente excluir essas entradas de teste do mysql.db para impedir que usuários anônimos alcancem bancos de dados de teste ou acessem bancos de dados de teste recém-criados (criando uma subpasta sob o padrãodatadir
).Como lembrete, é assim que você faz:
ATUALIZAÇÃO 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:Apenas como um anúncio de serviço público, execute
ou apenas execute mysql-secure-installation e coloque esse perigo potencial na cama.