MySQL es una de las bases de datos más extendidas entre los sistemas de información de producción en las organizaciones. Es por ello que se ha convertido desde hace tiempo en blanco de hackers y atacantes en busca de información de interés.
Desde el punto de vista técnico existen distintos puntos de revisión de una base de datos MySQL, fundamentalmente:
- Asignación de privilegios
- Fichero de configuración
- Cuentas de usuario
- Acceso remoto
Una de las primeras acciones de revisión se debe centrar en la revisión de las cuentas por defecto, en este caso root. Para ello se puede comprobar si existe la cuenta y contiene contraseña en blanco:
SELECT User, Host
FROM user
WHERE User=’root’;
El acceso remoto (puerto 3306) a la base de datos debe ser monitorizado y controlado. Es muy común que el servidor de aplicaciones resida en la misma máquina que la base de datos, por lo que se podría limitar las conexiones a la base de datos desde fuera de localhost. Para ello se puede configurar esta opción en el fichero my.cnf añadiendo:
MYSQLD_OPTIONS=»–skip-networking”
Adicionalmente existen algunos parámetros de configuración o arranque de la base de datos interesantes desde el punto de vista de la seguridad:
- skip-grant-tables: Arrancar el sistema con esta parámetro supone una grave brecha de seguridad, ya que supone que cualquier usuario tiene privilegios para hacer cualquier cosa sobre la base de datos. En algún caso puede ser útil para recuperar la contraseña de root.
- safe-show-database: Permite mostrar solamente aquellas bases de datos sobre las que un usuario tiene algún tipo de privilegio
- safe-user-create: permite determinar si un usuario puede crear nuevos usuarios siempre y cuando no tenga privilegios de INSERT sobre la tabla mysql.user
Finalmente, y partiendo de la base de asignación del mínimo privilegio necesario, uno de los aspectos de seguridad a revisar son los privilegios asignados en la base de datos:
Select * from user where
Select_priv = 'Y' or Insert_priv = 'Y'
or Update_priv = 'Y' or Delete_priv = 'Y'
or Create_priv = 'Y' or Drop_priv = 'Y'
or Reload_priv = 'Y' or Shutdown_priv = 'Y'
or Process_priv = 'Y' or File_priv = 'Y'
or Grant_priv = 'Y' or References_priv = ‘Y'
or Index_priv = 'Y' or Alter_priv = 'Y';
Select * from host
where Select_priv = 'Y' or Insert_priv = 'Y'
or Create_priv = 'Y' or Drop_priv = 'Y'
or Index_priv = 'Y' or Alter_priv = 'Y';
or Grant_priv = 'Y' or References_priv = ‘Y'
or Update_priv = 'Y' or Delete_priv = 'Y'
Select * from db
where Select_priv = 'Y' or Insert_priv = 'Y'
or Grant_priv = 'Y' or References_priv = ‘Y'
or Update_priv = 'Y' or Delete_priv = 'Y'
or Create_priv = 'Y' or Drop_priv = 'Y'
or Index_priv = 'Y' or Alter_priv = 'Y';
Áudea Seguridad de la Información
Antonio Martínez
Departamento de Gestión
www.audea.com