Mantén la seguridad de tus bases de datos MySQL creando usuarios y permisos separados

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:

  1. Un sitio o portal usando WordPress.
  2. Nuestro Foro de soporte, charlas, etc… toda una comunidad.
  3. Un FTP que usa una base de datos MySQL para guardar los usuarios y passwords.
  4. Los usuarios de email se almacenan (usuarios y passwords) en una base de datos MySQL.
  5. 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:

  1. Borrarnos y/o robarnos todo lo referente al sitio o portal que tenemos (el de WordPress).
  2. Puede borrarnos y/o robarnos información a nosotros Y a nuestros usuarios que usan el Foro, la comunidad que creamos.
  3. 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.
  4. 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;

Noten el punto y coma «;» al final de la línea.

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 ;

Les dejo un screenshot:

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


15 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Martin dijo

    Buen post KZKG, si fuera en el foro pediría un sticky!

    1.    KZKG^Gaara dijo

      Gracias 😀

      1.    CubaRed dijo

        Esta buena la contraseña que pusistes para el webchat, otra cosa que tiene que ver con el mysql es el uso de la memoria del mismo

  2.   Hyuuga_Neji dijo

    Jejeje ya gracias por recordarme los comandos del MySQL ahora vamos a ver si «le pongo algo de seguridad» a las BD del servidor de World of Warcraft que tengo en mi LAN.

  3.   sieg84 dijo

    mis conocimientos en esto son nulos, pero es casi lo mismo para cuando se usa MySQL para Amarok ¿?
    CREATE DATABASE amarokdb;
    GRANT ALL PRIVILEGES ON amarokdb.* TO ‘amarokuser’ IDENTIFIED BY ‘contraseña’; FLUSH PRIVILEGES;

    1.    KZKG^Gaara dijo

      Hace mucho, muchísimo que no uso Amarok, pero si usa una DB que es MySQL, en teoría debería funcionar así también.

  4.   Carlos Andrés Restrepo dijo

    Hola seria bueno que crearas una entrada para la seguridad contra los servidores web en linux muchos de ellos no tienen la debida seguridad y el administrador del mismo no es propiamente un experto solo les facilitan las cosas, por ejemplo el uso de symlink en los servidores permite leer los archivos de configuración de otras cuentas en el mismo server muchos administradores desconocen esto y es por ello que proliferan los deface de sitios web

    Saludos

    1.    KZKG^Gaara dijo

      Hola que tal,
      Bienvenido al sitio 🙂

      En realidad no me considero ni de lejos un experto en esta materia, pero intentaré aportar los pocos conocimientos que he ido adquiriendo a lo largo de los años 🙂

      Otra cosa que no muchos administradores de red hacen, es dar privilegios a los sitios con apache de forma individual, o sea, el usuario y grupo www-data (o similares), que sea uno diferente para cada sitio, y a su vez enjaular a cada uno de estos.

      Saludos

  5.   hackloper775 dijo

    Buen tip

    Saludos

    1.    KZKG^Gaara dijo

      Gracias 🙂

  6.   nano dijo

    DETESTO el aspecto de tu terminal, las letras de fondo me sacan de mi concentración. Eres un puto loco xD

    Fuera de eso, es interesante porque he visto casos patéticos de caídas de servicio por esas cosas.

    Ahora bien, no solo depende de eso, la seguridad radica en como se construyó la base de datos, me explicaba un profesor, pero tampoco estoy muy sumergido aún en las BD… deberíamos trastear uno de estos dias con MongoDB =D

  7.   Carlos Coronel dijo

    me ha pasado justamente eso hoy con mi servidor alquilado

    seguí tus pasos, entré al cpanel y busque la base de datos de MYSQL y me dice que está fuera de servicio.

    no sé como entrar ahora bajo el usuario root
    soy néofito en esto, pero leyendo acá se aprende mucho, espero me orientes para acceder

    1.    KZKG^Gaara dijo

      Hola 🙂
      ¿Lo que tienes es un Hosting (SharedHosting) o un VPS (servidor virtual)?

      Si tienes un Hosting y no un VPS, entonces debes ver si tu Hosting tiene acceso SSH (contacta al soporte técnico de la empresa que te vendió el hosting y les preguntas cómo acceder mediante SSH), una vez que entres por SSH, el usuario NO será root, sino que debes usar el usuario que pusiste cuando instalaste esa aplicación web.

      En realidad es un tema complicado el tuyo, pues las variantes y posibilidades son muuuuchas, te recomiendo que abras un tema nuevo en nuestro foro, ahí será más cómodo ayudarte -» http://foro.desdelinux.net

      Saludos 😀

  8.   jefebrondem dijo

    Buenas,

    Tengo entendido que és buena práctica no darle todos los privilegios a ningún usuario excepto root. Sin embargo, desde que instalé phpmyadmin se ha creado un nuevo usuario «phpmyadmin» con todos los privilegios. Parece lógico que sea así, pues sólo se trata de una versión gráfica para administrar las bases de datos en MySQL. De todas maneras me gustaría asegurarme de si está bien tal como está o debería hacer alguna modificación en los privilegios del usuario «phpmyadmin».

    Un saludo y gracias!

  9.   Emmanuel dijo

    Excelente…
    soy de los que hacen todo con el root, pero has abierto mis ojos amigo..
    muchas gracias…