AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 13361
Accepted
RolandoMySQLDBA
RolandoMySQLDBA
Asked: 2012-02-18 12:33:57 +0800 CST2012-02-18 12:33:57 +0800 CST 2012-02-18 12:33:57 +0800 CST

MySQL: Por que existem entradas de "teste" no mysql.db?

  • 772

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.dbrepresentam 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.dbimediatamente após a instalação e remova os logins anônimos e apague essas entradas de teste mysql.dbsem demora.

mysql security
  • 1 1 respostas
  • 8957 Views

1 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-02-18T13:07:05+08:002012-02-18T13:07:05+08:00

    Por favor, observe o Guia de estudo de certificação do MySQL 5.0

    insira a descrição da imagem aqui

    dizer em seus marcadores na página 498 Parágrafo 6:

    No Unix, o MySQL vem com um script mysql_secure_installation que pode executar várias operações úteis relacionadas à segurança em sua instalação. O script tem os seguintes recursos:

    • Defina uma senha para as contas root
    • Remova todas as contas raiz acessíveis remotamente.
    • Remova as contas de usuário anônimo. Isso melhora a segurança porque evita a possibilidade de qualquer pessoa se conectar ao servidor MySQL como root a partir de um host remoto. O resultado é que qualquer pessoa que queira se conectar como root deve primeiro conseguir fazer login no host do servidor, o que fornece uma barreira adicional contra ataques.
    • Remova o banco de dados de teste (se você remover as contas anônimas, talvez também queira remover o banco de dados de teste ao qual elas têm acesso).

    Para se livrar dessas entradas ruins, execute isto, por favor:

    DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test';
    FLUSH PRIVILEGES;
    

    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:

    USE test
    CREATE TABLE rolando_tb (a int);
    INSERT INTO rolando_tb VALUES (1);
    INSERT INTO rolando_tb SELECT a FROM rolando_tb;
    INSERT INTO rolando_tb SELECT a FROM rolando_tb;
    INSERT INTO rolando_tb SELECT a FROM rolando_tb;
    INSERT INTO rolando_tb SELECT a FROM rolando_tb;
    

    Execute a inserção 30 vezes e você obtém uma tabela de 7 GB

    • Imagine criar várias dessas tabelas no banco de dados de teste
    • Imagine criar um procedimento armazenado no banco de dados de teste
    • As possibilidades são infinitas, desde que test e test_% existam emmysql.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 testsimplesmente remove o banco de dados que abre um canal para uma falha de segurança em potencial.

    Por favor, tome nota desta consulta:

    mysql> select user,host,db from mysql.db;
    +------+------+---------+
    | user | host | db      |
    +------+------+---------+
    |      | %    | test    |
    |      | %    | test\_% |
    +------+------+---------+
    2 rows in set (0.09 sec)
    

    Com base nisso, os seguintes bancos de dados podem ser acessados ​​totalmente por usuários anônimos :

    • teste
    • test_db
    • teste_001
    • teste_1
    • dados de teste

    Embora os seguintes bancos de dados não possam ser acessados ​​totalmente por usuários anônimos:

    • testdb
    • teste1
    • dados de teste
    • Teste ( Testé diferente dos testsistemas baseados em Linux, mas ainda é um problema para o MySQL rodando no Windows)

    Você terá que se lembrar dessa regra sutil baseada na mysql.dbtabela. Se você não se lembra disso, criar um banco de dados de teste nomeado testou um nome de banco de dados cujos primeiros 5 caracteres sejam test_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:

    DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
    FLUSH PRIVILEGES;
    

    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

    mysql> select user,host,db from mysql.db;
    +------+------+---------+
    | user | host | db      |
    +------+------+---------+
    |      | %    | test    |
    |      | %    | test\_% |
    +------+------+---------+
    2 rows in set (0.05 sec)
    
    
    mysql>
    

    De acordo com isso, qualquer Joe anônimo pode acessar esses bancos de dados.

    Vou criar um banco de dados test_mysqldb

    mysql> create database test_mysqldb;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use test_mysqldb
    Database changed
    mysql> show tables;
    Empty set (0.00 sec)
    
    mysql>
    

    Vamos criar um usuário simples chamado vanilla@localhost (sem senha)

    mysql> CREATE USER vanilla@localhost;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SHOW GRANTS FOR vanilla@localhost;
    +---------------------------------------------+
    | Grants for vanilla@localhost                |
    +---------------------------------------------+
    | GRANT USAGE ON *.* TO 'vanilla'@'localhost' |
    +---------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    Em seguida, na linha de comando do DOS, vamos nos conectar ao esquema mysql

    C:\>mysql -uvanilla -Dmysql
    ERROR 1044 (42000): Access denied for user 'vanilla'@'localhost' to database 'mysql'
    
    C:\>
    

    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

    C:\>mysql -uvanilla -Dtest_mysqldb
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 6
    Server version: 5.5.12-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> CREATE TABLE rolando_tb (a bigint unsigned);
    Query OK, 0 rows affected (0.06 sec)
    
    mysql> INSERT INTO rolando_tb VALUES (1);
    Query OK, 1 row affected (0.06 sec)
    
    mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
    Query OK, 1 row affected (0.06 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
    Query OK, 2 rows affected (0.08 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
    Query OK, 4 rows affected (0.06 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
    Query OK, 8 rows affected (0.06 sec)
    Records: 8  Duplicates: 0  Warnings: 0
    
    mysql> SELECT * FROM rolando_tb;
    +------+
    | a    |
    +------+
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    |    1 |
    +------+
    16 rows in set (0.00 sec)
    
    mysql> SELECT database();
    +--------------+
    | database()   |
    +--------------+
    | test_mysqldb |
    +--------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    Você viu aquilo? Um usuário comUSAGEprivilé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:

    DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
    FLUSH PRIVILEGES;
    

    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:

    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1
    Server version: 5.6.13-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> select db,user,host from mysql.db where LEFT(db,4)='test';
    +---------+------+------+
    | db      | user | host |
    +---------+------+------+
    | test    |      | %    |
    | test\_% |      | %    |
    +---------+------+------+
    2 rows in set (0.43 sec)
    
    mysql> delete from mysql.db where LEFT(db,4)='test';
    Query OK, 2 rows affected (0.04 sec)
    
    mysql> select db,user,host from mysql.db2 where LEFT(db,4)='test';
    Empty set (0.00 sec)
    
    mysql>
    

    Apenas como um anúncio de serviço público, execute

    DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
    FLUSH PRIVILEGES;
    

    ou apenas execute mysql-secure-installation e coloque esse perigo potencial na cama.

    • 29

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve