MySQL: ¿Por qué hay entradas de "prueba" en mysql.db?


37

Recientemente, publiqué una respuesta a una pregunta sobre mysql.db .

Entonces, pensé que debería hacerles a todos esta pregunta:

He notado durante años que, después de la instalación de MySQL 5.0+, mysql.dbse completa con dos entradas que permiten que usuarios anónimos accedan a las bases de datos de prueba.

Puede verlo ejecutando 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)

¿Son estas entradas mysql.dbun riesgo de seguridad y, de ser así, por qué se agregan por defecto a una nueva instalación?

ACTUALIZACIÓN 2013-06-14 10:13 EDT

Esta mañana alguien rechazó mi pregunta, que realmente no entiendo. A la luz de este evento, aquí es por qué me tomé el tiempo para hacer una refutación:

Instalé MySQL 5.6.12 para un cliente esta semana en su clúster de etapas. Decidí verificar si esto seguía siendo un problema continuo:

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>

¿Adivina qué? ¡Esto sigue siendo un problema hasta el día de hoy!

MORAL DE LA HISTORIA: compruebe mysql.dbinmediatamente después de la instalación y elimine los inicios de sesión anónimos y borre estas entradas de prueba mysql.dbsin demora.


8
+1 por sacar a la luz este problema. Nunca lo noté antes, pero siempre ejecuto mysql_secure_installationuna instalación nueva, que elimina a los usuarios anónimos.
Derek Downey

Respuestas:


30

Tenga en cuenta qué guía de estudio de certificación MySQL 5.0

ingrese la descripción de la imagen aquí

decir en sus viñetas en la página 498, párrafo 6:

En Unix, MySQL viene con un script mysql_secure_installation que puede realizar varias operaciones útiles relacionadas con la seguridad en su instalación. El script tiene las siguientes capacidades:

  • Establecer una contraseña para las cuentas raíz
  • Elimine cualquier cuenta raíz accesible de forma remota.
  • Eliminar las cuentas de usuario anónimo. Esto mejora la seguridad porque evita la posibilidad de que alguien se conecte al servidor MySQL como root desde un host remoto. El resultado es que cualquier persona que quiera conectarse como root primero debe poder iniciar sesión en el host del servidor, lo que proporciona una barrera adicional contra el ataque.
  • Elimine la base de datos de prueba (si elimina las cuentas anónimas, es posible que también desee eliminar la base de datos de prueba a la que tienen acceso).

Para deshacerse de esas entradas malas, ejecute esto, por favor:

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

Como @DTest mencionó en su comentario a la pregunta, también puede ejecutar mysql_secure_installation para usted.

Si un usuario anónimo puede iniciar sesión en MySQL de forma remota, se puede lanzar un simple ataque de disco para dañar la instalación de mysql. Aquí hay un ejemplo:

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;

Ejecute la inserción 30 veces y obtendrá una tabla de 7 GB

  • Imagine crear varias de estas tablas en la base de datos de prueba
  • Imagine crear un procedimiento almacenado en la base de datos de prueba
  • Las posibilidades son infinitas mientras exista test y test_% en mysql.db

La seriedad de asegurar la instalación de mysql no ha sido completamente documentada por MySQL AB, y no creo que Oracle esté interesado en hacerlo hoy.

ACTUALIZACIÓN 2012-02-18 16:45 EDT

Fue sugerido por el comentario de @ atxdba que solo ejecutaba 'DROP DATABASE test'; debería ser el método preferido sobre tocar mysql.db. Descartar la base de datos nombrada testsimplemente elimina la base de datos que abre un conducto a un posible agujero de seguridad.

Por favor tome nota de esta consulta:

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

En base a esto, los usuarios anónimos pueden acceder completamente a las siguientes bases de datos :

  • prueba
  • test_db
  • prueba_001
  • prueba_1
  • datos de prueba

Si bien los usuarios anónimos no pueden acceder a las siguientes bases de datos:

  • testdb
  • prueba1
  • datos de prueba
  • Prueba ( Testes diferente de testlos sistemas basados ​​en Linux, pero sigue siendo un problema para MySQL que se ejecuta en Windows)

Tendrá que recordar esta regla sutil basada en la mysql.dbtabla. Si no recuerda esto, la creación de una base de datos de prueba con nombre testo un nombre de base de datos cuyos primeros 5 caracteres es test_reabrirá el mismo tipo de agujero de seguridad.

La forma más segura de tener que recordar estas cosas es ejecutar estas líneas después de una instalación inicial:

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

entonces cualquier base de datos con cualquier nombre puede tener una configuración de autenticación adecuada. Aún puede ejecutar estas dos líneas en cualquier momento.

ACTUALIZACIÓN 2012-02-24 15:20 EDT

Para demostrar abiertamente el peligro de tener usuarios anónimos mysql.db, me gustaría crear un usuario que solo tenga el privilegio de uso.

Usaré MySQL 5.5.12 en mi escritorio

Primero, mira el mysql.db

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


mysql>

De acuerdo con esto, cualquier Joe anónimo puede llegar a estas bases de datos.

Crearé una base de datos 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>

Creemos un usuario simple de vanilla llamado vanilla @ localhost (sin contraseña)

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>

A continuación, desde la línea de comandos de DOS, conectemos al esquema mysql

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

C:\>

Vale genial. Eso es lo que esperaba.

A continuación, desde la línea de comandos de DOS, conectemos al esquema test_mysqldb, cree una tabla y cárguela con 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>

¿Viste eso? Un usuario conUSAGEprivilegios puede crear una tabla en una base de datos de prueba y llenarla con datos. Este es un peligro claro y presente . Es por eso que recomiendo eliminar esas entradas de prueba de mysql.db para disuadir a los usuarios anónimos de acceder a bases de datos de prueba o acceder a bases de datos de prueba recién creadas (haciendo una subcarpeta por defectodatadir).

Como recordatorio, así es como lo haces:

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

ACTUALIZACIÓN 2013-09-14 20:05 EDT

Para demostrar que DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';realmente funciona, ejecuté esto en MySQL 5.6.13 hoy:

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>

Solo como un anuncio de servicio público, ejecute

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

o simplemente ejecute mysql-secure-installation y ponga este peligro potencial en la cama.


No se descarta la prueba de la base de datos; preferido sobre directamente inquietud con el mysqldb? Eliminar la entrada de la tabla db no eliminará el directorio db de prueba real. Si nada más parece una mejor
limpieza de la

1
Tuve que hacer una DELETE from mysql.db WHERE Db LIKE 'test%';Nota de que la capitalización del nombre del campo es importante. Entonces, si su nombre de campo es Dby no db , la consulta anterior no funcionará.
Avery
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.