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.db
se 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.db
un 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.db
inmediatamente después de la instalación y elimine los inicios de sesión anónimos y borre estas entradas de prueba mysql.db
sin demora.
mysql_secure_installation
una instalación nueva, que elimina a los usuarios anónimos.Respuestas:
Tenga en cuenta qué guía de estudio de certificación MySQL 5.0
decir en sus viñetas en la página 498, párrafo 6:
Para deshacerse de esas entradas malas, ejecute esto, por favor:
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:
Ejecute la inserción 30 veces y obtendrá una tabla de 7 GB
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
test
simplemente elimina la base de datos que abre un conducto a un posible agujero de seguridad.Por favor tome nota de esta consulta:
En base a esto, los usuarios anónimos pueden acceder completamente a las siguientes bases de datos :
Si bien los usuarios anónimos no pueden acceder a las siguientes bases de datos:
Test
es diferente detest
los 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.db
tabla. Si no recuerda esto, la creación de una base de datos de prueba con nombretest
o un nombre de base de datos cuyos primeros 5 caracteres estest_
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:
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
De acuerdo con esto, cualquier Joe anónimo puede llegar a estas bases de datos.
Crearé una base de datos test_mysqldb
Creemos un usuario simple de vanilla llamado vanilla @ localhost (sin contraseña)
A continuación, desde la línea de comandos de DOS, conectemos al esquema mysql
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
¿Viste eso? Un usuario con
USAGE
privilegios 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:
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:Solo como un anuncio de servicio público, ejecute
o simplemente ejecute mysql-secure-installation y ponga este peligro potencial en la cama.
fuente
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 esDb
y nodb
, la consulta anterior no funcionará.