Siempre he sido amigo de las buenas prácticas, mucho más si estas nos ayudan a mantener la seguridad de nuestros servidores, servicios, o simplemente nuestra información.
Una costumbre (mala costumbre) que tienen muchos administradores o usuarios es usar el acceso con root para todas las bases de datos, o sea… instalan un sitio usando el CMS WordPress, y como datos de acceso a la base de datos (para que WP use el servidor MySQL y use su DB) le ponen el usuario de administración del servidor MySQL: root
También, instalan cualquier otra aplicación web (un chat, paste, foro, etc) y hacen lo mismo, siempre usan el usuario root de MySQL…
ERROR!!!
Esto es simplemente una costumbre fatal.
Supongamos que tenemos los siguientes servicios en un servidor:
- Un sitio o portal usando WordPress.
- Nuestro Foro de soporte, charlas, etc… toda una comunidad.
- Un FTP que usa una base de datos MySQL para guardar los usuarios y passwords.
- Los usuarios de email se almacenan (usuarios y passwords) en una base de datos MySQL.
- Un pequeño WebChat que instalamos para charlar con algún conocido.
Y en todos, en los 5 servicios usamos el usuario root de MySQL para que cada servicio acceda y guarde los datos en su base de datos correspondiente.
Un buen día cualquier troll de los tantos que hay por la red, pero este no solo es un troll, sino que también domina algo de exploits, vulnerabilidades, hacking, etc … decide hacernos algo dañino.
Encuentra un bug en el WebChat que estamos usando, aprovechándose de ese bug logra tener acceso a archivos del WebChat, entre ellos el archivo de configuración del WebChat, y… en este archivo como es obvio, está el usuario y password que usa el WebChat para acceder al server MySQL, y ¿adivinen qué? … es nada más y nada menos el USUARIO ROOT!
Al hacerse con esta información, de forma muy simple el troll puede:
- Borrarnos y/o robarnos todo lo referente al sitio o portal que tenemos (el de WordPress).
- Puede borrarnos y/o robarnos información a nosotros Y a nuestros usuarios que usan el Foro, la comunidad que creamos.
- También podrá robar el usuario y password de TODOS los usuarios que tengan una cuenta de email en nuestro servidor, así como robarle la información de sus emails, suplantar identidad, etc.
- Y ahora por último, puede usar una cuenta de nuestro servidor FTP, y subir cualquier archivo que contenga malware, lo cual le permitiría hacerse con el control TOTAL y ABSOLUTO de nuestro servidor.
Bueno… ¿qué creen? …
¿Ven todo lo que puede suceder solo por no crear usuarios independientes para cada base de datos que tengamos?
Esto NO es una exageración amigos/as, esto puede suceder con una facilidad asombrosa… pues, todo lo que se necesita para desencadenar la catástrofe, es solo un bug en alguna de las aplicaciones webs que tengan instaladas.
Ahora…
¿Cómo crear usuarios independientes de MySQL para cada aplicación web?
Primero debemos entrar al servidor MySQL con el usuario root, pues él es quien tiene los privilegios para crear bases de datos, establecer permisos, crear usuarios, etc:
mysql -u root -p
Cuando escriban lo de arriba y presionen [Enter] se les pedirá el password del usuario root de MySQL, lo escriben y presionan [Enter] de nuevo, se les mostrará al momento algo como esto:
Ahora crearemos una base de datos con nombre «webchatdb«:
CREATE DATABASE webchatdb;
Listo, ya tienen creada la base de datos, ahora pasemos a crear el usuario «webchatuser«con el password «passworddelputowebchat«:
CREATE USER 'webchatuser'@'localhost' IDENTIFIED BY 'passworddelputowebchat';
Ahora la magia… le daremos todos los privilegios (lectura y escritura) a webchatuser SOLO en la DB webchatdb:
GRANT ALL PRIVILEGES ON webchatdb.* TO 'webchatuser'@'localhost' WITH GRANT OPTION;
Y listo, ya el usuario tiene los permisos en esa base de datos… ahora solo queda refrescarle los permisos a MySQL, o sea, indicarle a MySQL que vuelva a leer los privilegios de los usuarios pues nosotros acabamos de hacer un cambio en ellos:
FLUSH PRIVILEGES ;
Y esto viene siendo todo. Haciendo esto para cada aplicación web que usemos, garantizamos que en caso de que logren vulnerar una de esas aplicaciones webs, las otras estarán a salvo (al menos desde el punto de vista de MySQL)
¿a que es una buena práctica?
Espero les haya sido tan útil como me lo es a mí, pues intenté explicarlo de forma tan simple como pude.
Saludos